diff --git a/apps/spotlight/src/lib/github.ts b/apps/spotlight/src/lib/github.ts index b979f6d8..2d638567 100644 --- a/apps/spotlight/src/lib/github.ts +++ b/apps/spotlight/src/lib/github.ts @@ -7,7 +7,7 @@ export type GithubRepository = { export const DEFAULT_REPOSITORY: GithubRepository = { owner: 'gsa-tts', - repository: 'atj-platform', + repository: 'forms', branch: 'main', commit: 'main', }; @@ -28,7 +28,7 @@ export const getGithubRepository = async ( const { execSync } = await import('child_process'); return { owner: env.OWNER || 'gsa-tts', - repository: env.REPOSITORY || 'atj-platform', + repository: env.REPOSITORY || 'forms', branch: env.BRANCH || 'main', commit: execSync('git rev-parse HEAD').toString().trim(), }; diff --git a/documents/podman-integration.md b/documents/podman-integration.md index 14e9f3ef..034f9632 100644 --- a/documents/podman-integration.md +++ b/documents/podman-integration.md @@ -59,7 +59,6 @@ export TESTCONTAINERS_RYUK_DISABLED=true After adding the above lines to your shell configuration file, apply the changes by reloading your shell configuration: - For Zsh: ```bash source ~/.zshrc @@ -86,7 +85,6 @@ pnpm test If you're new to the team and need to start with Podman, follow these steps: - ### Step 1: Install Podman Install Podman using Homebrew: @@ -122,7 +120,6 @@ export TESTCONTAINERS_RYUK_DISABLED=true After adding the above lines to your shell configuration file, apply the changes by reloading your shell configuration: - For Zsh: ```bash source ~/.zshrc @@ -187,7 +184,6 @@ export PATH="$PNPM_HOME:$PATH" Save the file and close the editor. Apply the changes by reloading your shell configuration: - For Zsh: ```bash source ~/.zshrc diff --git a/infra/cdktf/__tests__/main-test.ts b/infra/cdktf/__tests__/main-test.ts index dc82a2af..22e4574e 100644 --- a/infra/cdktf/__tests__/main-test.ts +++ b/infra/cdktf/__tests__/main-test.ts @@ -1,5 +1,5 @@ import 'cdktf/lib/testing/adapters/jest'; -describe('atj-platform app stack', () => { +describe('Forms Platform app stack', () => { it.todo('should be tested'); }); diff --git a/infra/cdktf/src/lib/cloud.gov/node-astro.ts b/infra/cdktf/src/lib/cloud.gov/node-astro.ts index 3c3915d1..45e8be40 100644 --- a/infra/cdktf/src/lib/cloud.gov/node-astro.ts +++ b/infra/cdktf/src/lib/cloud.gov/node-astro.ts @@ -72,7 +72,7 @@ export class AstroService extends Construct { new cloudfoundry.app.App(this, `${id}-app`, { name: `${id}-app`, space: spaceId, - dockerImage: `ghcr.io/gsa-tts/atj-platform/${imageName}`, + dockerImage: `ghcr.io/gsa-tts/forms/${imageName}`, memory: 1024, diskQuota: 4096, healthCheckType: 'http', diff --git a/packages/common/src/locales/en/app.ts b/packages/common/src/locales/en/app.ts index 956dfc15..aa7c383e 100644 --- a/packages/common/src/locales/en/app.ts +++ b/packages/common/src/locales/en/app.ts @@ -52,5 +52,13 @@ export const en = { fieldLabel: 'Select Dropdown label', errorTextMustContainChar: 'String must contain at least 1 character(s)', }, + dateOfBirth: { + ...defaults, + displayName: 'Date of Birth label', + fieldLabel: 'Date Of Birth label', + hintLabel: 'Date of Birth Hint label', + hint: 'For example: January 19 2000', + errorTextMustContainChar: 'String must contain at least 1 character(s)', + }, }, }; diff --git a/packages/design/src/Form/components/DateOfBirth/DateOfBirth.stories.tsx b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.stories.tsx new file mode 100644 index 00000000..ac836158 --- /dev/null +++ b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.stories.tsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { FormProvider, useForm } from 'react-hook-form'; +import { type Meta, type StoryObj } from '@storybook/react'; + +import { DateOfBirthPattern } from './DateOfBirth.js'; + +const meta: Meta = { + title: 'patterns/DateOfBirthPattern', + component: DateOfBirthPattern, + decorators: [ + (Story, args) => { + const FormDecorator = () => { + const formMethods = useForm({ + defaultValues: { + 'date-of-birth-1.day': '', + 'date-of-birth-1.month': '', + 'date-of-birth-1.year': '', + }, + }); + return ( + + + + ); + }; + return ; + }, + ], + tags: ['autodocs'], +}; + +export default meta; + +export const Default: StoryObj = { + args: { + _patternId: '', + type: 'date-of-birth', + monthId: 'date-of-birth-1.month', + dayId: 'date-of-birth-1.day', + yearId: 'date-of-birth-1.year', + label: 'Select a date of birth', + hint: 'For example: January 19, 2000', + required: false, + }, +}; + +export const WithoutHint: StoryObj = { + args: { + _patternId: '', + type: 'date-of-birth', + monthId: 'date-of-birth-1.month', + dayId: 'date-of-birth-1.day', + yearId: 'date-of-birth-1.year', + label: 'Select a date of birth', + hint: undefined, + required: false, + }, +}; + +export const WithError: StoryObj = { + args: { + _patternId: '', + type: 'date-of-birth', + monthId: 'date-of-birth-1.month', + dayId: 'date-of-birth-1.day', + yearId: 'date-of-birth-1.year', + label: 'Select a date of birth with error', + hint: 'For example: January 19, 2000', + required: false, + error: { + type: 'custom', + message: 'This field has an error', + }, + }, +}; + +export const Required: StoryObj = { + args: { + _patternId: '', + type: 'date-of-birth', + monthId: 'date-of-birth-1.month', + dayId: 'date-of-birth-1.day', + yearId: 'date-of-birth-1.year', + label: 'Select a required date of birth', + hint: 'For example: January 19, 2000', + required: true, + }, +}; diff --git a/packages/design/src/Form/components/DateOfBirth/DateOfBirth.test.tsx b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.test.tsx new file mode 100644 index 00000000..ecff27fd --- /dev/null +++ b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.test.tsx @@ -0,0 +1,7 @@ +/** + * @vitest-environment jsdom + */ +import { describeStories } from '../../../test-helper.js'; +import meta, * as stories from './DateOfBirth.stories.js'; + +describeStories(meta, stories); diff --git a/packages/design/src/Form/components/DateOfBirth/DateOfBirth.tsx b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.tsx new file mode 100644 index 00000000..79f4432b --- /dev/null +++ b/packages/design/src/Form/components/DateOfBirth/DateOfBirth.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { useFormContext } from 'react-hook-form'; +import { type DateOfBirthProps } from '@atj/forms'; +import { type PatternComponent } from '../../index.js'; + +const months = [ + { value: '01', label: 'January' }, + { value: '02', label: 'February' }, + { value: '03', label: 'March' }, + { value: '04', label: 'April' }, + { value: '05', label: 'May' }, + { value: '06', label: 'June' }, + { value: '07', label: 'July' }, + { value: '08', label: 'August' }, + { value: '09', label: 'September' }, + { value: '10', label: 'October' }, + { value: '11', label: 'November' }, + { value: '12', label: 'December' }, +]; + +export const DateOfBirthPattern: PatternComponent = ({ + monthId, + dayId, + yearId, + label, + hint, + required, + error, +}) => { + const { register } = useFormContext(); + + return ( +
+ + {label} + {required && *} + + {hint && ( + + {hint} + + )} +
+
+ + +
+
+ + +
+
+ + +
+
+ {error && ( + + {error.message} + + )} +
+ ); +}; diff --git a/packages/design/src/Form/components/DateOfBirth/index.tsx b/packages/design/src/Form/components/DateOfBirth/index.tsx new file mode 100644 index 00000000..50cfb70a --- /dev/null +++ b/packages/design/src/Form/components/DateOfBirth/index.tsx @@ -0,0 +1,3 @@ +import { DateOfBirthPattern } from './DateOfBirth.js'; + +export default DateOfBirthPattern; diff --git a/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx b/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx index 188e3bd8..ab9c3485 100644 --- a/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx +++ b/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx @@ -14,27 +14,25 @@ export const SelectDropdownPattern: PatternComponent = ({ const { register } = useFormContext(); return (
-
- - + + {options.map((option, index) => ( + - {options.map((option, index) => ( - - ))} - - {error && ( - - {error.message} - - )} -
+ ))} + + {error && ( + + {error.message} + + )}
); }; diff --git a/packages/design/src/Form/components/index.tsx b/packages/design/src/Form/components/index.tsx index 6c63a7d4..87d376fa 100644 --- a/packages/design/src/Form/components/index.tsx +++ b/packages/design/src/Form/components/index.tsx @@ -12,6 +12,7 @@ import RadioGroup from './RadioGroup/index.js'; import RichText from './RichText/index.js'; import Sequence from './Sequence/index.js'; import SelectDropdown from './SelectDropdown/index.js'; +import DateOfBirth from './DateOfBirth/index.js'; import SubmissionConfirmation from './SubmissionConfirmation/index.js'; import TextInput from './TextInput/index.js'; @@ -28,6 +29,7 @@ export const defaultPatternComponents: ComponentForPattern = { 'radio-group': RadioGroup as PatternComponent, 'rich-text': RichText as PatternComponent, 'select-dropdown': SelectDropdown as PatternComponent, + 'date-of-birth': DateOfBirth as PatternComponent, sequence: Sequence as PatternComponent, 'submission-confirmation': SubmissionConfirmation as PatternComponent, }; diff --git a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx index 129048cf..f542356d 100644 --- a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx +++ b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx @@ -22,7 +22,7 @@ import classNames from 'classnames'; const icons: Record = { 'block-icon.svg': blockIcon, 'checkbox-icon.svg': checkboxIcon, - 'date-icon.svg.svg': dateIcon, + 'date-icon.svg': dateIcon, 'dropdown-icon.svg': dropDownIcon, 'dropdownoption-icon.svg': dropDownOptionIcon, 'richtext-icon.svg': richTextIcon, @@ -96,6 +96,7 @@ const sidebarPatterns: DropdownPattern[] = [ ['radio-group', defaultFormConfig.patterns['radio-group']], ['package-download', defaultFormConfig.patterns['package-download']], ['select-dropdown', defaultFormConfig.patterns['select-dropdown']], + ['date-of-birth', defaultFormConfig.patterns['date-of-birth']], ] as const; export const fieldsetPatterns: DropdownPattern[] = [ ['form-summary', defaultFormConfig.patterns['form-summary']], @@ -106,6 +107,7 @@ export const fieldsetPatterns: DropdownPattern[] = [ ['radio-group', defaultFormConfig.patterns['radio-group']], ['package-download', defaultFormConfig.patterns['package-download']], ['select-dropdown', defaultFormConfig.patterns['select-dropdown']], + ['date-of-birth', defaultFormConfig.patterns['date-of-birth']], ] as const; export const SidebarAddPatternMenuItem = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.stories.tsx new file mode 100644 index 00000000..c686994b --- /dev/null +++ b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.stories.tsx @@ -0,0 +1,104 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { expect, userEvent } from '@storybook/test'; +import { within } from '@testing-library/react'; + +import { type DateOfBirthPattern } from '@atj/forms'; +import { createPatternEditStoryMeta } from './common/story-helper.js'; +import FormEdit from '../index.js'; +import { enLocale as message } from '@atj/common'; + +const pattern: DateOfBirthPattern = { + id: 'date-of-birth-1', + type: 'date-of-birth', + data: { + label: message.patterns.dateOfBirth.displayName, + required: false, + hint: undefined, + }, +}; + +const storyConfig: Meta = { + title: 'Edit components/DateOfBirthPattern', + ...createPatternEditStoryMeta({ + pattern, + }), +} as Meta; + +export default storyConfig; + +export const Basic: StoryObj = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const updatedLabel = 'Date of Birth update'; + const updatedHint = 'Updated hint for Date of Birth'; + + await userEvent.click( + canvas.getByText(message.patterns.dateOfBirth.displayName) + ); + + const labelInput = canvas.getByLabelText( + message.patterns.dateOfBirth.fieldLabel + ); + await userEvent.clear(labelInput); + await userEvent.type(labelInput, updatedLabel); + + const hintInput = canvas.getByLabelText( + message.patterns.dateOfBirth.hintLabel + ); + await userEvent.clear(hintInput); + await userEvent.type(hintInput, updatedHint); + + const form = labelInput?.closest('form'); + form?.requestSubmit(); + + await expect(await canvas.findByText(updatedLabel)).toBeInTheDocument(); + await expect(await canvas.findByText(updatedHint)).toBeInTheDocument(); + }, +}; + +export const WithoutHint: StoryObj = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const updatedLabel = 'Date of Birth update'; + + await userEvent.click( + canvas.getByText(message.patterns.dateOfBirth.displayName) + ); + + const labelInput = canvas.getByLabelText( + message.patterns.dateOfBirth.fieldLabel + ); + await userEvent.clear(labelInput); + await userEvent.type(labelInput, updatedLabel); + + const form = labelInput?.closest('form'); + form?.requestSubmit(); + + await expect(await canvas.findByText(updatedLabel)).toBeInTheDocument(); + await expect( + await canvas.queryByLabelText(message.patterns.dateOfBirth.hintLabel) + ).toBeNull(); + }, +}; + +export const Error: StoryObj = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + await userEvent.click( + canvas.getByText(message.patterns.dateOfBirth.displayName) + ); + + const labelInput = canvas.getByLabelText( + message.patterns.dateOfBirth.fieldLabel + ); + await userEvent.clear(labelInput); + labelInput.blur(); + + await expect( + await canvas.findByText( + message.patterns.selectDropdown.errorTextMustContainChar + ) + ).toBeInTheDocument(); + }, +}; diff --git a/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.test.tsx b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.test.tsx new file mode 100644 index 00000000..ec95a62c --- /dev/null +++ b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.test.tsx @@ -0,0 +1,7 @@ +/** + * @vitest-environment jsdom + */ +import { describeStories } from '../../../test-helper.js'; +import meta, * as stories from './DateOfBirthPatternEdit.stories.js'; + +describeStories(meta, stories); diff --git a/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.tsx new file mode 100644 index 00000000..575724f1 --- /dev/null +++ b/packages/design/src/FormManager/FormEdit/components/DateOfBirthPatternEdit.tsx @@ -0,0 +1,115 @@ +import classnames from 'classnames'; +import React from 'react'; + +import { type DateOfBirthProps } from '@atj/forms'; +import { type DateOfBirthPattern } from '@atj/forms'; + +import DateOfBirth from '../../../Form/components/DateOfBirth/index.js'; +import { PatternEditComponent } from '../types.js'; + +import { PatternEditActions } from './common/PatternEditActions.js'; +import { PatternEditForm } from './common/PatternEditForm.js'; +import { usePatternEditFormContext } from './common/hooks.js'; +import { enLocale as message } from '@atj/common'; +import styles from '../formEditStyles.module.css'; + +const DateOfBirthPatternEdit: PatternEditComponent = ({ + focus, + previewProps, +}) => { + return ( + <> + {focus ? ( + } + > + ) : ( +
+ +
+ )} + + ); +}; + +const EditComponent = ({ pattern }: { pattern: DateOfBirthPattern }) => { + const { fieldId, getFieldState, register } = + usePatternEditFormContext(pattern.id); + const label = getFieldState('label'); + const hint = getFieldState('hint'); + + return ( +
+
+ +
+
+ +
+
+ + + + + + +
+
+ ); +}; + +export default DateOfBirthPatternEdit; diff --git a/packages/design/src/FormManager/FormEdit/components/index.ts b/packages/design/src/FormManager/FormEdit/components/index.ts index 44a5934b..4e4f355a 100644 --- a/packages/design/src/FormManager/FormEdit/components/index.ts +++ b/packages/design/src/FormManager/FormEdit/components/index.ts @@ -4,6 +4,7 @@ import { } from '../types.js'; import CheckboxPatternEdit from './CheckboxPatternEdit.js'; +import DateOfBirthPatternEdit from './DateOfBirthPatternEdit.js'; import FieldsetEdit from './FieldsetEdit.js'; import FormSummaryEdit from './FormSummaryEdit.js'; import InputPatternEdit from './InputPatternEdit.js'; @@ -19,6 +20,7 @@ import SubmissionConfirmationEdit from './SubmissionConfirmationEdit.js'; export const defaultPatternEditComponents: EditComponentForPattern = { checkbox: CheckboxPatternEdit as PatternEditComponent, + 'date-of-birth': DateOfBirthPatternEdit as PatternEditComponent, paragraph: ParagraphPatternEdit as PatternEditComponent, input: InputPatternEdit as PatternEditComponent, 'form-summary': FormSummaryEdit as PatternEditComponent, diff --git a/packages/design/src/FormManager/FormEdit/formEditStyles.module.css b/packages/design/src/FormManager/FormEdit/formEditStyles.module.css index b4ab6136..36f46de2 100644 --- a/packages/design/src/FormManager/FormEdit/formEditStyles.module.css +++ b/packages/design/src/FormManager/FormEdit/formEditStyles.module.css @@ -55,6 +55,10 @@ padding-left: 0; } +.draggableListItemWrapper .dateOfBirthPattern legend { + padding-left: 0; +} + .draggableListItemWrapper button { cursor: pointer; } diff --git a/packages/forms/package.json b/packages/forms/package.json index 90c54c9c..73aa7040 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -30,6 +30,7 @@ "@atj/database": "workspace:*", "pdf-lib": "^1.17.1", "qs": "^6.13.0", + "set-value": "^4.1.0", "zod": "^3.23.8" }, "devDependencies": { diff --git a/packages/forms/src/components.ts b/packages/forms/src/components.ts index 7c34bcc9..a4f4b5da 100644 --- a/packages/forms/src/components.ts +++ b/packages/forms/src/components.ts @@ -101,6 +101,17 @@ export type SelectDropdownProps = PatternProps<{ error?: FormError; }>; +export type DateOfBirthProps = PatternProps<{ + type: 'date-of-birth'; + dayId: string; + monthId: string; + yearId: string; + label: string; + hint?: string; + required: boolean; + error?: FormError; +}>; + export type SequenceProps = PatternProps<{ type: 'sequence'; }>; diff --git a/packages/forms/src/pattern.ts b/packages/forms/src/pattern.ts index 40a1e601..b0a39eec 100644 --- a/packages/forms/src/pattern.ts +++ b/packages/forms/src/pattern.ts @@ -1,4 +1,5 @@ import * as r from '@atj/common'; +import set from 'set-value'; import { type CreatePrompt } from './components.js'; import { type FormError, type FormErrors } from './error.js'; @@ -133,6 +134,18 @@ export const validatePattern = ( return r.success(parseResult.data); }; +const aggregateValuesByPrefix = ( + values: Record +): Record => { + const aggregatedValues: Record = {}; + + for (const [key, value] of Object.entries(values)) { + set(aggregatedValues, key, value); + } + + return aggregatedValues; +}; + export const validatePatternAndChildren = ( config: FormConfig, form: Blueprint, @@ -144,11 +157,12 @@ export const validatePatternAndChildren = ( errors: Record; } = { values: {}, errors: {} } ) => { + const aggregatedValues = aggregateValuesByPrefix(values); + if (patternConfig.parseUserInput) { - const parseResult = patternConfig.parseUserInput( - pattern, - values[pattern.id] - ); + const patternValues = aggregatedValues[pattern.id]; + const parseResult = patternConfig.parseUserInput(pattern, patternValues); + if (parseResult.success) { result.values[pattern.id] = parseResult.data; } else { diff --git a/packages/forms/src/patterns/date-of-birth/date-of-birth.test.ts b/packages/forms/src/patterns/date-of-birth/date-of-birth.test.ts new file mode 100644 index 00000000..15d4b34a --- /dev/null +++ b/packages/forms/src/patterns/date-of-birth/date-of-birth.test.ts @@ -0,0 +1,126 @@ +import { describe, expect, it } from 'vitest'; +import { + createDOBSchema, + dateOfBirthConfig, + type DateOfBirthPattern, +} from './date-of-birth'; + +describe('DateOfBirthPattern tests', () => { + describe('createDOBSchema', () => { + it('should create schema for required date of birth', () => { + const data: DateOfBirthPattern['data'] = { + label: 'Test Label', + required: true, + hint: 'Enter your date of birth', + }; + + const schema = createDOBSchema(data); + const validInput = { month: '03', day: '15', year: '1990' }; + const invalidInput = { month: '13', day: '32', year: '199x' }; + + expect(schema.safeParse(validInput).success).toBe(true); + expect(schema.safeParse(invalidInput).success).toBe(false); + }); + + it('should create schema for optional date of birth', () => { + const data: DateOfBirthPattern['data'] = { + label: 'Test Label', + required: false, + hint: 'Enter your date of birth', + }; + + const schema = createDOBSchema(data); + const validInput = { month: '03', day: '15', year: '1990' }; + const emptyInput = {}; + + expect(schema.safeParse(validInput).success).toBe(true); + expect(schema.safeParse(emptyInput).success).toBe(true); + }); + }); + + describe('dateOfBirthConfig', () => { + it('should parse user input correctly', () => { + const pattern: DateOfBirthPattern = { + type: 'date-of-birth', + id: 'test', + data: { + label: 'Test Date of Birth', + required: true, + hint: 'Enter your date of birth', + }, + }; + + const inputValue = { month: '03', day: '15', year: '1990' }; + if (!dateOfBirthConfig.parseUserInput) { + expect.fail('dateOfBirthConfig.parseUserInput is not undefined'); + } + const result = dateOfBirthConfig.parseUserInput(pattern, inputValue); + if (result.success) { + expect(result.data).toEqual(inputValue); + } else { + throw new Error('Unexpected validation failure'); + } + }); + + it('should handle validation error for user input', () => { + const pattern: DateOfBirthPattern = { + type: 'date-of-birth', + id: 'test', + data: { + label: 'Test Date of Birth', + required: true, + hint: 'Enter your date of birth', + }, + }; + + const inputValue = { month: '13', day: '32', year: '199x' }; + if (!dateOfBirthConfig.parseUserInput) { + expect.fail('dateOfBirthConfig.parseUserInput is not undefined'); + } + const result = dateOfBirthConfig.parseUserInput(pattern, inputValue); + if (!result.success) { + expect(result.error).toBeDefined(); + } else { + throw new Error('Unexpected validation success'); + } + }); + + it('should parse config data correctly', () => { + const obj = { + label: 'Test Date of Birth', + required: true, + hint: 'Enter your date of birth', + }; + + if (!dateOfBirthConfig.parseConfigData) { + expect.fail('dateOfBirthConfig.parseConfigData is not undefined'); + } + const result = dateOfBirthConfig.parseConfigData(obj); + if (result.success) { + expect(result.data.label).toBe('Test Date of Birth'); + expect(result.data.required).toBe(true); + expect(result.data.hint).toBe('Enter your date of birth'); + } else { + throw new Error('Unexpected validation failure'); + } + }); + + it('should handle invalid config data', () => { + const obj = { + label: '', + required: true, + hint: '', + }; + + if (!dateOfBirthConfig.parseConfigData) { + expect.fail('dateOfBirthConfig.parseConfigData is not undefined'); + } + const result = dateOfBirthConfig.parseConfigData(obj); + if (!result.success) { + expect(result.error).toBeDefined(); + } else { + throw new Error('Unexpected validation success'); + } + }); + }); +}); diff --git a/packages/forms/src/patterns/date-of-birth/date-of-birth.ts b/packages/forms/src/patterns/date-of-birth/date-of-birth.ts new file mode 100644 index 00000000..4c8c307c --- /dev/null +++ b/packages/forms/src/patterns/date-of-birth/date-of-birth.ts @@ -0,0 +1,110 @@ +import * as z from 'zod'; + +import { type DateOfBirthProps } from '../../components.js'; +import { + type Pattern, + type PatternConfig, + validatePattern, +} from '../../pattern.js'; +import { getFormSessionValue } from '../../session.js'; +import { + safeZodParseFormErrors, + safeZodParseToFormError, +} from '../../util/zod.js'; + +const configSchema = z.object({ + label: z.string().min(1), + required: z.boolean(), + hint: z.string().optional(), +}); + +export type DateOfBirthPattern = Pattern>; + +export type DateOfBirthPatternOutput = z.infer< + ReturnType +>; + +export const createDOBSchema = (data: DateOfBirthPattern['data']) => { + const daySchema = z + .string() + .regex(/^\d{1,2}$/, 'Invalid day format') + .optional(); + const monthSchema = z + .string() + .regex(/^(0[1-9]|1[0-2])$/, 'Invalid month format') + .optional(); + const yearSchema = z + .string() + .regex(/^\d{4}$/, 'Invalid year format') + .optional(); + + if (!data.required) { + return z + .object({ + day: daySchema, + month: monthSchema, + year: yearSchema, + }) + .optional(); + } + + return z.object({ + day: daySchema, + month: monthSchema, + year: yearSchema, + }); +}; + +export const dateOfBirthConfig: PatternConfig< + DateOfBirthPattern, + DateOfBirthPatternOutput +> = { + displayName: 'Date of Birth', + iconPath: 'date-icon.svg', + initial: { + label: 'Date of Birth', + required: true, + hint: 'For example: January 19 2000', + }, + + parseUserInput: (pattern, inputValue) => { + return safeZodParseToFormError(createDOBSchema(pattern.data), inputValue); + }, + + parseConfigData: obj => { + return safeZodParseFormErrors(configSchema, obj); + }, + getChildren() { + return []; + }, + + createPrompt(_, session, pattern, options) { + const extraAttributes: Record = {}; + const sessionValue = getFormSessionValue(session, pattern.id); + if (options.validate) { + const isValidResult = validatePattern( + dateOfBirthConfig, + pattern, + sessionValue + ); + if (!isValidResult.success) { + extraAttributes['error'] = isValidResult.error; + } + } + + return { + props: { + _patternId: pattern.id, + type: 'date-of-birth', + label: pattern.data.label, + hint: pattern.data.hint, + dayId: `${pattern.id}.day`, + monthId: `${pattern.id}.month`, + yearId: `${pattern.id}.year`, + required: pattern.data.required, + ...extraAttributes, + } as DateOfBirthProps, + children: [], + }; + }, +}; diff --git a/packages/forms/src/patterns/index.ts b/packages/forms/src/patterns/index.ts index c6c1d006..4fe5dbcd 100644 --- a/packages/forms/src/patterns/index.ts +++ b/packages/forms/src/patterns/index.ts @@ -2,6 +2,7 @@ import { type FormConfig } from '../pattern.js'; import { addressConfig } from './address/index.js'; import { checkboxConfig } from './checkbox.js'; +import { dateOfBirthConfig } from './date-of-birth/date-of-birth.js'; import { fieldsetConfig } from './fieldset/index.js'; import { formSummaryConfig } from './form-summary.js'; import { inputConfig } from './input/index.js'; @@ -19,10 +20,11 @@ import { sequenceConfig } from './sequence.js'; // understand the usage scenarios better. export const defaultFormConfig: FormConfig = { patterns: { - 'form-summary': formSummaryConfig, address: addressConfig, checkbox: checkboxConfig, + 'date-of-birth': dateOfBirthConfig, fieldset: fieldsetConfig, + 'form-summary': formSummaryConfig, input: inputConfig, 'package-download': packageDownloadConfig, page: pageConfig, @@ -37,6 +39,7 @@ export const defaultFormConfig: FormConfig = { export * from './address/index.js'; export * from './checkbox.js'; +export * from './date-of-birth/date-of-birth.js'; export * from './fieldset/index.js'; export { type FieldsetPattern } from './fieldset/config.js'; export * from './form-summary.js'; diff --git a/packages/forms/src/set-value.d.ts b/packages/forms/src/set-value.d.ts new file mode 100644 index 00000000..ddec15c0 --- /dev/null +++ b/packages/forms/src/set-value.d.ts @@ -0,0 +1,4 @@ +declare module 'set-value' { + function set(obj: Record, path: string, value: any): void; + export = set; +} diff --git a/packages/server/src/lib/github.ts b/packages/server/src/lib/github.ts index b979f6d8..2d638567 100644 --- a/packages/server/src/lib/github.ts +++ b/packages/server/src/lib/github.ts @@ -7,7 +7,7 @@ export type GithubRepository = { export const DEFAULT_REPOSITORY: GithubRepository = { owner: 'gsa-tts', - repository: 'atj-platform', + repository: 'forms', branch: 'main', commit: 'main', }; @@ -28,7 +28,7 @@ export const getGithubRepository = async ( const { execSync } = await import('child_process'); return { owner: env.OWNER || 'gsa-tts', - repository: env.REPOSITORY || 'atj-platform', + repository: env.REPOSITORY || 'forms', branch: env.BRANCH || 'main', commit: execSync('git rev-parse HEAD').toString().trim(), }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e9be235..9a66d63d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 2.1.3(@vitest/spy@2.1.3)(playwright@1.48.1)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5))(vitest@2.1.3) '@vitest/coverage-v8': specifier: ^2.1.3 - version: 2.1.3(@vitest/browser@2.1.3(@vitest/spy@2.1.3)(playwright@1.48.1)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5))(vitest@2.1.3))(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5)) + version: 2.1.3(@vitest/browser@2.1.3)(vitest@2.1.3) '@vitest/ui': specifier: ^2.1.3 version: 2.1.3(vitest@2.1.3) @@ -73,7 +73,7 @@ importers: version: 2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5) vitest-mock-extended: specifier: ^2.0.0 - version: 2.0.2(typescript@5.6.2)(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5)) + version: 2.0.2(typescript@5.6.2)(vitest@2.1.3) apps/cli: dependencies: @@ -148,7 +148,7 @@ importers: version: link:../../packages/forms astro: specifier: ^4.13.2 - version: 4.15.2(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021) + version: 4.15.2(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106) qs: specifier: ^6.13.0 version: 6.13.0 @@ -170,7 +170,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.4.1 - version: 0.4.1(prettier@3.3.3)(typescript@5.7.0-dev.20241021) + version: 0.4.1(prettier@3.3.3)(typescript@5.8.0-dev.20241106) '@types/qs': specifier: ^6.9.15 version: 6.9.15 @@ -214,10 +214,10 @@ importers: version: 29.5.12 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + version: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) ts-jest: specifier: ^29.2.4 - version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(typescript@5.7.0-dev.20241021) + version: 29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(typescript@5.8.0-dev.20241106) infra/core: dependencies: @@ -266,7 +266,7 @@ importers: version: 7.6.11 vitest-fetch-mock: specifier: ^0.3.0 - version: 0.3.0(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5)) + version: 0.3.0(vitest@2.1.3) packages/common: {} @@ -391,7 +391,7 @@ importers: version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/addon-interactions': specifier: ^8.2.8 - version: 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5)) + version: 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5) '@storybook/addon-links': specifier: ^8.2.8 version: 8.2.9(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) @@ -403,16 +403,16 @@ importers: version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/react': specifier: ^8.2.8 - version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021) + version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106) '@storybook/react-vite': specifier: ^8.2.8 - version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) + version: 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) '@storybook/test': specifier: ^8.2.8 - version: 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5)) + version: 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5) '@storybook/test-runner': specifier: ^0.17.0 - version: 0.17.0(@types/node@22.7.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + version: 0.17.0(@types/node@22.7.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) '@storybook/types': specifier: ^8.2.8 version: 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) @@ -433,19 +433,19 @@ importers: version: 18.3.5 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021))(eslint@8.57.0)(typescript@5.7.0-dev.20241021) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106))(eslint@8.57.0)(typescript@5.8.0-dev.20241106) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021) + version: 7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106) '@uswds/compile': specifier: 1.1.0 - version: 1.1.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + version: 1.1.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) '@vitejs/plugin-react': specifier: ^4.3.1 version: 4.3.1(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) '@vitest/browser': specifier: ^2.0.5 - version: 2.0.5(playwright@1.48.1)(typescript@5.7.0-dev.20241021)(vitest@2.0.5) + version: 2.0.5(playwright@1.48.1)(typescript@5.8.0-dev.20241106)(vitest@2.0.5) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -484,7 +484,7 @@ importers: version: 5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5) vite-plugin-dts: specifier: ^4.0.1 - version: 4.1.0(@types/node@22.7.4)(rollup@4.23.0)(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) + version: 4.1.0(@types/node@22.7.4)(rollup@4.23.0)(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) vitest: specifier: ^2.0.5 version: 2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5) @@ -512,6 +512,9 @@ importers: qs: specifier: ^6.13.0 version: 6.13.0 + set-value: + specifier: ^4.1.0 + version: 4.1.0 zod: specifier: ^3.23.8 version: 3.23.8 @@ -524,10 +527,10 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.2 - version: 0.9.3(prettier@3.3.3)(typescript@5.7.0-dev.20241021) + version: 0.9.3(prettier@3.3.3)(typescript@5.8.0-dev.20241106) '@astrojs/node': specifier: ^8.3.4 - version: 8.3.4(astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021)) + version: 8.3.4(astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106)) '@astrojs/react': specifier: ^3.6.1 version: 3.6.2(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(vite@5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5)) @@ -548,7 +551,7 @@ importers: version: link:../forms astro: specifier: ^4.15.10 - version: 4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021) + version: 4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106) express: specifier: ^4.21.0 version: 4.21.0 @@ -5910,6 +5913,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true esm@3.2.25: @@ -7095,6 +7099,10 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-primitive@3.0.1: + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + engines: {node: '>=0.10.0'} + is-promise@2.2.2: resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} @@ -9739,6 +9747,10 @@ packages: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} + set-value@4.1.0: + resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} + engines: {node: '>=11.0'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -10612,8 +10624,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.7.0-dev.20241021: - resolution: {integrity: sha512-nf5PGykGkdF2Palp0anP/jjLiqM7jdLaIyhpq1Y8bhHnClE1JR2eHXrame54dWeaX0ZMc3NF/TD59xtVhZiuMA==} + typescript@5.8.0-dev.20241106: + resolution: {integrity: sha512-oFqIoJnR/s4hq5I2MBDdeJThRVyyhRV5eo2EmxllNkSe76ycucq2h4QgWnq0g4Opf4KQjpi1m/jhgMoiwDc8CQ==} engines: {node: '>=14.17'} hasBin: true @@ -11539,25 +11551,25 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@astrojs/check@0.4.1(prettier@3.3.3)(typescript@5.7.0-dev.20241021)': + '@astrojs/check@0.4.1(prettier@3.3.3)(typescript@5.8.0-dev.20241106)': dependencies: - '@astrojs/language-server': 2.14.1(prettier@3.3.3)(typescript@5.7.0-dev.20241021) + '@astrojs/language-server': 2.14.1(prettier@3.3.3)(typescript@5.8.0-dev.20241106) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.3(prettier@3.3.3)(typescript@5.7.0-dev.20241021)': + '@astrojs/check@0.9.3(prettier@3.3.3)(typescript@5.8.0-dev.20241106)': dependencies: - '@astrojs/language-server': 2.14.1(prettier@3.3.3)(typescript@5.7.0-dev.20241021) + '@astrojs/language-server': 2.14.1(prettier@3.3.3)(typescript@5.8.0-dev.20241106) chokidar: 3.6.0 fast-glob: 3.3.2 kleur: 4.1.5 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -11567,12 +11579,12 @@ snapshots: '@astrojs/internal-helpers@0.4.1': {} - '@astrojs/language-server@2.14.1(prettier@3.3.3)(typescript@5.7.0-dev.20241021)': + '@astrojs/language-server@2.14.1(prettier@3.3.3)(typescript@5.8.0-dev.20241106)': dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/yaml2ts': 0.2.1 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.1(typescript@5.7.0-dev.20241021) + '@volar/kit': 2.4.1(typescript@5.8.0-dev.20241106) '@volar/language-core': 2.4.1 '@volar/language-server': 2.4.1 '@volar/language-service': 2.4.1 @@ -11616,9 +11628,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@8.3.4(astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021))': + '@astrojs/node@8.3.4(astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106))': dependencies: - astro: 4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021) + astro: 4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106) send: 0.19.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -13756,7 +13768,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -13770,7 +13782,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -13913,15 +13925,15 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.3.1(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': dependencies: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.7.0-dev.20241021) + react-docgen-typescript: 2.2.2(typescript@5.8.0-dev.20241106) vite: 5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5) optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -15013,11 +15025,11 @@ snapshots: '@storybook/global': 5.0.0 storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) - '@storybook/addon-interactions@8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5))': + '@storybook/addon-interactions@8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5)': dependencies: '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) - '@storybook/test': 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5)) + '@storybook/test': 8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5) polished: 4.3.1 storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) ts-dedent: 2.2.0 @@ -15079,7 +15091,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': + '@storybook/builder-vite@8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': dependencies: '@storybook/csf-plugin': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@types/find-cache-dir': 3.2.1 @@ -15093,7 +15105,7 @@ snapshots: ts-dedent: 2.2.0 vite: 5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5) optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 transitivePeerDependencies: - supports-color @@ -15184,12 +15196,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)) - '@storybook/react-vite@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': + '@storybook/react-vite@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.1(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) '@rollup/pluginutils': 5.1.0(rollup@4.23.0) - '@storybook/builder-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) - '@storybook/react': 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021) + '@storybook/builder-vite': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)) + '@storybook/react': 8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106) find-up: 5.0.0 magic-string: 0.30.11 react: 18.3.1 @@ -15206,7 +15218,7 @@ snapshots: - typescript - vite-plugin-glimmerx - '@storybook/react@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.7.0-dev.20241021)': + '@storybook/react@8.2.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(typescript@5.8.0-dev.20241106)': dependencies: '@storybook/components': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@storybook/global': 5.0.0 @@ -15233,9 +15245,9 @@ snapshots: type-fest: 2.19.0 util-deprecate: 1.0.2 optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 - '@storybook/test-runner@0.17.0(@types/node@22.7.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))': + '@storybook/test-runner@0.17.0(@types/node@22.7.4)(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -15249,14 +15261,14 @@ snapshots: '@swc/core': 1.7.23 '@swc/jest': 0.2.36(@swc/core@1.7.23) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))) + jest-playwright-preset: 4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))) playwright: 1.48.1 transitivePeerDependencies: - '@swc/helpers' @@ -15302,12 +15314,12 @@ snapshots: - supports-color - ts-node - '@storybook/test@8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5))': + '@storybook/test@8.2.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2)))(vitest@2.0.5)': dependencies: '@storybook/csf': 0.1.11 '@storybook/instrumenter': 8.2.9(storybook@8.2.9(@babel/preset-env@7.25.4(@babel/core@7.25.2))) '@testing-library/dom': 10.1.0 - '@testing-library/jest-dom': 6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5)) + '@testing-library/jest-dom': 6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(vitest@2.0.5) '@testing-library/user-event': 14.5.2(@testing-library/dom@10.1.0) '@vitest/expect': 1.6.0 '@vitest/spy': 1.6.0 @@ -15415,7 +15427,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(vitest@2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5))': + '@testing-library/jest-dom@6.4.5(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(vitest@2.0.5)': dependencies: '@adobe/css-tools': 4.4.0 '@babel/runtime': 7.25.6 @@ -15428,7 +15440,7 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 '@types/jest': 29.5.12 - jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) vitest: 2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5) '@testing-library/jest-dom@6.5.0': @@ -15909,34 +15921,34 @@ snapshots: '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021))(eslint@8.57.0)(typescript@5.7.0-dev.20241021)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106))(eslint@8.57.0)(typescript@5.8.0-dev.20241106)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.0-dev.20241021) + ts-api-utils: 1.3.0(typescript@5.8.0-dev.20241106) optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.0-dev.20241021) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.0-dev.20241106) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.6 eslint: 8.57.0 optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 transitivePeerDependencies: - supports-color @@ -15945,21 +15957,21 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.0-dev.20241021) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.0-dev.20241106) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106) debug: 4.3.6 eslint: 8.57.0 - ts-api-utils: 1.3.0(typescript@5.7.0-dev.20241021) + ts-api-utils: 1.3.0(typescript@5.8.0-dev.20241106) optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.0-dev.20241021)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.0-dev.20241106)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -15968,18 +15980,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.7.0-dev.20241021) + ts-api-utils: 1.3.0(typescript@5.8.0-dev.20241106) optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.7.0-dev.20241021)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.8.0-dev.20241106)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.0-dev.20241021) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.0-dev.20241106) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -15992,12 +16004,12 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@uswds/compile@1.1.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))': + '@uswds/compile@1.1.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))': dependencies: autoprefixer: 10.4.16(postcss@8.4.31) del: 6.1.1 gulp: 4.0.2 - gulp-postcss: 9.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + gulp-postcss: 9.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) gulp-rename: 2.0.0 gulp-replace: 1.1.4 gulp-sass: 5.1.0 @@ -16038,13 +16050,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@2.0.5(playwright@1.48.1)(typescript@5.7.0-dev.20241021)(vitest@2.0.5)': + '@vitest/browser@2.0.5(playwright@1.48.1)(typescript@5.8.0-dev.20241106)(vitest@2.0.5)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/utils': 2.0.5 magic-string: 0.30.11 - msw: 2.4.1(typescript@5.7.0-dev.20241021) + msw: 2.4.1(typescript@5.8.0-dev.20241106) sirv: 2.0.4 vitest: 2.0.5(@types/node@22.7.4)(@vitest/browser@2.0.5)(@vitest/ui@2.0.5)(jsdom@24.1.3)(sass-embedded@1.69.5) ws: 8.18.0 @@ -16078,7 +16090,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@2.1.3(@vitest/browser@2.1.3(@vitest/spy@2.1.3)(playwright@1.48.1)(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5))(vitest@2.1.3))(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5))': + '@vitest/coverage-v8@2.1.3(@vitest/browser@2.1.3)(vitest@2.1.3)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -16212,12 +16224,12 @@ snapshots: loupe: 3.1.1 tinyrainbow: 1.2.0 - '@volar/kit@2.4.1(typescript@5.7.0-dev.20241021)': + '@volar/kit@2.4.1(typescript@5.8.0-dev.20241106)': dependencies: '@volar/language-service': 2.4.1 '@volar/typescript': 2.4.1 typesafe-path: 0.2.2 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.0.8 @@ -16280,7 +16292,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.0.29(typescript@5.7.0-dev.20241021)': + '@vue/language-core@2.0.29(typescript@5.8.0-dev.20241106)': dependencies: '@volar/language-core': 2.4.1 '@vue/compiler-dom': 3.5.0 @@ -16291,7 +16303,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 '@vue/shared@3.5.0': {} @@ -16667,7 +16679,7 @@ snapshots: astral-regex@2.0.0: {} - astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021): + astro@4.15.10(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 @@ -16723,7 +16735,7 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 tinyexec: 0.3.0 - tsconfck: 3.1.3(typescript@5.7.0-dev.20241021) + tsconfck: 3.1.3(typescript@5.8.0-dev.20241106) unist-util-visit: 5.0.0 vfile: 6.0.3 vite: 5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5) @@ -16733,7 +16745,7 @@ snapshots: yargs-parser: 21.1.1 zod: 3.23.8 zod-to-json-schema: 3.23.3(zod@3.23.8) - zod-to-ts: 1.2.0(typescript@5.7.0-dev.20241021)(zod@3.23.8) + zod-to-ts: 1.2.0(typescript@5.8.0-dev.20241106)(zod@3.23.8) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -16749,7 +16761,7 @@ snapshots: - terser - typescript - astro@4.15.2(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.7.0-dev.20241021): + astro@4.15.2(@types/node@22.7.4)(rollup@4.23.0)(sass-embedded@1.69.5)(typescript@5.8.0-dev.20241106): dependencies: '@astrojs/compiler': 2.10.3 '@astrojs/internal-helpers': 0.4.1 @@ -16806,7 +16818,7 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.0 tinyexec: 0.3.0 - tsconfck: 3.1.3(typescript@5.7.0-dev.20241021) + tsconfck: 3.1.3(typescript@5.8.0-dev.20241106) unist-util-visit: 5.0.0 vfile: 6.0.3 vite: 5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5) @@ -16816,7 +16828,7 @@ snapshots: yargs-parser: 21.1.1 zod: 3.23.8 zod-to-json-schema: 3.23.2(zod@3.23.8) - zod-to-ts: 1.2.0(typescript@5.7.0-dev.20241021)(zod@3.23.8) + zod-to-ts: 1.2.0(typescript@5.8.0-dev.20241106)(zod@3.23.8) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -17739,13 +17751,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + create-jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -18136,7 +18148,7 @@ snapshots: dependencies: semver: 7.6.3 shelljs: 0.8.5 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 dset@3.1.3: {} @@ -19362,12 +19374,12 @@ snapshots: v8flags: 4.0.1 yargs: 16.2.0 - gulp-postcss@9.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + gulp-postcss@9.0.1(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: fancy-log: 1.3.3 plugin-error: 1.0.1 postcss: 8.4.31 - postcss-load-config: 3.1.4(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + postcss-load-config: 3.1.4(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) vinyl-sourcemaps-apply: 0.2.1 transitivePeerDependencies: - ts-node @@ -19990,6 +20002,8 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-primitive@3.0.1: {} + is-promise@2.2.2: {} is-reference@1.2.1: @@ -20240,16 +20254,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + jest-cli@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + create-jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest-config: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -20290,7 +20304,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + jest-config@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: '@babel/core': 7.25.2 '@jest/test-sequencer': 29.7.0 @@ -20316,7 +20330,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.7.4 - ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -20420,10 +20434,10 @@ snapshots: - debug - supports-color - jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))): + jest-playwright-preset@4.0.0(jest-circus@29.7.0)(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -20588,11 +20602,11 @@ snapshots: string-length: 5.0.1 strip-ansi: 7.1.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021))): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106))): dependencies: ansi-escapes: 6.2.1 chalk: 5.3.0 - jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -20629,12 +20643,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest-cli: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21675,7 +21689,7 @@ snapshots: optionalDependencies: typescript: 5.6.2 - msw@2.4.1(typescript@5.7.0-dev.20241021): + msw@2.4.1(typescript@5.8.0-dev.20241106): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 @@ -21694,7 +21708,7 @@ snapshots: type-fest: 4.26.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 muggle-string@0.4.1: {} @@ -22394,13 +22408,13 @@ snapshots: csso: 5.0.5 postcss: 8.4.31 - postcss-load-config@3.1.4(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)): + postcss-load-config@3.1.4(postcss@8.4.31)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.31 - ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021) + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106) postcss-load-config@6.0.1(postcss@8.4.44)(yaml@2.5.0): dependencies: @@ -22711,9 +22725,9 @@ snapshots: - bufferutil - utf-8-validate - react-docgen-typescript@2.2.2(typescript@5.7.0-dev.20241021): + react-docgen-typescript@2.2.2(typescript@5.8.0-dev.20241106): dependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 react-docgen@7.0.3: dependencies: @@ -23404,6 +23418,11 @@ snapshots: is-plain-object: 2.0.4 split-string: 3.1.0 + set-value@4.1.0: + dependencies: + is-plain-object: 2.0.4 + is-primitive: 3.0.1 + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -24197,9 +24216,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.3.0(typescript@5.7.0-dev.20241021): + ts-api-utils@1.3.0(typescript@5.8.0-dev.20241106): dependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 ts-dedent@2.2.0: {} @@ -24209,18 +24228,18 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)))(typescript@5.7.0-dev.20241021): + ts-jest@29.2.5(@babel/core@7.25.2)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.2))(esbuild@0.24.0)(jest@29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)))(typescript@5.8.0-dev.20241106): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021)) + jest: 29.7.0(@types/node@22.7.4)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.25.2 @@ -24249,7 +24268,7 @@ snapshots: optionalDependencies: '@swc/core': 1.7.23 - ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.7.0-dev.20241021): + ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.7.4)(typescript@5.8.0-dev.20241106): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -24263,7 +24282,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -24274,9 +24293,9 @@ snapshots: optionalDependencies: typescript: 5.6.2 - tsconfck@3.1.3(typescript@5.7.0-dev.20241021): + tsconfck@3.1.3(typescript@5.8.0-dev.20241106): optionalDependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 tsconfig-paths@4.2.0: dependencies: @@ -24431,7 +24450,7 @@ snapshots: typescript@5.6.2: {} - typescript@5.7.0-dev.20241021: {} + typescript@5.8.0-dev.20241106: {} uc.micro@2.1.0: {} @@ -24792,19 +24811,19 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.1.0(@types/node@22.7.4)(rollup@4.23.0)(typescript@5.7.0-dev.20241021)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)): + vite-plugin-dts@4.1.0(@types/node@22.7.4)(rollup@4.23.0)(typescript@5.8.0-dev.20241106)(vite@5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5)): dependencies: '@microsoft/api-extractor': 7.47.4(@types/node@22.7.4) '@rollup/pluginutils': 5.1.0(rollup@4.23.0) '@volar/typescript': 2.4.1 - '@vue/language-core': 2.0.29(typescript@5.7.0-dev.20241021) + '@vue/language-core': 2.0.29(typescript@5.8.0-dev.20241106) compare-versions: 6.1.1 debug: 4.3.6 kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.11 - typescript: 5.7.0-dev.20241021 - vue-tsc: 2.0.29(typescript@5.7.0-dev.20241021) + typescript: 5.8.0-dev.20241106 + vue-tsc: 2.0.29(typescript@5.8.0-dev.20241106) optionalDependencies: vite: 5.4.3(@types/node@22.7.4)(sass-embedded@1.69.5) transitivePeerDependencies: @@ -24860,14 +24879,14 @@ snapshots: optionalDependencies: vite: 5.4.8(@types/node@22.7.4)(sass-embedded@1.69.5) - vitest-fetch-mock@0.3.0(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5)): + vitest-fetch-mock@0.3.0(vitest@2.1.3): dependencies: cross-fetch: 4.0.0 vitest: 2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5) transitivePeerDependencies: - encoding - vitest-mock-extended@2.0.2(typescript@5.6.2)(vitest@2.1.3(@types/node@22.7.4)(@vitest/browser@2.1.3)(@vitest/ui@2.1.3)(jsdom@25.0.1)(msw@2.4.1(typescript@5.6.2))(sass-embedded@1.69.5)): + vitest-mock-extended@2.0.2(typescript@5.6.2)(vitest@2.1.3): dependencies: ts-essentials: 10.0.2(typescript@5.6.2) typescript: 5.6.2 @@ -24896,7 +24915,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.7.4 - '@vitest/browser': 2.0.5(playwright@1.48.1)(typescript@5.7.0-dev.20241021)(vitest@2.0.5) + '@vitest/browser': 2.0.5(playwright@1.48.1)(typescript@5.8.0-dev.20241106)(vitest@2.0.5) '@vitest/ui': 2.0.5(vitest@2.0.5) jsdom: 24.1.3 transitivePeerDependencies: @@ -25058,12 +25077,12 @@ snapshots: vscode-uri@3.0.8: {} - vue-tsc@2.0.29(typescript@5.7.0-dev.20241021): + vue-tsc@2.0.29(typescript@5.8.0-dev.20241106): dependencies: '@volar/typescript': 2.4.1 - '@vue/language-core': 2.0.29(typescript@5.7.0-dev.20241021) + '@vue/language-core': 2.0.29(typescript@5.8.0-dev.20241106) semver: 7.6.3 - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 w3c-keyname@2.2.8: {} @@ -25431,9 +25450,9 @@ snapshots: dependencies: zod: 3.23.8 - zod-to-ts@1.2.0(typescript@5.7.0-dev.20241021)(zod@3.23.8): + zod-to-ts@1.2.0(typescript@5.8.0-dev.20241106)(zod@3.23.8): dependencies: - typescript: 5.7.0-dev.20241021 + typescript: 5.8.0-dev.20241106 zod: 3.23.8 zod@3.23.8: {}