├── .dockerignore
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
├── labeler.yml
├── pull_request_template.md
├── release.yml
├── scripts
│ ├── purge-frontdoor-cache.sh
│ ├── release.sh
│ ├── revert.sh
│ └── sync-index.sh
└── workflows
│ ├── add-to-project.yml
│ ├── check-label-added.yml
│ ├── codeql.yml
│ ├── cypress.yml
│ ├── issue-labeler.yml
│ ├── pr-actions.yml
│ ├── release.yml
│ ├── revert.yml
│ ├── test
│ ├── release-preview-invalid-suffix.json
│ ├── release-preview-success.json
│ ├── release-rc-invalid-suffix.json
│ ├── release-rc-success.json
│ ├── release-stable-invalid-prerelease-value.json
│ ├── release-stable-invalid-suffix.json
│ ├── release-stable-missing-v.json
│ └── release-stable-success.json
│ └── unit-tests.yml
├── .gitignore
├── .husky
├── .gitignore
├── pre-commit
└── pre-commit-check-for-skipped-tests
├── .prettierignore
├── .vscode
├── extensions.json
└── settings.json
├── .yarn
└── releases
│ └── yarn-4.9.1.cjs
├── .yarnrc.yml
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── adr
└── 001-component-library.md
├── babel.config.json
├── benchmarks
├── splitDashedKey.ts
└── tsconfig.json
├── cypress.config.js
├── docker-compose.yml
├── eslint.config.mjs
├── jest.config.js
├── multi-reporter-config.json
├── package.json
├── prettier.config.js
├── renovate.json
├── schemas
└── json
│ ├── application
│ └── application-metadata.schema.v1.json
│ ├── component
│ └── number-format.schema.v1.json
│ ├── layout
│ ├── expression.schema.v1.json
│ └── footer.schema.v1.json
│ ├── text-resources
│ └── text-resources.schema.v1.json
│ └── validation
│ └── validation.schema.v1.json
├── scripts
├── copy-schemas.ts
└── cypress-run-all.ts
├── sonar-project.properties
├── src
├── App.test.tsx
├── App.tsx
├── __mocks__
│ ├── axios.ts
│ ├── getApplicationMetadataMock.ts
│ ├── getAttachmentsMock.ts
│ ├── getDataListMock.ts
│ ├── getFormDataMockForRepGroup.ts
│ ├── getFormLayoutGroupMock.ts
│ ├── getInstanceDataMock.ts
│ ├── getLayoutSetsMock.ts
│ ├── getLogoMock.ts
│ ├── getMultiPageGroupMock.ts
│ ├── getOrderDetailsPayloadMock.ts
│ ├── getOrganisationMock.ts
│ ├── getOrgsMock.ts
│ ├── getPartyMock.ts
│ ├── getPaymentPayloadMock.ts
│ ├── getProcessDataMock.ts
│ ├── getProfileMock.ts
│ ├── getTextResourcesMock.ts
│ ├── json-schema
│ │ ├── complex.json
│ │ ├── one-of-on-root.json
│ │ └── ref-on-root.json
│ ├── mocks.ts
│ ├── orgs.ts
│ └── zustand.ts
├── app-components
│ ├── Button
│ │ └── Button.tsx
│ ├── ConditionalWrapper
│ │ ├── ConditionalWrapper.test.tsx
│ │ └── ConditionalWrapper.tsx
│ ├── Date
│ │ ├── Date.module.css
│ │ └── DisplayDate.tsx
│ ├── Datepicker
│ │ ├── Calendar.module.css
│ │ ├── DatePickerCalendar.tsx
│ │ ├── DatePickerHelpers.ts
│ │ ├── DatePickerInput.tsx
│ │ ├── Datepicker.tsx
│ │ ├── DatepickerDialog.tsx
│ │ └── utils
│ │ │ ├── dateHelpers.test.ts
│ │ │ ├── dateHelpers.ts
│ │ │ └── dateLocales.ts
│ ├── DynamicForm
│ │ └── DynamicForm.tsx
│ ├── Flex
│ │ ├── Flex.module.css
│ │ └── Flex.tsx
│ ├── FullWidthWrapper
│ │ ├── FullWidthWrapper.module.css
│ │ └── FullWidthWrapper.tsx
│ ├── HelpText
│ │ ├── HelpText.test.tsx
│ │ ├── HelpText.tsx
│ │ ├── HelpTextIcon.test.tsx
│ │ ├── HelpTextIcon.tsx
│ │ └── Helptext.module.css
│ ├── Input
│ │ ├── FormattedInput.tsx
│ │ ├── Input.module.css
│ │ ├── Input.tsx
│ │ ├── NumericInput.tsx
│ │ └── constants.ts
│ ├── Label
│ │ ├── Fieldset.test.tsx
│ │ ├── Fieldset.tsx
│ │ ├── Label.module.css
│ │ └── Label.tsx
│ ├── Number
│ │ ├── DisplayNumber.tsx
│ │ └── Number.module.css
│ ├── Pagination
│ │ ├── Pagination.module.css
│ │ └── Pagination.tsx
│ ├── Panel
│ │ ├── Panel.module.css
│ │ ├── Panel.test.tsx
│ │ ├── Panel.tsx
│ │ └── constants.ts
│ ├── Table
│ │ ├── Table.module.css
│ │ ├── Table.test.tsx
│ │ └── Table.tsx
│ ├── Text
│ │ ├── DisplayText.tsx
│ │ └── Text.module.css
│ ├── TextArea
│ │ └── TextArea.tsx
│ └── readme.md
├── codegen
│ ├── CG.ts
│ ├── CodeGenerator.ts
│ ├── CodeGeneratorContext.ts
│ ├── Common.ts
│ ├── ComponentConfig.ts
│ ├── Config.ts
│ ├── SchemaFile.ts
│ ├── SerializableSetting.ts
│ ├── dataTypes
│ │ ├── GenerateArray.ts
│ │ ├── GenerateBoolean.ts
│ │ ├── GenerateCommonImport.ts
│ │ ├── GenerateConst.ts
│ │ ├── GenerateDataModelBinding.ts
│ │ ├── GenerateEnum.ts
│ │ ├── GenerateExpressionOr.ts
│ │ ├── GenerateImportedSymbol.ts
│ │ ├── GenerateInteger.ts
│ │ ├── GenerateIntersection.ts
│ │ ├── GenerateNumber.ts
│ │ ├── GenerateObject.ts
│ │ ├── GenerateProperty.ts
│ │ ├── GenerateRaw.ts
│ │ ├── GenerateString.ts
│ │ ├── GenerateTextResourceBinding.ts
│ │ └── GenerateUnion.ts
│ ├── run.ts
│ ├── schemas
│ │ ├── layout-sets.schema.v1.ts
│ │ ├── layout.schema.v1.ts
│ │ └── layoutSettings.schema.v1.ts
│ └── tools.ts
├── components
│ ├── AltinnCollapsable.module.css
│ ├── AltinnCollapsable.tsx
│ ├── AltinnLoader.module.css
│ ├── AltinnLoader.test.tsx
│ ├── AltinnLoader.tsx
│ ├── AltinnSpinner.module.css
│ ├── AltinnSpinner.test.tsx
│ ├── AltinnSpinner.tsx
│ ├── CircleIcon.module.css
│ ├── CircleIcon.tsx
│ ├── ErrorBoundary.tsx
│ ├── LandmarkShortcuts.module.css
│ ├── LandmarkShortcuts.test.tsx
│ ├── LandmarkShortcuts.tsx
│ ├── PDFGeneratorPreview
│ │ └── PDFGeneratorPreview.tsx
│ ├── ReadyForPrint.tsx
│ ├── ViewportWrapper.tsx
│ ├── altinnError.module.css
│ ├── altinnError.tsx
│ ├── altinnParty.module.css
│ ├── altinnParty.test.tsx
│ ├── altinnParty.tsx
│ ├── atoms
│ │ ├── AltinnAttachment.module.css
│ │ ├── AltinnAttachments.tsx
│ │ ├── AltinnContentIcon.tsx
│ │ ├── AltinnContentIconFormData.tsx
│ │ └── AltinnContentIconReceipt.tsx
│ ├── form
│ │ ├── Description.module.css
│ │ ├── Description.tsx
│ │ ├── Fieldset.module.css
│ │ ├── Form.module.css
│ │ ├── Form.test.tsx
│ │ ├── Form.tsx
│ │ ├── HelpTextContainer.module.css
│ │ ├── HelpTextContainer.test.tsx
│ │ ├── HelpTextContainer.tsx
│ │ ├── Legend.module.css
│ │ ├── LinkToPotentialNode.tsx
│ │ ├── LinkToPotentialPage.tsx
│ │ ├── MessageBanner.module.css
│ │ ├── MessageBanner.test.tsx
│ │ ├── MessageBanner.tsx
│ │ ├── OptionalIndicator.tsx
│ │ ├── RadioButton.module.css
│ │ ├── RadioButton.test.tsx
│ │ ├── RadioButton.tsx
│ │ ├── RequiredIndicator.tsx
│ │ └── caption
│ │ │ ├── Caption.module.css
│ │ │ ├── Caption.test.tsx
│ │ │ └── Caption.tsx
│ ├── label
│ │ ├── Label.module.css
│ │ ├── Label.tsx
│ │ ├── LabelContent.module.css
│ │ └── LabelContent.tsx
│ ├── logo
│ │ ├── AltinnLogo.module.css
│ │ └── AltinnLogo.tsx
│ ├── message
│ │ ├── ErrorPaper.module.css
│ │ ├── ErrorPaper.test.tsx
│ │ ├── ErrorPaper.tsx
│ │ ├── ErrorReport.module.css
│ │ ├── ErrorReport.test.tsx
│ │ └── ErrorReport.tsx
│ ├── molecules
│ │ ├── AltinnCollapsibleAttachments.module.css
│ │ ├── AltinnCollapsibleAttachments.tsx
│ │ ├── AltinnContentLoader.test.tsx
│ │ ├── AltinnContentLoader.tsx
│ │ ├── AltinnSubstatus.module.css
│ │ ├── AltinnSubstatus.test.tsx
│ │ └── AltinnSubstatus.tsx
│ ├── organisms
│ │ ├── AltinnReceipt.module.css
│ │ ├── AltinnReceipt.test.tsx
│ │ ├── AltinnReceipt.tsx
│ │ └── AltinnReceiptSimple.tsx
│ ├── presentation
│ │ ├── AppHeader
│ │ │ ├── AppHeader.module.css
│ │ │ ├── AppHeader.test.tsx
│ │ │ ├── AppHeader.tsx
│ │ │ ├── AppHeaderMenu.module.css
│ │ │ └── AppHeaderMenu.tsx
│ │ ├── BackNavigationButton.module.css
│ │ ├── BackNavigationButton.tsx
│ │ ├── ExpandWidthButton.module.css
│ │ ├── ExpandWidthButton.tsx
│ │ ├── Header.module.css
│ │ ├── Header.test.tsx
│ │ ├── Header.tsx
│ │ ├── LanguageSelector.module.css
│ │ ├── LanguageSelector.tsx
│ │ ├── NavBar.module.css
│ │ ├── NavBar.test.tsx
│ │ ├── NavBar.tsx
│ │ ├── OrganisationLogo
│ │ │ ├── OrganisationLogo.module.css
│ │ │ ├── OrganisationLogo.test.tsx
│ │ │ └── OrganisationLogo.tsx
│ │ ├── Presentation.module.css
│ │ ├── Presentation.test.tsx
│ │ ├── Presentation.tsx
│ │ ├── Progress.module.css
│ │ ├── Progress.test.tsx
│ │ └── Progress.tsx
│ ├── table
│ │ ├── AltinnSummaryTable.module.css
│ │ └── AltinnSummaryTable.tsx
│ └── wrappers
│ │ ├── ProcessWrapper.module.css
│ │ └── ProcessWrapper.tsx
├── core
│ ├── auth
│ │ └── KeepAliveProvider.tsx
│ ├── contexts
│ │ ├── AppQueriesProvider.tsx
│ │ ├── context.tsx
│ │ ├── delayedContext.tsx
│ │ ├── hookContext.tsx
│ │ ├── processingContext.tsx
│ │ ├── queryContext.tsx
│ │ ├── taskStoreContext.tsx
│ │ └── zustandContext.tsx
│ ├── errorHandling
│ │ ├── DisplayError.tsx
│ │ └── DisplayErrorProvider.tsx
│ ├── loading
│ │ ├── Loader.test.tsx
│ │ ├── Loader.tsx
│ │ ├── LoadingContext.tsx
│ │ └── LoadingRegistry.tsx
│ ├── queries
│ │ ├── usePrefetchQuery.ts
│ │ └── useQueryWithStaleData.ts
│ ├── structures
│ │ ├── ShallowArrayMap.test.ts
│ │ └── ShallowArrayMap.ts
│ ├── texts
│ │ ├── appTexts.test.tsx
│ │ └── appTexts.ts
│ └── ui
│ │ ├── RenderStart.tsx
│ │ └── useResetScrollPosition.ts
├── features
│ ├── alertOnChange
│ │ ├── AlertOnChangePlugin.tsx
│ │ ├── DeleteWarningPopover.module.css
│ │ ├── DeleteWarningPopover.tsx
│ │ └── useAlertOnChange.ts
│ ├── applicationMetadata
│ │ ├── ApplicationMetadataProvider.tsx
│ │ ├── VersionErrorOrChildren.test.tsx
│ │ ├── VersionErrorOrChildren.tsx
│ │ ├── appMetadataUtils.test.ts
│ │ ├── appMetadataUtils.ts
│ │ ├── minVersion.ts
│ │ └── types.ts
│ ├── applicationSettings
│ │ └── ApplicationSettingsProvider.tsx
│ ├── attachments
│ │ ├── AttachmentsPlugin.tsx
│ │ ├── AttachmentsStorePlugin.tsx
│ │ ├── StoreAttachmentsInNode.tsx
│ │ ├── UpdateAttachmentsForCypress.tsx
│ │ ├── hooks.ts
│ │ ├── index.ts
│ │ ├── sortAttachments.ts
│ │ ├── tools.ts
│ │ └── useAttachmentDeletionInRepGroups.ts
│ ├── baseurlinjection.ts
│ ├── customValidation
│ │ ├── customValidationUtils.ts
│ │ └── useCustomValidationQuery.ts
│ ├── dataLists
│ │ ├── index.ts
│ │ └── useDataListQuery.tsx
│ ├── datamodel
│ │ ├── DataElementIdsForCypress.tsx
│ │ ├── DataModelsProvider.tsx
│ │ ├── SimpleSchemaTraversal.tools.ts
│ │ ├── SimpleSchemaTraversal.ts
│ │ ├── lookupErrorAsText.ts
│ │ ├── notations.test.ts
│ │ ├── notations.ts
│ │ ├── useAvailableDataModels.tsx
│ │ ├── useBindingSchema.tsx
│ │ ├── useDataModelSchemaQuery.ts
│ │ └── utils.ts
│ ├── devtools
│ │ ├── DevTools.module.css
│ │ ├── DevTools.tsx
│ │ ├── DevToolsControls.tsx
│ │ ├── DevToolsPanel.tsx
│ │ ├── components
│ │ │ ├── DevHiddenFunctionality
│ │ │ │ └── DevHiddenFunctionality.tsx
│ │ │ ├── DevLanguageSelector
│ │ │ │ └── DevLanguageSelector.tsx
│ │ │ ├── DevNavigationButtons
│ │ │ │ ├── DevNavigationButtons.module.css
│ │ │ │ └── DevNavigationButtons.tsx
│ │ │ ├── DevToolsLogs
│ │ │ │ ├── DevToolsLogs.module.css
│ │ │ │ └── DevToolsLogs.tsx
│ │ │ ├── DownloadXMLButton
│ │ │ │ └── DownloadXMLButton.tsx
│ │ │ ├── ExpressionPlayground
│ │ │ │ ├── ExpressionPlayground.module.css
│ │ │ │ └── ExpressionPlayground.tsx
│ │ │ ├── LayoutInspector
│ │ │ │ ├── ComponentSelector.tsx
│ │ │ │ ├── LayoutInspector.module.css
│ │ │ │ ├── LayoutInspector.tsx
│ │ │ │ └── LayoutInspectorItem.tsx
│ │ │ ├── NodeInspector
│ │ │ │ ├── DefaultNodeInspector.tsx
│ │ │ │ ├── NodeHierarchy.tsx
│ │ │ │ ├── NodeInspector.module.css
│ │ │ │ ├── NodeInspector.tsx
│ │ │ │ ├── NodeInspectorContext.ts
│ │ │ │ ├── NodeInspectorDataField.tsx
│ │ │ │ ├── NodeInspectorDataModelBindings.tsx
│ │ │ │ ├── NodeInspectorTextResourceBindings.tsx
│ │ │ │ ├── ValidationInspector.module.css
│ │ │ │ └── ValidationInspector.tsx
│ │ │ ├── OpenDevToolsButton
│ │ │ │ ├── OpenDevToolsButton.module.css
│ │ │ │ └── OpenDevToolsButton.tsx
│ │ │ ├── PDFPreviewButton
│ │ │ │ ├── PDFPreview.module.css
│ │ │ │ └── PDFPreviewButton.tsx
│ │ │ ├── PermissionsEditor
│ │ │ │ ├── PermissionsEditor.module.css
│ │ │ │ └── PermissionsEditor.tsx
│ │ │ ├── SplitView
│ │ │ │ ├── SplitView.module.css
│ │ │ │ └── SplitView.tsx
│ │ │ └── VersionSwitcher
│ │ │ │ └── VersionSwitcher.tsx
│ │ ├── data
│ │ │ ├── DevToolsStore.ts
│ │ │ ├── devToolsSagas.ts
│ │ │ └── types.ts
│ │ ├── hooks
│ │ │ ├── useComponentHighlighter.ts
│ │ │ └── useComponentRefs.ts
│ │ ├── layoutValidation
│ │ │ ├── types.ts
│ │ │ └── useLayoutValidation.tsx
│ │ └── utils
│ │ │ └── layoutSchemaValidation.ts
│ ├── displayData
│ │ ├── index.ts
│ │ └── useDisplayData.ts
│ ├── entrypoint
│ │ └── Entrypoint.tsx
│ ├── expressions
│ │ ├── errors.ts
│ │ ├── expression-functions.ts
│ │ ├── index.test.ts
│ │ ├── index.ts
│ │ ├── prettyErrors.test.ts
│ │ ├── prettyErrors.ts
│ │ ├── schema.test.ts
│ │ ├── shared-context.test.tsx
│ │ ├── shared-functions-exist.test.ts
│ │ ├── shared-functions.test.tsx
│ │ ├── shared-tests
│ │ │ ├── README.md
│ │ │ ├── context-lists
│ │ │ │ ├── groups
│ │ │ │ │ ├── noData.json
│ │ │ │ │ ├── oneRow.json
│ │ │ │ │ └── twoRows.json
│ │ │ │ ├── nonRepeatingGroups
│ │ │ │ │ └── simple.json
│ │ │ │ ├── recursiveGroups
│ │ │ │ │ ├── recursiveNoData.json
│ │ │ │ │ ├── recursiveOneRow.json
│ │ │ │ │ ├── recursiveTwoRowsInner.json
│ │ │ │ │ └── recursiveTwoRowsOuter.json
│ │ │ │ └── simple
│ │ │ │ │ ├── simple.json
│ │ │ │ │ └── twoPages.json
│ │ │ ├── functions
│ │ │ │ ├── _experimentalSelectAndMap
│ │ │ │ │ ├── _experimentalSelectAndMap-with-append-without-last-element.json
│ │ │ │ │ ├── _experimentalSelectAndMap-with-prepend-and-append.json
│ │ │ │ │ └── _experimentalSelectAndMap.json
│ │ │ │ ├── and
│ │ │ │ │ ├── all-true.json
│ │ │ │ │ ├── allows-0.json
│ │ │ │ │ ├── allows-1.json
│ │ │ │ │ ├── allows-stringy-0.json
│ │ │ │ │ ├── allows-stringy-1.json
│ │ │ │ │ ├── allows-stringy-false.json
│ │ │ │ │ ├── allows-stringy-true.json
│ │ │ │ │ ├── casts-to-boolean.json
│ │ │ │ │ ├── casts-to-boolean2.json
│ │ │ │ │ ├── disallows-2.json
│ │ │ │ │ ├── disallows-empty-strings.json
│ │ │ │ │ ├── disallows-other-strings.json
│ │ │ │ │ ├── empty-and.json
│ │ │ │ │ ├── last-false.json
│ │ │ │ │ ├── null-is-false.json
│ │ │ │ │ ├── single-input-false.json
│ │ │ │ │ └── single-input-true.json
│ │ │ │ ├── argv
│ │ │ │ │ ├── arg-can-be-null.json
│ │ │ │ │ ├── error-no-args.json
│ │ │ │ │ ├── error-no-such-arg.json
│ │ │ │ │ ├── simple-0.json
│ │ │ │ │ └── simple-1.json
│ │ │ │ ├── authContext
│ │ │ │ │ ├── read-confirm.json
│ │ │ │ │ ├── read-sign-reject.json
│ │ │ │ │ ├── read-sign.json
│ │ │ │ │ └── read-write.json
│ │ │ │ ├── commaContains
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── null2.json
│ │ │ │ │ ├── should-include-word-in-string.json
│ │ │ │ │ ├── should-not-include-word-in-string.json
│ │ │ │ │ └── string-list-include-number.json
│ │ │ │ ├── compare-equals
│ │ │ │ │ ├── equals-strings.json
│ │ │ │ │ ├── error-too-few-args.json
│ │ │ │ │ └── not-equals-strings.json
│ │ │ │ ├── compare-error
│ │ │ │ │ ├── error-case-sensitive-not.json
│ │ │ │ │ ├── error-expr-as-not.json
│ │ │ │ │ ├── error-expr-as-operator-with-not.json
│ │ │ │ │ ├── error-expr-as-operator.json
│ │ │ │ │ ├── error-not-not.json
│ │ │ │ │ ├── error-wrong-operator.json
│ │ │ │ │ └── notEquals-not-implemented.json
│ │ │ │ ├── compare-greaterThan
│ │ │ │ │ ├── greaterThan-simple.json
│ │ │ │ │ └── greaterThan-simple2.json
│ │ │ │ ├── compare-isAfter
│ │ │ │ │ ├── date-leap-year.json
│ │ │ │ │ └── date-with-time.json
│ │ │ │ ├── compare-isAfterEq
│ │ │ │ │ └── isAfterEq.json
│ │ │ │ ├── compare-isBefore
│ │ │ │ │ ├── date-empty-string-and-null.json
│ │ │ │ │ ├── date-empty-string.json
│ │ │ │ │ ├── date-simple.json
│ │ │ │ │ ├── error-date-invalid.json
│ │ │ │ │ └── error-date-invalid2.json
│ │ │ │ ├── compare-isBeforeEq
│ │ │ │ │ └── isBeforeEq.json
│ │ │ │ ├── compare-isSameDay
│ │ │ │ │ ├── errors-different-timesone.json
│ │ │ │ │ ├── errors-with-number.json
│ │ │ │ │ ├── errors-with-only-year.json
│ │ │ │ │ ├── not-sameDay-year.json
│ │ │ │ │ └── start-and-end-of-day-is-same.json
│ │ │ │ ├── component
│ │ │ │ │ ├── across-pages-hidden.json
│ │ │ │ │ ├── across-pages.json
│ │ │ │ │ ├── distant-across-page.json
│ │ │ │ │ ├── distant.json
│ │ │ │ │ ├── find-first-row.json
│ │ │ │ │ ├── find-grouped-sibling.json
│ │ │ │ │ ├── find-hidden-sibling-in-other-repeating-group.json
│ │ │ │ │ ├── find-hidden-unrelated-sibling-in-other-repeating-group.json
│ │ │ │ │ ├── find-sibling-in-other-repeating-group.json
│ │ │ │ │ ├── find-unrelated-sibling-in-other-repeating-group.json
│ │ │ │ │ ├── hidden-in-group-other-row.json
│ │ │ │ │ ├── hidden-in-group.json
│ │ │ │ │ ├── hidden-in-non-repeating-group.json
│ │ │ │ │ ├── hide-group-component.json
│ │ │ │ │ ├── in-group-group-hidden.json
│ │ │ │ │ ├── in-group-page-hidden.json
│ │ │ │ │ ├── in-group-with-hidden.json
│ │ │ │ │ ├── in-group.json
│ │ │ │ │ ├── in-hidden-row.json
│ │ │ │ │ ├── in-nested-group.json
│ │ │ │ │ ├── in-nested-group2.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── simple-lookup-equals.json
│ │ │ │ │ ├── simple-lookup-for-hidden-component-is-null.json
│ │ │ │ │ ├── simple-lookup-for-hidden-dynamic-component-is-null.json
│ │ │ │ │ ├── simple-lookup.json
│ │ │ │ │ ├── visible-in-non-repeating-group.json
│ │ │ │ │ └── with-component-index.json
│ │ │ │ ├── concat
│ │ │ │ │ ├── boolean-are-empty-strings.json
│ │ │ │ │ ├── casts-numbers.json
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── inside-lookup.json
│ │ │ │ │ ├── nulls-are-empty-strings.json
│ │ │ │ │ ├── one-string.json
│ │ │ │ │ └── simple-lookup.json
│ │ │ │ ├── contains
│ │ │ │ │ ├── case-sensitivity.json
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── exact-match.json
│ │ │ │ │ ├── not-match.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── null2.json
│ │ │ │ │ ├── null3.json
│ │ │ │ │ ├── null4.json
│ │ │ │ │ └── partial-match.json
│ │ │ │ ├── countDataElements
│ │ │ │ │ ├── non-existing.json
│ │ │ │ │ ├── single.json
│ │ │ │ │ └── subform.json
│ │ │ │ ├── dataModel
│ │ │ │ │ ├── array-is-null.json
│ │ │ │ │ ├── direct-reference-in-group.json
│ │ │ │ │ ├── direct-reference-in-nested-group.json
│ │ │ │ │ ├── direct-reference-in-nested-group2.json
│ │ │ │ │ ├── direct-reference-in-nested-group3.json
│ │ │ │ │ ├── direct-reference-in-nested-group4.json
│ │ │ │ │ ├── in-group.json
│ │ │ │ │ ├── in-nested-group.json
│ │ │ │ │ ├── null-is-null.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── object-is-null.json
│ │ │ │ │ ├── simple-lookup-equals.json
│ │ │ │ │ ├── simple-lookup-is-null.json
│ │ │ │ │ ├── simple-lookup-is-null2.json
│ │ │ │ │ ├── simple-lookup.json
│ │ │ │ │ ├── with-indexes-without-layout.json
│ │ │ │ │ └── with-indexes.json
│ │ │ │ ├── dataModelMultiple
│ │ │ │ │ ├── component-lookup-non-default-model.json
│ │ │ │ │ ├── component-lookup-non-existing-model.json
│ │ │ │ │ ├── dataModel-non-default-model.json
│ │ │ │ │ ├── dataModel-non-existing-model.json
│ │ │ │ │ └── dataModel-type-as-expr.json
│ │ │ │ ├── displayValue
│ │ │ │ │ ├── hidden.json
│ │ │ │ │ ├── not-found.json
│ │ │ │ │ ├── not-implemented.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── number-formatted-input.json
│ │ │ │ │ ├── type-Address.json
│ │ │ │ │ ├── type-Checkboxes.json
│ │ │ │ │ ├── type-Custom.json
│ │ │ │ │ ├── type-Date.json
│ │ │ │ │ ├── type-Datepicker.json
│ │ │ │ │ ├── type-Dropdown.json
│ │ │ │ │ ├── type-FileUpload.json
│ │ │ │ │ ├── type-FileUploadWithTag.json
│ │ │ │ │ ├── type-Input.json
│ │ │ │ │ ├── type-LikertItem.json
│ │ │ │ │ ├── type-List.json
│ │ │ │ │ ├── type-Map.json
│ │ │ │ │ ├── type-MultipleSelect.json
│ │ │ │ │ ├── type-Number.json
│ │ │ │ │ ├── type-Option.json
│ │ │ │ │ ├── type-OrganisationLookup.json
│ │ │ │ │ ├── type-PersonLookup.json
│ │ │ │ │ ├── type-RadioButtons.json
│ │ │ │ │ ├── type-Text.json
│ │ │ │ │ └── type-TextArea.json
│ │ │ │ ├── endsWith
│ │ │ │ │ ├── case-sensitivity.json
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── ends-with-null.json
│ │ │ │ │ ├── ends-with-number.json
│ │ │ │ │ ├── ends-with.json
│ │ │ │ │ ├── exact-match.json
│ │ │ │ │ ├── not-ends-with.json
│ │ │ │ │ └── number-ends-with-number.json
│ │ │ │ ├── equals
│ │ │ │ │ ├── diff-types-bool-float-false.json
│ │ │ │ │ ├── diff-types-bool-int-false.json
│ │ │ │ │ ├── diff-types-bool-null-false.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-false2.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-false.json
│ │ │ │ │ ├── diff-types-int-null-false.json
│ │ │ │ │ ├── diff-types-string-bool-false.json
│ │ │ │ │ ├── diff-types-string-bool-true.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null-false.json
│ │ │ │ │ ├── diff-types-string-null-true.json
│ │ │ │ │ ├── false-case-insensitive.json
│ │ │ │ │ ├── false-case-insensitive2.json
│ │ │ │ │ ├── null-case-insensitive.json
│ │ │ │ │ ├── same-types-bool-false.json
│ │ │ │ │ ├── same-types-bool-true.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-false2.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ ├── same-types-string-true.json
│ │ │ │ │ ├── same-types-string-true2.json
│ │ │ │ │ ├── strings-case-sensitive.json
│ │ │ │ │ ├── too-few-args.json
│ │ │ │ │ └── too-many-args.json
│ │ │ │ ├── externalApi
│ │ │ │ │ ├── should-pick-data-with-nested-path.json
│ │ │ │ │ ├── should-return-empty-string-on-undefined-result.json
│ │ │ │ │ ├── should-return-empty-string-when-path-does-not-exist.json
│ │ │ │ │ ├── should-return-stringified-json-on-object-result.json
│ │ │ │ │ └── should-return-whole-result-with-empty-path-param.json
│ │ │ │ ├── formatDate
│ │ │ │ │ ├── error-parseFalse.json
│ │ │ │ │ ├── error-parseNumber.json
│ │ │ │ │ ├── error-parseTrue.json
│ │ │ │ │ ├── formats-date-english.json
│ │ │ │ │ ├── formats-date-english2.json
│ │ │ │ │ ├── formats-date-in-format-specified.json
│ │ │ │ │ ├── formats-date-in-format-specified2.json
│ │ │ │ │ ├── formats-date-time.json
│ │ │ │ │ ├── formats-date-with-offset.json
│ │ │ │ │ ├── formats-date.json
│ │ │ │ │ ├── formats-time-in-format-specified.json
│ │ │ │ │ ├── parse-date-2020-is-a-leap-year.json
│ │ │ │ │ ├── parse-date-2021-is-not-a-leap-year.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-29-days-in-february-normal-.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-30-days-in-february-leap-.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-31-days-in-april.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-31-days-in-june.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-31-days-in-november.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-31-days-in-september.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-august.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-december.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-january.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-july.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-march.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-may.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-32-days-in-october.json
│ │ │ │ │ ├── parse-date-a-invalid-date-string-with-invalid-month.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-28-days-in-february-normal-.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-29-days-in-february-leap-.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-30-days-in-april.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-30-days-in-june.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-30-days-in-november.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-30-days-in-september.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-august.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-december.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-january.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-july.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-march.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-may.json
│ │ │ │ │ ├── parse-date-a-valid-date-string-with-31-days-in-october.json
│ │ │ │ │ ├── parse-date-a-valid-date-string.json
│ │ │ │ │ ├── parse-date-an-invalid-date-string.json
│ │ │ │ │ ├── parse-date-invalid-month-day-combination.json
│ │ │ │ │ ├── parse-date-invalid-month.json
│ │ │ │ │ ├── parse-date-invalid-non-ascii-a-bengali-4-.json
│ │ │ │ │ ├── parse-date-iso8601-non-rfc3339-week-number-implicit-day-of-week-2023-01-02-.json
│ │ │ │ │ ├── parse-date-iso8601-non-rfc3339-week-number-rollover-to-next-year-2023-01-01-.json
│ │ │ │ │ ├── parse-date-iso8601-non-rfc3339-week-number-with-day-of-week-2023-03-28-.json
│ │ │ │ │ ├── parse-date-iso8601-non-rfc3339-yyyymmdd-without-dashes-2023-03-28-.json
│ │ │ │ │ ├── parse-date-non-padded-day-dates-are-not-valid.json
│ │ │ │ │ ├── parse-date-non-padded-month-dates-are-not-valid.json
│ │ │ │ │ ├── parse-date-only-rfc3339-not-all-of-iso-8601-are-valid.json
│ │ │ │ │ ├── parse-date-time-a-valid-date-time-string-with-minus-offset.json
│ │ │ │ │ ├── parse-date-time-a-valid-date-time-string-with-plus-offset.json
│ │ │ │ │ ├── parse-date-time-a-valid-date-time-string-without-second-fraction.json
│ │ │ │ │ ├── parse-date-time-a-valid-date-time-string.json
│ │ │ │ │ ├── parse-date-time-an-invalid-closing-z-after-time-zone-offset.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-past-leap-second-utc.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-string.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-with-a-leap-second-utc.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-with-a-leap-second-with-minus-offset.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-with-leap-second-on-a-wrong-hour-utc.json
│ │ │ │ │ ├── parse-date-time-an-invalid-date-time-with-leap-second-on-a-wrong-minute-utc.json
│ │ │ │ │ ├── parse-date-time-an-invalid-day-in-date-time-string.json
│ │ │ │ │ ├── parse-date-time-an-invalid-offset-in-date-time-string.json
│ │ │ │ │ ├── parse-date-time-case-insensitive-t-and-z.json
│ │ │ │ │ ├── parse-date-time-invalid-non-ascii-a-bengali-4-in-date-portion.json
│ │ │ │ │ ├── parse-date-time-invalid-non-ascii-a-bengali-4-in-time-portion.json
│ │ │ │ │ ├── parse-date-time-invalid-non-padded-day-dates.json
│ │ │ │ │ ├── parse-date-time-invalid-non-padded-month-dates.json
│ │ │ │ │ ├── parse-date-time-only-rfc3339-not-all-of-iso-8601-are-valid.json
│ │ │ │ │ ├── parseNull-returnsNull.json
│ │ │ │ │ ├── valid-lowercase-a-en.json
│ │ │ │ │ ├── valid-lowercase-a-nb.json
│ │ │ │ │ ├── valid-lowercase-a-nn.json
│ │ │ │ │ ├── valid-lowercase-a-noLanguage.json
│ │ │ │ │ ├── valid-lowercase-d.json
│ │ │ │ │ ├── valid-lowercase-dd.json
│ │ │ │ │ ├── valid-lowercase-h.json
│ │ │ │ │ ├── valid-lowercase-hh.json
│ │ │ │ │ ├── valid-lowercase-m.json
│ │ │ │ │ ├── valid-lowercase-mm.json
│ │ │ │ │ ├── valid-lowercase-s.json
│ │ │ │ │ ├── valid-lowercase-ss.json
│ │ │ │ │ ├── valid-lowercase-u.json
│ │ │ │ │ ├── valid-lowercase-uu.json
│ │ │ │ │ ├── valid-lowercase-uuu.json
│ │ │ │ │ ├── valid-lowercase-uuuu.json
│ │ │ │ │ ├── valid-lowercase-y.json
│ │ │ │ │ ├── valid-lowercase-yy.json
│ │ │ │ │ ├── valid-lowercase-yyy.json
│ │ │ │ │ ├── valid-lowercase-yyyy.json
│ │ │ │ │ ├── valid-uppercase-e-en.json
│ │ │ │ │ ├── valid-uppercase-e-nb.json
│ │ │ │ │ ├── valid-uppercase-e-nn.json
│ │ │ │ │ ├── valid-uppercase-ee-en.json
│ │ │ │ │ ├── valid-uppercase-ee-nb.json
│ │ │ │ │ ├── valid-uppercase-ee-nn.json
│ │ │ │ │ ├── valid-uppercase-eee-en.json
│ │ │ │ │ ├── valid-uppercase-eee-nb.json
│ │ │ │ │ ├── valid-uppercase-eee-nn.json
│ │ │ │ │ ├── valid-uppercase-eeee-en.json
│ │ │ │ │ ├── valid-uppercase-eeee-nb.json
│ │ │ │ │ ├── valid-uppercase-eeee-nn.json
│ │ │ │ │ ├── valid-uppercase-eeeee-en.json
│ │ │ │ │ ├── valid-uppercase-eeeee-nb.json
│ │ │ │ │ ├── valid-uppercase-eeeee-nn.json
│ │ │ │ │ ├── valid-uppercase-g-en.json
│ │ │ │ │ ├── valid-uppercase-g-nb.json
│ │ │ │ │ ├── valid-uppercase-g-nn.json
│ │ │ │ │ ├── valid-uppercase-gg-en.json
│ │ │ │ │ ├── valid-uppercase-gg-nb.json
│ │ │ │ │ ├── valid-uppercase-gg-nn.json
│ │ │ │ │ ├── valid-uppercase-ggg-en.json
│ │ │ │ │ ├── valid-uppercase-ggg-nb.json
│ │ │ │ │ ├── valid-uppercase-ggg-nn.json
│ │ │ │ │ ├── valid-uppercase-gggg-en.json
│ │ │ │ │ ├── valid-uppercase-gggg-nb.json
│ │ │ │ │ ├── valid-uppercase-gggg-nn.json
│ │ │ │ │ ├── valid-uppercase-ggggg-en.json
│ │ │ │ │ ├── valid-uppercase-ggggg-nb.json
│ │ │ │ │ ├── valid-uppercase-ggggg-nn.json
│ │ │ │ │ ├── valid-uppercase-h.json
│ │ │ │ │ ├── valid-uppercase-hh.json
│ │ │ │ │ ├── valid-uppercase-m.json
│ │ │ │ │ ├── valid-uppercase-mm.json
│ │ │ │ │ ├── valid-uppercase-mmm-en.json
│ │ │ │ │ ├── valid-uppercase-mmm-nb.json
│ │ │ │ │ ├── valid-uppercase-mmm-nn.json
│ │ │ │ │ ├── valid-uppercase-mmmm-en.json
│ │ │ │ │ ├── valid-uppercase-mmmm-nb.json
│ │ │ │ │ ├── valid-uppercase-mmmm-nn.json
│ │ │ │ │ ├── valid-uppercase-s.json
│ │ │ │ │ ├── valid-uppercase-ss.json
│ │ │ │ │ └── valid-uppercase-sss.json
│ │ │ │ ├── frontendSettings
│ │ │ │ │ ├── lookup-case-sensitive.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── simple-lookup-equals.json
│ │ │ │ │ ├── simple-lookup-is-null.json
│ │ │ │ │ └── simple-lookup.json
│ │ │ │ ├── greaterThan
│ │ │ │ │ ├── diff-types-bool-float.json
│ │ │ │ │ ├── diff-types-bool-int.json
│ │ │ │ │ ├── diff-types-bool-null.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-false.json
│ │ │ │ │ ├── diff-types-float-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false.json
│ │ │ │ │ ├── diff-types-int-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false3.json
│ │ │ │ │ ├── diff-types-string-bool.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null.json
│ │ │ │ │ ├── diff-types-string-null2.json
│ │ │ │ │ ├── doble-dots-fail-negative.json
│ │ │ │ │ ├── doble-dots-fail.json
│ │ │ │ │ ├── negative-string-float.json
│ │ │ │ │ ├── negative-string-float2.json
│ │ │ │ │ ├── negative-string.json
│ │ │ │ │ ├── negative-string2.json
│ │ │ │ │ ├── no-decimals-fail-negative.json
│ │ │ │ │ ├── no-decimals-fail.json
│ │ │ │ │ ├── same-types-bool.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ └── same-types-string-true.json
│ │ │ │ ├── greaterThanEq
│ │ │ │ │ ├── diff-types-bool-float.json
│ │ │ │ │ ├── diff-types-bool-int.json
│ │ │ │ │ ├── diff-types-bool-null.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-false.json
│ │ │ │ │ ├── diff-types-float-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false.json
│ │ │ │ │ ├── diff-types-int-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false3.json
│ │ │ │ │ ├── diff-types-string-bool.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null.json
│ │ │ │ │ ├── diff-types-string-null2.json
│ │ │ │ │ ├── same-types-bool.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ └── same-types-string-true.json
│ │ │ │ ├── if
│ │ │ │ │ ├── else-otherwise.json
│ │ │ │ │ ├── else-otherwise2.json
│ │ │ │ │ ├── fail-5.json
│ │ │ │ │ ├── fail-else-as-expr.json
│ │ │ │ │ ├── fail-empty-string.json
│ │ │ │ │ ├── fail-string.json
│ │ │ │ │ ├── fail-without-else.json
│ │ │ │ │ ├── fail-without-else2.json
│ │ │ │ │ ├── falsy-0-1.json
│ │ │ │ │ ├── falsy-0-2.json
│ │ │ │ │ ├── never-3-arguments.json
│ │ │ │ │ ├── never-5-arguments.json
│ │ │ │ │ ├── null-otherwise.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ ├── truthy-1-1.json
│ │ │ │ │ └── truthy-1-2.json
│ │ │ │ ├── instanceContext
│ │ │ │ │ ├── instanceOwnerNameOrg.json
│ │ │ │ │ ├── instanceOwnerNamePerson.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── only-dict.json
│ │ │ │ │ ├── partyTypeOrg.json
│ │ │ │ │ ├── partyTypePerson.json
│ │ │ │ │ ├── partyTypeSelfIdentified.json
│ │ │ │ │ ├── partyTypeUnknown.json
│ │ │ │ │ ├── simple-lookup-equals.json
│ │ │ │ │ ├── simple-lookup-is-null.json
│ │ │ │ │ └── simple-lookup.json
│ │ │ │ ├── language
│ │ │ │ │ ├── should-return-nb-if-not-set.json
│ │ │ │ │ └── should-return-profile-settings-preference.json
│ │ │ │ ├── lessThan
│ │ │ │ │ ├── diff-types-bool-float.json
│ │ │ │ │ ├── diff-types-bool-int.json
│ │ │ │ │ ├── diff-types-bool-null.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-false.json
│ │ │ │ │ ├── diff-types-float-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false.json
│ │ │ │ │ ├── diff-types-int-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false3.json
│ │ │ │ │ ├── diff-types-string-bool.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null.json
│ │ │ │ │ ├── diff-types-string-null2.json
│ │ │ │ │ ├── same-types-bool.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ └── same-types-string-true.json
│ │ │ │ ├── lessThanEq
│ │ │ │ │ ├── diff-types-bool-float.json
│ │ │ │ │ ├── diff-types-bool-int.json
│ │ │ │ │ ├── diff-types-bool-null.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-false.json
│ │ │ │ │ ├── diff-types-float-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false.json
│ │ │ │ │ ├── diff-types-int-null-false2.json
│ │ │ │ │ ├── diff-types-int-null-false3.json
│ │ │ │ │ ├── diff-types-string-bool.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null.json
│ │ │ │ │ ├── diff-types-string-null2.json
│ │ │ │ │ ├── same-types-bool.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ └── same-types-string-true.json
│ │ │ │ ├── linkToComponent
│ │ │ │ │ └── linkToComponent.json
│ │ │ │ ├── linkToPage
│ │ │ │ │ ├── linkToPage-stateless.json
│ │ │ │ │ └── linkToPage.json
│ │ │ │ ├── lowerCase
│ │ │ │ │ ├── lowercase-number-should-return-string.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── should-lowercase-string.json
│ │ │ │ │ ├── should-lowercase-whole-string.json
│ │ │ │ │ └── should-lowercase-whole-word.json
│ │ │ │ ├── lowerCaseFirst
│ │ │ │ │ ├── number.json
│ │ │ │ │ ├── simple1.json
│ │ │ │ │ └── simple2.json
│ │ │ │ ├── not
│ │ │ │ │ ├── not-changes-notNull-to-false.json
│ │ │ │ │ ├── not-changes-null-to-true.json
│ │ │ │ │ ├── not-errors-on-numbers-not-0-or-1.json
│ │ │ │ │ ├── not-errors-on-two-arguments.json
│ │ │ │ │ ├── not-errors-on-zero-arguments.json
│ │ │ │ │ ├── not-handles-numeric-zero-as-false.json
│ │ │ │ │ ├── not-inverts-false.json
│ │ │ │ │ └── not-inverts-true.json
│ │ │ │ ├── notContains
│ │ │ │ │ ├── case-sensitivity.json
│ │ │ │ │ ├── exact-match.json
│ │ │ │ │ ├── not-match.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── null2.json
│ │ │ │ │ ├── null3.json
│ │ │ │ │ └── null4.json
│ │ │ │ ├── notEquals
│ │ │ │ │ ├── diff-types-bool-float-true.json
│ │ │ │ │ ├── diff-types-bool-int-true.json
│ │ │ │ │ ├── diff-types-bool-null-true.json
│ │ │ │ │ ├── diff-types-float-int-false.json
│ │ │ │ │ ├── diff-types-float-int-true.json
│ │ │ │ │ ├── diff-types-float-null-true.json
│ │ │ │ │ ├── diff-types-int-null-true.json
│ │ │ │ │ ├── diff-types-string-bool-false.json
│ │ │ │ │ ├── diff-types-string-bool-true.json
│ │ │ │ │ ├── diff-types-string-float-false.json
│ │ │ │ │ ├── diff-types-string-float-true.json
│ │ │ │ │ ├── diff-types-string-int-false.json
│ │ │ │ │ ├── diff-types-string-int-true.json
│ │ │ │ │ ├── diff-types-string-null-false.json
│ │ │ │ │ ├── diff-types-string-null-true.json
│ │ │ │ │ ├── same-types-bool-false.json
│ │ │ │ │ ├── same-types-bool-true.json
│ │ │ │ │ ├── same-types-float-false.json
│ │ │ │ │ ├── same-types-float-true.json
│ │ │ │ │ ├── same-types-int-false.json
│ │ │ │ │ ├── same-types-int-true.json
│ │ │ │ │ ├── same-types-null.json
│ │ │ │ │ ├── same-types-string-false.json
│ │ │ │ │ └── same-types-string-true.json
│ │ │ │ ├── optionLabel
│ │ │ │ │ ├── error-not-found.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ └── translated.json
│ │ │ │ ├── or
│ │ │ │ │ ├── all-true.json
│ │ │ │ │ ├── allows-0.json
│ │ │ │ │ ├── allows-1.json
│ │ │ │ │ ├── allows-stringy-false.json
│ │ │ │ │ ├── allows-stringy-true.json
│ │ │ │ │ ├── disallows-2.json
│ │ │ │ │ ├── disallows-empty-strings.json
│ │ │ │ │ ├── disallows-other-strings.json
│ │ │ │ │ ├── empty-or.json
│ │ │ │ │ ├── last-false.json
│ │ │ │ │ ├── null-is-false.json
│ │ │ │ │ ├── single-input-false.json
│ │ │ │ │ └── single-input-true.json
│ │ │ │ ├── round
│ │ │ │ │ ├── nearest-integer-with-decimal-as-strings.json
│ │ │ │ │ ├── nearest-integer-with-decimal.json
│ │ │ │ │ ├── nearest-integer.json
│ │ │ │ │ ├── round-0-decimal-places.json
│ │ │ │ │ ├── round-0-decimal-places2.json
│ │ │ │ │ ├── round-negative-number.json
│ │ │ │ │ ├── round-null.json
│ │ │ │ │ ├── round-null2.json
│ │ │ │ │ ├── round-strings.json
│ │ │ │ │ ├── round-with-too-many-args.json
│ │ │ │ │ ├── round-without-decimalCount.json
│ │ │ │ │ └── round-without-decimalCount2.json
│ │ │ │ ├── startsWith
│ │ │ │ │ ├── case-sensitivity.json
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── exact-match.json
│ │ │ │ │ ├── not-starts-with.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── null2.json
│ │ │ │ │ ├── number-starts-with-number.json
│ │ │ │ │ ├── number-starts-with-string.json
│ │ │ │ │ ├── start-with-number.json
│ │ │ │ │ └── start-with.json
│ │ │ │ ├── stringIndexOf
│ │ │ │ │ ├── emoji.json
│ │ │ │ │ ├── look-for-null.json
│ │ │ │ │ ├── look-in-null.json
│ │ │ │ │ ├── not-found.json
│ │ │ │ │ ├── number.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ └── whitespace.json
│ │ │ │ ├── stringLength
│ │ │ │ │ ├── empty-string.json
│ │ │ │ │ ├── length-equals.json
│ │ │ │ │ ├── length-of-number.json
│ │ │ │ │ ├── length-of-unicode.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── string-length.json
│ │ │ │ │ └── whitespace-length.json
│ │ │ │ ├── stringReplace
│ │ │ │ │ ├── emoji.json
│ │ │ │ │ ├── multiple.json
│ │ │ │ │ ├── replace-with-null.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ └── special-chars.json
│ │ │ │ ├── stringSlice
│ │ │ │ │ ├── emoji.json
│ │ │ │ │ ├── emoji2.json
│ │ │ │ │ ├── end-before-start.json
│ │ │ │ │ ├── end-too-large.json
│ │ │ │ │ ├── error-together.json
│ │ │ │ │ ├── negative-end.json
│ │ │ │ │ ├── negative-start.json
│ │ │ │ │ ├── simple.json
│ │ │ │ │ ├── start-before-length.json
│ │ │ │ │ ├── start-too-large.json
│ │ │ │ │ └── together.json
│ │ │ │ ├── text
│ │ │ │ │ ├── lookup-from-multiple-sources.json
│ │ │ │ │ ├── lookup-instance-data.json
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── should-return-key-name-if-key-not-exist.json
│ │ │ │ │ ├── should-return-text-resource-with-variable-in-rep-group-no-index-markers.json
│ │ │ │ │ ├── should-return-text-resource-with-variable-in-rep-group.json
│ │ │ │ │ ├── should-return-text-resource-with-variable.json
│ │ │ │ │ ├── should-return-text-resource.json
│ │ │ │ │ ├── unknown-data-source-returns-null.json
│ │ │ │ │ └── use-default-when-dataModel-null.json
│ │ │ │ ├── unknown
│ │ │ │ │ ├── appSettings.json
│ │ │ │ │ ├── function-wrong-case.json
│ │ │ │ │ └── invalid-function.json
│ │ │ │ ├── upperCase
│ │ │ │ │ ├── null.json
│ │ │ │ │ ├── should-uppercase-string.json
│ │ │ │ │ ├── should-uppercase-whole-string.json
│ │ │ │ │ ├── should-uppercase-whole-word.json
│ │ │ │ │ └── uppercase-number-should-return-string.json
│ │ │ │ ├── upperCaseFirst
│ │ │ │ │ ├── number.json
│ │ │ │ │ ├── simple1.json
│ │ │ │ │ └── simple2.json
│ │ │ │ └── value
│ │ │ │ │ ├── error-invalid-key.json
│ │ │ │ │ ├── explicit-default-key.json
│ │ │ │ │ ├── implicit-default-value.json
│ │ │ │ │ └── other-key.json
│ │ │ └── invalid
│ │ │ │ ├── empty-array-inside.json
│ │ │ │ ├── empty-array.json
│ │ │ │ ├── empty-object.json
│ │ │ │ ├── extra-argument.json
│ │ │ │ ├── func-not-implemented.json
│ │ │ │ ├── missing-args.json
│ │ │ │ ├── numeric-array.json
│ │ │ │ └── wrong-function-capitalization.json
│ │ ├── shared.ts
│ │ ├── types.ts
│ │ ├── validation.test.ts
│ │ └── validation.ts
│ ├── externalApi
│ │ └── useExternalApi.ts
│ ├── footer
│ │ ├── Footer.module.css
│ │ ├── Footer.tsx
│ │ ├── components
│ │ │ ├── FooterComponentWrapper.module.css
│ │ │ ├── FooterComponentWrapper.tsx
│ │ │ ├── FooterEmail.tsx
│ │ │ ├── FooterLink.tsx
│ │ │ ├── FooterPhone.tsx
│ │ │ ├── FooterText.tsx
│ │ │ ├── index.ts
│ │ │ └── shared
│ │ │ │ ├── FooterGenericLink.tsx
│ │ │ │ └── FooterIcon.tsx
│ │ └── types.ts
│ ├── form
│ │ ├── FormContext.tsx
│ │ ├── dynamics
│ │ │ ├── DynamicsContext.tsx
│ │ │ ├── HiddenComponentsProvider.tsx
│ │ │ └── index.ts
│ │ ├── layout
│ │ │ ├── LayoutsContext.tsx
│ │ │ ├── NavigateToNode.tsx
│ │ │ ├── PageNavigationContext.tsx
│ │ │ ├── UiConfigContext.tsx
│ │ │ ├── cleanLayout.ts
│ │ │ ├── component-verification.test.ts
│ │ │ ├── makeLayoutLookups.ts
│ │ │ ├── quirks.ts
│ │ │ └── utils
│ │ │ │ ├── makeIndexedId.test.ts
│ │ │ │ ├── makeIndexedId.ts
│ │ │ │ └── repeating.ts
│ │ ├── layoutSets
│ │ │ ├── LayoutSetsProvider.tsx
│ │ │ └── useCurrentLayoutSet.ts
│ │ ├── layoutSettings
│ │ │ ├── LayoutSettingsContext.test.tsx
│ │ │ └── LayoutSettingsContext.tsx
│ │ └── rules
│ │ │ └── RulesContext.tsx
│ ├── formData
│ │ ├── FormData.test.tsx
│ │ ├── FormDataReaders.test.tsx
│ │ ├── FormDataReaders.tsx
│ │ ├── FormDataWrite.tsx
│ │ ├── FormDataWriteProxies.tsx
│ │ ├── FormDataWriteStateMachine.tsx
│ │ ├── InvalidSubformLayoutException.ts
│ │ ├── LegacyRules.ts
│ │ ├── MissingRowIdException.ts
│ │ ├── MissingRowIdView.tsx
│ │ ├── convertData.ts
│ │ ├── jsonPatch
│ │ │ ├── createPatch.test.ts
│ │ │ ├── createPatch.ts
│ │ │ └── types.ts
│ │ ├── types.ts
│ │ ├── useDataModelBindings.test.tsx
│ │ ├── useDataModelBindings.ts
│ │ └── useFormDataQuery.tsx
│ ├── instance
│ │ ├── InstanceContext.tsx
│ │ ├── ProcessContext.tsx
│ │ ├── instanceUtils.ts
│ │ ├── useProcessNext.tsx
│ │ └── useProcessTaskId.ts
│ ├── instantiate
│ │ ├── InstantiationContext.tsx
│ │ ├── InstantiationError.tsx
│ │ ├── containers
│ │ │ ├── ForbiddenError.tsx
│ │ │ ├── InstantiateContainer.tsx
│ │ │ ├── InstantiateValidationError.tsx
│ │ │ ├── InstantiationContainer.module.css
│ │ │ ├── InstantiationContainer.tsx
│ │ │ ├── InstantiationErrorPage.tsx
│ │ │ ├── InvalidSubformLayoutError.tsx
│ │ │ ├── MissingRolesError.tsx
│ │ │ ├── NoValidPartiesError.tsx
│ │ │ ├── PartySelection.module.css
│ │ │ ├── PartySelection.test.tsx
│ │ │ ├── PartySelection.tsx
│ │ │ ├── UnknownError.test.tsx
│ │ │ └── UnknownError.tsx
│ │ ├── instantiateHeader
│ │ │ ├── InstantiateHeader.module.css
│ │ │ ├── InstantiateHeader.test.tsx
│ │ │ └── InstantiateHeader.tsx
│ │ ├── selection
│ │ │ ├── ActiveInstancesProvider.tsx
│ │ │ ├── InstanceSelection.module.css
│ │ │ ├── InstanceSelection.test.tsx
│ │ │ └── InstanceSelection.tsx
│ │ └── useInstantiateWithPrefillMutation.ts
│ ├── language
│ │ ├── Lang.test.tsx
│ │ ├── Lang.tsx
│ │ ├── LangDataSourcesProvider.tsx
│ │ ├── LangToolsStore.tsx
│ │ ├── LanguageProvider.tsx
│ │ ├── textResources
│ │ │ ├── TextResourcesProvider.tsx
│ │ │ ├── index.ts
│ │ │ ├── resourcesAsMap.ts
│ │ │ └── useGetAppLanguagesQuery.ts
│ │ ├── useLanguage.test.tsx
│ │ └── useLanguage.ts
│ ├── logging.ts
│ ├── navigation
│ │ ├── AppNavigation.module.css
│ │ ├── AppNavigation.test.tsx
│ │ ├── AppNavigation.tsx
│ │ ├── PopoverNavigation.module.css
│ │ ├── PopoverNavigation.tsx
│ │ ├── SidebarNavigation.module.css
│ │ ├── SidebarNavigation.tsx
│ │ ├── components
│ │ │ ├── Page.module.css
│ │ │ ├── Page.tsx
│ │ │ ├── PageGroup.module.css
│ │ │ ├── PageGroup.tsx
│ │ │ ├── SubformsForPage.module.css
│ │ │ ├── SubformsForPage.tsx
│ │ │ ├── TaskGroup.module.css
│ │ │ └── TaskGroup.tsx
│ │ └── utils.ts
│ ├── options
│ │ ├── CodeListsProvider.tsx
│ │ ├── OptionsPlugin.tsx
│ │ ├── OptionsStorePlugin.tsx
│ │ ├── StoreOptionsInNode.tsx
│ │ ├── castOptionsToStrings.ts
│ │ ├── effects
│ │ │ ├── EffectPreselectedOptionIndex.tsx
│ │ │ ├── EffectRemoveStaleValues.tsx
│ │ │ ├── EffectSetDownstreamParameters.tsx
│ │ │ ├── EffectStoreLabel.tsx
│ │ │ └── EffectStoreLabelInGroup.tsx
│ │ ├── evalQueryParameters.ts
│ │ ├── getCommaSeparatedOptionsToText.ts
│ │ ├── getSelectedValueToText.ts
│ │ ├── useGetOptions.test.tsx
│ │ ├── useGetOptions.ts
│ │ ├── useGetOptionsQuery.ts
│ │ ├── useNodeOptions.ts
│ │ └── useSourceOptions.ts
│ ├── orgs
│ │ └── OrgsProvider.tsx
│ ├── party
│ │ ├── PartiesProvider.tsx
│ │ └── partyUtils.ts
│ ├── payment
│ │ ├── OrderDetailsProvider.tsx
│ │ ├── PaymentInformationProvider.tsx
│ │ ├── PaymentProvider.tsx
│ │ ├── types.ts
│ │ ├── usePerformPaymentMutation.ts
│ │ └── utils.ts
│ ├── pdf
│ │ ├── PDFView.module.css
│ │ ├── PDFWrapper.test.tsx
│ │ ├── PDFWrapper.tsx
│ │ ├── PdfView2.tsx
│ │ ├── types.ts
│ │ └── usePdfFormatQuery.ts
│ ├── processEnd
│ │ ├── confirm
│ │ │ ├── containers
│ │ │ │ ├── Confirm.test.tsx
│ │ │ │ ├── Confirm.tsx
│ │ │ │ ├── ConfirmPage.test.tsx
│ │ │ │ └── ConfirmPage.tsx
│ │ │ └── helpers
│ │ │ │ ├── returnConfirmSummaryObject.test.ts
│ │ │ │ └── returnConfirmSummaryObject.ts
│ │ └── feedback
│ │ │ └── Feedback.tsx
│ ├── profile
│ │ └── ProfileProvider.tsx
│ ├── propagateTraceWhenPdf
│ │ └── index.ts
│ ├── receipt
│ │ ├── ReceiptContainer.test.tsx
│ │ └── ReceiptContainer.tsx
│ ├── routing
│ │ └── AppRoutingContext.tsx
│ ├── saveToGroup
│ │ ├── ObjectToGroupLayoutValidator.tsx
│ │ ├── layoutValidation.ts
│ │ ├── useSaveToGroup.ts
│ │ └── useValidateGroupIsEmpty.ts
│ ├── stateless
│ │ ├── getAllowAnonymous.test.tsx
│ │ └── getAllowAnonymous.ts
│ ├── styleInjection.ts
│ ├── subformData
│ │ └── useSubformMutations.tsx
│ ├── toggles.ts
│ └── validation
│ │ ├── ComponentValidations.tsx
│ │ ├── StoreValidationsInNode.tsx
│ │ ├── ValidationPlugin.test.tsx
│ │ ├── ValidationPlugin.tsx
│ │ ├── ValidationStorePlugin.tsx
│ │ ├── backendValidation
│ │ ├── BackendValidation.tsx
│ │ ├── backendValidationQuery.ts
│ │ ├── backendValidationUtils.ts
│ │ └── validationTexts.ts
│ │ ├── callbacks
│ │ ├── onAttachmentSave.ts
│ │ ├── onFormSubmitValidation.ts
│ │ ├── onGroupCloseValidation.ts
│ │ └── onPageNavigationValidation.ts
│ │ ├── expressionValidation
│ │ ├── ExpressionValidation.test.tsx
│ │ ├── ExpressionValidation.tsx
│ │ └── shared-expression-validation-tests
│ │ │ ├── many-errors-direct.json
│ │ │ ├── many-errors.json
│ │ │ ├── nested-repeating.json
│ │ │ ├── override.json
│ │ │ ├── repeating-direct.json
│ │ │ ├── repeating.json
│ │ │ ├── single-field-equals.json
│ │ │ ├── value-function.json
│ │ │ └── warning.json
│ │ ├── index.ts
│ │ ├── invalidDataValidation
│ │ └── InvalidDataValidation.tsx
│ │ ├── nodeValidation
│ │ ├── emptyFieldValidation.ts
│ │ ├── useNodeValidation.ts
│ │ └── waitForNodesToValidate.ts
│ │ ├── schemaValidation
│ │ ├── SchemaValidation.test.tsx
│ │ ├── SchemaValidation.tsx
│ │ ├── schemaValidationUtils.test.ts
│ │ └── schemaValidationUtils.ts
│ │ ├── selectors
│ │ ├── attachmentValidations.ts
│ │ ├── bindingValidationsForNode.ts
│ │ ├── componentValidationsForNode.ts
│ │ ├── deepValidationsForNode.ts
│ │ ├── isValid.ts
│ │ ├── taskErrors.ts
│ │ └── unifiedValidationsForNode.ts
│ │ ├── utils.ts
│ │ └── validationContext.tsx
├── global.ts
├── globalSetup.ts
├── hooks
│ ├── delayedSelectors.test.tsx
│ ├── delayedSelectors.ts
│ ├── queries
│ │ └── usePostPlaceQuery.ts
│ ├── useAppLogo.ts
│ ├── useAsRef.ts
│ ├── useDeviceWidths.ts
│ ├── useEffectEvent.ts
│ ├── useIsPdf.ts
│ ├── useLocalStorageState.ts
│ ├── useMapToReactNumberConfig.ts
│ ├── useNavigatePage.ts
│ ├── useShallowMemo.ts
│ ├── useStateDeepEqual.test.tsx
│ ├── useStateDeepEqual.ts
│ ├── useWaitForState.test.tsx
│ └── useWaitForState.ts
├── index.css
├── index.tsx
├── language
│ ├── eslint.js
│ ├── languages.ts
│ ├── sharedLanguage.test.ts
│ ├── sharedLanguage.ts
│ └── texts
│ │ ├── en.ts
│ │ ├── nb.ts
│ │ └── nn.ts
├── layout
│ ├── Accordion
│ │ ├── Accordion.module.css
│ │ ├── Accordion.test.tsx
│ │ ├── Accordion.tsx
│ │ ├── AccordionItem.tsx
│ │ ├── SummaryAccordion.module.css
│ │ ├── SummaryAccordion.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── AccordionGroup
│ │ ├── AccordionGroup.tsx
│ │ ├── AccordionGroupContext.tsx
│ │ ├── SummaryAccordionGroupComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── ActionButton
│ │ ├── ActionButtonComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── AddToList
│ │ ├── AddToList.tsx
│ │ ├── AddToListFeatureFlagLayoutValidator.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Address
│ │ ├── AddressComponent.module.css
│ │ ├── AddressComponent.test.tsx
│ │ ├── AddressComponent.tsx
│ │ ├── AddressSummary
│ │ │ ├── AddressSummary.module.css
│ │ │ └── AddressSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── useAddressValidation.ts
│ ├── Alert
│ │ ├── Alert.module.css
│ │ ├── Alert.test.tsx
│ │ ├── Alert.tsx
│ │ ├── AlertBaseComponent.test.tsx
│ │ ├── AlertBaseComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── AttachmentList
│ │ ├── AttachmentListComponent.test.tsx
│ │ ├── AttachmentListComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Audio
│ │ ├── Audio.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Button
│ │ ├── ButtonComponent.tsx
│ │ ├── config.ts
│ │ ├── getComponentFromMode.ts
│ │ └── index.tsx
│ ├── ButtonGroup
│ │ ├── ButtonGroupComponent.module.css
│ │ ├── ButtonGroupComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Cards
│ │ ├── CardContext.tsx
│ │ ├── Cards.module.css
│ │ ├── Cards.tsx
│ │ ├── CardsPlugin.tsx
│ │ ├── CardsSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Checkboxes
│ │ ├── CheckboxesContainerComponent.module.css
│ │ ├── CheckboxesContainerComponent.test.tsx
│ │ ├── CheckboxesContainerComponent.tsx
│ │ ├── CheckboxesContainerComponentSummary.module.css
│ │ ├── CheckboxesSummary.module.css
│ │ ├── CheckboxesSummary.tsx
│ │ ├── MultipleChoiceSummary.module.css
│ │ ├── MultipleChoiceSummary.tsx
│ │ ├── WrappedCheckbox.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── ComponentStructureWrapper.tsx
│ ├── Custom
│ │ ├── CustomWebComponent.test.tsx
│ │ ├── CustomWebComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── CustomButton
│ │ ├── CustomButtonComponent.test.tsx
│ │ ├── CustomButtonComponent.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── typeHelpers.ts
│ ├── Date
│ │ ├── DateComponent.tsx
│ │ ├── DateSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Datepicker
│ │ ├── DatepickerComponent.test.tsx
│ │ ├── DatepickerComponent.tsx
│ │ ├── DatepickerSummary.tsx
│ │ ├── DropdownCaption.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── useDatepickerValidation.ts
│ ├── Divider
│ │ ├── DividerComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Dropdown
│ │ ├── DropdownComponent.test.tsx
│ │ ├── DropdownComponent.tsx
│ │ ├── DropdownSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── FileUpload
│ │ ├── AttachmentSummaryComponent2.tsx
│ │ ├── DropZone
│ │ │ ├── DropzoneComponent.module.css
│ │ │ ├── DropzoneComponent.test.tsx
│ │ │ ├── DropzoneComponent.tsx
│ │ │ ├── mapExtensionToAcceptMime.test.ts
│ │ │ └── mapExtensionToAcceptMime.ts
│ │ ├── Error
│ │ │ ├── FailedAttachments.module.css
│ │ │ └── FailedAttachments.tsx
│ │ ├── FileUploadComponent.module.css
│ │ ├── FileUploadComponent.test.tsx
│ │ ├── FileUploadComponent.tsx
│ │ ├── FileUploadLayoutValidator.tsx
│ │ ├── FileUploadTable
│ │ │ ├── AttachmentFileName.module.css
│ │ │ ├── AttachmentFileName.tsx
│ │ │ ├── FileTable.tsx
│ │ │ ├── FileTableButtons.tsx
│ │ │ ├── FileTableComponent.module.css
│ │ │ ├── FileTableRow.module.css
│ │ │ ├── FileTableRow.tsx
│ │ │ └── FileTableRowContext.tsx
│ │ ├── RejectedFileError.ts
│ │ ├── Summary
│ │ │ ├── AttachmentSummaryComponent.module.css
│ │ │ ├── AttachmentSummaryComponent.tsx
│ │ │ ├── AttachmentWithTagSummaryComponent.test.tsx
│ │ │ └── summary.ts
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── useValidateMinNumberOfAttachments.ts
│ │ └── utils
│ │ │ ├── fileEndings.test.ts
│ │ │ └── fileEndings.ts
│ ├── FileUploadWithTag
│ │ ├── EditWindowComponent.module.css
│ │ ├── EditWindowComponent.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── useValidateMissingTag.ts
│ ├── FormComponentContext.tsx
│ ├── GenericComponent.module.css
│ ├── GenericComponent.test.tsx
│ ├── GenericComponent.tsx
│ ├── Grid
│ │ ├── Grid.module.css
│ │ ├── GridComponent.tsx
│ │ ├── GridRowsPlugin.tsx
│ │ ├── GridSummary.module.css
│ │ ├── GridSummary.tsx
│ │ ├── GridSummaryComponent.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── tools.ts
│ │ └── types.ts
│ ├── Group
│ │ ├── GroupComponent.module.css
│ │ ├── GroupComponent.tsx
│ │ ├── GroupSummary.module.css
│ │ ├── GroupSummary.tsx
│ │ ├── SummaryGroupComponent.module.css
│ │ ├── SummaryGroupComponent.test.tsx
│ │ ├── SummaryGroupComponent.tsx
│ │ ├── __snapshots__
│ │ │ └── SummaryGroupComponent.test.tsx.snap
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Header
│ │ ├── HeaderComponent.test.tsx
│ │ ├── HeaderComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── IFrame
│ │ ├── IFrameComponent.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── utils.test.ts
│ │ └── utils.ts
│ ├── Image
│ │ ├── ImageComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Input
│ │ ├── InputComponent.module.css
│ │ ├── InputComponent.test.tsx
│ │ ├── InputComponent.tsx
│ │ ├── InputSummary.tsx
│ │ ├── config.ts
│ │ ├── formatting.ts
│ │ ├── index.tsx
│ │ └── number-format-helpers.ts
│ ├── InstanceInformation
│ │ ├── InstanceInformationComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── InstantiationButton
│ │ ├── InstantiationButton.module.css
│ │ ├── InstantiationButton.test.tsx
│ │ ├── InstantiationButton.tsx
│ │ ├── InstantiationButtonComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── LayoutComponent.tsx
│ ├── Likert
│ │ ├── Generator
│ │ │ ├── LikertGeneratorChildren.tsx
│ │ │ └── LikertRowsPlugin.tsx
│ │ ├── LikertComponent.test.tsx
│ │ ├── LikertComponent.tsx
│ │ ├── LikertTestUtils.tsx
│ │ ├── Summary
│ │ │ ├── LargeLikertSummaryContainer.tsx
│ │ │ ├── LikertSummaryComponent.module.css
│ │ │ └── LikertSummaryComponent.tsx
│ │ ├── Summary2
│ │ │ ├── LikertSummary.module.css
│ │ │ └── LikertSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── LikertItem
│ │ ├── LikertItemComponent.module.css
│ │ ├── LikertItemComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Link
│ │ ├── LinkComponent.test.tsx
│ │ ├── LinkComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── List
│ │ ├── ListComponent.module.css
│ │ ├── ListComponent.test.tsx
│ │ ├── ListComponent.tsx
│ │ ├── ListSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Map
│ │ ├── Map.tsx
│ │ ├── MapComponent.module.css
│ │ ├── MapComponent.test.tsx
│ │ ├── MapComponent.tsx
│ │ ├── MapComponentSummary.tsx
│ │ ├── Summary2
│ │ │ ├── MapSummary.module.css
│ │ │ └── MapSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── types.ts
│ │ └── utils.ts
│ ├── MultipleSelect
│ │ ├── MultipleSelectComponent.test.tsx
│ │ ├── MultipleSelectComponent.tsx
│ │ ├── MultipleSelectSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── NavigationBar
│ │ ├── NavigationBarComponent.module.css
│ │ ├── NavigationBarComponent.test.tsx
│ │ ├── NavigationBarComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── NavigationButtons
│ │ ├── NavigationButtonsComponent.module.css
│ │ ├── NavigationButtonsComponent.test.tsx
│ │ ├── NavigationButtonsComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Number
│ │ ├── NumberComponent.tsx
│ │ ├── NumberSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Option
│ │ ├── Option.module.css
│ │ ├── OptionComponent.tsx
│ │ ├── OptionSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── OrganisationLookup
│ │ ├── OrganisationLookupComponent.module.css
│ │ ├── OrganisationLookupComponent.tsx
│ │ ├── OrganisationLookupSummary.module.css
│ │ ├── OrganisationLookupSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── validation.test.ts
│ │ └── validation.ts
│ ├── PDFPreviewButton
│ │ ├── PDFPreviewButtonComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Panel
│ │ ├── PanelComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Paragraph
│ │ ├── ParagraphComponent.module.css
│ │ ├── ParagraphComponent.test.tsx
│ │ ├── ParagraphComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Payment
│ │ ├── PaymentComponent.module.css
│ │ ├── PaymentComponent.tsx
│ │ ├── PaymentReceiptDetails
│ │ │ ├── PaymentReceiptDetails.module.css
│ │ │ └── PaymentReceiptDetails.tsx
│ │ ├── PaymentSummary.tsx
│ │ ├── SkeletonLoader
│ │ │ ├── SkeletonLoader.module.css
│ │ │ ├── SkeletonLoader.tsx
│ │ │ └── index.tsx
│ │ ├── SummaryPaymentComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── PaymentDetails
│ │ ├── PaymentDetailsComponent.tsx
│ │ ├── PaymentDetailsTable.module.css
│ │ ├── PaymentDetailsTable.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── PersonLookup
│ │ ├── PersonLookupComponent.module.css
│ │ ├── PersonLookupComponent.tsx
│ │ ├── PersonLookupSummary.module.css
│ │ ├── PersonLookupSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── validation.test.ts
│ │ └── validation.ts
│ ├── PrintButton
│ │ ├── PrintButtonComponent.test.tsx
│ │ ├── PrintButtonComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── RadioButtons
│ │ ├── ControlledRadioGroup.test.tsx
│ │ ├── ControlledRadioGroup.tsx
│ │ ├── RadioButtonsSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── radioButtonsUtils.ts
│ ├── RepeatingGroup
│ │ ├── Container
│ │ │ ├── RepeatingGroupContainer.module.css
│ │ │ ├── RepeatingGroupContainer.test.tsx
│ │ │ └── RepeatingGroupContainer.tsx
│ │ ├── EditContainer
│ │ │ ├── RepeatingGroupEditContainer.test.tsx
│ │ │ ├── RepeatingGroupEditContext.tsx
│ │ │ └── RepeatingGroupsEditContainer.tsx
│ │ ├── Pagination
│ │ │ ├── RepeatingGroupPagination.module.css
│ │ │ └── RepeatingGroupPagination.tsx
│ │ ├── Providers
│ │ │ ├── OpenByDefaultProvider.test.tsx
│ │ │ ├── OpenByDefaultProvider.tsx
│ │ │ ├── RepeatingGroupContext.tsx
│ │ │ └── RepeatingGroupFocusContext.tsx
│ │ ├── RepeatingGroup.module.css
│ │ ├── Summary
│ │ │ ├── LargeGroupSummaryContainer.module.css
│ │ │ ├── LargeGroupSummaryContainer.tsx
│ │ │ ├── SummaryRepeatingGroup.module.css
│ │ │ ├── SummaryRepeatingGroup.test.tsx
│ │ │ ├── SummaryRepeatingGroup.tsx
│ │ │ └── __snapshots__
│ │ │ │ └── SummaryRepeatingGroup.test.tsx.snap
│ │ ├── Summary2
│ │ │ ├── RepeatingGroupSummary.module.css
│ │ │ ├── RepeatingGroupSummary.tsx
│ │ │ └── RepeatingGroupTableSummary
│ │ │ │ ├── RepeatingGroupTableSummary.module.css
│ │ │ │ ├── RepeatingGroupTableSummary.test.tsx
│ │ │ │ └── RepeatingGroupTableSummary.tsx
│ │ ├── Table
│ │ │ ├── RepeatingGroupTable.test.tsx
│ │ │ ├── RepeatingGroupTable.tsx
│ │ │ ├── RepeatingGroupTableRow.tsx
│ │ │ └── RepeatingGroupTableTitle.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── types.ts
│ │ ├── useTableComponentIds.ts
│ │ └── useValidateRepGroupMinCount.ts
│ ├── SigneeList
│ │ ├── SigneeListComponent.module.css
│ │ ├── SigneeListComponent.test.tsx
│ │ ├── SigneeListComponent.tsx
│ │ ├── SigneeListError.tsx
│ │ ├── SigneeListSummary.module.css
│ │ ├── SigneeListSummary.test.tsx
│ │ ├── SigneeListSummary.tsx
│ │ ├── SigneeStateTag.test.tsx
│ │ ├── SigneeStateTag.tsx
│ │ ├── api.test.ts
│ │ ├── api.ts
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── SigningActions
│ │ ├── OnBehalfOfChooser.tsx
│ │ ├── PanelAwaitingCurrentUserSignature.tsx
│ │ ├── PanelAwaitingOtherSignatures.tsx
│ │ ├── PanelNoActionRequired.tsx
│ │ ├── PanelSigning.tsx
│ │ ├── PanelSubmit.tsx
│ │ ├── SigningActions.module.css
│ │ ├── SigningActionsComponent.test.tsx
│ │ ├── SigningActionsComponent.tsx
│ │ ├── SubmitSigningButton.tsx
│ │ ├── api.ts
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── utils.test.ts
│ │ └── utils.ts
│ ├── SigningDocumentList
│ │ ├── SigningDocumentListComponent.test.tsx
│ │ ├── SigningDocumentListComponent.tsx
│ │ ├── SigningDocumentListError.tsx
│ │ ├── api.ts
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── SimpleTable
│ │ ├── ApiTable.tsx
│ │ ├── SimpleTableComponent.tsx
│ │ ├── SimpleTableFeatureFlagLayoutValidator.tsx
│ │ ├── SimpleTableSummary.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ └── typeguards.ts
│ ├── Subform
│ │ ├── SubformCellContent.tsx
│ │ ├── SubformComponent.module.css
│ │ ├── SubformComponent.tsx
│ │ ├── SubformValidator.tsx
│ │ ├── SubformWrapper.tsx
│ │ ├── Summary
│ │ │ ├── SubformSummaryComponent.module.css
│ │ │ ├── SubformSummaryComponent.tsx
│ │ │ ├── SubformSummaryComponent2.module.css
│ │ │ ├── SubformSummaryComponent2.tsx
│ │ │ └── SubformSummaryTable.tsx
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── useValidateSubform.ts
│ │ └── utils.ts
│ ├── Summary
│ │ ├── EditButton.module.css
│ │ ├── EditButton.tsx
│ │ ├── SummaryComponent.module.css
│ │ ├── SummaryComponent.test.tsx
│ │ ├── SummaryComponent.tsx
│ │ ├── SummaryContent.module.css
│ │ ├── SummaryContent.tsx
│ │ ├── SummaryItemCompact.module.css
│ │ ├── SummaryItemCompact.tsx
│ │ ├── SummaryItemSimple.module.css
│ │ ├── SummaryItemSimple.tsx
│ │ ├── ValidateSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Summary2
│ │ ├── CommonSummaryComponents
│ │ │ ├── EditButton.tsx
│ │ │ ├── LayoutSetSummaryAccordion.module.css
│ │ │ ├── LayoutSetSummaryAccordion.tsx
│ │ │ ├── MultipleValueSummary.module.css
│ │ │ ├── MultipleValueSummary.tsx
│ │ │ ├── SingleValueSummary.module.css
│ │ │ └── SingleValueSummary.tsx
│ │ ├── Summary2.module.css
│ │ ├── SummaryComponent2
│ │ │ ├── ComponentSummary.tsx
│ │ │ ├── LayoutSetSummary.tsx
│ │ │ ├── LayoutValidator.tsx
│ │ │ ├── PageSummary.tsx
│ │ │ ├── SummaryComponent2.test.tsx
│ │ │ ├── SummaryComponent2.tsx
│ │ │ ├── TaskSummaryWrapper.tsx
│ │ │ └── types.ts
│ │ ├── config.ts
│ │ ├── index.tsx
│ │ ├── isEmpty
│ │ │ ├── EmptyChildrenContext.tsx
│ │ │ └── isEmptyComponent.ts
│ │ └── summaryStoreContext.tsx
│ ├── Tabs
│ │ ├── Tabs.module.css
│ │ ├── Tabs.tsx
│ │ ├── TabsPlugin.tsx
│ │ ├── TabsSummary.module.css
│ │ ├── TabsSummary.tsx
│ │ ├── TabsSummaryComponent.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Text
│ │ ├── TextComponent.tsx
│ │ ├── TextSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── TextArea
│ │ ├── TextAreaComponent.test.tsx
│ │ ├── TextAreaComponent.tsx
│ │ ├── TextAreaSummary.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── Video
│ │ ├── Video.tsx
│ │ ├── config.ts
│ │ └── index.tsx
│ ├── common.ts
│ ├── index.ts
│ └── layout.ts
├── modules.ts
├── queries
│ ├── appPrefetcher.ts
│ ├── formPrefetcher.ts
│ ├── partyPrefetcher.ts
│ ├── queries.ts
│ └── types.ts
├── setupTests.ts
├── styles
│ ├── combobox.module.css
│ ├── print.module.css
│ ├── shared.css
│ └── utils.module.css
├── test
│ ├── allApps.ts
│ ├── jestTools
│ │ ├── transformCss.js
│ │ └── transformFile.js
│ ├── mockMediaQuery.tsx
│ ├── renderWithProviders.tsx
│ └── routerUtils.tsx
├── theme
│ └── altinnAppTheme.tsx
├── types
│ ├── index.ts
│ └── shared.ts
└── utils
│ ├── attachmentsUtils.test.ts
│ ├── attachmentsUtils.ts
│ ├── authContext.ts
│ ├── bodyStyling.ts
│ ├── cachedFunction.ts
│ ├── databindings.test.ts
│ ├── databindings.ts
│ ├── databindings
│ └── DataBinding.ts
│ ├── dateUtils.test.ts
│ ├── dateUtils.ts
│ ├── formComponentUtils.test.ts
│ ├── formComponentUtils.ts
│ ├── formLayout.test.ts
│ ├── formLayout.ts
│ ├── formattingUtils.test.ts
│ ├── formattingUtils.ts
│ ├── getPageTitle.ts
│ ├── inputUtils.tsx
│ ├── instanceDataSources.test.ts
│ ├── instanceDataSources.ts
│ ├── instanceIdRegExp.test.ts
│ ├── instanceIdRegExp.ts
│ ├── isAxiosError.ts
│ ├── isDev.test.ts
│ ├── isDev.ts
│ ├── layout
│ ├── ComponentErrorBoundary.tsx
│ ├── DataModelLocation.tsx
│ ├── LayoutNode.ts
│ ├── LayoutPage.ts
│ ├── LayoutPages.ts
│ ├── NodesContext.tsx
│ ├── all.test.tsx
│ ├── generator
│ │ ├── CommitQueue.tsx
│ │ ├── GeneratorContext.tsx
│ │ ├── GeneratorDataSources.tsx
│ │ ├── GeneratorErrorBoundary.tsx
│ │ ├── GeneratorStages.tsx
│ │ ├── LayoutSetGenerator.tsx
│ │ ├── NodeGenerator.tsx
│ │ ├── NodeRepeatingChildren.tsx
│ │ ├── debug.ts
│ │ ├── useEvalExpression.ts
│ │ └── validation
│ │ │ ├── GenerationValidationContext.tsx
│ │ │ └── NodePropertiesValidation.tsx
│ ├── index.test.tsx
│ ├── index.tsx
│ ├── plugins
│ │ ├── NodeDataPlugin.tsx
│ │ ├── NodeDefPlugin.tsx
│ │ ├── NonRepeatingChildrenPlugin.tsx
│ │ ├── RepeatingChildrenPlugin.tsx
│ │ └── RepeatingChildrenStorePlugin.tsx
│ ├── schema.test.ts
│ ├── types.ts
│ ├── useDataModelBindingTranspose.ts
│ ├── useExpressionDataSources.ts
│ ├── useLabel.tsx
│ └── useNodeItem.ts
│ ├── maybeAuthenticationRedirect.ts
│ ├── network
│ ├── networking.ts
│ └── sharedNetworking.ts
│ ├── options.ts
│ ├── schemaUtils.test.ts
│ ├── schemaUtils.ts
│ ├── splitDashedKey.ts
│ ├── stringHelper.test.ts
│ ├── stringHelper.ts
│ ├── typing.ts
│ ├── urls
│ ├── appUrlHelper.test.ts
│ ├── appUrlHelper.ts
│ ├── urlHelper.test.ts
│ └── urlHelper.ts
│ ├── useGetKeyFromObject.ts
│ ├── versionCompare.test.ts
│ ├── versionCompare.ts
│ └── waitForAnimationFrames.ts
├── template.env
├── test
├── .gitignore
├── README.md
├── e2e
│ ├── config
│ │ ├── docker.json
│ │ ├── podman.json
│ │ └── tt02.json
│ ├── fixtures
│ │ ├── attachment.json
│ │ ├── map-tile.png
│ │ ├── test-invalid.pdf
│ │ ├── test.pdf
│ │ ├── test.png
│ │ └── texts.json
│ ├── integration
│ │ ├── anonymous-stateless-app
│ │ │ ├── anonymous.ts
│ │ │ ├── auto-save-behavior.ts
│ │ │ ├── options.ts
│ │ │ └── validation.ts
│ │ ├── component-library
│ │ │ ├── address.ts
│ │ │ ├── button.ts
│ │ │ ├── checkboxes.ts
│ │ │ ├── date-formatDate.ts
│ │ │ ├── divider.ts
│ │ │ ├── dropdown.ts
│ │ │ ├── fileupload-attachmentlist.ts
│ │ │ ├── grid.ts
│ │ │ ├── group.ts
│ │ │ ├── input.ts
│ │ │ ├── link.ts
│ │ │ ├── list.ts
│ │ │ ├── multiple-select.ts
│ │ │ ├── organisationlookup.ts
│ │ │ ├── pdf.ts
│ │ │ ├── personlookup.ts
│ │ │ ├── radio-buttons.ts
│ │ │ ├── repeating-group.ts
│ │ │ ├── summary-of-previous-task.ts
│ │ │ ├── text-area.ts
│ │ │ └── title-tag-updates.ts
│ │ ├── expression-validation-test
│ │ │ └── expression-validation.ts
│ │ ├── frontend-test
│ │ │ ├── accordion.ts
│ │ │ ├── all-process-steps.ts
│ │ │ ├── attachments-in-group.ts
│ │ │ ├── auto-save-behavior.ts
│ │ │ ├── cards.ts
│ │ │ ├── components.ts
│ │ │ ├── custom-button.ts
│ │ │ ├── custom-confirm.ts
│ │ │ ├── dynamics.ts
│ │ │ ├── footer.ts
│ │ │ ├── formatting.ts
│ │ │ ├── grid.ts
│ │ │ ├── group-pets.ts
│ │ │ ├── group.ts
│ │ │ ├── hide-row-in-group.ts
│ │ │ ├── instantiation.ts
│ │ │ ├── language.ts
│ │ │ ├── likert.ts
│ │ │ ├── list-component.ts
│ │ │ ├── message.ts
│ │ │ ├── mobile.ts
│ │ │ ├── navigation.ts
│ │ │ ├── number-text-date.ts
│ │ │ ├── on-entry.ts
│ │ │ ├── options.ts
│ │ │ ├── page-order-with-dynamics.ts
│ │ │ ├── party-selection.ts
│ │ │ ├── pdf.ts
│ │ │ ├── prefill.ts
│ │ │ ├── print-button.ts
│ │ │ ├── process-next.ts
│ │ │ ├── redirect.ts
│ │ │ ├── rules.ts
│ │ │ ├── self-identified-user.ts
│ │ │ ├── sort-order.ts
│ │ │ ├── summary.ts
│ │ │ ├── tabbing.ts
│ │ │ ├── tabs.ts
│ │ │ ├── texts.ts
│ │ │ ├── ui-settings.ts
│ │ │ └── validation.ts
│ │ ├── multiple-datamodels-test
│ │ │ ├── readonly.ts
│ │ │ ├── saving.ts
│ │ │ └── validation.ts
│ │ ├── navigation-test
│ │ │ └── navigation.ts
│ │ ├── payment-test
│ │ │ └── payment.ts
│ │ ├── signing-test
│ │ │ ├── double-signing.ts
│ │ │ └── reject.ts
│ │ ├── stateless-app
│ │ │ ├── instantiate-from-query-params.ts
│ │ │ ├── party-selection.ts
│ │ │ ├── receipt.ts
│ │ │ └── stateless.ts
│ │ └── subform-test
│ │ │ ├── attachments.ts
│ │ │ └── subform.ts
│ ├── manual
│ │ └── page-load.ts
│ ├── pageobjects
│ │ ├── app-frontend.ts
│ │ ├── common.ts
│ │ ├── datalist.ts
│ │ ├── likert.ts
│ │ └── party-mocks.ts
│ └── support
│ │ ├── apps
│ │ ├── component-library
│ │ │ ├── fillAddressAndVerify.ts
│ │ │ ├── groupCheckboxMultiSelectListAndVerify.ts
│ │ │ ├── inputAndVerify.ts
│ │ │ └── uploadFileAndVerify.ts
│ │ └── signing-test
│ │ │ └── signing-login.ts
│ │ ├── auth.ts
│ │ ├── chai-extensions.ts
│ │ ├── custom.ts
│ │ ├── customReceipt.ts
│ │ ├── fail-on-console-log.ts
│ │ ├── formFiller.ts
│ │ ├── global.ts
│ │ ├── index.ts
│ │ ├── lang.ts
│ │ ├── navigation.ts
│ │ └── start-app-instance.ts
├── global.ts
├── percy.css
└── tsconfig.json
├── tsconfig.json
├── webpack.common.js
├── webpack.config.development.js
├── webpack.config.production.js
└── yarn.lock
/.dockerignore:
--------------------------------------------------------------------------------
1 | .dockerignore
2 | .env
3 | .git
4 | .vs
5 | .vscode
6 | docker-compose.yml
7 | docker-compose.*.yml
8 | **/node_modules
9 | **/bin
10 | **/obj
11 | **/dist
12 |
--------------------------------------------------------------------------------
/.github/labeler.yml:
--------------------------------------------------------------------------------
1 | # Add 'triage' label to all new issues
2 | 'status/triage':
3 | - '/.*/'
--------------------------------------------------------------------------------
/.github/workflows/test/release-preview-invalid-suffix.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0-preview1",
4 | "prerelease": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-preview-success.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0-preview.1",
4 | "prerelease": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-rc-invalid-suffix.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0-rc1",
4 | "prerelease": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-rc-success.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0-rc.1",
4 | "prerelease": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-stable-invalid-prerelease-value.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0",
4 | "prerelease": true
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-stable-invalid-suffix.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0-p",
4 | "prerelease": false
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-stable-missing-v.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "1.0.0",
4 | "prerelease": false
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.github/workflows/test/release-stable-success.json:
--------------------------------------------------------------------------------
1 | {
2 | "release": {
3 | "tag_name": "v1.0.0",
4 | "prerelease": false
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/.husky/.gitignore:
--------------------------------------------------------------------------------
1 | _
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | cd "$(dirname -- "$0")"
4 | cd ../
5 | npx lint-staged
6 |
--------------------------------------------------------------------------------
/.husky/pre-commit-check-for-skipped-tests:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | grep --quiet -E 'it.only\(|describe.only\(' "$@"
4 | if [ $? -eq 0 ]; then
5 | echo "Found skipped tests in: $@"
6 | exit 1
7 | fi
8 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | *.schema.v1.json
2 |
3 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "editorconfig.editorconfig"]
3 | }
4 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "editor.tabSize": 2,
4 | "editor.insertSpaces": true,
5 | "editor.detectIndentation": false,
6 | "editor.rulers": [120],
7 | "search.exclude": {
8 | "**/node_modules": true
9 | },
10 | "typescript.surveys.enabled": false,
11 | "editor.codeActionsOnSave": {
12 | "source.fixAll": "explicit"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | enableMessageNames: false
2 |
3 | enableTelemetry: false
4 |
5 | nodeLinker: node-modules
6 |
7 | yarnPath: .yarn/releases/yarn-4.9.1.cjs
8 |
--------------------------------------------------------------------------------
/benchmarks/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "include": ["*.ts"],
3 | "compilerOptions": {
4 | "target": "ESNext",
5 | "module": "ESNext",
6 | "strict": true,
7 | "esModuleInterop": true,
8 | "moduleResolution": "Bundler",
9 | "noEmit": true,
10 | "noUncheckedIndexedAccess": true,
11 | "paths": {
12 | "src/*": ["../src/*"],
13 | },
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.6'
2 |
3 | services:
4 | webpack:
5 | container_name: app-frontend-react
6 | image: node:22
7 | volumes:
8 | - ./:/usr/src/app
9 | working_dir: /usr/src/app
10 | command: bash -c "yarn --immutable && yarn docker"
11 | ports:
12 | - "8080:8080"
13 |
--------------------------------------------------------------------------------
/multi-reporter-config.json:
--------------------------------------------------------------------------------
1 | {
2 | "reporterEnabled": "cypress-parallel/json-stream.reporter.js, cypress-parallel/simple-spec.reporter.js"
3 | }
--------------------------------------------------------------------------------
/scripts/copy-schemas.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-console */
2 | import fs from 'fs';
3 | if (!fs.existsSync('dist')) {
4 | fs.mkdirSync('dist');
5 | }
6 | fs.cpSync('schemas', 'dist/schemas', { recursive: true });
7 | console.log('Copied schemas to dist/');
8 |
--------------------------------------------------------------------------------
/sonar-project.properties:
--------------------------------------------------------------------------------
1 | sonar.projectKey=Altinn_app-frontend-react
2 | sonar.organization=altinn
3 |
4 | sonar.sources=src/
5 | sonar.exclusions=src/**/*.test.ts,src/**/*.test.tsx,src/test/*,src/__mocks__/*,src/language/texts/**,src/layout/**/config.ts
6 |
7 | sonar.tests=src/,test/
8 | sonar.test.inclusions=src/**/*.test.tsx,src/**/*.test.ts
9 |
10 | sonar.javascript.lcov.reportPaths=coverage/lcov.info
11 |
--------------------------------------------------------------------------------
/src/__mocks__/axios.ts:
--------------------------------------------------------------------------------
1 | import mockAxios from 'jest-mock-axios';
2 |
3 | // eslint-disable-next-line import/no-default-export
4 | export default mockAxios;
5 |
--------------------------------------------------------------------------------
/src/__mocks__/getLogoMock.ts:
--------------------------------------------------------------------------------
1 | export function getLogoMock() {
2 | return '';
3 | }
4 |
--------------------------------------------------------------------------------
/src/__mocks__/mocks.ts:
--------------------------------------------------------------------------------
1 | export const instanceIdExample = '123456/75154373-aed4-41f7-95b4-e5b5115c2edc';
2 |
--------------------------------------------------------------------------------
/src/app-components/Date/Date.module.css:
--------------------------------------------------------------------------------
1 | .dateComponent {
2 | display: flex;
3 | flex-grow: 0;
4 | max-width: 100%;
5 | flex-basis: 100%;
6 | }
7 | .label span {
8 | font-size: 16px;
9 | }
10 | .icon {
11 | width: 24px;
12 | margin-right: 12px;
13 | }
14 | .vertical {
15 | flex-direction: column;
16 | }
17 | .horizontal {
18 | flex-direction: row;
19 | }
20 |
--------------------------------------------------------------------------------
/src/app-components/Number/Number.module.css:
--------------------------------------------------------------------------------
1 | .numberComponent {
2 | display: flex;
3 | flex-grow: 0;
4 | max-width: 100%;
5 | flex-basis: 100%;
6 | }
7 | .label span {
8 | font-size: 16px;
9 | }
10 | .icon {
11 | width: 24px;
12 | margin-right: 12px;
13 | }
14 | .vertical {
15 | flex-direction: column;
16 | }
17 | .horizontal {
18 | flex-direction: row;
19 | }
20 |
--------------------------------------------------------------------------------
/src/app-components/Pagination/Pagination.module.css:
--------------------------------------------------------------------------------
1 | .hidden {
2 | visibility: hidden;
3 | }
4 | .pagination {
5 | ul[class*='fds-pagination'] {
6 | padding: 0;
7 | }
8 | }
9 | .rowsPerPageDropdown {
10 | display: flex;
11 | flex-direction: row-reverse;
12 |
13 | div[class*='fds-combobox__input__wrapper'] {
14 | width: 80px;
15 | }
16 |
17 | div[class*='fds-combobox__chip-and-input'] {
18 | width: 34px;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/app-components/Panel/constants.ts:
--------------------------------------------------------------------------------
1 | export const PANEL_VARIANT = {
2 | Info: 'info',
3 | Warning: 'warning',
4 | Error: 'error',
5 | Success: 'success',
6 | } as const;
7 |
--------------------------------------------------------------------------------
/src/app-components/Text/Text.module.css:
--------------------------------------------------------------------------------
1 | .textComponent {
2 | display: flex;
3 | flex-grow: 0;
4 | max-width: 100%;
5 | flex-basis: 100%;
6 | }
7 | .label span {
8 | font-size: 16px;
9 | }
10 |
11 | .icon {
12 | width: 24px;
13 | margin-right: 12px;
14 | }
15 | .vertical {
16 | flex-direction: column;
17 | }
18 | .horizontal {
19 | flex-direction: row;
20 | }
21 |
--------------------------------------------------------------------------------
/src/codegen/SerializableSetting.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * This interface is used to define the structure of a setting that can be serialized.
3 | * This is mostly used for Plugin settings that need to be passed as constructor arguments in generated classes.
4 | */
5 | export interface SerializableSetting {
6 | serializeToTypeScript(): string;
7 | serializeToTypeDefinition(): string;
8 | }
9 |
--------------------------------------------------------------------------------
/src/components/AltinnSpinner.module.css:
--------------------------------------------------------------------------------
1 | .spinnerText {
2 | display: inline-block;
3 | font-size: 16px;
4 | margin-left: 10px;
5 | vertical-align: middle;
6 | margin-bottom: 25px;
7 | }
8 |
--------------------------------------------------------------------------------
/src/components/CircleIcon.module.css:
--------------------------------------------------------------------------------
1 | .circle {
2 | border-radius: 50%;
3 | display: flex;
4 | justify-content: center;
5 | align-items: center;
6 | background-color: var(--fds-semantic-surface-action-default);
7 | width: calc(var(--icon-size) * 0.75);
8 | height: calc(var(--icon-size) * 0.75);
9 | padding: calc(var(--icon-size) * 0.25);
10 | }
11 |
12 | .circle > * {
13 | width: 100%;
14 | height: 100%;
15 | }
16 |
--------------------------------------------------------------------------------
/src/components/LandmarkShortcuts.module.css:
--------------------------------------------------------------------------------
1 | .button {
2 | text-decoration: underline;
3 | text-align: left;
4 | padding: 5px 5px 5px 10px;
5 | }
6 |
7 | .srOnly {
8 | position: absolute;
9 | clip: rect(0, 0, 0, 0);
10 | border: 0;
11 | }
12 |
13 | .srOnly:focus {
14 | position: relative;
15 | width: auto;
16 | height: auto;
17 | }
18 |
--------------------------------------------------------------------------------
/src/components/form/Description.module.css:
--------------------------------------------------------------------------------
1 | .description {
2 | word-break: break-word;
3 | line-height: var(--fds-sizing-6);
4 | color: var(--semantic-text-neutral-subtle);
5 | display: inline-block;
6 | font-weight: normal;
7 | font-size: var(--fds-sizing-4);
8 | }
9 |
--------------------------------------------------------------------------------
/src/components/form/Fieldset.module.css:
--------------------------------------------------------------------------------
1 | .legendContent {
2 | font-size: 1.125rem;
3 | display: flex;
4 | gap: 0.25rem;
5 | align-items: center;
6 | }
7 |
8 | .description {
9 | font-size: 1.125rem;
10 | margin: 0;
11 | padding-bottom: var(--fds-spacing-3);
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/form/Form.module.css:
--------------------------------------------------------------------------------
1 | .errorReport {
2 | width: 100%;
3 | }
4 |
--------------------------------------------------------------------------------
/src/components/form/HelpTextContainer.module.css:
--------------------------------------------------------------------------------
1 | .helpTextContainer {
2 | padding: 2px 4px !important;
3 | }
4 |
5 | @media print {
6 | .helpTextContainer {
7 | display: none;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/components/form/Legend.module.css:
--------------------------------------------------------------------------------
1 | .legendHelpTextContainer {
2 | display: flex;
3 | flex-direction: row;
4 | }
5 |
6 | .legendSpan {
7 | display: inline-flex;
8 | }
9 |
10 | .padlock {
11 | margin-top: 0.2em;
12 | margin-right: 0.2em;
13 | flex-shrink: 0;
14 | }
15 |
--------------------------------------------------------------------------------
/src/components/form/caption/Caption.module.css:
--------------------------------------------------------------------------------
1 | .tableCaption {
2 | text-align: left;
3 | padding-bottom: var(--fds-spacing-2);
4 | }
5 |
6 | .captionTitle {
7 | display: flex;
8 | align-items: center;
9 | gap: 0.25rem;
10 | }
11 |
12 | .description {
13 | padding-bottom: var(--fds-spacing-3);
14 | }
15 |
16 | .titleAndHelpWrapper {
17 | display: flex;
18 | gap: var(--fds-spacing-2);
19 | align-items: center;
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/label/Label.module.css:
--------------------------------------------------------------------------------
1 | .fieldWrapper {
2 | display: grid;
3 | gap: var(--fds-spacing-2);
4 | }
5 |
6 | .fullWidth {
7 | width: 100%;
8 | }
9 |
10 | .leftAlign {
11 | text-align: left;
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/label/LabelContent.module.css:
--------------------------------------------------------------------------------
1 | .labelContainer {
2 | display: flex;
3 | gap: var(--fds-spacing-2);
4 | align-items: center;
5 | }
6 |
7 | .labelContent {
8 | word-break: break-word;
9 | }
10 |
11 | .labelWrapper {
12 | display: flex;
13 | flex-direction: column;
14 | gap: var(--fds-spacing-1);
15 | align-items: flex-start;
16 | }
17 |
18 | .description {
19 | padding-bottom: var(--fds-spacing-3);
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/logo/AltinnLogo.module.css:
--------------------------------------------------------------------------------
1 | .logo {
2 | height: 24px;
3 | display: inline-block;
4 | }
5 |
--------------------------------------------------------------------------------
/src/components/molecules/AltinnSubstatus.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | background: var(--colors-primary-white);
3 | box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.25);
4 | border-radius: 0;
5 | font-size: 16px;
6 | padding: 24px;
7 | }
8 |
--------------------------------------------------------------------------------
/src/components/organisms/AltinnReceipt.module.css:
--------------------------------------------------------------------------------
1 | .instanceMetaData {
2 | margin-top: 36px;
3 | }
4 |
5 | .tableCell {
6 | border-bottom: 0;
7 | padding-right: 1.5625rem;
8 | }
9 |
10 | .tableRow {
11 | height: auto;
12 | }
13 |
14 | .paddingTop24 {
15 | padding-top: 1.5rem;
16 | }
17 |
18 | .wordBreak {
19 | word-break: break-word;
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/presentation/AppHeader/AppHeaderMenu.module.css:
--------------------------------------------------------------------------------
1 | .partyName {
2 | font-size: 0.875rem;
3 | font-weight: 500;
4 | }
5 |
6 | @media (max-width: 768px) {
7 | .partyName {
8 | display: none;
9 | }
10 | }
11 |
12 | .button-active {
13 | background-color: var(--fds-semantic-surface-action-first-no_fill-active);
14 | color: var(--fds-semantic-text-action-first-active);
15 | }
16 |
--------------------------------------------------------------------------------
/src/components/presentation/BackNavigationButton.module.css:
--------------------------------------------------------------------------------
1 | .button {
2 | margin-left: -12px;
3 | }
4 |
5 | .button svg {
6 | margin-right: 4px;
7 | }
8 |
9 | .spinner {
10 | margin-left: 0;
11 | padding: 8px 0;
12 | }
13 |
14 | @media only screen and (min-width: 768px) {
15 | .spinner {
16 | margin-left: 8px;
17 | }
18 | .button {
19 | margin-left: 0;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/components/presentation/ExpandWidthButton.module.css:
--------------------------------------------------------------------------------
1 | .expand-width-button {
2 | display: var(--expand-width-button-display);
3 | }
4 |
5 | .expand-width-icon {
6 | margin-right: 6px;
7 | transform: rotate(45deg);
8 | }
9 |
--------------------------------------------------------------------------------
/src/components/presentation/Header.module.css:
--------------------------------------------------------------------------------
1 | .wrapper {
2 | width: 100%;
3 | min-height: 84px;
4 | padding: 12px;
5 | padding-left: var(--modal-padding-x);
6 | border-bottom: 1px solid #eee;
7 | box-sizing: border-box;
8 | }
9 |
10 | .no-above-header {
11 | margin-top: 24px;
12 | }
13 |
--------------------------------------------------------------------------------
/src/components/presentation/LanguageSelector.module.css:
--------------------------------------------------------------------------------
1 | .icon {
2 | font-size: 1.25rem;
3 | }
4 |
5 | .flip-vertical {
6 | transform: rotate(180deg);
7 | }
8 |
9 | .checkmark {
10 | margin-left: -4px;
11 | }
12 |
13 | .button {
14 | column-gap: 8px;
15 | }
16 |
17 | .button-active {
18 | background-color: var(--fds-semantic-surface-action-first-no_fill-active);
19 | color: var(--fds-semantic-text-action-first-active);
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/table/AltinnSummaryTable.module.css:
--------------------------------------------------------------------------------
1 | .table {
2 | border: 0;
3 | margin: 36px 0 0;
4 | padding: 0;
5 | width: auto;
6 | height: auto;
7 | }
8 |
9 | @media print {
10 | .table {
11 | margin-bottom: 1.25rem;
12 | }
13 | }
14 |
15 | .key {
16 | font-size: 1rem;
17 | font-weight: 400;
18 | line-height: 1.5;
19 | padding-right: 1.5625rem;
20 | }
21 |
--------------------------------------------------------------------------------
/src/components/wrappers/ProcessWrapper.module.css:
--------------------------------------------------------------------------------
1 | .navigationError {
2 | display: flex;
3 | margin-top: 35px;
4 | gap: 10px;
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/alertOnChange/DeleteWarningPopover.module.css:
--------------------------------------------------------------------------------
1 | .popoverContent {
2 | z-index: 1700;
3 | }
4 | .popoverButtonContainer {
5 | display: flex;
6 | flex-direction: row;
7 | margin-top: 0.625rem;
8 | gap: 0.625rem;
9 | }
10 |
--------------------------------------------------------------------------------
/src/features/applicationMetadata/minVersion.ts:
--------------------------------------------------------------------------------
1 | export const MINIMUM_APPLICATION_VERSION = {
2 | build: '8.0.0.108',
3 | name: 'v8.0.0',
4 | };
5 |
--------------------------------------------------------------------------------
/src/features/attachments/sortAttachments.ts:
--------------------------------------------------------------------------------
1 | import type { IAttachment, IFailedAttachment } from 'src/features/attachments/index';
2 |
3 | export function sortAttachmentsByName(a: IAttachment | IFailedAttachment, b: IAttachment | IFailedAttachment) {
4 | if (a.data.filename && b.data.filename) {
5 | return a.data.filename.localeCompare(b.data.filename);
6 | }
7 | return 0;
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/dataLists/index.ts:
--------------------------------------------------------------------------------
1 | export interface IDataList {
2 | listItems: Record[];
3 | _metaData: IDataListsMetaData;
4 | }
5 |
6 | export interface IDataListsMetaData {
7 | page: number;
8 | pageCount: number;
9 | pageSize: number;
10 | totaltItemsCount: number;
11 |
12 | // Used for manual navigation of pages when looking at the API response
13 | links: string[];
14 | }
15 |
--------------------------------------------------------------------------------
/src/features/devtools/components/PermissionsEditor/PermissionsEditor.module.css:
--------------------------------------------------------------------------------
1 | .checkboxWrapper > div > div {
2 | display: inline-grid;
3 | margin-right: 1rem;
4 | }
5 |
--------------------------------------------------------------------------------
/src/features/displayData/index.ts:
--------------------------------------------------------------------------------
1 | export interface DisplayData {
2 | useDisplayData(nodeId: string): string;
3 | }
4 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/all-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "All true inputs",
3 | "expression": ["and", true, true, true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-0.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 0 as false",
3 | "expression": ["and", true, 0, 0, 0],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 1 as true",
3 | "expression": ["and", 1, 1],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-stringy-0.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows stringy 0 as false",
3 | "expression": ["and", "0", "0.0", "0.0000"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-stringy-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows stringy 1 as true",
3 | "expression": ["and", "1", "1.0", "1.0000"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-stringy-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 'false' as false",
3 | "expression": ["and", "false"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/allows-stringy-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 'true' as true",
3 | "expression": ["and", true, "true"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/casts-to-boolean.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Casts 1 to a boolean",
3 | "expression": ["and", 1],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/casts-to-boolean2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Casts 1.000 to a boolean",
3 | "expression": ["and", 1],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/disallows-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows 2 as true",
3 | "expression": ["and", 2, true],
4 | "expectsFailure": "Expected boolean, got value 2"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/disallows-empty-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows empty strings",
3 | "expression": ["and", true, ""],
4 | "expectsFailure": "Expected boolean, got value \"\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/disallows-other-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows other strings",
3 | "expression": ["and", true, "yes"],
4 | "expectsFailure": "Expected boolean, got value \"yes\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/empty-and.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Empty input produces an error",
3 | "expression": ["and"],
4 | "expectsFailure": "Expected 1+ argument(s), got 0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/last-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Last input false",
3 | "expression": ["and", true, true, false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/null-is-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Null is false",
3 | "expression": ["and", true, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/single-input-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Single input returns the same (false)",
3 | "expression": ["and", false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/and/single-input-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Single input returns the same (true)",
3 | "expression": ["and", true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/argv/arg-can-be-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Positional argument can also be null",
3 | "expression": ["argv", 1],
4 | "expects": null,
5 | "positionalArguments": ["foo", null, 5]
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/argv/error-no-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Errors when trying to read argument when none exist",
3 | "expression": ["argv", 0],
4 | "expectsFailure": "No positional arguments available"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/argv/error-no-such-arg.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Errors when trying to read argument that does not exist",
3 | "expression": ["argv", 2],
4 | "expectsFailure": "Index 2 out of range",
5 | "positionalArguments": ["foo", 1234]
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/argv/simple-0.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple: Read arg 0",
3 | "expression": ["argv", 0],
4 | "expects": "foo",
5 | "positionalArguments": ["foo", "bar"]
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/argv/simple-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple: Read arg 1",
3 | "expression": ["argv", 1],
4 | "expects": 1234,
5 | "positionalArguments": ["foo", 1234]
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/authContext/read-write.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Read/Write",
3 | "expression": ["and", ["authContext", "read"], ["authContext", "write"]],
4 | "expects": true,
5 | "permissions": {
6 | "read": true,
7 | "write": true,
8 | "actions": {
9 | "instantiate": true,
10 | "confirm": false,
11 | "sign": false,
12 | "reject": false
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not contain an empty string",
3 | "expression": ["commaContains", "40, 50, 60", ""],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not contain a null value",
3 | "expression": ["commaContains", "40, 50, 60", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not split a null value",
3 | "expression": ["commaContains", null, "hello world"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/should-include-word-in-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return true if the comma-separated list contains the given value",
3 | "expression": ["commaContains", "hello, bye, hola, adios", "hola"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/should-not-include-word-in-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return false if the comma-separated list does not contain the given value",
3 | "expression": ["commaContains", "hello, bye, hola, adios", "Hasta luego"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/commaContains/string-list-include-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return true if the comma-separated list contains the given value even if its provided as a number",
3 | "expression": ["commaContains", "40, 50, 60", 40],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-equals/equals-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple equals test with string",
3 | "expression": ["compare", "yes", "equals", "yes"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-equals/error-too-few-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given too few arguments",
3 | "expression": ["compare", "yes", "equals"],
4 | "expectsFailure": "Expected 3-4 argument(s), got 2"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-equals/not-equals-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple not-equals test with string",
3 | "expression": ["compare", "yes", "equals", "no"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-case-sensitive-not.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Third item should be not when given 5 items (case sensitive)",
3 | "expression": ["compare", "yes", "NOT", "equals", "no"],
4 | "expectsFailure": "Second argument must be \"not\" when providing 4 arguments in total"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-expr-as-not.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given an expression instead of 'not'",
3 | "expression": ["compare", 5, ["if", true, "not", "else", "not-not?"], "greaterThan", 8],
4 | "expectsFailure": "Second argument must be \"not\" when providing 4 arguments in total"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-expr-as-operator-with-not.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given an expression instead of an operator when using 'not'",
3 | "expression": ["compare", 5, "not", ["if", true, "lessThan", "else", "greaterThan"], 8],
4 | "expectsFailure": "Invalid operator (it cannot be an expression or null)"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-expr-as-operator.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given an expression as operator",
3 | "expression": ["compare", 5, ["if", true, "greaterThan", "else", "lowerThan"], 8],
4 | "expectsFailure": "Invalid operator (it cannot be an expression or null)"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-not-not.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Third item should be not when given 5 items",
3 | "expression": ["compare", "yes", "equals", "no", "maybe"],
4 | "expectsFailure": "Second argument must be \"not\" when providing 4 arguments in total"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/error-wrong-operator.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given an invalid operator",
3 | "expression": ["compare", 5, "is exactly the same as", 8],
4 | "expectsFailure": "Invalid operator \"is exactly the same as\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-error/notEquals-not-implemented.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "notEquals is not implemented here",
3 | "expression": ["compare", "yes", "notEquals", "no"],
4 | "expectsFailure": "Invalid operator \"notEquals\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-greaterThan/greaterThan-simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple greaterThan test",
3 | "expression": ["compare", 5, "greaterThan", 4],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-greaterThan/greaterThan-simple2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple greaterThan test (2)",
3 | "expression": ["compare", 5, "greaterThan", 8],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isAfter/date-leap-year.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to understand a date only valid in a leap year",
3 | "expression": ["compare", "2020-02-29", "isAfter", "2020-02-28"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isAfter/date-with-time.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "isAfter with time-formatted dates",
3 | "expression": ["compare", "2020-01-01 00:00:05", "isAfter", "2020-01-01T00:00:00"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isAfterEq/isAfterEq.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Compare isAfterEq with dates and time",
3 | "expression": ["compare", "2020-01-01 05:08:09", "isAfterEq", "2020-01-01 05:08:09.00"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBefore/date-empty-string-and-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "A date comparison with empty string and null return false",
3 | "expression": ["compare", null, "isBefore", ""],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBefore/date-empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "A date comparison with an empty string return false",
3 | "expression": ["compare", "2020-01-01", "isBefore", ""],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBefore/date-simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "A simple case comparing two dates",
3 | "expression": ["compare", "2020-01-01", "isBefore", "2020-01-02"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBefore/error-date-invalid.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not parse a date with invalid format",
3 | "expression": ["compare", "2020-01-01 00/00/00", "isBefore", ""],
4 | "expectsFailure": "Unable to parse date \"2020-01-01 00/00/00\": Unknown format"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBefore/error-date-invalid2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not parse an invalid date",
3 | "expression": ["compare", "2021-02-29", "isBefore", ""],
4 | "expectsFailure": "Unable to parse date \"2021-02-29\": Format was recognized, but the date/time is invalid"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isBeforeEq/isBeforeEq.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Compare isBeforeEq with dates and time",
3 | "expression": ["compare", "2020-01-01 05:08:09", "isBeforeEq", "2020-01-01 05:08:09.00"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isSameDay/errors-with-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "errors with number",
3 | "expression": ["compare", 2020, "not", "isSameDay", "2022"],
4 | "expectsFailure": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isSameDay/errors-with-only-year.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Errors with only year",
3 | "expression": ["compare", "2020", "isSameDay", "2020"],
4 | "expectsFailure": "Unable to parse date \"2020\": Unknown format"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/compare-isSameDay/not-sameDay-year.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "isSameDay with different years",
3 | "expression": ["compare", "2020-02-02", "isSameDay", "2022-02-02"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/concat/boolean-are-empty-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Booleans encode as literal strings",
3 | "expression": ["concat", "foo", false, "bar", true],
4 | "expects": "foofalsebartrue"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/concat/casts-numbers.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Casts numbers to strings",
3 | "expression": ["concat", 1, " + ", 2.5, " = ", 3],
4 | "expects": "1 + 2.5 = 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/concat/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "No arguments results in empty string",
3 | "expression": ["concat"],
4 | "expects": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/concat/nulls-are-empty-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Nulls are represented as empty strings",
3 | "expression": ["concat", "foo", null, "bar"],
4 | "expects": "foobar"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/concat/one-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "One arguments returns the same",
3 | "expression": ["concat", "test"],
4 | "expects": "test"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/case-sensitivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not match case sensitive",
3 | "expression": ["contains", "Hello", "hello"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always contain en empty string",
3 | "expression": ["contains", "Hello", ""],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/exact-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return true if the first string contains the second string",
3 | "expression": ["contains", "abc", "abc"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/not-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "should return false if the second string does not contain the first string",
3 | "expression": ["contains", "Hello", "Bye"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return false when the input is null",
3 | "expression": ["contains", null, "null"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return false when the input is null",
3 | "expression": ["contains", "null", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/null3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return false when the input is null",
3 | "expression": ["contains", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/null4.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat stringy nulls as null",
3 | "expression": ["contains", "null", "null"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/contains/partial-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return true if the string contains the substring",
3 | "expression": ["contains", "abc", "b"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/countDataElements/single.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should find and count a single data model",
3 | "expression": ["countDataElements", "default"],
4 | "expects": 1,
5 | "dataModels": [
6 | {
7 | "dataElement": {
8 | "id": "00dd7417-5b4e-402a-bb73-007537071f1d",
9 | "dataType": "default"
10 | },
11 | "data": { "a": { "value": "ABC" } }
12 | }
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/dataModelMultiple/dataModel-type-as-expr.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dataModel lookup cannot have a dynamic data type",
3 | "expression": ["dataModel", "a.value", ["if", true, "non-default", "else", "default"]],
4 | "expectsFailure": "The data type must be a string (expressions cannot be used here)"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/case-sensitivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be case sensitive and return false if the string does end with the given string but opposite case",
3 | "expression": ["endsWith", "Hello", "LO"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "All strings ends with an empty string",
3 | "expression": ["endsWith", "Hello", ""],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/ends-with-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "No string ends with a null",
3 | "expression": ["endsWith", "Hello", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/ends-with-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string ends with the given string (even when the given 'string' is a number)",
3 | "expression": ["endsWith", "Im 40", 40],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/ends-with.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string ends with the specified string",
3 | "expression": ["endsWith", "Hello", "lo"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/exact-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string ends with the specified string, even on exact match",
3 | "expression": ["endsWith", "Hello", "Hello"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/not-ends-with.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be false when the string does not ends with the specified string",
3 | "expression": ["endsWith", "Hello", "me"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/endsWith/number-ends-with-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the given number ends with the given digit",
3 | "expression": ["endsWith", 102, 2],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-bool-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, float] (false)",
3 | "expression": ["equals", false, 0],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-bool-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, integer] (false)",
3 | "expression": ["equals", true, 1],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-bool-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, null] (false)",
3 | "expression": ["equals", false, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["equals", 123.0001, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-float-int-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-float, integer] (false)",
3 | "expression": ["equals", -123, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["equals", 123, 123],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-float-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (false)",
3 | "expression": ["equals", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-int-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (false)",
3 | "expression": ["equals", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-bool-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, boolean] (false)",
3 | "expression": ["equals", "hello world", false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-bool-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, boolean] (true)",
3 | "expression": ["equals", "false", false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["equals", "1234", 1234.55],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["equals", "1234.5678", 1234.5678],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["equals", "hello world", 55],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["equals", "1234", 1234],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["equals", "nil", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/diff-types-string-null-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (true)",
3 | "expression": ["equals", "null", null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/false-case-insensitive.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Booleans are compared case-insensitively",
3 | "expression": ["equals", "FalSE", false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/false-case-insensitive2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Booleans are compared case-insensitively (2)",
3 | "expression": ["equals", "TRUE", true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/null-case-insensitive.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Null is compared case-insensitively",
3 | "expression": ["equals", "nULL", null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-bool-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with booleans (false)",
3 | "expression": ["equals", true, false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-bool-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with booleans (true)",
3 | "expression": ["equals", false, false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["equals", 1.5, 2.5],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-float-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with -floats (false)",
3 | "expression": ["equals", -2.5, 2.5],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["equals", 2.5, 2.5],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["equals", 1, 2],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["equals", 2, 2],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with null",
3 | "expression": ["equals", null, null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["equals", "foo", "bar"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["equals", "bar", "bar"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/same-types-string-true2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["equals", "true", "true"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/strings-case-sensitive.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Regular strings are compared case-sensitively",
3 | "expression": ["equals", "Hello World", "hello World"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/too-few-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Too few arguments give an error",
3 | "expression": ["equals", true, ["equals"]],
4 | "expectsFailure": "Expected 2 argument(s), got 0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/equals/too-many-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Too many arguments give an error",
3 | "expression": ["equals", true, ["equals", true, false, true]],
4 | "expectsFailure": "Expected 2 argument(s), got 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/externalApi/should-pick-data-with-nested-path.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should pick data with nested path",
3 | "expression": ["externalApi", "testId", "cars[0].brand"],
4 | "expects": "BMW",
5 | "externalApis": { "data": { "testId": { "cars": [{ "brand": "BMW" }, { "brand": "Lada" }] } } }
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/externalApi/should-return-empty-string-on-undefined-result.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null on undefined result",
3 | "expression": ["externalApi", "testId", "results[0].id"],
4 | "expects": null,
5 | "externalApis": { "data": { "testId": {} } }
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/externalApi/should-return-empty-string-when-path-does-not-exist.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null when string path does not exist",
3 | "expression": ["externalApi", "testId", "non.existent.path"],
4 | "expects": null,
5 | "externalApis": { "data": { "testId": { "cars": [{ "brand": "BMW" }, { "brand": "Lada" }] } } }
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/externalApi/should-return-stringified-json-on-object-result.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null on object result",
3 | "expression": ["externalApi", "testId", "results[0]"],
4 | "expects": null,
5 | "externalApis": { "data": { "testId": { "cars": [{ "brand": "BMW" }, { "brand": "Lada" }] } } }
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/externalApi/should-return-whole-result-with-empty-path-param.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null with empty path param",
3 | "expression": ["externalApi", "testId", ""],
4 | "expects": null,
5 | "externalApis": { "data": { "testId": { "cars": [{ "brand": "BMW" }, { "brand": "Lada" }] } } }
6 | }
7 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/error-parseFalse.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "formatDate should error when given false",
3 | "expression": ["formatDate", false],
4 | "expectsFailure": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/error-parseNumber.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date",
3 | "expression": ["formatDate", 2],
4 | "expectsFailure": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/error-parseTrue.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date",
3 | "expression": ["formatDate", true],
4 | "expectsFailure": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-english.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date when only given a year",
3 | "expression": ["formatDate", "2023-01-01"],
4 | "expects": "1/1/23",
5 | "profileSettings": {
6 | "language": "en"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-english2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date in english",
3 | "expression": ["formatDate", "2023-10-26T13:12:38.069Z"],
4 | "expects": "10/26/23",
5 | "profileSettings": {
6 | "language": "en"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-in-format-specified.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date in format specified",
3 | "expression": ["formatDate", "2023-10-30T14:54:00.000Z", "dd-MM.yy"],
4 | "expects": "30-10.23"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-in-format-specified2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date in format specified (2)",
3 | "expression": ["formatDate", "2023-10-26T13:12:38.069Z", "dd.MM"],
4 | "expects": "26.10"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-time.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date-time from backend",
3 | "expression": ["formatDate", "2025-01-23T10:25:33.9729397+01:00"],
4 | "expects": "23.01.2025",
5 | "profileSettings": {
6 | "language": "nb"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date-with-offset.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date when only a date + offset is given",
3 | "expression": ["formatDate", "2023-01-01-08:00", "yyyy-MM-dd HH:mm:ss"],
4 | "expectsFailure": "Unable to parse date \"2023-01-01-08:00\": Unknown format"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-date.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date",
3 | "expression": ["formatDate", "2023-10-30T14:54:00.000Z"],
4 | "expects": "30.10.2023",
5 | "profileSettings": {
6 | "language": "nb"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/formats-time-in-format-specified.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format time in format specified",
3 | "expression": ["formatDate", "2023-10-30T14:54:00.000Z", "HH:mm"],
4 | "expects": "14:54"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/parseNull-returnsNull.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date",
3 | "expression": ["formatDate", null],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-d.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'd' as '4'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "d"
7 | ],
8 | "expects": "4"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-dd.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'dd' as '04'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "dd"
7 | ],
8 | "expects": "04"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-h.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'h' as '5'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "h"
7 | ],
8 | "expects": "5"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-hh.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'hh' as '05'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "hh"
7 | ],
8 | "expects": "05"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-m.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'm' as '6'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "m"
7 | ],
8 | "expects": "6"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-mm.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'mm' as '06'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "mm"
7 | ],
8 | "expects": "06"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-s.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 's' as '7'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "s"
7 | ],
8 | "expects": "7"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-ss.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'ss' as '07'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "ss"
7 | ],
8 | "expects": "07"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-u.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'u' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "u"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-uu.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'uu' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "uu"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-uuu.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'uuu' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "uuu"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-uuuu.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'uuuu' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "uuuu"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-y.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'y' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "y"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-yy.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'yy' as '23'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "yy"
7 | ],
8 | "expects": "23"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-yyy.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'yyy' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "yyy"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-lowercase-yyyy.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'yyyy' as '2023'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "yyyy"
7 | ],
8 | "expects": "2023"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-e-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'E' as 'Sat'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "E"
7 | ],
8 | "expects": "Sat",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-e-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'E' as 'lør'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "E"
7 | ],
8 | "expects": "lør",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-e-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'E' as 'lau'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "E"
7 | ],
8 | "expects": "lau",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ee-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EE' as 'Sat'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EE"
7 | ],
8 | "expects": "Sat",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ee-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EE' as 'lør'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EE"
7 | ],
8 | "expects": "lør",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ee-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EE' as 'lau'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EE"
7 | ],
8 | "expects": "lau",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eee-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEE' as 'Sat'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEE"
7 | ],
8 | "expects": "Sat",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eee-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEE' as 'lør'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEE"
7 | ],
8 | "expects": "lør",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eee-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEE' as 'lau'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEE"
7 | ],
8 | "expects": "lau",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeee-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEE' as 'Saturday'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEE"
7 | ],
8 | "expects": "Saturday",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeee-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEE' as 'lørdag'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEE"
7 | ],
8 | "expects": "lørdag",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeee-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEE' as 'laurdag'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEE"
7 | ],
8 | "expects": "laurdag",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeeee-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEEE' as 'S'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEEE"
7 | ],
8 | "expects": "S",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeeee-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEEE' as 'L'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEEE"
7 | ],
8 | "expects": "L",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-eeeee-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'EEEEE' as 'L'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "EEEEE"
7 | ],
8 | "expects": "L",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-g-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'G' as 'AD'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "G"
7 | ],
8 | "expects": "AD",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-g-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'G' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "G"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-g-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'G' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "G"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gg-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GG' as 'AD'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GG"
7 | ],
8 | "expects": "AD",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gg-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gg-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggg-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGG' as 'AD'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGG"
7 | ],
8 | "expects": "AD",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggg-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggg-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gggg-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGG' as 'Anno Domini'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGG"
7 | ],
8 | "expects": "Anno Domini",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gggg-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGG' as 'etter Kristus'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGG"
7 | ],
8 | "expects": "etter Kristus",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-gggg-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGG' as 'etter Kristus'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGG"
7 | ],
8 | "expects": "etter Kristus",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggggg-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGGG' as 'A'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGGG"
7 | ],
8 | "expects": "A",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggggg-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGGG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGGG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ggggg-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'GGGGG' as 'e.Kr.'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "GGGGG"
7 | ],
8 | "expects": "e.Kr.",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-h.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'H' as '5'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "H"
7 | ],
8 | "expects": "5"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-hh.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'HH' as '05'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "HH"
7 | ],
8 | "expects": "05"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-m.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'M' as '3'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "M"
7 | ],
8 | "expects": "3"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mm.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MM' as '03'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MM"
7 | ],
8 | "expects": "03"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmm-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMM' as 'Mar'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMM"
7 | ],
8 | "expects": "Mar",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmm-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMM' as 'mar'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMM"
7 | ],
8 | "expects": "mar",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmm-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMM' as 'mar'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMM"
7 | ],
8 | "expects": "mar",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmmm-en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMMM' as 'March'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMMM"
7 | ],
8 | "expects": "March",
9 | "profileSettings": {
10 | "language": "en"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmmm-nb.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMMM' as 'mars'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMMM"
7 | ],
8 | "expects": "mars",
9 | "profileSettings": {
10 | "language": "nb"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-mmmm-nn.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'MMMM' as 'mars'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "MMMM"
7 | ],
8 | "expects": "mars",
9 | "profileSettings": {
10 | "language": "nn"
11 | }
12 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-s.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'S' as '1'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "S"
7 | ],
8 | "expects": "1"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-ss.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'SS' as '12'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "SS"
7 | ],
8 | "expects": "12"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/formatDate/valid-uppercase-sss.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should format date with format 'SSS' as '120'",
3 | "expression": [
4 | "formatDate",
5 | "2023-03-04T05:06:07.120Z",
6 | "SSS"
7 | ],
8 | "expects": "120"
9 | }
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/frontendSettings/lookup-case-sensitive.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontendSettings is case sensitive",
3 | "expression": ["frontendSettings", "MYSETTING1"],
4 | "expects": null,
5 | "frontendSettings": {
6 | "mySetting1": "foo"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/frontendSettings/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Looking up null",
3 | "expression": ["frontendSettings", null],
4 | "expectsFailure": "Value cannot be null. (Parameter 'key')",
5 | "frontendSettings": {
6 | "mySetting1": "foo",
7 | "mySetting2": "bar"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/frontendSettings/simple-lookup-equals.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple lookup equals other lookup",
3 | "expression": [
4 | "equals",
5 | ["frontendSettings", "mySetting1"],
6 | ["frontendSettings", "mySetting2"]
7 | ],
8 | "expects": true,
9 | "frontendSettings": {
10 | "mySetting1": "foo",
11 | "mySetting2": "foo"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/frontendSettings/simple-lookup-is-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple lookup for non-existing key equals null",
3 | "expression": ["equals", ["frontendSettings", "doesNotExist"], null],
4 | "expects": true,
5 | "frontendSettings": {
6 | "mySetting1": "foo",
7 | "mySetting2": "bar"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/frontendSettings/simple-lookup.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple lookup",
3 | "expression": ["frontendSettings", "mySetting1"],
4 | "expects": "foo",
5 | "frontendSettings": {
6 | "mySetting1": "foo",
7 | "mySetting2": "bar"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-bool-float.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, float]",
3 | "expression": ["greaterThan", true, 123.456],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-bool-int.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, integer]",
3 | "expression": ["greaterThan", true, 123],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-bool-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, null]",
3 | "expression": ["greaterThan", true, null],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["greaterThan", 123.456, 124],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["greaterThan", 123.456, 123],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-float-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (false)",
3 | "expression": ["greaterThan", 123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-float-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-float, null] (false)",
3 | "expression": ["greaterThan", -123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-int-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (false)",
3 | "expression": ["greaterThan", 1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-int-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-integer, null] (false)",
3 | "expression": ["greaterThan", -1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-int-null-false3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [0, null] (false)",
3 | "expression": ["greaterThan", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, boolean]",
3 | "expression": ["greaterThan", "1", true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["greaterThan", "122", 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["greaterThan", "124", 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["greaterThan", "1", 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["greaterThan", "3", 2],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["greaterThan", "12", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/diff-types-string-null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, null]",
3 | "expression": ["greaterThan", "hello world", null],
4 | "expectsFailure": "Expected number, got value \"hello world\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/doble-dots-fail-negative.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [-string with two periods, integer]",
3 | "expression": ["greaterThan", "-55.88.66", -57],
4 | "expectsFailure": "Expected number, got value \"-55.88.66\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/doble-dots-fail.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string with two periods, integer]",
3 | "expression": ["greaterThan", "55.88.66", -57],
4 | "expectsFailure": "Expected number, got value \"55.88.66\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/negative-string-float.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-string, float] (1)",
3 | "expression": ["greaterThan", "-55.5", -55.3],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/negative-string-float2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-string, float] (2)",
3 | "expression": ["greaterThan", "-55.5", -55.7],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/negative-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-string, integer] (1)",
3 | "expression": ["greaterThan", "-55", -57],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/negative-string2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-string, integer] (2)",
3 | "expression": ["greaterThan", "-55", -54],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/no-decimals-fail-negative.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [-string with no decimals, integer]",
3 | "expression": ["greaterThan", "-55.", -57],
4 | "expectsFailure": "Expected number, got value \"-55.\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/no-decimals-fail.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string with no decimals, integer]",
3 | "expression": ["greaterThan", "55.", -57],
4 | "expectsFailure": "Expected number, got value \"55.\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with booleans",
3 | "expression": ["greaterThan", true, true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["greaterThan", 123.456, 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["greaterThan", 123.456, 123.455],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["greaterThan", 123, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["greaterThan", 123, 122],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with nulls",
3 | "expression": ["greaterThan", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["greaterThan", "1", "1.5"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThan/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["greaterThan", "1.1", "1.001"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-bool-float.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, float]",
3 | "expression": ["greaterThanEq", true, 123.456],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-bool-int.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, integer]",
3 | "expression": ["greaterThanEq", true, 123],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-bool-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, null]",
3 | "expression": ["greaterThanEq", true, null],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["greaterThanEq", 123.9999, 124],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["greaterThanEq", 123, 123],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-float-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (false)",
3 | "expression": ["greaterThanEq", 123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-float-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-float, null] (false)",
3 | "expression": ["greaterThanEq", -123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-int-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (false)",
3 | "expression": ["greaterThanEq", 1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-int-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-integer, null] (false)",
3 | "expression": ["greaterThanEq", -1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-int-null-false3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [0, null] (false)",
3 | "expression": ["greaterThanEq", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, boolean]",
3 | "expression": ["greaterThanEq", "1", true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["greaterThanEq", "122", 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["greaterThanEq", "123.456", 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["greaterThanEq", "1", 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["greaterThanEq", "2", 2],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["greaterThanEq", "12", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/diff-types-string-null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, null]",
3 | "expression": ["greaterThanEq", "hello world", null],
4 | "expectsFailure": "Expected number, got value \"hello world\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with booleans",
3 | "expression": ["greaterThanEq", true, true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["greaterThanEq", 123.455, 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["greaterThanEq", 123.455, 123.455],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["greaterThanEq", 122, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["greaterThanEq", 122, 122],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with nulls",
3 | "expression": ["greaterThanEq", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["greaterThanEq", "1", "1.5"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/greaterThanEq/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["greaterThanEq", "1.1", "1.1"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/else-otherwise.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return else result on failure",
3 | "expression": ["if", false, 123.456, "else", 456.123],
4 | "expects": 456.123
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/else-otherwise2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return else result on failure (2)",
3 | "expression": ["if", false, 123.456, "else", false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-5.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given a 5 as a boolean true",
3 | "expression": ["if", 5, 123.456],
4 | "expectsFailure": "Expected boolean, got value 5"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-else-as-expr.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given an expression instead of 'else'",
3 | "expression": ["if", true, 123.456, ["if", true, "else", "else", "not-else?"], 654.321],
4 | "expectsFailure": "Expected third argument to be \"else\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given empty string",
3 | "expression": ["if", "", 123.456],
4 | "expectsFailure": "Expected boolean, got value \"\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given a string as a boolean value",
3 | "expression": ["if", "string", 123.456],
4 | "expectsFailure": "Expected boolean, got value \"string\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-without-else.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail without \"else\" constant",
3 | "expression": ["if", true, 123.456, false],
4 | "expectsFailure": "Expected third argument to be \"else\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/fail-without-else2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail without \"else\" constant",
3 | "expression": ["if", true, 123.456, false, false],
4 | "expectsFailure": "Expected third argument to be \"else\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/falsy-0-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat a stringy 0 as a boolean false",
3 | "expression": ["if", "0", 123.456],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/falsy-0-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat a 0 as a boolean false",
3 | "expression": ["if", 0, 123.456],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/never-3-arguments.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given 3 arguments",
3 | "expression": ["if", false, 123.456, "else"],
4 | "expectsFailure": "Expected either 2 arguments (if) or 4 (if + else), got 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/never-5-arguments.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given 5 arguments",
3 | "expression": ["if", false, 123.456, "else", "test", "something"],
4 | "expectsFailure": "Expected either 2 arguments (if) or 4 (if + else), got 5"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/null-otherwise.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null on failure",
3 | "expression": ["if", false, 123.456],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return result on success",
3 | "expression": ["if", true, 123.456],
4 | "expects": 123.456
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/truthy-1-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat a stringy 1 as a boolean true",
3 | "expression": ["if", "1", 123.456],
4 | "expects": 123.456
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/if/truthy-1-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat a 1 as a boolean true",
3 | "expression": ["if", 1, 123.456],
4 | "expects": 123.456
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Looking up null",
3 | "expression": ["instanceContext", null],
4 | "expectsFailure": "Unknown Instance context property ",
5 | "instance": {
6 | "id": "d00ce51c-800b-416a-a906-ccab55f597e9",
7 | "appId": "org/app-name",
8 | "instanceOwner": {
9 | "partyId": "12345"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/only-dict.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Only works on one level (as a dictionary)",
3 | "expression": ["equals", ["instanceContext", "deep.key"], null],
4 | "expectsFailure": "Unknown Instance context property deep.key",
5 | "instance": {
6 | "deep": {
7 | "key": "should not be found"
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/partyTypeOrg.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "PartyType is Org",
3 | "expression": ["instanceContext", "instanceOwnerPartyType"],
4 | "expects": "org",
5 | "instance": {
6 | "id": "d00ce51c-800b-416a-a906-ccab55f597e9",
7 | "appId": "org/app-name",
8 | "instanceOwner": {
9 | "partyId": "12345",
10 | "organisationNumber": "1234567"
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/partyTypePerson.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "PartyType is Person",
3 | "expression": ["instanceContext", "instanceOwnerPartyType"],
4 | "expects": "person",
5 | "instance": {
6 | "id": "d00ce51c-800b-416a-a906-ccab55f597e9",
7 | "appId": "org/app-name",
8 | "instanceOwner": {
9 | "partyId": "12345",
10 | "personNumber": "1234567"
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/partyTypeUnknown.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Party type unknown",
3 | "expression": ["instanceContext", "instanceOwnerPartyType"],
4 | "expects": "unknown",
5 | "instance": {
6 | "id": "d00ce51c-800b-416a-a906-ccab55f597e9",
7 | "appId": "org/app-name",
8 | "instanceOwner": {
9 | "partyId": "12345"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/instanceContext/simple-lookup.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Simple lookup",
3 | "expression": ["instanceContext", "appId"],
4 | "expects": "org/app-name",
5 | "instance": {
6 | "id": "d00ce51c-800b-416a-a906-ccab55f597e9",
7 | "appId": "org/app-name",
8 | "instanceOwner": {
9 | "partyId": "12345"
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/language/should-return-nb-if-not-set.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should default to nb if no profile is set",
3 | "expression": ["language"],
4 | "expects": "nb"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/language/should-return-profile-settings-preference.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return profileSetting language if set",
3 | "expression": ["language"],
4 | "expects": "en",
5 | "profileSettings": {
6 | "language": "en"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-bool-float.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, float]",
3 | "expression": ["lessThan", true, 123.456],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-bool-int.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, integer]",
3 | "expression": ["lessThan", true, 123],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-bool-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, null]",
3 | "expression": ["lessThan", true, null],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["lessThan", 123.456, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["lessThan", 123.456, 124],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-float-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (false)",
3 | "expression": ["lessThan", 123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-float-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-float, null] (false)",
3 | "expression": ["lessThan", -123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-int-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (false)",
3 | "expression": ["lessThan", 1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-int-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-integer, null] (false)",
3 | "expression": ["lessThan", -1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-int-null-false3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [0, null] (false)",
3 | "expression": ["lessThan", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, boolean]",
3 | "expression": ["lessThan", "1", true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["lessThan", "124", 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["lessThan", "122", 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["lessThan", "123", 1],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["lessThan", "2", 3],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["lessThan", "12", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/diff-types-string-null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, null]",
3 | "expression": ["lessThan", "hello world", null],
4 | "expectsFailure": "Expected number, got value \"hello world\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with booleans",
3 | "expression": ["lessThan", true, true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["lessThan", 123.456, 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["lessThan", 123.455, 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["lessThan", 123, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["lessThan", 122, 123],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with nulls",
3 | "expression": ["lessThan", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["lessThan", "1.5", "1"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThan/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["lessThan", "1.001", "1.1"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-bool-float.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, float]",
3 | "expression": ["lessThanEq", true, 123.456],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-bool-int.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, integer]",
3 | "expression": ["lessThanEq", true, 123],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-bool-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [boolean, null]",
3 | "expression": ["lessThanEq", true, null],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["lessThanEq", 123.456, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["lessThanEq", 124, 124],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-float-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (false)",
3 | "expression": ["lessThanEq", 123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-float-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-float, null] (false)",
3 | "expression": ["lessThanEq", -123.456, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-int-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (false)",
3 | "expression": ["lessThanEq", 1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-int-null-false2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [-integer, null] (false)",
3 | "expression": ["lessThanEq", -1, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-int-null-false3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [0, null] (false)",
3 | "expression": ["lessThanEq", 0, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, boolean]",
3 | "expression": ["lessThanEq", "1", true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["lessThanEq", "124", 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["lessThanEq", "123.456", 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["lessThanEq", "123", 1],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["lessThanEq", "2", 2],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["lessThanEq", "12", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/diff-types-string-null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with [string, null]",
3 | "expression": ["lessThanEq", "hello world", null],
4 | "expectsFailure": "Expected number, got value \"hello world\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-bool.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail with booleans",
3 | "expression": ["lessThanEq", true, true],
4 | "expectsFailure": "Expected number, got value true"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["lessThanEq", 123.457, 123.456],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["lessThanEq", 123.456, 123.456],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["lessThanEq", 123, 122],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["lessThanEq", 122, 122],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with nulls",
3 | "expression": ["lessThanEq", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["lessThanEq", "1.5", "1"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lessThanEq/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["lessThanEq", "1.001", "1.001"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/linkToPage/linkToPage-stateless.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should create a link with reference to a page when no instance is provided",
3 | "expression": ["linkToPage", "Klikk på meg", "grid"],
4 | "expects": "Klikk på meg"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCase/lowercase-number-should-return-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return number as string when number is passed",
3 | "expression": ["lowerCase", 40],
4 | "expects": "40"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCase/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return a null when the input is a null",
3 | "expression": ["lowerCase", null],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCase/should-lowercase-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should lowercase the string",
3 | "expression": ["lowerCase", "HELLO"],
4 | "expects": "hello"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCase/should-lowercase-whole-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should lowercase the whole string when given a string has multiple words",
3 | "expression": ["lowerCase", "Hola, Como Estas?"],
4 | "expects": "hola, como estas?"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCase/should-lowercase-whole-word.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should lowercase the whole string",
3 | "expression": ["lowerCase", "HElLo"],
4 | "expects": "hello"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCaseFirst/number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should accept, but just return a number",
3 | "expression": ["lowerCaseFirst", 789],
4 | "expects": "789"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCaseFirst/simple1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should lowercase the first letter of the string",
3 | "expression": ["lowerCaseFirst", "HELLO"],
4 | "expects": "hELLO"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/lowerCaseFirst/simple2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should lowercase the first letter when given multiple words",
3 | "expression": ["lowerCaseFirst", "HELLO WORLD FOO BAR"],
4 | "expects": "hELLO WORLD FOO BAR"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-changes-notNull-to-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not errors on string \"notNull\"",
3 | "expression": ["not", "notNull"],
4 | "expectsFailure": "Expected boolean, got value \"notNull\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-changes-null-to-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not changes not null to true",
3 | "expression": ["not", null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-errors-on-numbers-not-0-or-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not errors on numbers not 0 or 1",
3 | "expression": ["not", 1337],
4 | "expectsFailure": "Expected boolean, got value 1337"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-errors-on-two-arguments.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not errors two arguments",
3 | "expression": ["not", 3, 34, 5],
4 | "expectsFailure": "Expected 1 argument(s), got 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-errors-on-zero-arguments.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not errors zero arguments",
3 | "expression": ["not"],
4 | "expectsFailure": "Expected 1 argument(s), got 0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-handles-numeric-zero-as-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not handles numeric zero as true",
3 | "expression": ["not", 0],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-inverts-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not inverts false",
3 | "expression": ["not", false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/not/not-inverts-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Not inverts true",
3 | "expression": ["not", true],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/case-sensitivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should not match case sensitive",
3 | "expression": ["notContains", "Hello", "hello"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/exact-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return false when the string does contain the substring",
3 | "expression": ["notContains", "abc", "abc"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/not-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "should return true if the string does not contain the substring",
3 | "expression": ["notContains", "Hello", "Bye"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return true if the input is null",
3 | "expression": ["notContains", null, null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return true if the input is null",
3 | "expression": ["notContains", "null", null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/null3.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always return true if the input is null",
3 | "expression": ["notContains", null, "null"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notContains/null4.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should treat stringy nulls as null",
3 | "expression": ["notContains", "null", "null"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-bool-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, float] (true)",
3 | "expression": ["notEquals", false, 0.0005],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-bool-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, integer] (true)",
3 | "expression": ["notEquals", true, 1],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-bool-null-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [boolean, null] (true)",
3 | "expression": ["notEquals", true, null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-float-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (false)",
3 | "expression": ["notEquals", 123, 123],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-float-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, integer] (true)",
3 | "expression": ["notEquals", 123.005, 123],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-float-null-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [float, null] (true)",
3 | "expression": ["notEquals", 0, null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-int-null-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [integer, null] (true)",
3 | "expression": ["notEquals", 0, null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-bool-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, boolean] (false)",
3 | "expression": ["notEquals", "false", false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-bool-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, boolean] (true)",
3 | "expression": ["notEquals", "0", false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (false)",
3 | "expression": ["notEquals", "1234.55", 1234.55],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, float] (true)",
3 | "expression": ["notEquals", "1234.56789", 1234.5678],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (false)",
3 | "expression": ["notEquals", "55", 55],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, integer] (true)",
3 | "expression": ["notEquals", "12345", 1234],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-null-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (false)",
3 | "expression": ["notEquals", "null", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/diff-types-string-null-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with [string, null] (true)",
3 | "expression": ["notEquals", "false", null],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-bool-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with booleans (false)",
3 | "expression": ["notEquals", false, false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-bool-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with booleans (true)",
3 | "expression": ["notEquals", false, true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-float-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (false)",
3 | "expression": ["notEquals", 12.56, 12.56],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-float-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with floats (true)",
3 | "expression": ["notEquals", 2.51, 2.5],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-int-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (false)",
3 | "expression": ["notEquals", 2, 2],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-int-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with integers (true)",
3 | "expression": ["notEquals", 2, 25],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with null",
3 | "expression": ["notEquals", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-string-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (false)",
3 | "expression": ["notEquals", "bar", "bar"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/notEquals/same-types-string-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with strings (true)",
3 | "expression": ["notEquals", "foo", "bar"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/all-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "All true inputs",
3 | "expression": ["or", true, true, true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/allows-0.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 0 as false",
3 | "expression": ["or", 0, 0, 0],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/allows-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 1 as true",
3 | "expression": ["or", 1, 1, false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/allows-stringy-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 'false' as false",
3 | "expression": ["or", "false"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/allows-stringy-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Allows 'true' as true",
3 | "expression": ["or", "true"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/disallows-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows 2 as true",
3 | "expression": ["or", 2, true],
4 | "expectsFailure": "Expected boolean, got value 2"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/disallows-empty-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows empty strings",
3 | "expression": ["or", true, ""],
4 | "expectsFailure": "Expected boolean, got value \"\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/disallows-other-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Disallows other strings",
3 | "expression": ["or", true, "yes"],
4 | "expectsFailure": "Expected boolean, got value \"yes\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/empty-or.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Empty input produces an error",
3 | "expression": ["or"],
4 | "expectsFailure": "Expected 1+ argument(s), got 0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/last-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Last input false",
3 | "expression": ["or", true, true, false],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/null-is-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Null is false",
3 | "expression": ["or", null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/single-input-false.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Single input returns the same (false)",
3 | "expression": ["or", false],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/or/single-input-true.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Single input returns the same (true)",
3 | "expression": ["or", true],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/nearest-integer-with-decimal-as-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should round a number to the nearest integer with a precision of 2",
3 | "expression": ["round", "2.2199999", "2"],
4 | "expects": "2.22"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/nearest-integer-with-decimal.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should round a number to the nearest integer with a precision of 2",
3 | "expression": ["round", 3.2199999, 2],
4 | "expects": "3.22"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/nearest-integer.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should round to nearest integer",
3 | "expression": ["round", 3.2, null],
4 | "expects": "3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-0-decimal-places.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round 0 to 0 decimal places",
3 | "expression": ["round", 0, 0],
4 | "expects": "0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-0-decimal-places2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round 0 to 0 decimal places",
3 | "expression": ["round", 2.9999, 0],
4 | "expects": "3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-negative-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should round negative number",
3 | "expression": ["round", -2.999, null],
4 | "expects": "-3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round a null",
3 | "expression": ["round", null],
4 | "expects": "0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round a null",
3 | "expression": ["round", null, 2],
4 | "expects": "0.00"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-strings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round a number to the nearest integer even if it is a string",
3 | "expression": ["round", "3.99", null],
4 | "expects": "4"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-with-too-many-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should fail when given too many arguments",
3 | "expression": ["round", 3.99, 2, 3],
4 | "expectsFailure": "Expected 1-2 argument(s), got 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-without-decimalCount.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round a number without the optional second argument",
3 | "expression": ["round", "3.99"],
4 | "expects": "4"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/round/round-without-decimalCount2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be able to round a number without the optional second argument",
3 | "expression": ["round", 3.99],
4 | "expects": "4"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/case-sensitivity.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be case sensitive and return false if the string does start with the given string but opposite case",
3 | "expression": ["startsWith", "Hello", "HEL"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "All strings start with an empty string",
3 | "expression": ["startsWith", "Hello world", ""],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/exact-match.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string starts with the specified string, even on exact match",
3 | "expression": ["startsWith", "Hello", "Hello"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/not-starts-with.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be false when the string does not starts with the specified string",
3 | "expression": ["startsWith", "Hello", "Bye"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always be false when given a null",
3 | "expression": ["startsWith", null, "null"],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/null2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should always be false when given a null",
3 | "expression": ["startsWith", null, null],
4 | "expects": false
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/number-starts-with-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the given number starts with the given digit",
3 | "expression": ["startsWith", 102, 1],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/number-starts-with-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the number starts with the given string (number starts with string)",
3 | "expression": ["startsWith", 40, "40"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/start-with-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string starts with the given string (even when the given 'string' is a number)",
3 | "expression": ["startsWith", "40 years old", 40],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/startsWith/start-with.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should be true when the string starts with the specified string",
3 | "expression": ["startsWith", "Hello", "Hel"],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/emoji.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should count an emoji as 2 characters (as JS counts UTF-16 code units)",
3 | "expression": ["stringIndexOf", "🌍!", "!"],
4 | "expects": 2
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/look-for-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null when looking for null",
3 | "expression": ["stringIndexOf", "foo bar", null],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/look-in-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null when looking in null",
3 | "expression": ["stringIndexOf", null, "foo"],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/not-found.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "When substring is not found, returns null",
3 | "expression": ["stringIndexOf", "foo bar", "baz"],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should find the index of a number",
3 | "expression": ["stringIndexOf", 123456789, "345"],
4 | "expects": 2
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should find the index of a substring",
3 | "expression": ["stringIndexOf", "Hello, world!", "world"],
4 | "expects": 7
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringIndexOf/whitespace.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Whitespace should be counted",
3 | "expression": ["stringIndexOf", " foo", "foo"],
4 | "expects": 4
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/empty-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return the length of a string even when it's empty",
3 | "expression": ["stringLength", ""],
4 | "expects": 0
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/length-equals.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Two strings of equal length should be equal according to equals expression",
3 | "expression": ["equals", ["stringLength", "Hello"], ["stringLength", "World"]],
4 | "expects": true
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/length-of-number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return the length of a string even if it is type of number",
3 | "expression": ["stringLength", 203],
4 | "expects": 3
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/length-of-unicode.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return the number of characters in a unicode string",
3 | "expression": ["stringLength", "æøå"],
4 | "expects": 3
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return 0 when the input is a null",
3 | "expression": ["stringLength", null],
4 | "expects": 0
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/string-length.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return the length of a string",
3 | "expression": ["stringLength", "Hello"],
4 | "expects": 5
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringLength/whitespace-length.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should count whitespace as a character when counting string length",
3 | "expression": ["stringLength", " "],
4 | "expects": 1
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringReplace/emoji.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should replace an emoji",
3 | "expression": ["stringReplace", "Hello, \uD83C\uDF0D!", "\uD83C\uDF0D", "planet"],
4 | "expects": "Hello, planet!"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringReplace/multiple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should replace multiple substrings",
3 | "expression": ["stringReplace", "Hel lo, wo rld !", " ", ""],
4 | "expects": "Hello,world!"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringReplace/replace-with-null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should allow replacing with null (as empty string)",
3 | "expression": ["stringReplace", "Hello, {0}!", "{0}", null],
4 | "expects": "Hello, !"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringReplace/simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should find and replace a substring",
3 | "expression": ["stringReplace", "Hello, world!", "world", "planet"],
4 | "expects": "Hello, planet!"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringReplace/special-chars.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should find and replace special characters",
3 | "expression": ["stringReplace", "Hello, {[!@#$%^&*()]}!", "{[!@#$%^&*()]}", "planet"],
4 | "expects": "Hello, planet!"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/end-before-start.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work when negative end index is before string starts",
3 | "expression": ["stringSlice", "hello", 0, -8],
4 | "expects": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/end-too-large.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work even if end index is too large",
3 | "expression": ["stringSlice", "hello", 4, 10],
4 | "expects": "o"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/negative-end.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with a negative end index",
3 | "expression": ["stringSlice", "filename.pdf", 0, -4],
4 | "expects": "filename"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/negative-start.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work with a negative start index",
3 | "expression": ["stringSlice", "filename.pdf", -3],
4 | "expects": "pdf"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should slice a simple string",
3 | "expression": ["stringSlice", "hello", 1, 4],
4 | "expects": "ell"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/start-before-length.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work when negative start index is before full string length",
3 | "expression": ["stringSlice", "hello", -8],
4 | "expects": "hello"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/stringSlice/start-too-large.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should work even if start index is too large",
3 | "expression": ["stringSlice", "hello", 10],
4 | "expects": ""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/text/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return null when the input is null",
3 | "expression": ["text", null],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/text/should-return-key-name-if-key-not-exist.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return 'key-name' when key does not exist",
3 | "expression": ["text", "random-key"],
4 | "expects": "random-key"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/text/should-return-text-resource.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return text resource value",
3 | "expression": ["text", "found.key"],
4 | "expects": "Hello world",
5 | "textResources": [
6 | {
7 | "id": "found.key",
8 | "value": "Hello world"
9 | }
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/unknown/appSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Invalid function gives an error",
3 | "expression": ["equals", true, ["applicationSettings"]],
4 | "expectsFailure": "Function \"applicationSettings\" not implemented"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/unknown/function-wrong-case.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Function with wrong case gives an error",
3 | "expression": ["datamodel", "test"],
4 | "expectsFailure": "Function \"datamodel\" not implemented"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/unknown/invalid-function.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Invalid function gives an error",
3 | "expression": ["equals", true, ["functionThatDoesNotExist"]],
4 | "expectsFailure": "Function \"functionThatDoesNotExist\" not implemented"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCase/null.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return a null when the input is a null",
3 | "expression": ["upperCase", null],
4 | "expects": null
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCase/should-uppercase-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should UPPERCASE the string",
3 | "expression": ["upperCase", "hello"],
4 | "expects": "HELLO"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCase/should-uppercase-whole-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should UPPERCASE the whole string when given a string has multiple words",
3 | "expression": ["upperCase", "Hola, como estas?"],
4 | "expects": "HOLA, COMO ESTAS?"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCase/should-uppercase-whole-word.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should UPPERCASE the whole string",
3 | "expression": ["upperCase", "heLlo"],
4 | "expects": "HELLO"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCase/uppercase-number-should-return-string.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return number as string when number is passed",
3 | "expression": ["upperCase", 40],
4 | "expects": "40"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCaseFirst/number.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should accept, but just return a number",
3 | "expression": ["upperCaseFirst", 789],
4 | "expects": "789"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCaseFirst/simple1.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should uppercase the first letter of the string",
3 | "expression": ["upperCaseFirst", "hello"],
4 | "expects": "Hello"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/upperCaseFirst/simple2.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should uppercase the first letter of the string when given multiple words",
3 | "expression": ["upperCaseFirst", "hello wOrld Foo bar"],
4 | "expects": "Hello wOrld Foo bar"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/value/error-invalid-key.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return list of keys when using the wrong key",
3 | "expression": ["value", "b"],
4 | "expectsFailure": "Unknown key b, Valid keys are: v, a",
5 | "valueArguments": {
6 | "data": {
7 | "v": "foo",
8 | "a": "bar"
9 | },
10 | "defaultKey": "v"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/value/explicit-default-key.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return 'foo' when explicitly asking for default key",
3 | "expression": ["value", "v"],
4 | "expects": "foo",
5 | "valueArguments": {
6 | "data": {
7 | "v": "foo"
8 | },
9 | "defaultKey": "v"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/value/implicit-default-value.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return 'foo' when asked for default key",
3 | "expression": ["value"],
4 | "expects": "foo",
5 | "valueArguments": {
6 | "data": {
7 | "value": "foo"
8 | },
9 | "defaultKey": "value"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/functions/value/other-key.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Should return 'bar' when asking for non-default key",
3 | "expression": ["value", "a"],
4 | "expects": "bar",
5 | "valueArguments": {
6 | "data": {
7 | "v": "foo",
8 | "a": "bar"
9 | },
10 | "defaultKey": "v"
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/empty-array-inside.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Empty array inside expression gives error",
3 | "expression": ["equals", [], true],
4 | "expectsFailure": "Missing function name in expression"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/empty-array.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Empty array gives error",
3 | "expression": [],
4 | "expectsFailure": "Missing function name in expression"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/empty-object.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Empty object inside expression parsed as other expression",
3 | "expression": ["equals", true, {}],
4 | "expectsFailure": "Invalid type \"object\""
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/extra-argument.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Extra argument in expression gives error",
3 | "expression": ["equals", true, false, 55],
4 | "expectsFailure": "Expected 2 argument(s), got 3"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/func-not-implemented.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Non-implemented function gives error",
3 | "expression": ["non-existing-function", 1, 2],
4 | "expectsFailure": "Function \"non-existing-function\" not implemented"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/missing-args.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Missing arguments produces an error",
3 | "expression": ["equals"],
4 | "expectsFailure": "Expected 2 argument(s), got 0"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/numeric-array.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Numeric array gives error",
3 | "expression": ["equals", [true, [1, 2, 3]]],
4 | "expectsFailure": "Function name in expression should be string"
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/expressions/shared-tests/invalid/wrong-function-capitalization.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "FrontendSettings is not implemented",
3 | "expression": ["FrontendSettings", "mySetting1"],
4 | "expectsFailure": "Function \"FrontendSettings\" not implemented",
5 | "frontendSettings": {
6 | "mySetting1": "foo"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/footer/components/FooterComponentWrapper.module.css:
--------------------------------------------------------------------------------
1 | .wrapper {
2 | align-self: center;
3 | justify-self: center;
4 | }
5 |
--------------------------------------------------------------------------------
/src/features/formData/InvalidSubformLayoutException.ts:
--------------------------------------------------------------------------------
1 | export class InvalidSubformLayoutException extends Error {
2 | public readonly id: string;
3 | constructor(id: string) {
4 | super(`The layout set with id '${id}' cannot have both type "subform" and a task association.`);
5 | this.id = id;
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/src/features/formData/MissingRowIdException.ts:
--------------------------------------------------------------------------------
1 | export class MissingRowIdException extends Error {
2 | public readonly path: string;
3 |
4 | constructor(dataModelPath: string) {
5 | super(`Missing row ID in data model for ${dataModelPath}`);
6 | this.path = dataModelPath;
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/src/features/instantiate/containers/InstantiationContainer.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | --page-max-width: 1056px;
3 | --page-padding-x: 24px;
4 | --footer-padding: var(--page-padding-x);
5 |
6 | background-color: white;
7 | width: 100%;
8 | max-width: var(--page-max-width);
9 | padding: 0 var(--page-padding-x);
10 | margin: 0 auto;
11 | display: flex;
12 | flex-direction: column;
13 | box-sizing: border-box;
14 | }
15 |
--------------------------------------------------------------------------------
/src/features/instantiate/useInstantiateWithPrefillMutation.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Altinn/app-frontend-react/0cf3ffa17d4ca366fe199b2a487b2a7c7d581a78/src/features/instantiate/useInstantiateWithPrefillMutation.ts
--------------------------------------------------------------------------------
/src/features/language/textResources/index.ts:
--------------------------------------------------------------------------------
1 | import type { ITextResource } from 'src/types/shared';
2 |
3 | export interface TextResourceMap {
4 | [key: string]: ITextResource | undefined;
5 | }
6 |
7 | export interface IRawTextResource extends ITextResource {
8 | id: string;
9 | }
10 |
11 | export interface ITextResourceResult {
12 | language: string;
13 | resources: IRawTextResource[];
14 | }
15 |
--------------------------------------------------------------------------------
/src/features/language/textResources/resourcesAsMap.ts:
--------------------------------------------------------------------------------
1 | import type { IRawTextResource } from 'src/features/language/textResources/index';
2 |
3 | export function resourcesAsMap(resources: IRawTextResource[]) {
4 | return resources.reduce((acc, { id, ...resource }) => ({ ...acc, [id]: resource }), {});
5 | }
6 |
--------------------------------------------------------------------------------
/src/features/navigation/AppNavigation.module.css:
--------------------------------------------------------------------------------
1 | .navigation-heading {
2 | font-weight: normal;
3 | margin-bottom: 1.5rem;
4 | display: flex;
5 | flex-direction: row;
6 | justify-content: space-between;
7 | align-items: flex-end;
8 | }
9 |
10 | .group-list {
11 | list-style-type: none;
12 | padding: 0;
13 | margin: 0;
14 | }
15 |
16 | .group-list > li:not(:last-child) {
17 | margin-bottom: 28px;
18 | }
19 |
--------------------------------------------------------------------------------
/src/features/pdf/types.ts:
--------------------------------------------------------------------------------
1 | export interface IPdfFormat {
2 | excludedPages: string[];
3 | excludedComponents: string[];
4 | }
5 |
--------------------------------------------------------------------------------
/src/hooks/useIsPdf.ts:
--------------------------------------------------------------------------------
1 | import { SearchParams, useQueryKey } from 'src/features/routing/AppRoutingContext';
2 |
3 | /**
4 | * Hook checking whether we are in PDF generation mode
5 | */
6 | export function useIsPdf() {
7 | return useQueryKey(SearchParams.Pdf) === '1';
8 | }
9 |
--------------------------------------------------------------------------------
/src/layout/Accordion/Accordion.module.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | .accordion h2 > button {
3 | display: unset !important;
4 | }
5 |
6 | .container {
7 | break-inside: avoid;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/layout/Address/AddressComponent.module.css:
--------------------------------------------------------------------------------
1 | .addressComponent {
2 | display: flex;
3 | flex-direction: column;
4 | width: 100%;
5 | gap: 18px;
6 | }
7 |
8 | .addressComponentPostplace {
9 | flex-grow: 4;
10 | max-width: 300px;
11 | }
12 |
13 | .addressComponentZipCode {
14 | flex-grow: 0;
15 | box-sizing: content-box;
16 | }
17 |
18 | .addressComponentSmallInputs {
19 | max-width: 90px;
20 | }
21 |
--------------------------------------------------------------------------------
/src/layout/Alert/Alert.module.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | .container {
3 | break-inside: avoid;
4 | }
5 | }
6 |
7 | .title {
8 | font-weight: 500;
9 | font-size: 1.25rem;
10 | }
11 |
12 | .body {
13 | margin: 0;
14 | }
15 |
--------------------------------------------------------------------------------
/src/layout/ButtonGroup/ButtonGroupComponent.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | margin-top: var(--button-margin-top);
3 | gap: var(--button-gap);
4 | }
5 |
--------------------------------------------------------------------------------
/src/layout/Cards/Cards.module.css:
--------------------------------------------------------------------------------
1 | .card {
2 | height: 100%;
3 | }
4 |
5 | .cardMedia img,
6 | audio,
7 | video {
8 | object-fit: cover;
9 | }
10 |
11 | .cardMedia:last-of-type {
12 | margin-top: auto;
13 | }
14 |
--------------------------------------------------------------------------------
/src/layout/Checkboxes/CheckboxesContainerComponentSummary.module.css:
--------------------------------------------------------------------------------
1 | .formValue {
2 | font-weight: bold;
3 | }
4 |
--------------------------------------------------------------------------------
/src/layout/Checkboxes/CheckboxesSummary.module.css:
--------------------------------------------------------------------------------
1 | .formValue {
2 | font-weight: 500;
3 | }
4 |
5 | .labelValueWrapper {
6 | display: flex;
7 | flex-direction: column;
8 | gap: var(--fds-spacing-2);
9 | }
10 |
11 | .checkboxSummaryItem {
12 | display: flex;
13 | align-items: flex-start;
14 | flex-direction: row;
15 | }
16 |
17 | .editButton {
18 | margin-left: auto;
19 | min-width: unset;
20 | }
21 |
--------------------------------------------------------------------------------
/src/layout/FileUpload/FileUploadComponent.module.css:
--------------------------------------------------------------------------------
1 | .fileUploadButton {
2 | cursor: pointer;
3 | background: 0;
4 | font-size: 1rem;
5 | border-left: 0;
6 | border-right: 0;
7 | border-top: 0;
8 | padding: 0;
9 | margin-top: 1.5rem;
10 | }
11 |
12 | .betweenTableAndDropMargin {
13 | display: block;
14 | visibility: hidden;
15 | height: 1.5rem;
16 | }
17 |
--------------------------------------------------------------------------------
/src/layout/FileUpload/Summary/summary.ts:
--------------------------------------------------------------------------------
1 | import { useAttachmentsFor } from 'src/features/attachments/hooks';
2 | import type { IAttachment } from 'src/features/attachments';
3 | import type { LayoutNode } from 'src/utils/layout/LayoutNode';
4 |
5 | export function useUploaderSummaryData(node: LayoutNode<'FileUpload' | 'FileUploadWithTag'>): IAttachment[] {
6 | return useAttachmentsFor(node);
7 | }
8 |
--------------------------------------------------------------------------------
/src/layout/Input/InputComponent.module.css:
--------------------------------------------------------------------------------
1 | .text-align-right,
2 | .text-align-right input {
3 | text-align: right;
4 | }
5 |
6 | .text-align-left,
7 | .text-align-left input {
8 | text-align: left;
9 | }
10 |
11 | .text-align-center,
12 | .text-align-center input {
13 | text-align: center;
14 | }
15 |
--------------------------------------------------------------------------------
/src/layout/InstantiationButton/InstantiationButton.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | display: flex;
3 | gap: var(--button-gap);
4 | width: 100%;
5 | }
6 |
--------------------------------------------------------------------------------
/src/layout/Likert/Summary2/LikertSummary.module.css:
--------------------------------------------------------------------------------
1 | .summaryItem {
2 | display: flex;
3 | flex-direction: row;
4 | align-items: center;
5 | }
6 |
7 | .summaryItemWrapper {
8 | display: flex;
9 | flex-direction: column;
10 | gap: var(--fds-spacing-6);
11 | }
12 |
13 | .editButton {
14 | margin-left: auto;
15 | min-width: unset;
16 | }
17 |
--------------------------------------------------------------------------------
/src/layout/Map/types.ts:
--------------------------------------------------------------------------------
1 | import type { GeoJSON } from 'geojson';
2 |
3 | export type RawGeometry = {
4 | altinnRowId: string;
5 | data: string;
6 | label?: string;
7 | };
8 |
9 | export type Geometry = {
10 | altinnRowId: string;
11 | data: GeoJSON;
12 | label?: string;
13 | };
14 |
--------------------------------------------------------------------------------
/src/layout/NavigationButtons/NavigationButtonsComponent.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | display: flex;
3 | flex-direction: row-reverse;
4 | justify-content: flex-end;
5 | gap: var(--button-gap);
6 | }
7 |
--------------------------------------------------------------------------------
/src/layout/Paragraph/ParagraphComponent.module.css:
--------------------------------------------------------------------------------
1 | .paragraphWrapper {
2 | display: flex;
3 | }
4 |
--------------------------------------------------------------------------------
/src/layout/Payment/PaymentComponent.module.css:
--------------------------------------------------------------------------------
1 | .buttonContainer {
2 | display: flex;
3 | gap: var(--fds-spacing-3);
4 | }
5 |
6 | .alertContainer {
7 | display: flex;
8 | flex-direction: column;
9 | gap: var(--fds-spacing-3);
10 | }
11 |
12 | .paymentContainer {
13 | display: flex;
14 | flex-direction: column;
15 | gap: var(--fds-spacing-6);
16 | }
17 |
--------------------------------------------------------------------------------
/src/layout/Payment/SkeletonLoader/SkeletonLoader.module.css:
--------------------------------------------------------------------------------
1 | .titleContainer {
2 | display: flex;
3 | gap: 10px;
4 | align-items: center;
5 | padding: 5px 0 5px 0;
6 | }
7 |
8 | .skeletonWrapper {
9 | width: 100%;
10 | }
11 |
--------------------------------------------------------------------------------
/src/layout/Payment/SkeletonLoader/index.tsx:
--------------------------------------------------------------------------------
1 | import { SkeletonLoader } from 'src/layout/Payment/SkeletonLoader/SkeletonLoader';
2 | export { SkeletonLoader };
3 |
--------------------------------------------------------------------------------
/src/layout/PaymentDetails/PaymentDetailsTable.module.css:
--------------------------------------------------------------------------------
1 | .orderDetailsTable {
2 | width: 100%;
3 | }
4 |
5 | .tableCaption {
6 | text-align: left;
7 | }
8 |
9 | .tableRow:hover td {
10 | background-color: var(--fds-semantic-surface-neutral-default);
11 | }
12 |
--------------------------------------------------------------------------------
/src/layout/RepeatingGroup/Container/RepeatingGroupContainer.module.css:
--------------------------------------------------------------------------------
1 | .showAllFieldset > legend {
2 | padding-left: var(--modal-padding-x);
3 | padding-right: var(--modal-padding-x);
4 | }
5 |
6 | .showAllFieldset .showAllDescription {
7 | padding-left: var(--modal-padding-x);
8 | padding-right: var(--modal-padding-x);
9 | padding-bottom: 12px !important;
10 | }
11 |
12 | .showAllFieldset > * {
13 | margin-top: 0 !important;
14 | }
15 |
--------------------------------------------------------------------------------
/src/layout/RepeatingGroup/Pagination/RepeatingGroupPagination.module.css:
--------------------------------------------------------------------------------
1 | .pagination {
2 | display: flex;
3 | justify-content: center;
4 | }
5 |
6 | .pagination ul {
7 | padding: 0;
8 | }
9 |
10 | .row,
11 | .row td {
12 | background-color: var(--fds-semantic-surface-neutral-subtle);
13 | }
14 |
15 | .hidden {
16 | visibility: hidden;
17 | }
18 |
--------------------------------------------------------------------------------
/src/layout/RepeatingGroup/Summary/LargeGroupSummaryContainer.module.css:
--------------------------------------------------------------------------------
1 | .largeGroupContainer {
2 | padding-bottom: 38px !important;
3 | }
4 |
5 | .group {
6 | width: 100%;
7 | padding: 12px;
8 | }
9 |
10 | .summary {
11 | width: 100%;
12 | }
13 |
--------------------------------------------------------------------------------
/src/layout/SigneeList/SigneeListComponent.module.css:
--------------------------------------------------------------------------------
1 | .header {
2 | background-color: var(--fds-semantic-surface-action-subtle);
3 | font-weight: 400;
4 | border-bottom-color: var(--fds-semantic-border-action-hover);
5 | }
6 |
7 | .table tr td:last-child {
8 | width: 1%;
9 | }
10 |
--------------------------------------------------------------------------------
/src/layout/Subform/Summary/SubformSummaryComponent.module.css:
--------------------------------------------------------------------------------
1 | .container {
2 | display: grid;
3 | grid-template-columns: 1fr;
4 | }
5 |
6 | .emptyField {
7 | font-style: italic;
8 | font-size: 1rem;
9 | line-height: 1.6875;
10 | }
11 |
12 | .row:not(:first-child) {
13 | margin-top: 0.5rem;
14 | }
15 |
16 | /* Mobile layout */
17 | @media screen and (max-width: 768px) {
18 | .tag {
19 | text-align: left;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/layout/Summary/EditButton.module.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | .editButton {
3 | display: none;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/src/layout/Summary/SummaryComponent.module.css:
--------------------------------------------------------------------------------
1 | .border {
2 | margin-bottom: 10px;
3 | padding-bottom: 10px;
4 | border-bottom: var(--dashed-border-primary);
5 | }
6 |
7 | .link {
8 | background: none;
9 | border: none;
10 | border-bottom: var(--solid-border-primary);
11 | cursor: pointer;
12 | padding-left: 0px;
13 | }
14 |
--------------------------------------------------------------------------------
/src/layout/Summary/SummaryItemCompact.module.css:
--------------------------------------------------------------------------------
1 | .data {
2 | font-weight: 500;
3 | overflow-wrap: break-word;
4 | }
5 |
6 | .emptyField {
7 | font-style: italic;
8 | font-size: 0.875rem;
9 | overflow-wrap: break-word;
10 | }
11 |
--------------------------------------------------------------------------------
/src/layout/Summary/SummaryItemSimple.module.css:
--------------------------------------------------------------------------------
1 | .data {
2 | font-weight: 500;
3 | font-size: 1.125rem;
4 | overflow-wrap: break-word;
5 | }
6 |
7 | .emptyField {
8 | font-style: italic;
9 | line-height: 1.6875;
10 | overflow-wrap: break-word;
11 | }
12 |
13 | .multiline {
14 | white-space: pre-wrap;
15 | }
16 |
--------------------------------------------------------------------------------
/src/layout/Summary2/CommonSummaryComponents/LayoutSetSummaryAccordion.module.css:
--------------------------------------------------------------------------------
1 | .summaryItem {
2 | width: 100%;
3 | }
4 |
--------------------------------------------------------------------------------
/src/layout/Summary2/Summary2.module.css:
--------------------------------------------------------------------------------
1 | .summaryItem {
2 | width: 100%;
3 | }
4 |
5 | .greyedOut,
6 | .greyedOut * {
7 | background-color: #dfdfdf !important;
8 | }
9 |
10 | .hidden {
11 | display: none;
12 | }
13 |
14 | .visible {
15 | }
16 |
--------------------------------------------------------------------------------
/src/layout/Summary2/SummaryComponent2/types.ts:
--------------------------------------------------------------------------------
1 | import type { CompTypes } from 'src/layout/layout';
2 | import type { LayoutNode } from 'src/utils/layout/LayoutNode';
3 |
4 | export interface Summary2Props {
5 | target: LayoutNode;
6 | }
7 |
--------------------------------------------------------------------------------
/src/layout/Tabs/Tabs.module.css:
--------------------------------------------------------------------------------
1 | .tabContent {
2 | background-color: white;
3 | display: flex;
4 | flex-direction: column;
5 | gap: var(--fds-spacing-6);
6 | }
7 | .icon {
8 | width: var(--fds-sizing-6);
9 | }
10 |
--------------------------------------------------------------------------------
/src/layout/Tabs/TabsSummary.module.css:
--------------------------------------------------------------------------------
1 | .summaryContent {
2 | display: flex;
3 | gap: var(--fds-spacing-6);
4 | flex-direction: column;
5 | }
6 |
7 | .tabDivider {
8 | height: var(--fds-border_width-active);
9 | border: none;
10 | background-color: var(--fds-semantic-border-neutral-default);
11 | margin: 0;
12 | }
13 |
14 | .tabWrapper {
15 | display: flex;
16 | gap: var(--fds-spacing-8);
17 | flex-direction: column;
18 | }
19 |
--------------------------------------------------------------------------------
/src/modules.ts:
--------------------------------------------------------------------------------
1 | declare module '*.png';
2 |
3 | declare module '*.module.css';
4 |
5 | declare module 'ajv-formats-draft2019' {
6 | import type Ajv from 'ajv/dist/core';
7 | function addAdditionalFormats(ajv: Ajv): void;
8 | export = addAdditionalFormats;
9 | }
10 |
--------------------------------------------------------------------------------
/src/styles/combobox.module.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Workaround to make the combobox shrink on narrow screens
3 | */
4 | .container [class*='fds-combobox__input__wrapper'],
5 | .container [class*='fds-combobox__chip-and-input'],
6 | .container input {
7 | min-width: 0;
8 | }
9 |
--------------------------------------------------------------------------------
/src/styles/print.module.css:
--------------------------------------------------------------------------------
1 | @media print {
2 | .break-before-auto {
3 | break-before: auto;
4 | }
5 | .break-after-auto {
6 | break-after: auto;
7 | }
8 | .break-before-always {
9 | break-before: page;
10 | }
11 | .break-after-always {
12 | break-after: page;
13 | }
14 | .break-before-avoid {
15 | break-before: avoid-page;
16 | }
17 | .break-after-avoid {
18 | break-after: avoid-page;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/styles/utils.module.css:
--------------------------------------------------------------------------------
1 | /* Focus utility class */
2 | .focusable:focus-within {
3 | outline: var(--fds-focus-border-width) solid var(--fds-outer-focus-border-color);
4 | outline-offset: var(--fds-focus-border-width);
5 | box-shadow: 0 0 0 var(--fds-focus-border-width) var(--fds-inner-focus-border-color);
6 | }
7 |
--------------------------------------------------------------------------------
/src/test/jestTools/transformCss.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @see https://jestjs.io/docs/code-transformation#examples
3 | */
4 | module.exports = {
5 | process(_sourceText, _sourcePath) {
6 | return {
7 | code: `module.exports = require('identity-obj-proxy');`,
8 | };
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/src/test/jestTools/transformFile.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @see https://jestjs.io/docs/code-transformation#examples
3 | */
4 | module.exports = {
5 | process(_sourceText, sourcePath) {
6 | return {
7 | code: `module.exports = ${JSON.stringify(sourcePath)};`,
8 | };
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/src/utils/authContext.ts:
--------------------------------------------------------------------------------
1 | import type { IAuthContext, ITask } from 'src/types/shared';
2 |
3 | export function buildAuthContext(process: ITask | undefined): Partial {
4 | return {
5 | read: Boolean(process?.read),
6 | write: Boolean(process?.write),
7 | ...process?.actions,
8 | };
9 | }
10 |
--------------------------------------------------------------------------------
/src/utils/bodyStyling.ts:
--------------------------------------------------------------------------------
1 | export function changeBodyBackground(color: string) {
2 | document.body.style.backgroundColor = color;
3 | }
4 |
--------------------------------------------------------------------------------
/src/utils/getPageTitle.ts:
--------------------------------------------------------------------------------
1 | export const getPageTitle = (appName: string, title?: string, appOwner?: string) => {
2 | let result = appName;
3 | if (title) {
4 | result = `${title} - ${appName}`;
5 | }
6 | if (appOwner) {
7 | result += ` - ${appOwner}`;
8 | }
9 | return result;
10 | };
11 |
--------------------------------------------------------------------------------
/src/utils/typing.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Use to narrow anything into a boolean.
3 | * Useful for e.g. filtering out falsy values and keeping the type.
4 | */
5 | export function typedBoolean(value: T): value is Exclude {
6 | return Boolean(value);
7 | }
8 |
--------------------------------------------------------------------------------
/src/utils/waitForAnimationFrames.ts:
--------------------------------------------------------------------------------
1 | export async function waitForAnimationFrames(n: number) {
2 | for (let i = 0; i < n; i++) {
3 | await new Promise((resolve) => requestAnimationFrame(resolve));
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/test/.gitignore:
--------------------------------------------------------------------------------
1 | # Screenshots and videos
2 | /screenshots/
3 | /videos/
4 |
5 | # Reports
6 | /reports/
7 |
8 | # Downloads
9 | /downloads/
10 |
11 | # Various log files produced from running tests
12 | /redux-history/
13 | /logs/
14 |
--------------------------------------------------------------------------------
/test/e2e/fixtures/map-tile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Altinn/app-frontend-react/0cf3ffa17d4ca366fe199b2a487b2a7c7d581a78/test/e2e/fixtures/map-tile.png
--------------------------------------------------------------------------------
/test/e2e/fixtures/test-invalid.pdf:
--------------------------------------------------------------------------------
1 | test
2 |
--------------------------------------------------------------------------------
/test/e2e/integration/frontend-test/cards.ts:
--------------------------------------------------------------------------------
1 | describe('Cards component', () => {
2 | it('should render correctly', () => {
3 | cy.gotoHiddenPage('cards');
4 |
5 | cy.findByRole('checkbox', { name: /smake på kaker/i }).check();
6 |
7 | cy.snapshot('cards');
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/test/e2e/pageobjects/common.ts:
--------------------------------------------------------------------------------
1 | export class Common {
2 | // Standard Material UI components
3 | public altinnFlex = '[data-testid*="altinn-flex"]';
4 | public button = 'button[class*="MuiButton-root"]';
5 | public tableBody = 'table > tbody';
6 | public tableElement = 'tr > td';
7 | public caption = '.MuiTypography-caption';
8 | }
9 |
--------------------------------------------------------------------------------
/test/e2e/support/apps/component-library/inputAndVerify.ts:
--------------------------------------------------------------------------------
1 | export const fillInInputAndVerify = (text: string) => {
2 | cy.gotoNavPage('Kort svar');
3 | cy.get('#InputPage-Input').type(text);
4 | cy.get('[data-testid="summary-single-value-component"]').eq(0).find('span.fds-paragraph').should('have.text', text);
5 | };
6 |
--------------------------------------------------------------------------------
/test/e2e/support/lang.ts:
--------------------------------------------------------------------------------
1 | export const changeToLang = (option: 'en' | 'nb') => {
2 | cy.findByRole('button', { name: option === 'en' ? 'Språkvalg' : 'Language' }).click();
3 | cy.findByRole('menuitemradio', { name: option === 'en' ? 'Engelsk' : 'Norwegian bokmål' }).click();
4 |
5 | // Verify that the language has changed
6 | cy.findByRole('button', { name: option === 'en' ? 'Language' : 'Språkvalg' }).should('be.visible');
7 | };
8 |
--------------------------------------------------------------------------------
/test/global.ts:
--------------------------------------------------------------------------------
1 | import 'src/global';
2 | import 'src/modules';
3 |
--------------------------------------------------------------------------------
/test/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tsconfig.json",
3 | "compilerOptions": {
4 | "types": ["node", "cypress", "@testing-library/cypress", "cypress-wait-until"],
5 | "sourceMap": false
6 | },
7 | "include": ["./**/*.ts"],
8 | "exclude": ["../node_modules"]
9 | }
10 |
--------------------------------------------------------------------------------