├── .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 'Altinn'; 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 | --------------------------------------------------------------------------------