From 02b981f999b77c57630032872649204ac3cd64a8 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 3 Sep 2025 18:00:20 -0500 Subject: [PATCH 01/40] Upgrade to latest node.js LTS --- .nvmrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nvmrc b/.nvmrc index 517f3866..2c6984e9 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v22.14.0 +v22.19.0 From 966827d57919fd0609c4b3c5bca3bdb292e31774 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 3 Sep 2025 18:40:02 -0500 Subject: [PATCH 02/40] Comment out the deploy step --- .github/workflows/deploy.yml | 14 +++++++------- packages/forms/src/patterns/repeater/prompt.ts | 6 +++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 9094443f..431bedf1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,10 +16,10 @@ jobs: tag-name: ${{ github.ref_name }} deploy-key: ${{ github.ref_name }} - deploy: - needs: [build-image] - uses: ./.github/workflows/_terraform-apply.yml - secrets: inherit - with: - deploy-env: ${{ github.ref_name }} - #deploy-env: main + # deploy: + # needs: [build-image] + # uses: ./.github/workflows/_terraform-apply.yml + # secrets: inherit + # with: + # deploy-env: ${{ github.ref_name }} + # #deploy-env: main diff --git a/packages/forms/src/patterns/repeater/prompt.ts b/packages/forms/src/patterns/repeater/prompt.ts index 1ef47ee2..b7750a52 100644 --- a/packages/forms/src/patterns/repeater/prompt.ts +++ b/packages/forms/src/patterns/repeater/prompt.ts @@ -1,6 +1,10 @@ import { type RepeaterPattern } from './index.js'; import { getFormSessionError } from '../../session.js'; -import { createPromptForPattern, type CreatePrompt, type RepeaterProps } from '../../components.js'; +import { + createPromptForPattern, + type CreatePrompt, + type RepeaterProps, +} from '../../components.js'; import { getPattern } from '../../pattern.js'; export const createPrompt: CreatePrompt = ( From 72d152258957a18cf83b54f49f99b75a97f4fe70 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 3 Sep 2025 18:48:43 -0500 Subject: [PATCH 03/40] Use @flexion package namespace. --- .changeset/old-wolves-speak.md | 8 +- .github/workflows/_terraform-apply.yml | 4 +- .../workflows/_terraform-plan-pr-comment.yml | 4 +- apps/cli/README.md | 2 +- apps/cli/package.json | 8 +- apps/cli/src/cli-controller/e2e.ts | 4 +- apps/cli/src/cli-controller/secrets.ts | 4 +- apps/sandbox/README.md | 2 +- apps/sandbox/package.json | 8 +- apps/sandbox/src/index.ts | 4 +- apps/sandbox/src/server.ts | 4 +- apps/sandbox/tests/integration.test.ts | 2 +- apps/server-doj/README.md | 2 +- apps/server-doj/package.json | 8 +- apps/server-doj/src/index.ts | 4 +- apps/server-doj/src/server.ts | 4 +- apps/server-doj/tests/integration.test.ts | 2 +- apps/spotlight/package.json | 8 +- .../src/components/AppAvailableFormList.tsx | 2 +- .../src/components/AppFormManager.tsx | 2 +- .../spotlight/src/components/DemoHeader.astro | 2 +- apps/spotlight/src/components/Header.astro | 2 +- apps/spotlight/src/components/UsaBanner.astro | 6 +- apps/spotlight/src/context.ts | 8 +- .../form-page/components/AppFormPage.tsx | 4 +- .../store/actions/get-form-session.ts | 2 +- .../features/form-page/store/actions/index.ts | 2 +- .../form-page/store/actions/initialize.ts | 2 +- apps/spotlight/src/lib/initialize.ts | 2 +- apps/spotlight/src/styles.css | 2 +- documents/adr/0007-initial-css-strategy.md | 4 +- documents/adr/0009-design-assets-workflow.md | 2 +- e2e/README.md | 4 +- e2e/package.json | 6 +- e2e/playwright.config.ts | 2 +- e2e/src/fixtures/add-download.fixture.ts | 4 +- e2e/src/models/form-create-page.ts | 4 +- infra/aws-cdk/README.md | 2 +- infra/aws-cdk/lib/pipeline-stack/index.ts | 2 +- infra/aws-cdk/lib/platform-stack/index.ts | 2 +- infra/aws-cdk/package.json | 4 +- infra/cdktf/README.md | 2 +- infra/cdktf/package.json | 4 +- infra/core/package.json | 6 +- infra/core/src/lib/adapters/index.ts | 2 +- infra/core/src/lib/types.ts | 2 +- manage.sh | 2 +- package.json | 8 +- packages/auth/package.json | 6 +- packages/auth/src/context/e2e.test.ts | 2 +- packages/auth/src/context/e2e.ts | 2 +- packages/auth/src/context/test.ts | 2 +- packages/auth/src/lucia.ts | 2 +- .../src/repository/create-session.test.ts | 2 +- .../auth/src/repository/create-session.ts | 2 +- .../auth/src/repository/create-user.test.ts | 2 +- packages/auth/src/repository/create-user.ts | 2 +- .../auth/src/repository/get-user-id.test.ts | 2 +- packages/auth/src/repository/get-user-id.ts | 2 +- packages/auth/src/repository/index.ts | 4 +- packages/auth/src/services/index.ts | 2 +- .../src/services/process-provider-callback.ts | 2 +- .../src/services/process-session-cookie.ts | 2 +- packages/auth/vitest.config.ts | 2 +- packages/common/README.md | 2 +- packages/common/package.json | 2 +- packages/database/README.md | 8 +- packages/database/package.json | 4 +- packages/design/README.md | 4 +- packages/design/package.json | 6 +- .../AvailableFormList.stories.tsx | 4 +- .../design/src/AvailableFormList/index.tsx | 2 +- packages/design/src/Form/ActionBar/index.tsx | 2 +- packages/design/src/Form/Form.tsx | 2 +- .../components/AccordionRow/AccordionRow.tsx | 2 +- .../components/Address/Address.stories.tsx | 2 +- .../src/Form/components/Address/Address.tsx | 2 +- .../Attachment/Attachment.stories.tsx | 4 +- .../Form/components/Attachment/Attachment.tsx | 4 +- .../components/Checkbox/Checkbox.stories.tsx | 2 +- .../src/Form/components/Checkbox/Checkbox.tsx | 2 +- .../CheckboxGroup/CheckboxGroup.tsx | 2 +- .../design/src/Form/components/Date/Date.tsx | 2 +- .../Form/components/EmailInput/EmailInput.tsx | 2 +- .../components/Fieldset/Fieldset.stories.tsx | 2 +- .../src/Form/components/Fieldset/Fieldset.tsx | 2 +- .../components/FormSummary/FormSummary.tsx | 2 +- .../src/Form/components/GenderId/GenderId.tsx | 2 +- .../design/src/Form/components/Name/Name.tsx | 2 +- .../PackageDownload/PackageDownload.tsx | 2 +- .../design/src/Form/components/Page/Page.tsx | 2 +- .../components/PageSet/PageSet.stories.tsx | 2 +- .../src/Form/components/PageSet/PageSet.tsx | 2 +- .../Form/components/Paragraph/Paragraph.tsx | 2 +- .../components/PhoneNumber/PhoneNumber.tsx | 2 +- .../Form/components/RadioGroup/RadioGroup.tsx | 2 +- .../components/Repeater/Repeater.stories.tsx | 2 +- .../src/Form/components/Repeater/Repeater.tsx | 2 +- .../src/Form/components/RichText/RichText.tsx | 2 +- .../SelectDropdown/SelectDropdown.tsx | 2 +- .../design/src/Form/components/Sex/Sex.tsx | 2 +- .../SocialSecurityNumber.tsx | 2 +- .../SubmissionConfirmation.tsx | 2 +- .../src/Form/components/TextArea/TextArea.tsx | 2 +- .../Form/components/TextInput/TextInput.tsx | 2 +- packages/design/src/Form/form-common.tsx | 2 +- packages/design/src/Form/types.ts | 2 +- .../FormDelete/FormDelete.stories.tsx | 2 +- .../src/FormManager/FormDelete/FormDelete.tsx | 2 +- .../DocumentImporter/DocumentImporter.tsx | 2 +- .../FormDocumentImport/FormDocumentImport.tsx | 2 +- .../FormEdit/AddPatternDropdown.tsx | 4 +- .../AccordionRowPatternEdit.stories.tsx | 4 +- .../AccordionRowPatternEdit.tsx | 4 +- .../AddressPatternEdit.stories.tsx | 4 +- .../AddressPatternEdit/AddressPatternEdit.tsx | 6 +- .../AttachmentPatternEdit.stories.tsx | 4 +- .../AttachmentPatternEdit.tsx | 6 +- .../CheckboxGroupPatternEdit.stories.tsx | 4 +- .../CheckboxGroupPatternEdit.tsx | 6 +- .../CheckboxPatternEdit.stories.tsx | 4 +- .../CheckboxPatternEdit.tsx | 6 +- .../DatePatternEdit.stories.tsx | 4 +- .../DatePatternEdit/DatePatternEdit.tsx | 8 +- .../DraggableList/DraggableList.stories.tsx | 2 +- .../EmailInputPatternEdit.stories.tsx | 4 +- .../EmailInputPatternEdit.tsx | 6 +- .../FieldsetEdit/FieldsetEdit.stories.tsx | 4 +- .../components/FieldsetEdit/FieldsetEdit.tsx | 6 +- .../FormEdit/components/FormSummaryEdit.tsx | 6 +- .../GenderIdPatternEdit.stories.tsx | 4 +- .../GenderIdPatternEdit.tsx | 6 +- .../InputPatternEdit.stories.tsx | 4 +- .../InputPatternEdit/InputPatternEdit.tsx | 6 +- .../NamePatternEdit.stories.tsx | 4 +- .../NamePatternEdit/NamePatternEdit.tsx | 6 +- .../components/PackageDownloadPatternEdit.tsx | 4 +- .../FormEdit/components/PageEdit.tsx | 6 +- .../components/PageSetEdit/PageSetEdit.tsx | 2 +- .../ParagraphPatternEdit.stories.tsx | 4 +- .../ParagraphPatternEdit.tsx | 6 +- .../PhoneNumberPatternEdit.stories.tsx | 4 +- .../PhoneNumberPatternEdit.tsx | 6 +- .../PreviewSequencePattern.tsx | 2 +- .../RadioGroupPatternEdit.stories.tsx | 4 +- .../RadioGroupPatternEdit.tsx | 6 +- .../RepeaterPatternEdit.stories.tsx | 4 +- .../RepeaterPatternEdit.tsx | 6 +- .../RichTextPatternEdit.stories.tsx | 2 +- .../RichTextPatternEdit.tsx | 2 +- .../SelectDropdownPatternEdit.stories.tsx | 4 +- .../SelectDropdownPatternEdit.tsx | 6 +- .../SexPatternEdit/SexPatternEdit.stories.tsx | 4 +- .../SexPatternEdit/SexPatternEdit.tsx | 4 +- ...ocialSecurityNumberPatternEdit.stories.tsx | 4 +- .../SocialSecurityNumberPatternEdit.tsx | 6 +- .../components/SubmissionConfirmationEdit.tsx | 2 +- .../SocialSecurityNumberPatternEdit.tsx | 6 +- .../TextAreaPattermEdit.stories.tsx | 4 +- .../components/common/MovePatternDropdown.tsx | 2 +- .../components/common/PatternEditActions.tsx | 2 +- .../components/common/PatternEditForm.tsx | 2 +- .../FormEdit/components/common/hooks.ts | 2 +- .../components/common/story-helper.tsx | 2 +- .../design/src/FormManager/FormEdit/store.ts | 4 +- .../design/src/FormManager/FormEdit/types.ts | 2 +- .../FormList/CreateNew/CreateNew.tsx | 2 +- .../FormManager/FormList/FormList.stories.tsx | 2 +- .../design/src/FormManager/FormList/store.ts | 4 +- .../design/src/FormManager/FormManager.tsx | 2 +- .../FormManager/FormPreview/FormPreview.tsx | 2 +- packages/design/src/FormManager/hooks.ts | 2 +- .../design/src/FormManager/manager-common.tsx | 2 +- packages/design/src/FormManager/store.tsx | 4 +- packages/design/src/FormManager/types.ts | 2 +- .../src/experiments/document-assembler.tsx | 2 +- packages/design/src/test-form.ts | 16 +- packages/forms/README.md | 2 +- packages/forms/package.json | 6 +- packages/forms/src/builder/index.ts | 2 +- packages/forms/src/builder/parse-form.test.ts | 2 +- packages/forms/src/builder/parse-form.ts | 2 +- .../forms/src/context/browser/form-repo.ts | 2 +- .../forms/src/context/browser/session-repo.ts | 2 +- .../__tests__/doj-pardon-marijuana.test.ts | 2 +- .../src/documents/__tests__/fill-pdf.test.ts | 2 +- packages/forms/src/documents/pdf/generate.ts | 2 +- packages/forms/src/pattern.ts | 2 +- .../forms/src/patterns/attachment/config.ts | 2 +- .../forms/src/patterns/attachment/index.ts | 2 +- packages/forms/src/patterns/input/config.ts | 2 +- packages/forms/src/patterns/input/index.ts | 2 +- .../patterns/package-download/submit.test.ts | 2 +- .../src/patterns/package-download/submit.ts | 2 +- .../src/patterns/page-set/submit.test.ts | 2 +- .../forms/src/patterns/page-set/submit.ts | 2 +- packages/forms/src/patterns/radio-group.ts | 2 +- .../forms/src/patterns/repeater/submit.ts | 2 +- .../forms/src/patterns/text-area/text-area.ts | 2 +- .../forms/src/repository/add-document.test.ts | 2 +- packages/forms/src/repository/add-document.ts | 2 +- .../forms/src/repository/add-form.test.ts | 2 +- packages/forms/src/repository/add-form.ts | 2 +- .../forms/src/repository/delete-form.test.ts | 4 +- packages/forms/src/repository/delete-form.ts | 2 +- .../forms/src/repository/get-document.test.ts | 2 +- packages/forms/src/repository/get-document.ts | 2 +- .../src/repository/get-form-list.test.ts | 2 +- .../src/repository/get-form-session.test.ts | 2 +- .../forms/src/repository/get-form-session.ts | 2 +- .../forms/src/repository/get-form.test.ts | 2 +- packages/forms/src/repository/get-form.ts | 2 +- packages/forms/src/repository/index.ts | 4 +- .../forms/src/repository/save-form.test.ts | 2 +- packages/forms/src/repository/save-form.ts | 2 +- .../repository/upsert-form-session.test.ts | 2 +- .../src/repository/upsert-form-session.ts | 2 +- packages/forms/src/response.ts | 2 +- packages/forms/src/services/add-form.ts | 2 +- packages/forms/src/services/delete-form.ts | 2 +- packages/forms/src/services/get-form-list.ts | 2 +- .../forms/src/services/get-form-session.ts | 2 +- packages/forms/src/services/get-form.ts | 2 +- packages/forms/src/services/index.ts | 2 +- .../forms/src/services/initialize-form.ts | 2 +- packages/forms/src/services/save-form.test.ts | 2 +- packages/forms/src/services/save-form.ts | 2 +- packages/forms/src/services/submit-form.ts | 2 +- packages/forms/src/submission.ts | 2 +- packages/forms/src/testing.ts | 4 +- packages/forms/src/util/zod.ts | 2 +- packages/forms/vitest.config.ts | 2 +- packages/server/README.md | 4 +- packages/server/package.json | 12 +- .../src/components/AppAvailableFormList.tsx | 2 +- packages/server/src/components/AppForm.tsx | 4 +- .../server/src/components/AppFormManager.tsx | 2 +- packages/server/src/components/Header.astro | 4 +- .../server/src/components/UsaBanner.astro | 6 +- packages/server/src/config/astro.ts | 6 +- packages/server/src/config/context.ts | 4 +- packages/server/src/config/options.ts | 8 +- packages/server/src/config/services.ts | 2 +- packages/server/src/lib/api-client.ts | 6 +- packages/server/src/lib/initialize.ts | 2 +- packages/server/src/middleware.ts | 2 +- packages/server/src/pages/forms/[id].astro | 2 +- packages/server/src/pages/forms/[id].test.ts | 2 +- packages/server/src/pages/signin/callback.ts | 2 +- packages/server/src/pages/signin/index.ts | 2 +- packages/server/src/pages/signout/confirm.ts | 2 +- packages/server/src/styles.css | 2 +- packages/server/vitest.config.browser.ts | 2 +- packages/server/vitest.config.ts | 2 +- pnpm-lock.yaml | 280 +++++++++--------- 255 files changed, 544 insertions(+), 544 deletions(-) diff --git a/.changeset/old-wolves-speak.md b/.changeset/old-wolves-speak.md index 3adf68da..f5379a1e 100644 --- a/.changeset/old-wolves-speak.md +++ b/.changeset/old-wolves-speak.md @@ -1,8 +1,8 @@ --- -"@gsa-tts/forms-cli": patch -"@gsa-tts/forms-e2e": patch -"@gsa-tts/forms-common": patch -"@gsa-tts/forms-design": patch +"@flexion/forms-cli": patch +"@flexion/forms-e2e": patch +"@flexion/forms-common": patch +"@flexion/forms-design": patch --- Change end-to-end tests to run against server rendered app diff --git a/.github/workflows/_terraform-apply.yml b/.github/workflows/_terraform-apply.yml index 2f6bfb0d..e7cdff58 100644 --- a/.github/workflows/_terraform-apply.yml +++ b/.github/workflows/_terraform-apply.yml @@ -57,11 +57,11 @@ jobs: - name: Generate Terraform CDK provider constructs shell: bash - run: pnpm --filter @gsa-tts/forms-infra-cdktf build:get + run: pnpm --filter @flexion/forms-infra-cdktf build:get - name: Initialize Terraform CDK configuration shell: bash - run: pnpm turbo run --filter @gsa-tts/forms-infra-cdktf build + run: pnpm turbo run --filter @flexion/forms-infra-cdktf build - name: Install CloudFoundry CLI run: | diff --git a/.github/workflows/_terraform-plan-pr-comment.yml b/.github/workflows/_terraform-plan-pr-comment.yml index 160b920c..4e7dc4ea 100644 --- a/.github/workflows/_terraform-plan-pr-comment.yml +++ b/.github/workflows/_terraform-plan-pr-comment.yml @@ -68,11 +68,11 @@ jobs: - name: Generate Terraform CDK provider constructs shell: bash - run: pnpm --filter @gsa-tts/forms-infra-cdktf build:get + run: pnpm --filter @flexion/forms-infra-cdktf build:get - name: Build Terraform configuration shell: bash - run: pnpm turbo run --filter @gsa-tts/forms-infra-cdktf build + run: pnpm turbo run --filter @flexion/forms-infra-cdktf build - name: Get Terraform stack name id: get_stack_name diff --git a/apps/cli/README.md b/apps/cli/README.md index b4e56d04..31a24d44 100644 --- a/apps/cli/README.md +++ b/apps/cli/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-cli-app +# @flexion/forms-cli-app This package defines the platform's command-line interface. diff --git a/apps/cli/package.json b/apps/cli/package.json index 08a60bf9..8ff0d183 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-cli", + "name": "@flexion/forms-cli", "version": "0.1.4", "description": "10x Forms Platform command-line interface", "type": "module", @@ -13,9 +13,9 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-infra-core": "workspace:*", - "@gsa-tts/forms-auth": "workspace:^", - "@gsa-tts/forms-database": "workspace:*", + "@flexion/forms-infra-core": "workspace:*", + "@flexion/forms-auth": "workspace:^", + "@flexion/forms-database": "workspace:*", "commander": "^11.1.0" } } diff --git a/apps/cli/src/cli-controller/e2e.ts b/apps/cli/src/cli-controller/e2e.ts index 30123aa5..1e52987c 100644 --- a/apps/cli/src/cli-controller/e2e.ts +++ b/apps/cli/src/cli-controller/e2e.ts @@ -2,7 +2,7 @@ import { promises as fs } from 'fs'; import { Command } from 'commander'; import { type Context } from './types.js'; -import { createTestDbSession, createE2eAuthContext } from '@gsa-tts/forms-auth'; +import { createTestDbSession, createE2eAuthContext } from '@flexion/forms-auth'; export const addE2eCommands = (ctx: Context, cli: Command) => { const cmd = cli @@ -41,4 +41,4 @@ export const addE2eCommands = (ctx: Context, cli: Command) => { process.exit(); } }); -}; \ No newline at end of file +}; diff --git a/apps/cli/src/cli-controller/secrets.ts b/apps/cli/src/cli-controller/secrets.ts index e1d9f884..c3b06a1f 100644 --- a/apps/cli/src/cli-controller/secrets.ts +++ b/apps/cli/src/cli-controller/secrets.ts @@ -6,7 +6,7 @@ import { type DeployEnv, commands, getSecretsVault, -} from '@gsa-tts/forms-infra-core'; +} from '@flexion/forms-infra-core'; import { type Context } from './types.js'; export const addSecretCommands = (ctx: Context, cli: Command) => { @@ -97,4 +97,4 @@ export const addSecretCommands = (ctx: Context, cli: Command) => { console.log('New keypair added'); } }); -}; \ No newline at end of file +}; diff --git a/apps/sandbox/README.md b/apps/sandbox/README.md index cb573592..a4569e94 100644 --- a/apps/sandbox/README.md +++ b/apps/sandbox/README.md @@ -1,3 +1,3 @@ -# @gsa-tts/forms-sandbox +# @flexion/forms-sandbox Sandbox application to evaluate platform functionality. diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index a9c20d4e..27767cf9 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-sandbox", + "name": "@flexion/forms-sandbox", "version": "0.1.4", "description": "Form server sandbox for evaluating functionality.", "type": "module", @@ -14,9 +14,9 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-database": "workspace:*", - "@gsa-tts/forms-infra-core": "workspace:*", - "@gsa-tts/forms-server": "workspace:*" + "@flexion/forms-database": "workspace:*", + "@flexion/forms-infra-core": "workspace:*", + "@flexion/forms-server": "workspace:*" }, "devDependencies": { "@types/supertest": "^6.0.2", diff --git a/apps/sandbox/src/index.ts b/apps/sandbox/src/index.ts index b4874e4b..60809d15 100644 --- a/apps/sandbox/src/index.ts +++ b/apps/sandbox/src/index.ts @@ -1,5 +1,5 @@ -import { createPostgresDatabaseContext } from '@gsa-tts/forms-database/context'; -import { getAWSSecretsManagerVault } from '@gsa-tts/forms-infra-core'; +import { createPostgresDatabaseContext } from '@flexion/forms-database/context'; +import { getAWSSecretsManagerVault } from '@flexion/forms-infra-core'; import { createCustomServer } from './server.js'; diff --git a/apps/sandbox/src/server.ts b/apps/sandbox/src/server.ts index eb2ebbc0..2bfc07a9 100644 --- a/apps/sandbox/src/server.ts +++ b/apps/sandbox/src/server.ts @@ -1,5 +1,5 @@ -import { type DatabaseContext } from '@gsa-tts/forms-database'; -import { createServer } from '@gsa-tts/forms-server'; +import { type DatabaseContext } from '@flexion/forms-database'; +import { createServer } from '@flexion/forms-server'; export const createCustomServer = async (db: DatabaseContext): Promise => { return createServer({ diff --git a/apps/sandbox/tests/integration.test.ts b/apps/sandbox/tests/integration.test.ts index 64d2e083..ae6df6b9 100644 --- a/apps/sandbox/tests/integration.test.ts +++ b/apps/sandbox/tests/integration.test.ts @@ -1,7 +1,7 @@ import request from 'supertest'; import { describe, expect, test } from 'vitest'; -import { createInMemoryDatabaseContext } from '@gsa-tts/forms-database/context'; +import { createInMemoryDatabaseContext } from '@flexion/forms-database/context'; import { createCustomServer } from '../src/server'; diff --git a/apps/server-doj/README.md b/apps/server-doj/README.md index a673c36b..e671eb9a 100644 --- a/apps/server-doj/README.md +++ b/apps/server-doj/README.md @@ -1,3 +1,3 @@ -# @gsa-tts/forms-server-doj +# @flexion/forms-server-doj Web server to demonstrate forms for DOJ's Office of the Pardon Attorney. diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index d685542c..b9ad882f 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-server-doj", + "name": "@flexion/forms-server-doj", "version": "0.1.4", "description": "Form server instance for DOJ", "type": "module", @@ -14,9 +14,9 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-database": "workspace:*", - "@gsa-tts/forms-infra-core": "workspace:*", - "@gsa-tts/forms-server": "workspace:*" + "@flexion/forms-database": "workspace:*", + "@flexion/forms-infra-core": "workspace:*", + "@flexion/forms-server": "workspace:*" }, "devDependencies": { "@types/supertest": "^6.0.2", diff --git a/apps/server-doj/src/index.ts b/apps/server-doj/src/index.ts index b4874e4b..60809d15 100644 --- a/apps/server-doj/src/index.ts +++ b/apps/server-doj/src/index.ts @@ -1,5 +1,5 @@ -import { createPostgresDatabaseContext } from '@gsa-tts/forms-database/context'; -import { getAWSSecretsManagerVault } from '@gsa-tts/forms-infra-core'; +import { createPostgresDatabaseContext } from '@flexion/forms-database/context'; +import { getAWSSecretsManagerVault } from '@flexion/forms-infra-core'; import { createCustomServer } from './server.js'; diff --git a/apps/server-doj/src/server.ts b/apps/server-doj/src/server.ts index de8dae4f..cf6f3fd6 100644 --- a/apps/server-doj/src/server.ts +++ b/apps/server-doj/src/server.ts @@ -1,5 +1,5 @@ -import { type DatabaseContext } from '@gsa-tts/forms-database'; -import { createServer } from '@gsa-tts/forms-server'; +import { type DatabaseContext } from '@flexion/forms-database'; +import { createServer } from '@flexion/forms-server'; export const createCustomServer = async (db: DatabaseContext): Promise => { return createServer({ diff --git a/apps/server-doj/tests/integration.test.ts b/apps/server-doj/tests/integration.test.ts index 15b31955..a3566d57 100644 --- a/apps/server-doj/tests/integration.test.ts +++ b/apps/server-doj/tests/integration.test.ts @@ -1,7 +1,7 @@ import request from 'supertest'; import { describe, expect, test } from 'vitest'; -import { createInMemoryDatabaseContext } from '@gsa-tts/forms-database/context'; +import { createInMemoryDatabaseContext } from '@flexion/forms-database/context'; import { createCustomServer } from '../src/server'; diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index f11b3af8..778a6336 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-spotlight", + "name": "@flexion/forms-spotlight", "type": "module", "version": "0.1.3", "private": true, @@ -24,9 +24,9 @@ ], "dependencies": { "@astrojs/react": "^3.6.1", - "@gsa-tts/forms-common": "workspace:*", - "@gsa-tts/forms-design": "workspace:*", - "@gsa-tts/forms-core": "workspace:*", + "@flexion/forms-common": "workspace:*", + "@flexion/forms-design": "workspace:*", + "@flexion/forms-core": "workspace:*", "astro": "^4.16.18", "qs": "^6.13.0", "react": "^18.3.1", diff --git a/apps/spotlight/src/components/AppAvailableFormList.tsx b/apps/spotlight/src/components/AppAvailableFormList.tsx index a85f48aa..af7d8892 100644 --- a/apps/spotlight/src/components/AppAvailableFormList.tsx +++ b/apps/spotlight/src/components/AppAvailableFormList.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { ErrorBoundary } from 'react-error-boundary'; -import { AvailableFormList } from '@gsa-tts/forms-design'; +import { AvailableFormList } from '@flexion/forms-design'; import { getAppContext } from '../context.js'; import { getFormManagerUrlById, getFormUrl } from '../routes.js'; diff --git a/apps/spotlight/src/components/AppFormManager.tsx b/apps/spotlight/src/components/AppFormManager.tsx index ef1831e2..55b744d4 100644 --- a/apps/spotlight/src/components/AppFormManager.tsx +++ b/apps/spotlight/src/components/AppFormManager.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { FormManager } from '@gsa-tts/forms-design'; +import { FormManager } from '@flexion/forms-design'; import { getAppContext } from '../context.js'; import { getFormManagerUrlById, getFormUrl } from '../routes.js'; diff --git a/apps/spotlight/src/components/DemoHeader.astro b/apps/spotlight/src/components/DemoHeader.astro index 1c1d12a4..35a50b67 100644 --- a/apps/spotlight/src/components/DemoHeader.astro +++ b/apps/spotlight/src/components/DemoHeader.astro @@ -1,5 +1,5 @@ --- -import closeSvg from '@gsa-tts/forms-design/static/uswds/img/usa-icons/close.svg'; +import closeSvg from '@flexion/forms-design/static/uswds/img/usa-icons/close.svg'; import * as routes from '../routes'; const getNavLinkClasses = (url: string) => { diff --git a/apps/spotlight/src/components/Header.astro b/apps/spotlight/src/components/Header.astro index e1234dbd..ad2d8137 100644 --- a/apps/spotlight/src/components/Header.astro +++ b/apps/spotlight/src/components/Header.astro @@ -1,5 +1,5 @@ --- -import closeSvg from '@gsa-tts/forms-design/static/uswds/img/usa-icons/close.svg'; +import closeSvg from '@flexion/forms-design/static/uswds/img/usa-icons/close.svg'; import * as routes from '../routes'; import { Image } from 'astro:assets'; import { getPublicDirUrl } from '../routes'; diff --git a/apps/spotlight/src/components/UsaBanner.astro b/apps/spotlight/src/components/UsaBanner.astro index 6fbfd61e..2dd3f656 100644 --- a/apps/spotlight/src/components/UsaBanner.astro +++ b/apps/spotlight/src/components/UsaBanner.astro @@ -1,7 +1,7 @@ --- -import iconDotGov from '@gsa-tts/forms-design/static/uswds/img/icon-dot-gov.svg'; -import iconHttps from '@gsa-tts/forms-design/static/uswds/img/icon-https.svg'; -import usFlagSmall from '@gsa-tts/forms-design/static/uswds/img/us_flag_small.png'; +import iconDotGov from '@flexion/forms-design/static/uswds/img/icon-dot-gov.svg'; +import iconHttps from '@flexion/forms-design/static/uswds/img/icon-https.svg'; +import usFlagSmall from '@flexion/forms-design/static/uswds/img/us_flag_small.png'; ---
diff --git a/apps/spotlight/src/context.ts b/apps/spotlight/src/context.ts index 5ca2c938..691f206d 100644 --- a/apps/spotlight/src/context.ts +++ b/apps/spotlight/src/context.ts @@ -3,12 +3,12 @@ import { type FormService, createFormService, parsePdf, -} from '@gsa-tts/forms-core'; -import { defaultFormConfig } from '@gsa-tts/forms-core'; -import { BrowserFormRepository } from '@gsa-tts/forms-core/context'; +} from '@flexion/forms-core'; +import { defaultFormConfig } from '@flexion/forms-core'; +import { BrowserFormRepository } from '@flexion/forms-core/context'; import { type GithubRepository } from './lib/github.js'; -import { createTestBrowserFormService } from '@gsa-tts/forms-core/context'; +import { createTestBrowserFormService } from '@flexion/forms-core/context'; export type AppContext = { baseUrl: `${string}/`; diff --git a/apps/spotlight/src/features/form-page/components/AppFormPage.tsx b/apps/spotlight/src/features/form-page/components/AppFormPage.tsx index 4b0ae183..3ba7f697 100644 --- a/apps/spotlight/src/features/form-page/components/AppFormPage.tsx +++ b/apps/spotlight/src/features/form-page/components/AppFormPage.tsx @@ -8,11 +8,11 @@ import { useParams, } from 'react-router-dom'; -import { defaultPatternComponents, Form } from '@gsa-tts/forms-design'; +import { defaultPatternComponents, Form } from '@flexion/forms-design'; import { defaultFormConfig, getRouteDataFromQueryString, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { getAppContext } from '../../../context.js'; import { useFormPageStore } from '../store/index.js'; diff --git a/apps/spotlight/src/features/form-page/store/actions/get-form-session.ts b/apps/spotlight/src/features/form-page/store/actions/get-form-session.ts index fdf83e59..1638d646 100644 --- a/apps/spotlight/src/features/form-page/store/actions/get-form-session.ts +++ b/apps/spotlight/src/features/form-page/store/actions/get-form-session.ts @@ -1,4 +1,4 @@ -import { type FormSession, type RouteData } from '@gsa-tts/forms-core'; +import { type FormSession, type RouteData } from '@flexion/forms-core'; import { type FormPageContext } from './index.js'; export type FormSessionResponse = diff --git a/apps/spotlight/src/features/form-page/store/actions/index.ts b/apps/spotlight/src/features/form-page/store/actions/index.ts index b5a6e33c..5eadc35a 100644 --- a/apps/spotlight/src/features/form-page/store/actions/index.ts +++ b/apps/spotlight/src/features/form-page/store/actions/index.ts @@ -1,4 +1,4 @@ -import { type ServiceMethod, createService } from '@gsa-tts/forms-common'; +import { type ServiceMethod, createService } from '@flexion/forms-common'; import { type AppContext, getAppContext } from '../../../../context.js'; import { type GetFormSession, getFormSession } from './get-form-session.js'; diff --git a/apps/spotlight/src/features/form-page/store/actions/initialize.ts b/apps/spotlight/src/features/form-page/store/actions/initialize.ts index 06d17edf..997153e2 100644 --- a/apps/spotlight/src/features/form-page/store/actions/initialize.ts +++ b/apps/spotlight/src/features/form-page/store/actions/initialize.ts @@ -1,4 +1,4 @@ -import { type FormRoute } from '@gsa-tts/forms-core'; +import { type FormRoute } from '@flexion/forms-core'; import { type FormPageContext } from './index.js'; import { getFormSession } from './get-form-session.js'; diff --git a/apps/spotlight/src/lib/initialize.ts b/apps/spotlight/src/lib/initialize.ts index 2c9f2d73..ddb01758 100644 --- a/apps/spotlight/src/lib/initialize.ts +++ b/apps/spotlight/src/lib/initialize.ts @@ -1,4 +1,4 @@ /** * Global initialization script. */ -import '@gsa-tts/forms-design'; +import '@flexion/forms-design'; diff --git a/apps/spotlight/src/styles.css b/apps/spotlight/src/styles.css index 40f8ac4f..26f6dc29 100644 --- a/apps/spotlight/src/styles.css +++ b/apps/spotlight/src/styles.css @@ -1 +1 @@ -@import '@gsa-tts/forms-design/static/uswds/styles/styles.css'; +@import '@flexion/forms-design/static/uswds/styles/styles.css'; diff --git a/documents/adr/0007-initial-css-strategy.md b/documents/adr/0007-initial-css-strategy.md index ef725f9f..948c1648 100644 --- a/documents/adr/0007-initial-css-strategy.md +++ b/documents/adr/0007-initial-css-strategy.md @@ -14,12 +14,12 @@ The project team desires a method of managing CSS using a method that maximizes ## Decision -The project team will theme USWDS via an encapsulated build (`@gsa-tts/forms-design`). Any USWDS-related configuration or initialization will reside in this package. +The project team will theme USWDS via an encapsulated build (`@flexion/forms-design`). Any USWDS-related configuration or initialization will reside in this package. The Spotlight frontend will leverage this package via CSS imports. Where necessary, the Spotlight frontend application will use straight CSS. ## Consequences -There is a bit more pomp and circumstance required to leverage styles that are in a separate project (`@gsa-tts/forms-design`) than there is when importing SASS directly via Astro. +There is a bit more pomp and circumstance required to leverage styles that are in a separate project (`@flexion/forms-design`) than there is when importing SASS directly via Astro. This decision is easily reversed if there proves to not be benefit from the extra modularization. diff --git a/documents/adr/0009-design-assets-workflow.md b/documents/adr/0009-design-assets-workflow.md index f0a1f1de..45af9c0c 100644 --- a/documents/adr/0009-design-assets-workflow.md +++ b/documents/adr/0009-design-assets-workflow.md @@ -14,7 +14,7 @@ The project team requires a method of organizing frontend components that facili ## Decision -The project team will use [Storybook](https://storybook.js.org/) as development aid, component documentation, and collaboration tool. Storybook and corresponding React components will be located in the @gsa-tts/forms-design namespace. The Storybook build will be bundled with the Spotlight build and deployed to Cloud.gov Pages. +The project team will use [Storybook](https://storybook.js.org/) as development aid, component documentation, and collaboration tool. Storybook and corresponding React components will be located in the @flexion/forms-design namespace. The Storybook build will be bundled with the Spotlight build and deployed to Cloud.gov Pages. The Spotlight frontend will leverage this package via CSS imports. Where necessary, the Spotlight frontend application will use straight CSS. diff --git a/e2e/README.md b/e2e/README.md index 4657dba0..056085b9 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -8,7 +8,7 @@ To run the tests, run `pnpm test` in this directory. In order to test the authenticated state, you can generate an auth session and the associated cookie. To authenticate for these tests, you can run the following command: ```bash -pnpm --filter=@gsa-tts/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env +pnpm --filter=@flexion/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env ``` ## Developing tests @@ -18,4 +18,4 @@ The easiest way to develop tests is to run Playwright in UI mode. This is availa pnpm test:dev ``` -When Playwright starts in UI mode, the UI will open automatically at `http://localhost:8080`. \ No newline at end of file +When Playwright starts in UI mode, the UI will open automatically at `http://localhost:8080`. diff --git a/e2e/package.json b/e2e/package.json index d0323bc8..4f763b86 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,9 +1,9 @@ { - "name": "@gsa-tts/forms-e2e", + "name": "@flexion/forms-e2e", "version": "0.1.3", "private": true, "scripts": { - "auth": "pnpm --filter=@gsa-tts/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env", + "auth": "pnpm --filter=@flexion/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env", "dev": "tsc -w", "test:e2e:ci": "pnpm auth && pnpm playwright test --headed", "test:e2e:dev": "pnpm auth && pnpm playwright test --ui-port=8080 --ui-host=0.0.0.0" @@ -14,6 +14,6 @@ "pdf-lib": "^1.17.1" }, "dependencies": { - "@gsa-tts/forms-common": "workspace:*" + "@flexion/forms-common": "workspace:*" } } diff --git a/e2e/playwright.config.ts b/e2e/playwright.config.ts index cfd515ba..658d019c 100644 --- a/e2e/playwright.config.ts +++ b/e2e/playwright.config.ts @@ -58,7 +58,7 @@ export default defineConfig({ /* Run your local dev server before starting the tests */ webServer: { - command: 'pnpm --filter @gsa-tts/forms-server dev', + command: 'pnpm --filter @flexion/forms-server dev', url: process.env.E2E_ENDPOINT || 'http://localhost:4321', reuseExistingServer: !process.env.CI, }, diff --git a/e2e/src/fixtures/add-download.fixture.ts b/e2e/src/fixtures/add-download.fixture.ts index 98bb8f9a..d81aae33 100644 --- a/e2e/src/fixtures/add-download.fixture.ts +++ b/e2e/src/fixtures/add-download.fixture.ts @@ -1,5 +1,5 @@ import { test as base, expect } from './import-file.fixture'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; export type AddPackageDownloadFixture = { formUrl: string; @@ -39,4 +39,4 @@ const test = base.extend({ }, }); -export { test, expect }; \ No newline at end of file +export { test, expect }; diff --git a/e2e/src/models/form-create-page.ts b/e2e/src/models/form-create-page.ts index 383accbc..84404741 100644 --- a/e2e/src/models/form-create-page.ts +++ b/e2e/src/models/form-create-page.ts @@ -1,6 +1,6 @@ import { Locator, Page } from '@playwright/test'; import { expect } from '../fixtures/import-file.fixture.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; export class FormCreatePage { private readonly page: Page; @@ -74,4 +74,4 @@ export class FormCreatePage { await expect(pattern).not.toBeVisible(); } -} \ No newline at end of file +} diff --git a/infra/aws-cdk/README.md b/infra/aws-cdk/README.md index 2cae929a..2c005c95 100644 --- a/infra/aws-cdk/README.md +++ b/infra/aws-cdk/README.md @@ -16,7 +16,7 @@ pnpm build ```bash #forms-apply-stack -r -e -cd node_modules/@gsa-tts/forms-infra-aws-cdk +cd node_modules/@flexion/forms-infra-aws-cdk pnpm cdk deploy \ --ci FormsPlatformStack \ --parameters "tagOrDigest=${TAG_OR_DIGEST}" \ diff --git a/infra/aws-cdk/lib/pipeline-stack/index.ts b/infra/aws-cdk/lib/pipeline-stack/index.ts index 3e887c50..4df16266 100644 --- a/infra/aws-cdk/lib/pipeline-stack/index.ts +++ b/infra/aws-cdk/lib/pipeline-stack/index.ts @@ -143,7 +143,7 @@ export class FormsPipelineStack extends cdk.Stack { }, build: { commands: [ - 'cd node_modules/@gsa-tts/forms-infra-aws-cdk', + 'cd node_modules/@flexion/forms-infra-aws-cdk', 'pnpm cdk deploy --ci FormsPlatformStack --parameters "tagOrDigest=${TAG_OR_DIGEST}" --parameters "environment=${ENVIRONMENT}" --parameters "repositoryName=${REPO_NAME}"', ], }, diff --git a/infra/aws-cdk/lib/platform-stack/index.ts b/infra/aws-cdk/lib/platform-stack/index.ts index 55c8b9b6..a8b4694a 100644 --- a/infra/aws-cdk/lib/platform-stack/index.ts +++ b/infra/aws-cdk/lib/platform-stack/index.ts @@ -9,7 +9,7 @@ import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'; import * as changeCase from 'change-case'; import { Duration } from 'aws-cdk-lib'; -import { getDatabaseSecretKey } from '@gsa-tts/forms-infra-core'; +import { getDatabaseSecretKey } from '@flexion/forms-infra-core'; export class FormsPlatformStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { diff --git a/infra/aws-cdk/package.json b/infra/aws-cdk/package.json index 9db6cf44..09fdfca7 100644 --- a/infra/aws-cdk/package.json +++ b/infra/aws-cdk/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-infra-aws-cdk", + "name": "@flexion/forms-infra-aws-cdk", "version": "0.1.12", "bin": { "aws-cdk": "bin/aws-cdk.js", @@ -24,7 +24,7 @@ }, "dependencies": { "@aws-cdk/aws-apprunner-alpha": "2.184.1-alpha.0", - "@gsa-tts/forms-infra-core": "workspace:*", + "@flexion/forms-infra-core": "workspace:*", "aws-cdk": "2.1004.0", "aws-cdk-lib": "2.184.1", "change-case": "^5.4.4", diff --git a/infra/cdktf/README.md b/infra/cdktf/README.md index 2aad19fb..7b2bc483 100644 --- a/infra/cdktf/README.md +++ b/infra/cdktf/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-infra +# @flexion/forms-infra Infrastructure-as-code (IaC) for the project, implemented with [Terraform CDK](https://github.com/hashicorp/terraform-cdk). diff --git a/infra/cdktf/package.json b/infra/cdktf/package.json index 6435c231..4c943e55 100644 --- a/infra/cdktf/package.json +++ b/infra/cdktf/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-infra-cdktf", + "name": "@flexion/forms-infra-cdktf", "version": "0.1.12", "description": "10x Forms Platform Terraform CDK", "main": "src/index.js", @@ -21,7 +21,7 @@ "test": "echo 'no tests'" }, "dependencies": { - "@gsa-tts/forms-infra-aws-cdk": "workspace:*", + "@flexion/forms-infra-aws-cdk": "workspace:*", "@aws-sdk/client-ssm": "^3.750.0", "cdktf": "^0.20.11", "cdktf-cli": "^0.20.11", diff --git a/infra/core/package.json b/infra/core/package.json index 7e36d39d..088e7efe 100644 --- a/infra/core/package.json +++ b/infra/core/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-infra-core", + "name": "@flexion/forms-infra-core", "version": "0.1.4", "description": "10x Forms Platform core infrastructure management", "type": "module", @@ -15,8 +15,8 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.758.0", "@aws-sdk/client-ssm": "^3.624.0", - "@gsa-tts/forms-common": "workspace:*", - "@gsa-tts/forms-core": "workspace:*", + "@flexion/forms-common": "workspace:*", + "@flexion/forms-core": "workspace:*", "zod": "^3.23.8" } } diff --git a/infra/core/src/lib/adapters/index.ts b/infra/core/src/lib/adapters/index.ts index b0fbd6c7..7d49a9f7 100644 --- a/infra/core/src/lib/adapters/index.ts +++ b/infra/core/src/lib/adapters/index.ts @@ -1,6 +1,6 @@ import { promises as fs } from 'fs'; -import * as r from '@gsa-tts/forms-common'; +import * as r from '@flexion/forms-common'; import { AWSParameterStoreSecretsVault } from './aws-param-store.js'; import { getSecretMapFromJsonString, type SecretsVault } from '../types.js'; diff --git a/infra/core/src/lib/types.ts b/infra/core/src/lib/types.ts index db474b84..984a0bfe 100644 --- a/infra/core/src/lib/types.ts +++ b/infra/core/src/lib/types.ts @@ -1,5 +1,5 @@ import * as z from 'zod'; -import { type Result } from '@gsa-tts/forms-common'; +import { type Result } from '@flexion/forms-common'; export type SecretKey = string; export type SecretValue = string | undefined; diff --git a/manage.sh b/manage.sh index 6cebc247..a9f6a30b 100755 --- a/manage.sh +++ b/manage.sh @@ -1,3 +1,3 @@ #!/bin/sh -pnpm --filter @gsa-tts/forms-cli cli $@ +pnpm --filter @flexion/forms-cli cli $@ diff --git a/package.json b/package.json index b2442a75..15c05d76 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms", + "name": "@flexion/forms", "version": "1.0.0-beta.1", "description": "10x Forms Platform", "type": "module", @@ -7,7 +7,7 @@ "license": "CC0", "packageManager": "pnpm@9.8.0", "scripts": { - "build": "turbo run build --filter=!@gsa-tts/forms-infra-cdktf --filter=!@gsa-tts/forms-infra-aws-cdk", + "build": "turbo run build --filter=!@flexion/forms-infra-cdktf --filter=!@flexion/forms-infra-aws-cdk", "clean": "turbo run clean", "clean:modules": "find $(git rev-parse --show-toplevel) -name 'node_modules' -type d -prune -exec rm -rf '{}' +", "clean:dist": "find $(git rev-parse --show-toplevel) -name 'dist' -type d -prune -exec rm -rf '{}' +", @@ -19,8 +19,8 @@ "release": "pnpm run build && changeset publish", "test": "vitest run", "test:ci": "CI=true vitest run # --coverage.enabled --coverage.provider=v8 --coverage.reporter=text --coverage.reporter=json-summary --coverage.reporter=json --coverage.reportOnFailure", - "test:e2e:ci": "pnpm --filter @gsa-tts/forms-e2e test:e2e:ci", - "test:e2e:dev": "pnpm --filter @gsa-tts/forms-e2e test:e2e:dev", + "test:e2e:ci": "pnpm --filter @flexion/forms-e2e test:e2e:ci", + "test:e2e:dev": "pnpm --filter @flexion/forms-e2e test:e2e:dev", "test:infra": "turbo run --filter=infra-cdktf test", "typecheck": "tsc --build --noEmit" }, diff --git a/packages/auth/package.json b/packages/auth/package.json index ea2a5adb..e9a0cbbf 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-auth", + "name": "@flexion/forms-auth", "version": "0.1.2", "description": "10x Forms Platform auth module", "type": "module", @@ -13,8 +13,8 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-common": "workspace:^", - "@gsa-tts/forms-database": "workspace:*", + "@flexion/forms-common": "workspace:^", + "@flexion/forms-database": "workspace:*", "@lucia-auth/adapter-postgresql": "^3.1.2", "@lucia-auth/adapter-sqlite": "^3.0.2", "arctic": "^1.9.2", diff --git a/packages/auth/src/context/e2e.test.ts b/packages/auth/src/context/e2e.test.ts index f601fcc0..c5270d0d 100644 --- a/packages/auth/src/context/e2e.test.ts +++ b/packages/auth/src/context/e2e.test.ts @@ -3,7 +3,7 @@ import { createE2eAuthContext } from './e2e.js'; import { BaseAuthContext } from './base.js'; // Mock imports -vi.mock('@gsa-tts/forms-database/context', () => ({ +vi.mock('@flexion/forms-database/context', () => ({ createFilesystemDatabaseContext: vi.fn().mockResolvedValue({}), })); diff --git a/packages/auth/src/context/e2e.ts b/packages/auth/src/context/e2e.ts index 68d7cbfa..501e37d5 100644 --- a/packages/auth/src/context/e2e.ts +++ b/packages/auth/src/context/e2e.ts @@ -4,7 +4,7 @@ import { createAuthRepository } from '../repository/index.js'; export const createE2eAuthContext = async (dbPath: string) => { // The login flow is to create fs db context -> feed into base auth context constructor -> feed it into the auth service const { createFilesystemDatabaseContext } = await import( - '@gsa-tts/forms-database/context' + '@flexion/forms-database/context' ); const dbContext = await createFilesystemDatabaseContext(dbPath); const authRepository = createAuthRepository(dbContext); diff --git a/packages/auth/src/context/test.ts b/packages/auth/src/context/test.ts index 5bbe262d..24beeebc 100644 --- a/packages/auth/src/context/test.ts +++ b/packages/auth/src/context/test.ts @@ -1,7 +1,7 @@ import { Cookie, Lucia } from 'lucia'; import { vi } from 'vitest'; -import { createInMemoryDatabaseContext } from '@gsa-tts/forms-database/context'; +import { createInMemoryDatabaseContext } from '@flexion/forms-database/context'; import { AuthServiceContext, UserSession } from '../index.js'; import { createSqliteLuciaAdapter } from '../lucia.js'; diff --git a/packages/auth/src/lucia.ts b/packages/auth/src/lucia.ts index 11b3cc52..5da98d30 100644 --- a/packages/auth/src/lucia.ts +++ b/packages/auth/src/lucia.ts @@ -3,7 +3,7 @@ import { BetterSqlite3Adapter } from '@lucia-auth/adapter-sqlite'; import { type Database as Sqlite3Database } from 'better-sqlite3'; import { Lucia } from 'lucia'; -import { type Database } from '@gsa-tts/forms-database'; +import { type Database } from '@flexion/forms-database'; /** * Factory function to create a SQLite Lucia adapter. diff --git a/packages/auth/src/repository/create-session.test.ts b/packages/auth/src/repository/create-session.test.ts index f34a0eec..7a069e76 100644 --- a/packages/auth/src/repository/create-session.test.ts +++ b/packages/auth/src/repository/create-session.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { createUser } from './create-user.js'; import { createSession } from './create-session.js'; diff --git a/packages/auth/src/repository/create-session.ts b/packages/auth/src/repository/create-session.ts index 085c1150..8903bc52 100644 --- a/packages/auth/src/repository/create-session.ts +++ b/packages/auth/src/repository/create-session.ts @@ -1,4 +1,4 @@ -import { type DatabaseContext, dateValue } from '@gsa-tts/forms-database'; +import { type DatabaseContext, dateValue } from '@flexion/forms-database'; type Session = { id: string; diff --git a/packages/auth/src/repository/create-user.test.ts b/packages/auth/src/repository/create-user.test.ts index adf9e635..b8afab57 100644 --- a/packages/auth/src/repository/create-user.test.ts +++ b/packages/auth/src/repository/create-user.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { createUser } from './create-user.js'; diff --git a/packages/auth/src/repository/create-user.ts b/packages/auth/src/repository/create-user.ts index d1a4cd20..123e4303 100644 --- a/packages/auth/src/repository/create-user.ts +++ b/packages/auth/src/repository/create-user.ts @@ -1,6 +1,6 @@ import { randomUUID } from 'crypto'; -import { type DatabaseContext } from '@gsa-tts/forms-database'; +import { type DatabaseContext } from '@flexion/forms-database'; /** * Asynchronously creates a new user record in the database. diff --git a/packages/auth/src/repository/get-user-id.test.ts b/packages/auth/src/repository/get-user-id.test.ts index ba659c64..262268b9 100644 --- a/packages/auth/src/repository/get-user-id.test.ts +++ b/packages/auth/src/repository/get-user-id.test.ts @@ -4,7 +4,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { getUserId } from './get-user-id.js'; diff --git a/packages/auth/src/repository/get-user-id.ts b/packages/auth/src/repository/get-user-id.ts index 21bc2ebe..1c94f2d9 100644 --- a/packages/auth/src/repository/get-user-id.ts +++ b/packages/auth/src/repository/get-user-id.ts @@ -1,4 +1,4 @@ -import { type DatabaseContext } from '@gsa-tts/forms-database'; +import { type DatabaseContext } from '@flexion/forms-database'; /** * Retrieves the unique identifier (ID) of a user based on their email address. diff --git a/packages/auth/src/repository/index.ts b/packages/auth/src/repository/index.ts index 9b7c875e..afc6526a 100644 --- a/packages/auth/src/repository/index.ts +++ b/packages/auth/src/repository/index.ts @@ -1,5 +1,5 @@ -import { createService } from '@gsa-tts/forms-common'; -import { type DatabaseContext } from '@gsa-tts/forms-database'; +import { createService } from '@flexion/forms-common'; +import { type DatabaseContext } from '@flexion/forms-database'; import { createSession } from './create-session.js'; import { createUser } from './create-user.js'; diff --git a/packages/auth/src/services/index.ts b/packages/auth/src/services/index.ts index 23b25ad7..9b158d1f 100644 --- a/packages/auth/src/services/index.ts +++ b/packages/auth/src/services/index.ts @@ -1,6 +1,6 @@ import { Cookie, Lucia } from 'lucia'; -import { createService } from '@gsa-tts/forms-common'; +import { createService } from '@flexion/forms-common'; import { type UserSession, diff --git a/packages/auth/src/services/process-provider-callback.ts b/packages/auth/src/services/process-provider-callback.ts index ee108c28..2b9b8ac8 100644 --- a/packages/auth/src/services/process-provider-callback.ts +++ b/packages/auth/src/services/process-provider-callback.ts @@ -1,7 +1,7 @@ import { OAuth2RequestError } from 'arctic'; import { randomUUID } from 'crypto'; -import * as r from '@gsa-tts/forms-common'; +import * as r from '@flexion/forms-common'; import { type AuthServiceContext } from './index.js'; type LoginGovUser = { diff --git a/packages/auth/src/services/process-session-cookie.ts b/packages/auth/src/services/process-session-cookie.ts index e5a32153..72c87c53 100644 --- a/packages/auth/src/services/process-session-cookie.ts +++ b/packages/auth/src/services/process-session-cookie.ts @@ -1,6 +1,6 @@ import { verifyRequestOrigin } from 'lucia'; -import { type VoidResult } from '@gsa-tts/forms-common'; +import { type VoidResult } from '@flexion/forms-common'; import { type AuthServiceContext } from './index.js'; diff --git a/packages/auth/vitest.config.ts b/packages/auth/vitest.config.ts index 1e198670..0a61a98b 100644 --- a/packages/auth/vitest.config.ts +++ b/packages/auth/vitest.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import { getVitestDatabaseContainerGlobalSetupPath } from '@gsa-tts/forms-database'; +import { getVitestDatabaseContainerGlobalSetupPath } from '@flexion/forms-database'; import sharedTestConfig from '../../vitest.shared'; export default mergeConfig( diff --git a/packages/common/README.md b/packages/common/README.md index 2cb5b9e0..a49d6d77 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -1 +1 @@ -# @gsa-tts/forms-common +# @flexion/forms-common diff --git a/packages/common/package.json b/packages/common/package.json index bc449c3a..11e627fd 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-common", + "name": "@flexion/forms-common", "version": "0.1.2", "description": "10x Forms Platform shared resources", "type": "module", diff --git a/packages/database/README.md b/packages/database/README.md index a67f14b9..4ebc5fd6 100644 --- a/packages/database/README.md +++ b/packages/database/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-database +# @flexion/forms-database This package maintains the supporting infrastructure for the Forms Platform database. @@ -19,7 +19,7 @@ Application of database migrations are orchestrated by the application via ## Testing -Packages that leverage `@gsa-tts/forms-database` may use provided helpers for testing +Packages that leverage `@flexion/forms-database` may use provided helpers for testing purposes. ### Testing database gateway routines @@ -30,7 +30,7 @@ a clean database on both Sqlite3 and PostgreSQL: ```typescript import { expect, it } from 'vitest'; -import { type DbTestContext, describeDatabase } from '@gsa-tts/forms-database/testing'; +import { type DbTestContext, describeDatabase } from '@flexion/forms-database/testing'; describeDatabase('database connection', () => { it('selects all via kysely', async ({ db }) => { @@ -52,7 +52,7 @@ the `createInMemoryDatabaseContext` factory. This will provide an ephemeral in-memory Sqlite3 database. ```typescript -import { createInMemoryDatabaseContext } from '@gsa-tts/forms-database/context'; +import { createInMemoryDatabaseContext } from '@flexion/forms-database/context'; describe('business logic tested with in-memory database', () => { it('context helper has a connection to a sqlite database', async () => { diff --git a/packages/database/package.json b/packages/database/package.json index 5a2f0a0d..ea88b39e 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-database", + "name": "@flexion/forms-database", "version": "0.1.2", "description": "10x Forms Platform database", "type": "module", @@ -31,7 +31,7 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-common": "workspace:*", + "@flexion/forms-common": "workspace:*", "@types/pg": "^8.11.6", "better-sqlite3": "^11.7.2", "knex": "^3.1.0", diff --git a/packages/design/README.md b/packages/design/README.md index 6b2bee0e..46650565 100644 --- a/packages/design/README.md +++ b/packages/design/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-design +# @flexion/forms-design This package encapsulates all the design components used in Forms Platform frontend applications. @@ -13,4 +13,4 @@ See relevant ADRs: - [documents/adr/0007-initial-css-strategy](../../documents/adr/0007-initial-css-strategy.md) - [documents/adr/0009-design-assets-workflow.md](../../documents/adr/0009-design-assets-workflow.md) -This package as a special watch task. If your dev server is running already (`pnpm dev`), you can open a separate terminal and run `pnpm test:watch` and any changes to the *.{ts,tsx} files in this package will run the test suite. If you'd like to run from the project root directory, you would run `pnpm --filter @gsa-tts/forms-design test:watch`. +This package as a special watch task. If your dev server is running already (`pnpm dev`), you can open a separate terminal and run `pnpm test:watch` and any changes to the *.{ts,tsx} files in this package will run the test suite. If you'd like to run from the project root directory, you would run `pnpm --filter @flexion/forms-design test:watch`. diff --git a/packages/design/package.json b/packages/design/package.json index af68635e..e7ee6d2a 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-design", + "name": "@flexion/forms-design", "version": "0.1.2", "main": "src/index.ts", "type": "module", @@ -71,8 +71,8 @@ "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "@gsa-tts/forms-common": "workspace:*", - "@gsa-tts/forms-core": "workspace:*", + "@flexion/forms-common": "workspace:*", + "@flexion/forms-core": "workspace:*", "@size-limit/preset-big-lib": "^11.1.6", "@tiptap/core": "^2.6.2", "@tiptap/react": "^2.6.2", diff --git a/packages/design/src/AvailableFormList/AvailableFormList.stories.tsx b/packages/design/src/AvailableFormList/AvailableFormList.stories.tsx index 05ad5cbf..e2873317 100644 --- a/packages/design/src/AvailableFormList/AvailableFormList.stories.tsx +++ b/packages/design/src/AvailableFormList/AvailableFormList.stories.tsx @@ -2,8 +2,8 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import type { Meta, StoryObj } from '@storybook/react'; -import { type FormService, createForm, nullSession } from '@gsa-tts/forms-core'; -import { createTestBrowserFormService } from '@gsa-tts/forms-core/context'; +import { type FormService, createForm, nullSession } from '@flexion/forms-core'; +import { createTestBrowserFormService } from '@flexion/forms-core/context'; import { FormManagerProvider } from '../FormManager/store.js'; import { createTestFormManagerContext } from '../test-form.js'; import AvailableFormList from './index.js'; diff --git a/packages/design/src/AvailableFormList/index.tsx b/packages/design/src/AvailableFormList/index.tsx index 8024ffef..dc77108a 100644 --- a/packages/design/src/AvailableFormList/index.tsx +++ b/packages/design/src/AvailableFormList/index.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { Link } from 'react-router-dom'; -import { type FormService } from '@gsa-tts/forms-core'; +import { type FormService } from '@flexion/forms-core'; import * as AppRoutes from '../FormManager/routes.js'; diff --git a/packages/design/src/Form/ActionBar/index.tsx b/packages/design/src/Form/ActionBar/index.tsx index 58799287..b5a680d0 100644 --- a/packages/design/src/Form/ActionBar/index.tsx +++ b/packages/design/src/Form/ActionBar/index.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { PromptAction } from '@gsa-tts/forms-core'; +import { PromptAction } from '@flexion/forms-core'; export default function ActionBar({ actions }: { actions: PromptAction[] }) { return ( diff --git a/packages/design/src/Form/Form.tsx b/packages/design/src/Form/Form.tsx index 4e85538a..a5ddb89b 100644 --- a/packages/design/src/Form/Form.tsx +++ b/packages/design/src/Form/Form.tsx @@ -9,7 +9,7 @@ import { type FormRoute, type FormSession, type Prompt, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { renderPromptComponents } from './form-common.js'; import { FormUIContext } from './types.js'; diff --git a/packages/design/src/Form/components/AccordionRow/AccordionRow.tsx b/packages/design/src/Form/components/AccordionRow/AccordionRow.tsx index c71dcede..454ca10e 100644 --- a/packages/design/src/Form/components/AccordionRow/AccordionRow.tsx +++ b/packages/design/src/Form/components/AccordionRow/AccordionRow.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import classNames from 'classnames'; -import { type AccordionRowProps } from '@gsa-tts/forms-core'; +import { type AccordionRowProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const AccordionRow: PatternComponent = ({ diff --git a/packages/design/src/Form/components/Address/Address.stories.tsx b/packages/design/src/Form/components/Address/Address.stories.tsx index 78971c3f..ac5774f1 100644 --- a/packages/design/src/Form/components/Address/Address.stories.tsx +++ b/packages/design/src/Form/components/Address/Address.stories.tsx @@ -3,7 +3,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { type Meta, type StoryObj } from '@storybook/react'; import AddressPattern from './Address.js'; -import { stateTerritoryOrMilitaryPostList } from '@gsa-tts/forms-core'; +import { stateTerritoryOrMilitaryPostList } from '@flexion/forms-core'; const meta: Meta = { title: 'patterns/Address', diff --git a/packages/design/src/Form/components/Address/Address.tsx b/packages/design/src/Form/components/Address/Address.tsx index c50798e8..4e2c6662 100644 --- a/packages/design/src/Form/components/Address/Address.tsx +++ b/packages/design/src/Form/components/Address/Address.tsx @@ -2,7 +2,7 @@ import classNames from 'classnames'; import React, { useState, useEffect } from 'react'; import { useFormContext } from 'react-hook-form'; -import { type AddressComponentProps } from '@gsa-tts/forms-core'; +import { type AddressComponentProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; diff --git a/packages/design/src/Form/components/Attachment/Attachment.stories.tsx b/packages/design/src/Form/components/Attachment/Attachment.stories.tsx index d529001c..4318c686 100644 --- a/packages/design/src/Form/components/Attachment/Attachment.stories.tsx +++ b/packages/design/src/Form/components/Attachment/Attachment.stories.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { within, userEvent } from '@storybook/test'; import { expect } from '@storybook/test'; -import { attachmentFileTypeMimes } from '@gsa-tts/forms-core'; -import { type AttachmentProps } from '@gsa-tts/forms-core'; +import { attachmentFileTypeMimes } from '@flexion/forms-core'; +import { type AttachmentProps } from '@flexion/forms-core'; import { FormProvider, useForm } from 'react-hook-form'; import type { Meta, StoryObj } from '@storybook/react'; diff --git a/packages/design/src/Form/components/Attachment/Attachment.tsx b/packages/design/src/Form/components/Attachment/Attachment.tsx index 130c43b8..ec81cf5c 100644 --- a/packages/design/src/Form/components/Attachment/Attachment.tsx +++ b/packages/design/src/Form/components/Attachment/Attachment.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React, { useState } from 'react'; import { useFormContext } from 'react-hook-form'; -import { type AttachmentProps } from '@gsa-tts/forms-core'; -import { attachmentFileTypeOptions } from '@gsa-tts/forms-core'; +import { type AttachmentProps } from '@flexion/forms-core'; +import { attachmentFileTypeOptions } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const Attachment: PatternComponent = props => { diff --git a/packages/design/src/Form/components/Checkbox/Checkbox.stories.tsx b/packages/design/src/Form/components/Checkbox/Checkbox.stories.tsx index 08811367..642a542d 100644 --- a/packages/design/src/Form/components/Checkbox/Checkbox.stories.tsx +++ b/packages/design/src/Form/components/Checkbox/Checkbox.stories.tsx @@ -3,7 +3,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { type Meta, type StoryObj } from '@storybook/react'; import CheckboxPattern from './Checkbox.js'; -import { CheckboxProps } from '@gsa-tts/forms-core'; +import { CheckboxProps } from '@flexion/forms-core'; const meta: Meta = { title: 'patterns/CheckboxPattern', diff --git a/packages/design/src/Form/components/Checkbox/Checkbox.tsx b/packages/design/src/Form/components/Checkbox/Checkbox.tsx index d3b3f766..3713adba 100644 --- a/packages/design/src/Form/components/Checkbox/Checkbox.tsx +++ b/packages/design/src/Form/components/Checkbox/Checkbox.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { type CheckboxProps } from '@gsa-tts/forms-core'; +import { type CheckboxProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import classNames from 'classnames'; diff --git a/packages/design/src/Form/components/CheckboxGroup/CheckboxGroup.tsx b/packages/design/src/Form/components/CheckboxGroup/CheckboxGroup.tsx index 0ea8256e..808f30da 100644 --- a/packages/design/src/Form/components/CheckboxGroup/CheckboxGroup.tsx +++ b/packages/design/src/Form/components/CheckboxGroup/CheckboxGroup.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { type CheckboxGroupProps } from '@gsa-tts/forms-core'; +import { type CheckboxGroupProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import classNames from 'classnames'; diff --git a/packages/design/src/Form/components/Date/Date.tsx b/packages/design/src/Form/components/Date/Date.tsx index 7eb146d8..08be665a 100644 --- a/packages/design/src/Form/components/Date/Date.tsx +++ b/packages/design/src/Form/components/Date/Date.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type DateProps } from '@gsa-tts/forms-core'; +import { type DateProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const months = [ diff --git a/packages/design/src/Form/components/EmailInput/EmailInput.tsx b/packages/design/src/Form/components/EmailInput/EmailInput.tsx index 07046a0c..5d74f829 100644 --- a/packages/design/src/Form/components/EmailInput/EmailInput.tsx +++ b/packages/design/src/Form/components/EmailInput/EmailInput.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type EmailInputProps } from '@gsa-tts/forms-core'; +import { type EmailInputProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const EmailInputPattern: PatternComponent = ({ diff --git a/packages/design/src/Form/components/Fieldset/Fieldset.stories.tsx b/packages/design/src/Form/components/Fieldset/Fieldset.stories.tsx index 27a3c399..190400bb 100644 --- a/packages/design/src/Form/components/Fieldset/Fieldset.stories.tsx +++ b/packages/design/src/Form/components/Fieldset/Fieldset.stories.tsx @@ -8,7 +8,7 @@ import type { DateProps, EmailInputProps, FieldsetProps, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { expect, within } from '@storybook/test'; const defaultArgs = { diff --git a/packages/design/src/Form/components/Fieldset/Fieldset.tsx b/packages/design/src/Form/components/Fieldset/Fieldset.tsx index d1ef382a..968eb6d7 100644 --- a/packages/design/src/Form/components/Fieldset/Fieldset.tsx +++ b/packages/design/src/Form/components/Fieldset/Fieldset.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type FieldsetProps } from '@gsa-tts/forms-core'; +import { type FieldsetProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import { renderPromptComponents } from '../../form-common.js'; diff --git a/packages/design/src/Form/components/FormSummary/FormSummary.tsx b/packages/design/src/Form/components/FormSummary/FormSummary.tsx index ab53e2c5..af69bd40 100644 --- a/packages/design/src/Form/components/FormSummary/FormSummary.tsx +++ b/packages/design/src/Form/components/FormSummary/FormSummary.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type FormSummaryProps } from '@gsa-tts/forms-core'; +import { type FormSummaryProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const FormSummary: PatternComponent = props => { diff --git a/packages/design/src/Form/components/GenderId/GenderId.tsx b/packages/design/src/Form/components/GenderId/GenderId.tsx index 972b90d0..48054a7f 100644 --- a/packages/design/src/Form/components/GenderId/GenderId.tsx +++ b/packages/design/src/Form/components/GenderId/GenderId.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import classNames from 'classnames'; import { useFormContext, useWatch } from 'react-hook-form'; -import { type GenderIdProps } from '@gsa-tts/forms-core'; +import { type GenderIdProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const GenderIdPattern: PatternComponent = ({ diff --git a/packages/design/src/Form/components/Name/Name.tsx b/packages/design/src/Form/components/Name/Name.tsx index 2dad8f53..2456757b 100644 --- a/packages/design/src/Form/components/Name/Name.tsx +++ b/packages/design/src/Form/components/Name/Name.tsx @@ -2,7 +2,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; import { type PatternComponent } from '../../types.js'; -import { type NameProps } from '@gsa-tts/forms-core'; +import { type NameProps } from '@flexion/forms-core'; const getAriaDescribedBy = ( errorId: string | null, diff --git a/packages/design/src/Form/components/PackageDownload/PackageDownload.tsx b/packages/design/src/Form/components/PackageDownload/PackageDownload.tsx index a7f1fa2b..6def0f88 100644 --- a/packages/design/src/Form/components/PackageDownload/PackageDownload.tsx +++ b/packages/design/src/Form/components/PackageDownload/PackageDownload.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type PackageDownloadProps } from '@gsa-tts/forms-core'; +import { type PackageDownloadProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import ActionBar from '../../ActionBar/index.js'; diff --git a/packages/design/src/Form/components/Page/Page.tsx b/packages/design/src/Form/components/Page/Page.tsx index 94dd3276..75ecd781 100644 --- a/packages/design/src/Form/components/Page/Page.tsx +++ b/packages/design/src/Form/components/Page/Page.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type PageProps } from '@gsa-tts/forms-core'; +import { type PageProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import { renderPromptComponents } from '../../form-common.js'; diff --git a/packages/design/src/Form/components/PageSet/PageSet.stories.tsx b/packages/design/src/Form/components/PageSet/PageSet.stories.tsx index d48678c0..1a963116 100644 --- a/packages/design/src/Form/components/PageSet/PageSet.stories.tsx +++ b/packages/design/src/Form/components/PageSet/PageSet.stories.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import type { Meta, StoryObj } from '@storybook/react'; -import { type PageSetProps } from '@gsa-tts/forms-core'; +import { type PageSetProps } from '@flexion/forms-core'; import { FormManagerProvider } from '../../../FormManager/store.js'; import { diff --git a/packages/design/src/Form/components/PageSet/PageSet.tsx b/packages/design/src/Form/components/PageSet/PageSet.tsx index 10ad94ca..3d0510ca 100644 --- a/packages/design/src/Form/components/PageSet/PageSet.tsx +++ b/packages/design/src/Form/components/PageSet/PageSet.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type PageSetProps } from '@gsa-tts/forms-core'; +import { type PageSetProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import ActionBar from '../../../Form/ActionBar/index.js'; diff --git a/packages/design/src/Form/components/Paragraph/Paragraph.tsx b/packages/design/src/Form/components/Paragraph/Paragraph.tsx index 2c7a8fc2..d05561b4 100644 --- a/packages/design/src/Form/components/Paragraph/Paragraph.tsx +++ b/packages/design/src/Form/components/Paragraph/Paragraph.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type ParagraphProps } from '@gsa-tts/forms-core'; +import { type ParagraphProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; diff --git a/packages/design/src/Form/components/PhoneNumber/PhoneNumber.tsx b/packages/design/src/Form/components/PhoneNumber/PhoneNumber.tsx index f8506206..93ec7ef9 100644 --- a/packages/design/src/Form/components/PhoneNumber/PhoneNumber.tsx +++ b/packages/design/src/Form/components/PhoneNumber/PhoneNumber.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type PhoneNumberProps } from '@gsa-tts/forms-core'; +import { type PhoneNumberProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const formatPhoneNumber = (value: string) => { diff --git a/packages/design/src/Form/components/RadioGroup/RadioGroup.tsx b/packages/design/src/Form/components/RadioGroup/RadioGroup.tsx index 760b2fcc..f279b083 100644 --- a/packages/design/src/Form/components/RadioGroup/RadioGroup.tsx +++ b/packages/design/src/Form/components/RadioGroup/RadioGroup.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { type RadioGroupProps } from '@gsa-tts/forms-core'; +import { type RadioGroupProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import classNames from 'classnames'; diff --git a/packages/design/src/Form/components/Repeater/Repeater.stories.tsx b/packages/design/src/Form/components/Repeater/Repeater.stories.tsx index a0a3cb1e..6d32afde 100644 --- a/packages/design/src/Form/components/Repeater/Repeater.stories.tsx +++ b/packages/design/src/Form/components/Repeater/Repeater.stories.tsx @@ -7,7 +7,7 @@ import type { DateProps, EmailInputProps, RepeaterProps, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { expect, within } from '@storybook/test'; const defaultArgs = { diff --git a/packages/design/src/Form/components/Repeater/Repeater.tsx b/packages/design/src/Form/components/Repeater/Repeater.tsx index 849d77e4..72b9d9f5 100644 --- a/packages/design/src/Form/components/Repeater/Repeater.tsx +++ b/packages/design/src/Form/components/Repeater/Repeater.tsx @@ -5,7 +5,7 @@ import { type PromptComponent, FormError, FormErrors, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import { renderPromptComponents } from '../../form-common.js'; diff --git a/packages/design/src/Form/components/RichText/RichText.tsx b/packages/design/src/Form/components/RichText/RichText.tsx index a77e0102..969a7386 100644 --- a/packages/design/src/Form/components/RichText/RichText.tsx +++ b/packages/design/src/Form/components/RichText/RichText.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type RichTextProps } from '@gsa-tts/forms-core'; +import { type RichTextProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; import styles from './richTextStyles.module.css'; diff --git a/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx b/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx index e3fc91b0..4d234fce 100644 --- a/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx +++ b/packages/design/src/Form/components/SelectDropdown/SelectDropdown.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type SelectDropdownProps } from '@gsa-tts/forms-core'; +import { type SelectDropdownProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const SelectDropdownPattern: PatternComponent = ({ diff --git a/packages/design/src/Form/components/Sex/Sex.tsx b/packages/design/src/Form/components/Sex/Sex.tsx index 88a8363e..39e98054 100644 --- a/packages/design/src/Form/components/Sex/Sex.tsx +++ b/packages/design/src/Form/components/Sex/Sex.tsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; import { type PatternComponent } from '../../types.js'; -import { type SexProps } from '@gsa-tts/forms-core'; +import { type SexProps } from '@flexion/forms-core'; import Modal from './Modal.js'; const getAriaDescribedBy = (hintId: string | null) => hintId || undefined; diff --git a/packages/design/src/Form/components/SocialSecurityNumber/SocialSecurityNumber.tsx b/packages/design/src/Form/components/SocialSecurityNumber/SocialSecurityNumber.tsx index d18ade08..489a276c 100644 --- a/packages/design/src/Form/components/SocialSecurityNumber/SocialSecurityNumber.tsx +++ b/packages/design/src/Form/components/SocialSecurityNumber/SocialSecurityNumber.tsx @@ -1,7 +1,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type SocialSecurityNumberProps } from '@gsa-tts/forms-core'; +import { type SocialSecurityNumberProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; diff --git a/packages/design/src/Form/components/SubmissionConfirmation/SubmissionConfirmation.tsx b/packages/design/src/Form/components/SubmissionConfirmation/SubmissionConfirmation.tsx index 72da6d0c..6ae60626 100644 --- a/packages/design/src/Form/components/SubmissionConfirmation/SubmissionConfirmation.tsx +++ b/packages/design/src/Form/components/SubmissionConfirmation/SubmissionConfirmation.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type SubmissionConfirmationProps } from '@gsa-tts/forms-core'; +import { type SubmissionConfirmationProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const SubmissionConfirmation: PatternComponent< diff --git a/packages/design/src/Form/components/TextArea/TextArea.tsx b/packages/design/src/Form/components/TextArea/TextArea.tsx index c3788fab..a3864501 100644 --- a/packages/design/src/Form/components/TextArea/TextArea.tsx +++ b/packages/design/src/Form/components/TextArea/TextArea.tsx @@ -2,7 +2,7 @@ import React from 'react'; import classNames from 'classnames'; import { useFormContext } from 'react-hook-form'; -import { type TextAreaProps } from '@gsa-tts/forms-core'; +import { type TextAreaProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const TextArea: PatternComponent = ({ diff --git a/packages/design/src/Form/components/TextInput/TextInput.tsx b/packages/design/src/Form/components/TextInput/TextInput.tsx index c57fc0e5..de7020f9 100644 --- a/packages/design/src/Form/components/TextInput/TextInput.tsx +++ b/packages/design/src/Form/components/TextInput/TextInput.tsx @@ -2,7 +2,7 @@ import classNames from 'classnames'; import React from 'react'; import { useFormContext } from 'react-hook-form'; -import { type TextInputProps } from '@gsa-tts/forms-core'; +import { type TextInputProps } from '@flexion/forms-core'; import { type PatternComponent } from '../../types.js'; const TextInput: PatternComponent = ({ diff --git a/packages/design/src/Form/form-common.tsx b/packages/design/src/Form/form-common.tsx index 4a1779ae..577c2a79 100644 --- a/packages/design/src/Form/form-common.tsx +++ b/packages/design/src/Form/form-common.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { PromptComponent } from '@gsa-tts/forms-core'; +import type { PromptComponent } from '@flexion/forms-core'; import type { FormUIContext } from './types.js'; export const renderPromptComponents = ( diff --git a/packages/design/src/Form/types.ts b/packages/design/src/Form/types.ts index 486d147f..d66915d7 100644 --- a/packages/design/src/Form/types.ts +++ b/packages/design/src/Form/types.ts @@ -2,7 +2,7 @@ import { type FormConfig, type PatternProps, type PromptComponent, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; export type FormUIContext = { config: FormConfig; diff --git a/packages/design/src/FormManager/FormDelete/FormDelete.stories.tsx b/packages/design/src/FormManager/FormDelete/FormDelete.stories.tsx index fa572a9e..64b390ba 100644 --- a/packages/design/src/FormManager/FormDelete/FormDelete.stories.tsx +++ b/packages/design/src/FormManager/FormDelete/FormDelete.stories.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import type { Meta, StoryObj } from '@storybook/react'; -import { createTestBrowserFormService } from '@gsa-tts/forms-core/context'; +import { createTestBrowserFormService } from '@flexion/forms-core/context'; import { createPatternTestForm } from '../../test-form.js'; import FormDelete from './FormDelete.js'; diff --git a/packages/design/src/FormManager/FormDelete/FormDelete.tsx b/packages/design/src/FormManager/FormDelete/FormDelete.tsx index 8d072fbc..f71f70c6 100644 --- a/packages/design/src/FormManager/FormDelete/FormDelete.tsx +++ b/packages/design/src/FormManager/FormDelete/FormDelete.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import type { Blueprint, FormService } from '@gsa-tts/forms-core'; +import type { Blueprint, FormService } from '@flexion/forms-core'; export default function FormDelete({ formId, diff --git a/packages/design/src/FormManager/FormDocumentImport/DocumentImporter/DocumentImporter.tsx b/packages/design/src/FormManager/FormDocumentImport/DocumentImporter/DocumentImporter.tsx index 1164170b..50743830 100644 --- a/packages/design/src/FormManager/FormDocumentImport/DocumentImporter/DocumentImporter.tsx +++ b/packages/design/src/FormManager/FormDocumentImport/DocumentImporter/DocumentImporter.tsx @@ -8,7 +8,7 @@ import { addDocument, addDocumentFieldsToForm, createFormSession, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import Form from '../../../Form/Form.js'; import { type FormUIContext } from '../../../Form/types.js'; diff --git a/packages/design/src/FormManager/FormDocumentImport/FormDocumentImport.tsx b/packages/design/src/FormManager/FormDocumentImport/FormDocumentImport.tsx index f1d870fb..a4f4510f 100644 --- a/packages/design/src/FormManager/FormDocumentImport/FormDocumentImport.tsx +++ b/packages/design/src/FormManager/FormDocumentImport/FormDocumentImport.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; -import { Blueprint, type FormService } from '@gsa-tts/forms-core'; +import { Blueprint, type FormService } from '@flexion/forms-core'; import { type FormUIContext } from '../../Form/types.js'; import DocumentImporter from './DocumentImporter/DocumentImporter.js'; diff --git a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx index 7c1f3805..591481b2 100644 --- a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx +++ b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect } from 'react'; -import { defaultFormConfig, type PatternConfig } from '@gsa-tts/forms-core'; +import { defaultFormConfig, type PatternConfig } from '@flexion/forms-core'; import { useFormManagerStore } from '../store.js'; import styles from './formEditStyles.module.css'; import blockIcon from './images/block-icon.svg'; @@ -11,7 +11,7 @@ import multipleChoiceIcon from './images/radio-options-icon.svg'; import templateIcon from './images/template-icon.svg'; import classNames from 'classnames'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; // eslint-disable-next-line @typescript-eslint/no-explicit-any const icons: Record = { diff --git a/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.stories.tsx index 6a9bad7a..dc925733 100644 --- a/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.stories.tsx @@ -1,10 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type AccordionRowPattern } from '@gsa-tts/forms-core'; +import { type AccordionRowPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.tsx index 615fdadd..d0947e9d 100644 --- a/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AccordionRowPatternEdit/AccordionRowPatternEdit.tsx @@ -4,7 +4,7 @@ import classNames from 'classnames'; import type { AccordionRowProps, AccordionRowPattern, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import AccordionRow from '../../../../Form/components/AccordionRow/AccordionRow.js'; import { PatternEditComponent } from '../../types.js'; @@ -12,7 +12,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const AccordionRowPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.stories.tsx index c6ee179c..6cb761d1 100644 --- a/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type AddressPattern } from '@gsa-tts/forms-core'; +import { type AddressPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: AddressPattern = { id: 'address-1', diff --git a/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.tsx index a9348b34..81733478 100644 --- a/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AddressPatternEdit/AddressPatternEdit.tsx @@ -1,8 +1,8 @@ import React from 'react'; import classNames from 'classnames'; -import { type AddressComponentProps } from '@gsa-tts/forms-core'; -import { type AddressPattern } from '@gsa-tts/forms-core'; +import { type AddressComponentProps } from '@flexion/forms-core'; +import { type AddressPattern } from '@flexion/forms-core'; import Address from '../../../../Form/components/Address/Address.js'; import { PatternEditComponent } from '../../types.js'; @@ -10,7 +10,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const AddressPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.stories.tsx index 1ee458e2..88859278 100644 --- a/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type AttachmentPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type AttachmentPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta, diff --git a/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.tsx index 014e11cd..79a891aa 100644 --- a/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/AttachmentPatternEdit/AttachmentPatternEdit.tsx @@ -1,14 +1,14 @@ import classNames from 'classnames'; import React from 'react'; -import { PatternId, AttachmentProps } from '@gsa-tts/forms-core'; -import { AttachmentPattern } from '@gsa-tts/forms-core'; +import { PatternId, AttachmentProps } from '@flexion/forms-core'; +import { AttachmentPattern } from '@flexion/forms-core'; import Attachment from '../../../../Form/components/Attachment/Attachment.js'; import { useFormManagerStore } from '../../../store.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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from './attachmentPatternEditStyles.module.css'; const AttachmentPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.stories.tsx index b179b920..06a3fa23 100644 --- a/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.stories.tsx @@ -1,11 +1,11 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type CheckboxGroupPattern } from '@gsa-tts/forms-core'; +import { type CheckboxGroupPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; import CheckboxGroupPatternEdit from './CheckboxGroupPatternEdit.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.tsx index 03d4db16..23fcf93d 100644 --- a/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/CheckboxGroupPatternEdit/CheckboxGroupPatternEdit.tsx @@ -4,8 +4,8 @@ import React from 'react'; import { UniqueIdentifier } from '@dnd-kit/core'; import { DraggableList } from '../DraggableList/DraggableList.js'; -import { type CheckboxGroupProps } from '@gsa-tts/forms-core'; -import { type CheckboxGroupPattern } from '@gsa-tts/forms-core'; +import { type CheckboxGroupProps } from '@flexion/forms-core'; +import { type CheckboxGroupPattern } from '@flexion/forms-core'; import CheckboxGroup from '../../../../Form/components/CheckboxGroup/CheckboxGroup.js'; import { PatternEditComponent } from '../../types.js'; @@ -17,7 +17,7 @@ import { createPatternOptionsWithContext, usePatternEditFormContext, } from '../common/hooks.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const CheckboxGroupPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.stories.tsx index dcddd948..052ae85b 100644 --- a/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type CheckboxPattern } from '@gsa-tts/forms-core'; +import { type CheckboxPattern } from '@flexion/forms-core'; import CheckboxPatternEdit from './CheckboxPatternEdit.js'; import { @@ -9,7 +9,7 @@ import { testUpdateFormFieldOnSubmit, } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.tsx index 8039d6e9..1166a89f 100644 --- a/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/CheckboxPatternEdit/CheckboxPatternEdit.tsx @@ -1,9 +1,9 @@ import classnames from 'classnames'; import React from 'react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type CheckboxProps } from '@gsa-tts/forms-core'; -import { type CheckboxPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type CheckboxProps } from '@flexion/forms-core'; +import { type CheckboxPattern } from '@flexion/forms-core'; import Checkbox from '../../../../Form/components/Checkbox/Checkbox.js'; import { PatternEditComponent } from '../../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.stories.tsx index efd7726e..faeb66e8 100644 --- a/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type DateOfBirthPattern } from '@gsa-tts/forms-core'; +import { type DateOfBirthPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: DateOfBirthPattern = { id: 'date-of-birth-1', diff --git a/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.tsx index 72168ac9..4260447a 100644 --- a/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/DatePatternEdit/DatePatternEdit.tsx @@ -1,9 +1,9 @@ import classNames from 'classnames'; import React from 'react'; -import { type DateProps } from '@gsa-tts/forms-core'; -import { type DateOfBirthPattern } from '@gsa-tts/forms-core'; -import { type DatePickerPattern } from '@gsa-tts/forms-core'; +import { type DateProps } from '@flexion/forms-core'; +import { type DateOfBirthPattern } from '@flexion/forms-core'; +import { type DatePickerPattern } from '@flexion/forms-core'; import Date from '../../../../Form/components/Date/Date.js'; import { PatternEditComponent } from '../../types.js'; @@ -11,7 +11,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const DatePatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/DraggableList/DraggableList.stories.tsx b/packages/design/src/FormManager/FormEdit/components/DraggableList/DraggableList.stories.tsx index 64ed1242..01e7f6be 100644 --- a/packages/design/src/FormManager/FormEdit/components/DraggableList/DraggableList.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/DraggableList/DraggableList.stories.tsx @@ -14,7 +14,7 @@ import { DraggableListProps, DraggableListPresentation, } from './DraggableList.js'; -import { getPattern } from '@gsa-tts/forms-core'; +import { getPattern } from '@flexion/forms-core'; const meta: Meta = { title: 'patterns/DraggableList', diff --git a/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.stories.tsx index 3e3cfbeb..0a5364e4 100644 --- a/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type EmailInputPattern } from '@gsa-tts/forms-core'; +import { type EmailInputPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: EmailInputPattern = { id: 'email-input-1', diff --git a/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.tsx index c8f0b9c3..47e82558 100644 --- a/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/EmailInputPatternEdit/EmailInputPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type EmailInputProps } from '@gsa-tts/forms-core'; -import { type EmailInputPattern } from '@gsa-tts/forms-core'; +import { type EmailInputProps } from '@flexion/forms-core'; +import { type EmailInputPattern } from '@flexion/forms-core'; import EmailInput from '../../../../Form/components/EmailInput/EmailInput.js'; import { PatternEditComponent } from '../../types.js'; @@ -10,7 +10,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const EmailInputEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.stories.tsx index c6532d75..9f492492 100644 --- a/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.stories.tsx @@ -2,8 +2,8 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type FieldsetPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type FieldsetPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta, diff --git a/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.tsx b/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.tsx index 09d82a27..a2b0eb64 100644 --- a/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/FieldsetEdit/FieldsetEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type PatternId, type FieldsetProps } from '@gsa-tts/forms-core'; -import { FieldsetPattern } from '@gsa-tts/forms-core'; +import { type PatternId, type FieldsetProps } from '@flexion/forms-core'; +import { FieldsetPattern } from '@flexion/forms-core'; import { CompoundAddPatternButton, @@ -15,7 +15,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; import { type FormManagerContext } from '../../../types.js'; import { type PatternComponent } from '../../../../Form/types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/FormSummaryEdit.tsx b/packages/design/src/FormManager/FormEdit/components/FormSummaryEdit.tsx index 65b7adea..921a0fc0 100644 --- a/packages/design/src/FormManager/FormEdit/components/FormSummaryEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/FormSummaryEdit.tsx @@ -1,9 +1,9 @@ import classNames from 'classnames'; import React from 'react'; -import { type FormSummaryProps } from '@gsa-tts/forms-core'; -import { type Pattern } from '@gsa-tts/forms-core'; -import { type FormSummaryPattern } from '@gsa-tts/forms-core'; +import { type FormSummaryProps } from '@flexion/forms-core'; +import { type Pattern } from '@flexion/forms-core'; +import { type FormSummaryPattern } from '@flexion/forms-core'; import FormSummary from '../../../Form/components/FormSummary/FormSummary.js'; import { PatternEditComponent } from '../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.stories.tsx index e1fad3ae..ef8b3a7a 100644 --- a/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { userEvent, expect } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type GenderIdPattern } from '@gsa-tts/forms-core'; +import { type GenderIdPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: GenderIdPattern = { id: 'gender-identity-1', diff --git a/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.tsx index 5ff8fde0..33dbeea9 100644 --- a/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/GenderIdPatternEdit/GenderIdPatternEdit.tsx @@ -1,8 +1,8 @@ import classnames from 'classnames'; import React from 'react'; -import { type GenderIdProps } from '@gsa-tts/forms-core'; -import { type GenderIdPattern } from '@gsa-tts/forms-core'; +import { type GenderIdProps } from '@flexion/forms-core'; +import { type GenderIdPattern } from '@flexion/forms-core'; import GenderId from '../../../../Form/components/GenderId/GenderId.js'; import { PatternEditComponent } from '../../types.js'; @@ -10,7 +10,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const GenderIdPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.stories.tsx index d5d2dc53..6aec50bd 100644 --- a/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type InputPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type InputPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta, diff --git a/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.tsx index 0af349e5..3b398200 100644 --- a/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/InputPatternEdit/InputPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { PatternId, TextInputProps } from '@gsa-tts/forms-core'; -import { InputPattern } from '@gsa-tts/forms-core'; +import { PatternId, TextInputProps } from '@flexion/forms-core'; +import { InputPattern } from '@flexion/forms-core'; import TextInput from '../../../../Form/components/TextInput/TextInput.js'; import { useFormManagerStore } from '../../../store.js'; @@ -11,7 +11,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const InputPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.stories.tsx index 632415d7..cfcdb1b1 100644 --- a/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { userEvent, expect } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type NamePattern } from '@gsa-tts/forms-core'; +import { type NamePattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: NamePattern = { id: 'name-1', diff --git a/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.tsx index c0515de4..68be7e0e 100644 --- a/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/NamePatternEdit/NamePatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type NameProps } from '@gsa-tts/forms-core'; -import { type NamePattern } from '@gsa-tts/forms-core'; +import { type NameProps } from '@flexion/forms-core'; +import { type NamePattern } from '@flexion/forms-core'; import { PatternEditComponent } from '../../types.js'; import Name from '../../../../Form/components/Name/Name.js'; @@ -10,7 +10,7 @@ import Name from '../../../../Form/components/Name/Name.js'; import { PatternEditActions } from '../common/PatternEditActions.js'; import { PatternEditForm } from '../common/PatternEditForm.js'; import { usePatternEditFormContext } from '../common/hooks.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const NamePatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/PackageDownloadPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/PackageDownloadPatternEdit.tsx index 3a1a0aab..616ee655 100644 --- a/packages/design/src/FormManager/FormEdit/components/PackageDownloadPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PackageDownloadPatternEdit.tsx @@ -1,12 +1,12 @@ import classnames from 'classnames'; import React from 'react'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { type PackageDownloadPattern, type PackageDownloadProps, type PatternId, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import PackageDownload from '../../../Form/components/PackageDownload/PackageDownload.js'; import { PatternEditComponent } from '../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/PageEdit.tsx b/packages/design/src/FormManager/FormEdit/components/PageEdit.tsx index 5a560016..0506a949 100644 --- a/packages/design/src/FormManager/FormEdit/components/PageEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PageEdit.tsx @@ -1,9 +1,9 @@ import classnames from 'classnames'; import React from 'react'; -import { PageProps } from '@gsa-tts/forms-core'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { PagePattern } from '@gsa-tts/forms-core'; +import { PageProps } from '@flexion/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { PagePattern } from '@flexion/forms-core'; import { useRouteParams } from '../../hooks.js'; import { PatternEditComponent } from '../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/PageSetEdit/PageSetEdit.tsx b/packages/design/src/FormManager/FormEdit/components/PageSetEdit/PageSetEdit.tsx index fec08256..26586df2 100644 --- a/packages/design/src/FormManager/FormEdit/components/PageSetEdit/PageSetEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PageSetEdit/PageSetEdit.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { getPattern, type PageSetProps } from '@gsa-tts/forms-core'; +import { getPattern, type PageSetProps } from '@flexion/forms-core'; import { PatternEditComponent } from '../../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.stories.tsx index fa8bf764..b3b5cfad 100644 --- a/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type ParagraphPattern } from '@gsa-tts/forms-core'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { type ParagraphPattern } from '@flexion/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.tsx index db73251d..9f591dd0 100644 --- a/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/ParagraphPatternEdit/ParagraphPatternEdit.tsx @@ -1,9 +1,9 @@ import classnames from 'classnames'; import React from 'react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { PatternId, type ParagraphProps } from '@gsa-tts/forms-core'; -import { type ParagraphPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { PatternId, type ParagraphProps } from '@flexion/forms-core'; +import { type ParagraphPattern } from '@flexion/forms-core'; import Paragraph from '../../../../Form/components/Paragraph/Paragraph.js'; import { PatternEditComponent } from '../../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.stories.tsx index 59156938..012b0d90 100644 --- a/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type PhoneNumberPattern } from '@gsa-tts/forms-core'; +import { type PhoneNumberPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: PhoneNumberPattern = { id: 'phone-number-1', diff --git a/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.tsx index 85ed5423..7d3a4e82 100644 --- a/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PhoneNumberPatternEdit/PhoneNumberPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type PhoneNumberProps } from '@gsa-tts/forms-core'; -import { type PhoneNumberPattern } from '@gsa-tts/forms-core'; +import { type PhoneNumberProps } from '@flexion/forms-core'; +import { type PhoneNumberPattern } from '@flexion/forms-core'; import PhoneNumber from '../../../../Form/components/PhoneNumber/PhoneNumber.js'; import { PatternEditComponent } from '../../types.js'; @@ -10,7 +10,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const PhoneNumberPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/PreviewSequencePattern/PreviewSequencePattern.tsx b/packages/design/src/FormManager/FormEdit/components/PreviewSequencePattern/PreviewSequencePattern.tsx index bba4388f..514c5ef3 100644 --- a/packages/design/src/FormManager/FormEdit/components/PreviewSequencePattern/PreviewSequencePattern.tsx +++ b/packages/design/src/FormManager/FormEdit/components/PreviewSequencePattern/PreviewSequencePattern.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { type SequenceProps, getPattern } from '@gsa-tts/forms-core'; +import { type SequenceProps, getPattern } from '@flexion/forms-core'; import { DraggableList } from '../DraggableList/DraggableList.js'; import { useFormManagerStore } from '../../../store.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.stories.tsx index 751def80..c88545d9 100644 --- a/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.stories.tsx @@ -1,11 +1,11 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type RadioGroupPattern } from '@gsa-tts/forms-core'; +import { type RadioGroupPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; import CheckboxPatternEdit from '../CheckboxPatternEdit/CheckboxPatternEdit.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.tsx index 25594f45..932ac881 100644 --- a/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RadioGroupPatternEdit/RadioGroupPatternEdit.tsx @@ -3,8 +3,8 @@ import React from 'react'; import { UniqueIdentifier } from '@dnd-kit/core'; import { DraggableList } from '../DraggableList/DraggableList.js'; -import { type RadioGroupProps } from '@gsa-tts/forms-core'; -import { type RadioGroupPattern } from '@gsa-tts/forms-core'; +import { type RadioGroupProps } from '@flexion/forms-core'; +import { type RadioGroupPattern } from '@flexion/forms-core'; import RadioGroup from '../../../../Form/components/RadioGroup/RadioGroup.js'; import { PatternEditComponent } from '../../types.js'; @@ -16,7 +16,7 @@ import { createPatternOptionsWithContext, usePatternEditFormContext, } from '../common/hooks.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const RadioGroupPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.stories.tsx index 7088899d..19693e17 100644 --- a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.stories.tsx @@ -2,8 +2,8 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type RepeaterPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type RepeaterPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta, diff --git a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.tsx index 617b3dab..9f400d15 100644 --- a/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RepeaterPatternEdit/RepeaterPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type PatternId, type RepeaterProps } from '@gsa-tts/forms-core'; -import { RepeaterPattern } from '@gsa-tts/forms-core'; +import { type PatternId, type RepeaterProps } from '@flexion/forms-core'; +import { RepeaterPattern } from '@flexion/forms-core'; import { CompoundAddPatternButton, @@ -17,7 +17,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; import { renderEditPromptComponents } from '../../../manager-common.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.stories.tsx index dbfc545d..ac3bd608 100644 --- a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type RichTextPattern } from '@gsa-tts/forms-core'; +import { type RichTextPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx index 3d41de3a..3ad41560 100644 --- a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx @@ -10,7 +10,7 @@ import { type PatternMap, type RichTextPattern, type RichTextProps, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import RichText from '../../../../Form/components/RichText/RichText.js'; import { PatternEditActions } from '../common/PatternEditActions.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.stories.tsx index 02527f40..6f4c07ff 100644 --- a/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.stories.tsx @@ -1,10 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type SelectDropdownPattern } from '@gsa-tts/forms-core'; +import { type SelectDropdownPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.tsx index 014ed67b..4b6ad73d 100644 --- a/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SelectDropdownPatternEdit/SelectDropdownPatternEdit.tsx @@ -4,8 +4,8 @@ import React from 'react'; import { UniqueIdentifier } from '@dnd-kit/core'; import { DraggableList } from '../DraggableList/DraggableList.js'; -import { type SelectDropdownProps } from '@gsa-tts/forms-core'; -import { type SelectDropdownPattern } from '@gsa-tts/forms-core'; +import { type SelectDropdownProps } from '@flexion/forms-core'; +import { type SelectDropdownPattern } from '@flexion/forms-core'; import SelectDropdown from '../../../../Form/components/SelectDropdown/SelectDropdown.js'; import { PatternEditComponent } from '../../types.js'; @@ -17,7 +17,7 @@ import { usePatternEditFormContext, createPatternOptionsWithContext, } from '../common/hooks.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const SelectDropdownPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.stories.tsx index 41b76a5e..e726b60d 100644 --- a/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.stories.tsx @@ -1,10 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { type SexPattern } from '@gsa-tts/forms-core'; +import { type SexPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; diff --git a/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.tsx index 47760c55..9e859792 100644 --- a/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SexPatternEdit/SexPatternEdit.tsx @@ -1,7 +1,7 @@ import classNames from 'classnames'; import React from 'react'; -import { type SexProps, type SexPattern } from '@gsa-tts/forms-core'; +import { type SexProps, type SexPattern } from '@flexion/forms-core'; import Sex from '../../../../Form/components/Sex/Sex.js'; import { PatternEditComponent } from '../../types.js'; @@ -9,7 +9,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const SexPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.stories.tsx index 79d5d870..e1f25c6d 100644 --- a/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.stories.tsx @@ -2,10 +2,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import { expect, userEvent } from '@storybook/test'; import { within } from '@testing-library/react'; -import { type SocialSecurityNumberPattern } from '@gsa-tts/forms-core'; +import { type SocialSecurityNumberPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta } from '../common/story-helper.js'; import FormEdit from '../../index.js'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; const pattern: SocialSecurityNumberPattern = { id: 'social-security-number-1', diff --git a/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.tsx index fbfbfe09..c8f805c3 100644 --- a/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SocialSecurityNumberPatternEdit/SocialSecurityNumberPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { type SocialSecurityNumberProps } from '@gsa-tts/forms-core'; -import { type SocialSecurityNumberPattern } from '@gsa-tts/forms-core'; +import { type SocialSecurityNumberProps } from '@flexion/forms-core'; +import { type SocialSecurityNumberPattern } from '@flexion/forms-core'; import SocialSecurityNumber from '../../../../Form/components/SocialSecurityNumber/SocialSecurityNumber.js'; import { PatternEditComponent } from '../../types.js'; @@ -10,7 +10,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const SocialSecurityNumberPatternEdit: PatternEditComponent< diff --git a/packages/design/src/FormManager/FormEdit/components/SubmissionConfirmationEdit.tsx b/packages/design/src/FormManager/FormEdit/components/SubmissionConfirmationEdit.tsx index d330312e..df3701f3 100644 --- a/packages/design/src/FormManager/FormEdit/components/SubmissionConfirmationEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/SubmissionConfirmationEdit.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { type PatternId, SubmissionConfirmationProps, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import SubmissionConfirmation from '../../../Form/components/SubmissionConfirmation/SubmissionConfirmation.js'; import { PatternEditComponent } from '../types.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/SocialSecurityNumberPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/SocialSecurityNumberPatternEdit.tsx index 0d67b4e2..c09accaa 100644 --- a/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/SocialSecurityNumberPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/SocialSecurityNumberPatternEdit.tsx @@ -1,8 +1,8 @@ import classNames from 'classnames'; import React from 'react'; -import { PatternId, TextAreaProps } from '@gsa-tts/forms-core'; -import { TextAreaPattern } from '@gsa-tts/forms-core'; +import { PatternId, TextAreaProps } from '@flexion/forms-core'; +import { TextAreaPattern } from '@flexion/forms-core'; import TextArea from '../../../../Form/components/TextArea/TextArea.js'; import { useFormManagerStore } from '../../../store.js'; @@ -11,7 +11,7 @@ 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 '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import styles from '../../formEditStyles.module.css'; const TextAreaPatternEdit: PatternEditComponent = ({ diff --git a/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/TextAreaPattermEdit.stories.tsx b/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/TextAreaPattermEdit.stories.tsx index 43d4c955..7bcfa1fe 100644 --- a/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/TextAreaPattermEdit.stories.tsx +++ b/packages/design/src/FormManager/FormEdit/components/TextAreaPatternEdit/TextAreaPattermEdit.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { enLocale as message } from '@gsa-tts/forms-common'; -import { type TextAreaPattern } from '@gsa-tts/forms-core'; +import { enLocale as message } from '@flexion/forms-common'; +import { type TextAreaPattern } from '@flexion/forms-core'; import { createPatternEditStoryMeta, diff --git a/packages/design/src/FormManager/FormEdit/components/common/MovePatternDropdown.tsx b/packages/design/src/FormManager/FormEdit/components/common/MovePatternDropdown.tsx index e16127fc..c152af8b 100644 --- a/packages/design/src/FormManager/FormEdit/components/common/MovePatternDropdown.tsx +++ b/packages/design/src/FormManager/FormEdit/components/common/MovePatternDropdown.tsx @@ -1,7 +1,7 @@ import React, { useState, useRef, useEffect } from 'react'; import { useFormManagerStore } from '../../../store.js'; import styles from '../../formEditStyles.module.css'; -import type { Pattern } from '@gsa-tts/forms-core'; +import type { Pattern } from '@flexion/forms-core'; interface MovePatternDropdownProps { isCompound: boolean; diff --git a/packages/design/src/FormManager/FormEdit/components/common/PatternEditActions.tsx b/packages/design/src/FormManager/FormEdit/components/common/PatternEditActions.tsx index e24ab46b..5cec364a 100644 --- a/packages/design/src/FormManager/FormEdit/components/common/PatternEditActions.tsx +++ b/packages/design/src/FormManager/FormEdit/components/common/PatternEditActions.tsx @@ -4,7 +4,7 @@ import classNames from 'classnames'; import { useFormManagerStore } from '../../../store.js'; import MovePatternDropdown from './MovePatternDropdown.js'; import styles from '../../formEditStyles.module.css'; -import type { Pattern } from '@gsa-tts/forms-core'; +import type { Pattern } from '@flexion/forms-core'; type PatternEditActionsProps = PropsWithChildren<{ children?: ReactElement; diff --git a/packages/design/src/FormManager/FormEdit/components/common/PatternEditForm.tsx b/packages/design/src/FormManager/FormEdit/components/common/PatternEditForm.tsx index 16467c21..2618eadf 100644 --- a/packages/design/src/FormManager/FormEdit/components/common/PatternEditForm.tsx +++ b/packages/design/src/FormManager/FormEdit/components/common/PatternEditForm.tsx @@ -5,7 +5,7 @@ import { type FormError, type Pattern, type PatternMap, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { useFormManagerStore } from '../../../store.js'; diff --git a/packages/design/src/FormManager/FormEdit/components/common/hooks.ts b/packages/design/src/FormManager/FormEdit/components/common/hooks.ts index 43cbb8d0..6e932a6a 100644 --- a/packages/design/src/FormManager/FormEdit/components/common/hooks.ts +++ b/packages/design/src/FormManager/FormEdit/components/common/hooks.ts @@ -6,7 +6,7 @@ import { type PatternId, type PatternMap, type PatternValue, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; export type Option = { id: string; diff --git a/packages/design/src/FormManager/FormEdit/components/common/story-helper.tsx b/packages/design/src/FormManager/FormEdit/components/common/story-helper.tsx index ad30aa0a..d1d727fd 100644 --- a/packages/design/src/FormManager/FormEdit/components/common/story-helper.tsx +++ b/packages/design/src/FormManager/FormEdit/components/common/story-helper.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { type Decorator, type Meta } from '@storybook/react'; -import { type Blueprint, type Pattern } from '@gsa-tts/forms-core'; +import { type Blueprint, type Pattern } from '@flexion/forms-core'; import { createPatternTestForm, diff --git a/packages/design/src/FormManager/FormEdit/store.ts b/packages/design/src/FormManager/FormEdit/store.ts index 629599db..a8730cfe 100644 --- a/packages/design/src/FormManager/FormEdit/store.ts +++ b/packages/design/src/FormManager/FormEdit/store.ts @@ -9,14 +9,14 @@ import { getPattern, getSessionPage, mergeSession, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { type FormManagerContext } from '../types.js'; import { type PatternFocus } from './types.js'; import { type NotificationSlice, createNotificationsSlice, } from '../Notifications/index.js'; -import { getRouteDataFromQueryString } from '@gsa-tts/forms-core'; +import { getRouteDataFromQueryString } from '@flexion/forms-core'; export type FormEditSlice = { context: FormManagerContext; diff --git a/packages/design/src/FormManager/FormEdit/types.ts b/packages/design/src/FormManager/FormEdit/types.ts index 3406d21d..2e23c51f 100644 --- a/packages/design/src/FormManager/FormEdit/types.ts +++ b/packages/design/src/FormManager/FormEdit/types.ts @@ -5,7 +5,7 @@ import { type Pattern, type PatternProps, type PromptComponent, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { FormManagerContext } from '../types.js'; export type PatternFocus = { diff --git a/packages/design/src/FormManager/FormList/CreateNew/CreateNew.tsx b/packages/design/src/FormManager/FormList/CreateNew/CreateNew.tsx index 53f1a3bb..5fb56885 100644 --- a/packages/design/src/FormManager/FormList/CreateNew/CreateNew.tsx +++ b/packages/design/src/FormManager/FormList/CreateNew/CreateNew.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useNavigate } from 'react-router-dom'; -import { SAMPLE_DOCUMENTS } from '@gsa-tts/forms-core'; +import { SAMPLE_DOCUMENTS } from '@flexion/forms-core'; import { useFormManagerStore } from '../../store.js'; import { onFileInputChangeGetFile } from './file-input.js'; diff --git a/packages/design/src/FormManager/FormList/FormList.stories.tsx b/packages/design/src/FormManager/FormList/FormList.stories.tsx index fbbe7416..b325324d 100644 --- a/packages/design/src/FormManager/FormList/FormList.stories.tsx +++ b/packages/design/src/FormManager/FormList/FormList.stories.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import type { Meta, StoryObj } from '@storybook/react'; -import { createTestBrowserFormService } from '@gsa-tts/forms-core/context'; +import { createTestBrowserFormService } from '@flexion/forms-core/context'; import FormList from './FormList.js'; import { diff --git a/packages/design/src/FormManager/FormList/store.ts b/packages/design/src/FormManager/FormList/store.ts index 85b5e198..12c66dfd 100644 --- a/packages/design/src/FormManager/FormList/store.ts +++ b/packages/design/src/FormManager/FormList/store.ts @@ -1,8 +1,8 @@ import { type StateCreator } from 'zustand'; -import { BlueprintBuilder, uint8ArrayToBase64 } from '@gsa-tts/forms-core'; +import { BlueprintBuilder, uint8ArrayToBase64 } from '@flexion/forms-core'; import { type FormManagerContext } from '../types.js'; -import { type Result, failure } from '@gsa-tts/forms-common'; +import { type Result, failure } from '@flexion/forms-common'; type StoreContext = { context: FormManagerContext; diff --git a/packages/design/src/FormManager/FormManager.tsx b/packages/design/src/FormManager/FormManager.tsx index bb4b4b47..72dce65a 100644 --- a/packages/design/src/FormManager/FormManager.tsx +++ b/packages/design/src/FormManager/FormManager.tsx @@ -13,7 +13,7 @@ import { defaultFormConfig, Blueprint, type FormService, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { type FormManagerProps, type FormManagerContext } from './types.js'; import FormDelete from './FormDelete/FormDelete.js'; diff --git a/packages/design/src/FormManager/FormPreview/FormPreview.tsx b/packages/design/src/FormManager/FormPreview/FormPreview.tsx index 61a477e8..94c3835b 100644 --- a/packages/design/src/FormManager/FormPreview/FormPreview.tsx +++ b/packages/design/src/FormManager/FormPreview/FormPreview.tsx @@ -1,6 +1,6 @@ import React, { useEffect } from 'react'; -import { mergeSession } from '@gsa-tts/forms-core'; +import { mergeSession } from '@flexion/forms-core'; import Form from '../../Form/Form.js'; import { useRouteParams } from '../hooks.js'; diff --git a/packages/design/src/FormManager/hooks.ts b/packages/design/src/FormManager/hooks.ts index f276e675..34bae99b 100644 --- a/packages/design/src/FormManager/hooks.ts +++ b/packages/design/src/FormManager/hooks.ts @@ -3,7 +3,7 @@ import { useLocation } from 'react-router-dom'; import { type RouteData, getRouteDataFromQueryString, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; export const useRouteParams = (): { routeParams: RouteData; diff --git a/packages/design/src/FormManager/manager-common.tsx b/packages/design/src/FormManager/manager-common.tsx index d1119edd..70a28b0c 100644 --- a/packages/design/src/FormManager/manager-common.tsx +++ b/packages/design/src/FormManager/manager-common.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import type { PromptComponent } from '@gsa-tts/forms-core'; +import type { PromptComponent } from '@flexion/forms-core'; import type { FormUIContext } from '../Form/types.js'; import { PreviewPattern } from './FormEdit/PreviewPattern.js'; diff --git a/packages/design/src/FormManager/store.tsx b/packages/design/src/FormManager/store.tsx index 998445b4..01f85e37 100644 --- a/packages/design/src/FormManager/store.tsx +++ b/packages/design/src/FormManager/store.tsx @@ -7,8 +7,8 @@ import { } from 'zustand'; import { createContext } from 'zustand-utils'; -import { type Result, failure } from '@gsa-tts/forms-common'; -import { type FormSession, type Blueprint } from '@gsa-tts/forms-core'; +import { type Result, failure } from '@flexion/forms-common'; +import { type FormSession, type Blueprint } from '@flexion/forms-core'; import { type FormListSlice, createFormListSlice } from './FormList/store.js'; import { type FormEditSlice, createFormEditSlice } from './FormEdit/store.js'; diff --git a/packages/design/src/FormManager/types.ts b/packages/design/src/FormManager/types.ts index 3a0507f0..460b6261 100644 --- a/packages/design/src/FormManager/types.ts +++ b/packages/design/src/FormManager/types.ts @@ -1,4 +1,4 @@ -import { type FormConfig, type FormService } from '@gsa-tts/forms-core'; +import { type FormConfig, type FormService } from '@flexion/forms-core'; import { type ComponentForPattern } from '../Form/types.js'; import { type EditComponentForPattern } from './FormEdit/types.js'; import { UrlForForm, UrlForFormManager } from '../AvailableFormList/index.js'; diff --git a/packages/design/src/experiments/document-assembler.tsx b/packages/design/src/experiments/document-assembler.tsx index 53d9fc64..55118680 100644 --- a/packages/design/src/experiments/document-assembler.tsx +++ b/packages/design/src/experiments/document-assembler.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; -import { generateDummyPDF } from '@gsa-tts/forms-core'; +import { generateDummyPDF } from '@flexion/forms-core'; export const downloadPdfBytes = (bytes: Uint8Array) => { const base64 = btoa(String.fromCharCode(...bytes)); diff --git a/packages/design/src/test-form.ts b/packages/design/src/test-form.ts index fef1b80f..d37b3e34 100644 --- a/packages/design/src/test-form.ts +++ b/packages/design/src/test-form.ts @@ -4,14 +4,14 @@ import { defaultFormConfig, type Blueprint, type Pattern, -} from '@gsa-tts/forms-core'; -import { createTestBrowserFormService } from '@gsa-tts/forms-core/context'; -import { type InputPattern } from '@gsa-tts/forms-core'; -import { type PagePattern } from '@gsa-tts/forms-core'; -import { type PageSetPattern } from '@gsa-tts/forms-core'; -import { type SequencePattern } from '@gsa-tts/forms-core'; - -import { type FormSummaryPattern } from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; +import { createTestBrowserFormService } from '@flexion/forms-core/context'; +import { type InputPattern } from '@flexion/forms-core'; +import { type PagePattern } from '@flexion/forms-core'; +import { type PageSetPattern } from '@flexion/forms-core'; +import { type SequencePattern } from '@flexion/forms-core'; + +import { type FormSummaryPattern } from '@flexion/forms-core'; import { type FormUIContext } from './Form/types.js'; import { defaultPatternComponents } from './Form/components/index.js'; import { defaultPatternEditComponents } from './FormManager/FormEdit/components/index.js'; diff --git a/packages/forms/README.md b/packages/forms/README.md index a00dab18..5482575f 100644 --- a/packages/forms/README.md +++ b/packages/forms/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-core +# @flexion/forms-core This library includes all of the core business logic of Forms Platform. diff --git a/packages/forms/package.json b/packages/forms/package.json index f3acfba1..61588205 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-core", + "name": "@flexion/forms-core", "version": "0.1.2", "description": "10x Forms Platform form handling", "type": "module", @@ -26,8 +26,8 @@ "test": "vitest run --coverage" }, "dependencies": { - "@gsa-tts/forms-common": "workspace:*", - "@gsa-tts/forms-database": "workspace:*", + "@flexion/forms-common": "workspace:*", + "@flexion/forms-database": "workspace:*", "pdf-lib": "^1.17.1", "qs": "^6.13.0", "set-value": "^4.1.0", diff --git a/packages/forms/src/builder/index.ts b/packages/forms/src/builder/index.ts index 26db7aaf..201db56a 100644 --- a/packages/forms/src/builder/index.ts +++ b/packages/forms/src/builder/index.ts @@ -1,4 +1,4 @@ -import { type VoidResult } from '@gsa-tts/forms-common'; +import { type VoidResult } from '@flexion/forms-common'; import { addPageToPageSet, addPatternToFieldset, diff --git a/packages/forms/src/builder/parse-form.test.ts b/packages/forms/src/builder/parse-form.test.ts index 409fb762..6748256a 100644 --- a/packages/forms/src/builder/parse-form.test.ts +++ b/packages/forms/src/builder/parse-form.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { failure, success } from '@gsa-tts/forms-common'; +import { failure, success } from '@flexion/forms-common'; import { parseForm, parseFormString } from './parse-form'; import { defaultFormConfig, type InputPattern } from '../patterns'; diff --git a/packages/forms/src/builder/parse-form.ts b/packages/forms/src/builder/parse-form.ts index dab74f2f..df0c497a 100644 --- a/packages/forms/src/builder/parse-form.ts +++ b/packages/forms/src/builder/parse-form.ts @@ -1,6 +1,6 @@ import * as z from 'zod'; -import { failure, success, type Result } from '@gsa-tts/forms-common'; +import { failure, success, type Result } from '@flexion/forms-common'; import type { FormConfig } from '../pattern'; import type { Blueprint } from '../types'; diff --git a/packages/forms/src/context/browser/form-repo.ts b/packages/forms/src/context/browser/form-repo.ts index 68c163b8..84fa8bef 100644 --- a/packages/forms/src/context/browser/form-repo.ts +++ b/packages/forms/src/context/browser/form-repo.ts @@ -3,7 +3,7 @@ import { type VoidResult, failure, success, -} from '@gsa-tts/forms-common'; +} from '@flexion/forms-common'; import { FormSession, diff --git a/packages/forms/src/context/browser/session-repo.ts b/packages/forms/src/context/browser/session-repo.ts index 2d33c120..e4cdbac1 100644 --- a/packages/forms/src/context/browser/session-repo.ts +++ b/packages/forms/src/context/browser/session-repo.ts @@ -1,4 +1,4 @@ -import { type Result, type VoidResult } from '@gsa-tts/forms-common'; +import { type Result, type VoidResult } from '@flexion/forms-common'; import { type FormSession } from '../../index.js'; /** diff --git a/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts b/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts index d0582b19..15b78228 100644 --- a/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts +++ b/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from 'vitest'; -import { Success } from '@gsa-tts/forms-common'; +import { Success } from '@flexion/forms-common'; import { type DocumentFieldMap } from '../index.js'; import { fillPDF } from '../pdf/index.js'; diff --git a/packages/forms/src/documents/__tests__/fill-pdf.test.ts b/packages/forms/src/documents/__tests__/fill-pdf.test.ts index fb349661..2bd596c2 100644 --- a/packages/forms/src/documents/__tests__/fill-pdf.test.ts +++ b/packages/forms/src/documents/__tests__/fill-pdf.test.ts @@ -1,6 +1,6 @@ import { beforeAll, describe, expect, it } from 'vitest'; -import { type Failure, type Success } from '@gsa-tts/forms-common'; +import { type Failure, type Success } from '@flexion/forms-common'; import { fillPDF } from '../index.js'; import { loadSamplePDF } from './sample-data.js'; diff --git a/packages/forms/src/documents/pdf/generate.ts b/packages/forms/src/documents/pdf/generate.ts index 4206508f..7597f350 100644 --- a/packages/forms/src/documents/pdf/generate.ts +++ b/packages/forms/src/documents/pdf/generate.ts @@ -5,7 +5,7 @@ import { type PDFForm, } from 'pdf-lib'; -import { Result } from '@gsa-tts/forms-common'; +import { Result } from '@flexion/forms-common'; import { type FormOutput } from '../../index.js'; import { type PDFFieldType } from './index.js'; diff --git a/packages/forms/src/pattern.ts b/packages/forms/src/pattern.ts index 11da11c0..319b909c 100644 --- a/packages/forms/src/pattern.ts +++ b/packages/forms/src/pattern.ts @@ -1,4 +1,4 @@ -import * as r from '@gsa-tts/forms-common'; +import * as r from '@flexion/forms-common'; import set from 'set-value'; import { type CreatePrompt } from './components.js'; diff --git a/packages/forms/src/patterns/attachment/config.ts b/packages/forms/src/patterns/attachment/config.ts index 0533e4c8..b2663c56 100644 --- a/packages/forms/src/patterns/attachment/config.ts +++ b/packages/forms/src/patterns/attachment/config.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { ParsePatternConfigData, type Pattern } from '../../pattern.js'; import { safeZodParseFormErrors } from '../../util/zod.js'; import { attachmentFileTypeMimes } from './file-type-options'; diff --git a/packages/forms/src/patterns/attachment/index.ts b/packages/forms/src/patterns/attachment/index.ts index e89c17a7..70d122e4 100644 --- a/packages/forms/src/patterns/attachment/index.ts +++ b/packages/forms/src/patterns/attachment/index.ts @@ -1,4 +1,4 @@ -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { type PatternConfig } from '../../pattern.js'; diff --git a/packages/forms/src/patterns/input/config.ts b/packages/forms/src/patterns/input/config.ts index 5ab8f627..94691012 100644 --- a/packages/forms/src/patterns/input/config.ts +++ b/packages/forms/src/patterns/input/config.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { type ParsePatternConfigData, type Pattern } from '../../pattern.js'; import { safeZodParseFormErrors } from '../../util/zod.js'; diff --git a/packages/forms/src/patterns/input/index.ts b/packages/forms/src/patterns/input/index.ts index c45ae93e..f19726a7 100644 --- a/packages/forms/src/patterns/input/index.ts +++ b/packages/forms/src/patterns/input/index.ts @@ -1,4 +1,4 @@ -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { type PatternConfig } from '../../pattern.js'; diff --git a/packages/forms/src/patterns/package-download/submit.test.ts b/packages/forms/src/patterns/package-download/submit.test.ts index 26f19fab..dde8c08e 100644 --- a/packages/forms/src/patterns/package-download/submit.test.ts +++ b/packages/forms/src/patterns/package-download/submit.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { failure, success } from '@gsa-tts/forms-common'; +import { failure, success } from '@flexion/forms-common'; import { type Blueprint, type FormSession, defaultFormConfig } from '../..'; diff --git a/packages/forms/src/patterns/package-download/submit.ts b/packages/forms/src/patterns/package-download/submit.ts index 36d223e3..d17800f6 100644 --- a/packages/forms/src/patterns/package-download/submit.ts +++ b/packages/forms/src/patterns/package-download/submit.ts @@ -1,4 +1,4 @@ -import { failure, success, type Result } from '@gsa-tts/forms-common'; +import { failure, success, type Result } from '@flexion/forms-common'; import { type Blueprint, type FormOutput } from '../..'; import { createFormOutputFieldData, fillPDF } from '../../documents'; diff --git a/packages/forms/src/patterns/page-set/submit.test.ts b/packages/forms/src/patterns/page-set/submit.test.ts index 24b9cc17..458e49af 100644 --- a/packages/forms/src/patterns/page-set/submit.test.ts +++ b/packages/forms/src/patterns/page-set/submit.test.ts @@ -7,7 +7,7 @@ import { createFormSession } from '../../session'; import { PageSet } from './builder'; import { submitPage } from './submit'; -import { success } from '@gsa-tts/forms-common'; +import { success } from '@flexion/forms-common'; describe('Page-set submission', () => { it('stores session data for valid page data', async () => { diff --git a/packages/forms/src/patterns/page-set/submit.ts b/packages/forms/src/patterns/page-set/submit.ts index c9d082b4..15456adc 100644 --- a/packages/forms/src/patterns/page-set/submit.ts +++ b/packages/forms/src/patterns/page-set/submit.ts @@ -1,4 +1,4 @@ -import { failure, success } from '@gsa-tts/forms-common'; +import { failure, success } from '@flexion/forms-common'; import { getPatternConfig, diff --git a/packages/forms/src/patterns/radio-group.ts b/packages/forms/src/patterns/radio-group.ts index 89bd8110..d23c5797 100644 --- a/packages/forms/src/patterns/radio-group.ts +++ b/packages/forms/src/patterns/radio-group.ts @@ -1,6 +1,6 @@ import * as z from 'zod'; -import { Result } from '@gsa-tts/forms-common'; +import { Result } from '@flexion/forms-common'; import { type RadioGroupProps } from '../components.js'; import { type FormError } from '../error.js'; diff --git a/packages/forms/src/patterns/repeater/submit.ts b/packages/forms/src/patterns/repeater/submit.ts index 53d7139a..b28c7b0e 100644 --- a/packages/forms/src/patterns/repeater/submit.ts +++ b/packages/forms/src/patterns/repeater/submit.ts @@ -1,4 +1,4 @@ -import { success } from '@gsa-tts/forms-common'; +import { success } from '@flexion/forms-common'; import { type RepeaterPattern } from '../..'; import { type SubmitHandler } from '../../submission'; diff --git a/packages/forms/src/patterns/text-area/text-area.ts b/packages/forms/src/patterns/text-area/text-area.ts index 1d17b55a..4796fd7d 100644 --- a/packages/forms/src/patterns/text-area/text-area.ts +++ b/packages/forms/src/patterns/text-area/text-area.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { enLocale as message } from '@gsa-tts/forms-common'; +import { enLocale as message } from '@flexion/forms-common'; import { PatternBuilder, type Pattern, diff --git a/packages/forms/src/repository/add-document.test.ts b/packages/forms/src/repository/add-document.test.ts index a0a77daf..216d1152 100644 --- a/packages/forms/src/repository/add-document.test.ts +++ b/packages/forms/src/repository/add-document.test.ts @@ -3,7 +3,7 @@ import { beforeAll, expect, it, vi } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { addDocument } from './add-document.js'; import type { ParsedPdf } from '../documents/pdf/parsing-api.js'; import type { DocumentFieldMap } from '../documents/types.js'; diff --git a/packages/forms/src/repository/add-document.ts b/packages/forms/src/repository/add-document.ts index 22259e80..16ac29e1 100644 --- a/packages/forms/src/repository/add-document.ts +++ b/packages/forms/src/repository/add-document.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import type { ParsedPdf } from '../documents/pdf/parsing-api'; import type { DocumentFieldMap } from '../documents/types'; diff --git a/packages/forms/src/repository/add-form.test.ts b/packages/forms/src/repository/add-form.test.ts index 8d68e15a..1a894a5a 100644 --- a/packages/forms/src/repository/add-form.test.ts +++ b/packages/forms/src/repository/add-form.test.ts @@ -3,7 +3,7 @@ import { beforeAll, expect, it, vi } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { addForm } from './add-form.js'; import { defaultFormConfig } from '../patterns/index.js'; diff --git a/packages/forms/src/repository/add-form.ts b/packages/forms/src/repository/add-form.ts index ed975bfc..3a98edbc 100644 --- a/packages/forms/src/repository/add-form.ts +++ b/packages/forms/src/repository/add-form.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type Blueprint } from '../index.js'; import type { FormRepositoryContext } from './index.js'; diff --git a/packages/forms/src/repository/delete-form.test.ts b/packages/forms/src/repository/delete-form.test.ts index eae216e8..d916c659 100644 --- a/packages/forms/src/repository/delete-form.test.ts +++ b/packages/forms/src/repository/delete-form.test.ts @@ -1,10 +1,10 @@ import { beforeAll, expect, it, vi } from 'vitest'; -import type { Result } from '@gsa-tts/forms-common'; +import type { Result } from '@flexion/forms-common'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { createTestBlueprint } from '../builder/builder.test.js'; import type { Blueprint } from '../types.js'; diff --git a/packages/forms/src/repository/delete-form.ts b/packages/forms/src/repository/delete-form.ts index a90bb091..eb20b114 100644 --- a/packages/forms/src/repository/delete-form.ts +++ b/packages/forms/src/repository/delete-form.ts @@ -1,4 +1,4 @@ -import { type VoidResult, failure, voidSuccess } from '@gsa-tts/forms-common'; +import { type VoidResult, failure, voidSuccess } from '@flexion/forms-common'; import type { FormOutput } from '../types'; import type { FormRepositoryContext } from '.'; diff --git a/packages/forms/src/repository/get-document.test.ts b/packages/forms/src/repository/get-document.test.ts index dba4a9aa..223edf40 100644 --- a/packages/forms/src/repository/get-document.test.ts +++ b/packages/forms/src/repository/get-document.test.ts @@ -3,7 +3,7 @@ import { beforeAll, expect, it, vi } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { addDocument } from './add-document'; import type { DocumentFieldMap } from '../documents/types'; import type { ParsedPdf } from '../documents/pdf/parsing-api'; diff --git a/packages/forms/src/repository/get-document.ts b/packages/forms/src/repository/get-document.ts index d537d96c..dd13a3b9 100644 --- a/packages/forms/src/repository/get-document.ts +++ b/packages/forms/src/repository/get-document.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import type { ParsedPdf } from '../documents/pdf/parsing-api'; import type { DocumentFieldMap } from '../documents/types'; diff --git a/packages/forms/src/repository/get-form-list.test.ts b/packages/forms/src/repository/get-form-list.test.ts index d52d21c9..c6159956 100644 --- a/packages/forms/src/repository/get-form-list.test.ts +++ b/packages/forms/src/repository/get-form-list.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { getForm } from './get-form.js'; import { getFormList } from './get-form-list.js'; import { defaultFormConfig } from '../patterns/index.js'; diff --git a/packages/forms/src/repository/get-form-session.test.ts b/packages/forms/src/repository/get-form-session.test.ts index bc785d2a..dbc0e093 100644 --- a/packages/forms/src/repository/get-form-session.test.ts +++ b/packages/forms/src/repository/get-form-session.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { createTestBlueprint } from '../builder/builder.test'; import { addForm } from './add-form'; diff --git a/packages/forms/src/repository/get-form-session.ts b/packages/forms/src/repository/get-form-session.ts index 87c36e40..b36693ba 100644 --- a/packages/forms/src/repository/get-form-session.ts +++ b/packages/forms/src/repository/get-form-session.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormSession, type FormSessionId } from '../session'; import type { FormRepositoryContext } from '.'; diff --git a/packages/forms/src/repository/get-form.test.ts b/packages/forms/src/repository/get-form.test.ts index 2a46748a..f5824511 100644 --- a/packages/forms/src/repository/get-form.test.ts +++ b/packages/forms/src/repository/get-form.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { defaultFormConfig, type Blueprint } from '../index.js'; import { getForm } from './get-form.js'; diff --git a/packages/forms/src/repository/get-form.ts b/packages/forms/src/repository/get-form.ts index 9625bc34..daac9fb3 100644 --- a/packages/forms/src/repository/get-form.ts +++ b/packages/forms/src/repository/get-form.ts @@ -1,4 +1,4 @@ -import { failure, success, type Result } from '@gsa-tts/forms-common'; +import { failure, success, type Result } from '@flexion/forms-common'; import { parseFormString } from '../builder/parse-form.js'; import { type Blueprint } from '../index.js'; import type { FormRepositoryContext } from './index.js'; diff --git a/packages/forms/src/repository/index.ts b/packages/forms/src/repository/index.ts index c213942d..aca57938 100644 --- a/packages/forms/src/repository/index.ts +++ b/packages/forms/src/repository/index.ts @@ -1,5 +1,5 @@ -import { type ServiceMethod, createService } from '@gsa-tts/forms-common'; -import { type DatabaseContext } from '@gsa-tts/forms-database'; +import { type ServiceMethod, createService } from '@flexion/forms-common'; +import { type DatabaseContext } from '@flexion/forms-database'; import type { FormConfig } from '../pattern.js'; diff --git a/packages/forms/src/repository/save-form.test.ts b/packages/forms/src/repository/save-form.test.ts index caa31075..206fcb44 100644 --- a/packages/forms/src/repository/save-form.test.ts +++ b/packages/forms/src/repository/save-form.test.ts @@ -3,7 +3,7 @@ import { expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { defaultFormConfig, type Blueprint } from '../index.js'; import { saveForm } from './save-form.js'; diff --git a/packages/forms/src/repository/save-form.ts b/packages/forms/src/repository/save-form.ts index e64e924d..332c0c7f 100644 --- a/packages/forms/src/repository/save-form.ts +++ b/packages/forms/src/repository/save-form.ts @@ -1,4 +1,4 @@ -import { type VoidResult, failure, success } from '@gsa-tts/forms-common'; +import { type VoidResult, failure, success } from '@flexion/forms-common'; import { type Blueprint } from '../index.js'; import type { FormRepositoryContext } from './index.js'; diff --git a/packages/forms/src/repository/upsert-form-session.test.ts b/packages/forms/src/repository/upsert-form-session.test.ts index 8fea4597..c3c7ab01 100644 --- a/packages/forms/src/repository/upsert-form-session.test.ts +++ b/packages/forms/src/repository/upsert-form-session.test.ts @@ -3,7 +3,7 @@ import { beforeEach, expect, it } from 'vitest'; import { type DbTestContext, describeDatabase, -} from '@gsa-tts/forms-database/testing'; +} from '@flexion/forms-database/testing'; import { defaultFormConfig, type Blueprint } from '..'; import { createTestBlueprint } from '../builder/builder.test'; diff --git a/packages/forms/src/repository/upsert-form-session.ts b/packages/forms/src/repository/upsert-form-session.ts index f0819ffe..a99fe292 100644 --- a/packages/forms/src/repository/upsert-form-session.ts +++ b/packages/forms/src/repository/upsert-form-session.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormSession } from '../session'; import type { FormRepositoryContext } from '.'; diff --git a/packages/forms/src/response.ts b/packages/forms/src/response.ts index 96200c92..e8c8c50f 100644 --- a/packages/forms/src/response.ts +++ b/packages/forms/src/response.ts @@ -1,4 +1,4 @@ -import { type Result } from '@gsa-tts/forms-common'; +import { type Result } from '@flexion/forms-common'; import { type PromptAction } from './components.js'; import { diff --git a/packages/forms/src/services/add-form.ts b/packages/forms/src/services/add-form.ts index f049d729..d2f539de 100644 --- a/packages/forms/src/services/add-form.ts +++ b/packages/forms/src/services/add-form.ts @@ -1,4 +1,4 @@ -import { type Result, failure } from '@gsa-tts/forms-common'; +import { type Result, failure } from '@flexion/forms-common'; import { Blueprint } from '../index.js'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/delete-form.ts b/packages/forms/src/services/delete-form.ts index e1f709c9..c1f64888 100644 --- a/packages/forms/src/services/delete-form.ts +++ b/packages/forms/src/services/delete-form.ts @@ -1,4 +1,4 @@ -import { type VoidResult, failure } from '@gsa-tts/forms-common'; +import { type VoidResult, failure } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/get-form-list.ts b/packages/forms/src/services/get-form-list.ts index 40eafdb8..eaaf1935 100644 --- a/packages/forms/src/services/get-form-list.ts +++ b/packages/forms/src/services/get-form-list.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/get-form-session.ts b/packages/forms/src/services/get-form-session.ts index 02b90546..c9ed03bf 100644 --- a/packages/forms/src/services/get-form-session.ts +++ b/packages/forms/src/services/get-form-session.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; import { type FormRoute } from '../route-data.js'; diff --git a/packages/forms/src/services/get-form.ts b/packages/forms/src/services/get-form.ts index 3b52dfd3..d3bef99a 100644 --- a/packages/forms/src/services/get-form.ts +++ b/packages/forms/src/services/get-form.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { parseForm } from '../builder/parse-form.js'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/index.ts b/packages/forms/src/services/index.ts index db82a813..38a2ef7e 100644 --- a/packages/forms/src/services/index.ts +++ b/packages/forms/src/services/index.ts @@ -1,4 +1,4 @@ -import { type ServiceMethod, createService } from '@gsa-tts/forms-common'; +import { type ServiceMethod, createService } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/initialize-form.ts b/packages/forms/src/services/initialize-form.ts index 5b87aa66..37b66386 100644 --- a/packages/forms/src/services/initialize-form.ts +++ b/packages/forms/src/services/initialize-form.ts @@ -1,6 +1,6 @@ import * as z from 'zod'; -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { BlueprintBuilder } from '../builder/index.js'; import { type FormServiceContext } from '../context/index.js'; diff --git a/packages/forms/src/services/save-form.test.ts b/packages/forms/src/services/save-form.test.ts index e4964cf1..e6486b11 100644 --- a/packages/forms/src/services/save-form.test.ts +++ b/packages/forms/src/services/save-form.test.ts @@ -4,7 +4,7 @@ import { createForm, generatePatternId } from '../index.js'; import { createTestFormServiceContext } from '../testing.js'; import { saveForm } from './save-form.js'; -import { success } from '@gsa-tts/forms-common'; +import { success } from '@flexion/forms-common'; const TEST_FORM = createForm({ title: 'Form Title', description: '' }); const formSummaryId = generatePatternId(); diff --git a/packages/forms/src/services/save-form.ts b/packages/forms/src/services/save-form.ts index 454c9310..256fbf30 100644 --- a/packages/forms/src/services/save-form.ts +++ b/packages/forms/src/services/save-form.ts @@ -1,4 +1,4 @@ -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; import { type Blueprint } from '../types.js'; diff --git a/packages/forms/src/services/submit-form.ts b/packages/forms/src/services/submit-form.ts index 550b2f04..8724ae0c 100644 --- a/packages/forms/src/services/submit-form.ts +++ b/packages/forms/src/services/submit-form.ts @@ -1,4 +1,4 @@ -import { failure, success, type Result } from '@gsa-tts/forms-common'; +import { failure, success, type Result } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; import { submitPage } from '../patterns/page-set/submit'; diff --git a/packages/forms/src/submission.ts b/packages/forms/src/submission.ts index cb79c107..8a839222 100644 --- a/packages/forms/src/submission.ts +++ b/packages/forms/src/submission.ts @@ -1,6 +1,6 @@ import * as z from 'zod'; -import { type Result, failure, success } from '@gsa-tts/forms-common'; +import { type Result, failure, success } from '@flexion/forms-common'; import { type FormConfig, diff --git a/packages/forms/src/testing.ts b/packages/forms/src/testing.ts index 02575637..06d70a00 100644 --- a/packages/forms/src/testing.ts +++ b/packages/forms/src/testing.ts @@ -1,5 +1,5 @@ -import { type DatabaseContext } from '@gsa-tts/forms-database'; -import { createInMemoryDatabaseContext } from '@gsa-tts/forms-database/context'; +import { type DatabaseContext } from '@flexion/forms-database'; +import { createInMemoryDatabaseContext } from '@flexion/forms-database/context'; import type { FormServiceContext } from './context'; import { type ParsePdf, parsePdf } from './documents'; diff --git a/packages/forms/src/util/zod.ts b/packages/forms/src/util/zod.ts index 3f92f858..63f8cd65 100644 --- a/packages/forms/src/util/zod.ts +++ b/packages/forms/src/util/zod.ts @@ -1,6 +1,6 @@ import * as z from 'zod'; -import * as r from '@gsa-tts/forms-common'; +import * as r from '@flexion/forms-common'; import { type FormError, type FormErrors, type Pattern } from '../index.js'; diff --git a/packages/forms/vitest.config.ts b/packages/forms/vitest.config.ts index d89d7593..6428888e 100644 --- a/packages/forms/vitest.config.ts +++ b/packages/forms/vitest.config.ts @@ -1,6 +1,6 @@ import { defineConfig, mergeConfig } from 'vitest/config'; -import { getVitestDatabaseContainerGlobalSetupPath } from '@gsa-tts/forms-database'; +import { getVitestDatabaseContainerGlobalSetupPath } from '@flexion/forms-database'; import sharedTestConfig from '../../vitest.shared'; export default mergeConfig( diff --git a/packages/server/README.md b/packages/server/README.md index 18c1bc39..ef15366c 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -1,4 +1,4 @@ -# @gsa-tts/forms-server +# @flexion/forms-server The Forms Platform web server. @@ -21,7 +21,7 @@ pnpm dev To start the provided Express server: ```typescript -import { createServer } from '@gsa-tts/forms-server'; +import { createServer } from '@flexion/forms-server'; const port = process.env.PORT || 4321; diff --git a/packages/server/package.json b/packages/server/package.json index c7f3f6f8..9e678379 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,5 +1,5 @@ { - "name": "@gsa-tts/forms-server", + "name": "@flexion/forms-server", "type": "module", "version": "0.1.2", "main": "dist/handler.js", @@ -20,11 +20,11 @@ "@astrojs/check": "^0.9.4", "@astrojs/node": "^9.0.0", "@astrojs/react": "^4.1.2", - "@gsa-tts/forms-auth": "workspace:^", - "@gsa-tts/forms-common": "workspace:*", - "@gsa-tts/forms-database": "workspace:*", - "@gsa-tts/forms-design": "workspace:*", - "@gsa-tts/forms-core": "workspace:*", + "@flexion/forms-auth": "workspace:^", + "@flexion/forms-common": "workspace:*", + "@flexion/forms-database": "workspace:*", + "@flexion/forms-design": "workspace:*", + "@flexion/forms-core": "workspace:*", "astro": "^5.1.3", "express": "^4.21.0", "jwt-decode": "^4.0.0", diff --git a/packages/server/src/components/AppAvailableFormList.tsx b/packages/server/src/components/AppAvailableFormList.tsx index 191b72aa..19b291d6 100644 --- a/packages/server/src/components/AppAvailableFormList.tsx +++ b/packages/server/src/components/AppAvailableFormList.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { ErrorBoundary } from 'react-error-boundary'; -import { AvailableFormList } from '@gsa-tts/forms-design'; +import { AvailableFormList } from '@flexion/forms-design'; import { type AppContext } from '../config/context.js'; import { getFormManagerUrlById, getFormUrl } from '../routes.js'; diff --git a/packages/server/src/components/AppForm.tsx b/packages/server/src/components/AppForm.tsx index 3a937c0d..b6af32f0 100644 --- a/packages/server/src/components/AppForm.tsx +++ b/packages/server/src/components/AppForm.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { defaultPatternComponents, Form } from '@gsa-tts/forms-design'; -import { type FormSession, defaultFormConfig } from '@gsa-tts/forms-core'; +import { defaultPatternComponents, Form } from '@flexion/forms-design'; +import { type FormSession, defaultFormConfig } from '@flexion/forms-core'; type AppFormProps = { uswdsRoot: `${string}/`; diff --git a/packages/server/src/components/AppFormManager.tsx b/packages/server/src/components/AppFormManager.tsx index 88297e4c..618a4a22 100644 --- a/packages/server/src/components/AppFormManager.tsx +++ b/packages/server/src/components/AppFormManager.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { FormManager } from '@gsa-tts/forms-design'; +import { FormManager } from '@flexion/forms-design'; import { FormServiceClient } from '../lib/api-client.js'; import { type AppContext } from '../config/context.js'; diff --git a/packages/server/src/components/Header.astro b/packages/server/src/components/Header.astro index 9d6bc966..16c6a32b 100644 --- a/packages/server/src/components/Header.astro +++ b/packages/server/src/components/Header.astro @@ -1,6 +1,6 @@ --- -import closeSvg from '@gsa-tts/forms-design/static/uswds/img/usa-icons/close.svg'; -import logoSvg from '@gsa-tts/forms-design/images/logo.svg'; +import closeSvg from '@flexion/forms-design/static/uswds/img/usa-icons/close.svg'; +import logoSvg from '@flexion/forms-design/images/logo.svg'; import { getServerContext, getUserSession } from '../config/astro.js'; import * as routes from '../routes'; diff --git a/packages/server/src/components/UsaBanner.astro b/packages/server/src/components/UsaBanner.astro index 6fbfd61e..2dd3f656 100644 --- a/packages/server/src/components/UsaBanner.astro +++ b/packages/server/src/components/UsaBanner.astro @@ -1,7 +1,7 @@ --- -import iconDotGov from '@gsa-tts/forms-design/static/uswds/img/icon-dot-gov.svg'; -import iconHttps from '@gsa-tts/forms-design/static/uswds/img/icon-https.svg'; -import usFlagSmall from '@gsa-tts/forms-design/static/uswds/img/us_flag_small.png'; +import iconDotGov from '@flexion/forms-design/static/uswds/img/icon-dot-gov.svg'; +import iconHttps from '@flexion/forms-design/static/uswds/img/icon-https.svg'; +import usFlagSmall from '@flexion/forms-design/static/uswds/img/us_flag_small.png'; ---
diff --git a/packages/server/src/config/astro.ts b/packages/server/src/config/astro.ts index 8cf541b8..053d1489 100644 --- a/packages/server/src/config/astro.ts +++ b/packages/server/src/config/astro.ts @@ -4,8 +4,8 @@ import { type AuthRepository, type LoginGovOptions, createAuthRepository, -} from '@gsa-tts/forms-auth'; -import { defaultFormConfig } from '@gsa-tts/forms-core'; +} from '@flexion/forms-auth'; +import { defaultFormConfig } from '@flexion/forms-core'; import { type AppContext } from './context.js'; import { type ServerOptions, createDevServerOptions } from './options.js'; @@ -65,7 +65,7 @@ const createDefaultAuthContext = async ({ loginGovOptions: LoginGovOptions; isUserAuthorized: (email: string) => Promise; }) => { - const { LoginGov, BaseAuthContext } = await import('@gsa-tts/forms-auth'); + const { LoginGov, BaseAuthContext } = await import('@flexion/forms-auth'); return new BaseAuthContext( authRepository, new LoginGov({ diff --git a/packages/server/src/config/context.ts b/packages/server/src/config/context.ts index 25d67923..9d46048b 100644 --- a/packages/server/src/config/context.ts +++ b/packages/server/src/config/context.ts @@ -1,5 +1,5 @@ -import { type AuthServiceContext } from '@gsa-tts/forms-auth'; -import { type FormConfig, type FormService } from '@gsa-tts/forms-core'; +import { type AuthServiceContext } from '@flexion/forms-auth'; +import { type FormConfig, type FormService } from '@flexion/forms-core'; import { type GithubRepository } from '../lib/github.js'; diff --git a/packages/server/src/config/options.ts b/packages/server/src/config/options.ts index 2c4fcf67..4bc90a40 100644 --- a/packages/server/src/config/options.ts +++ b/packages/server/src/config/options.ts @@ -1,8 +1,8 @@ import { dirname, join } from 'path'; import { fileURLToPath } from 'url'; -import { type LoginGovOptions } from '@gsa-tts/forms-auth'; -import { DatabaseContext } from '@gsa-tts/forms-database'; +import { type LoginGovOptions } from '@flexion/forms-auth'; +import { DatabaseContext } from '@flexion/forms-database'; export type ServerOptions = { agencyBranding: boolean; @@ -14,7 +14,7 @@ export type ServerOptions = { export const createDevServerOptions = async (): Promise => { const { createFilesystemDatabaseContext } = await import( - '@gsa-tts/forms-database/context' + '@flexion/forms-database/context' ); const db = await createFilesystemDatabaseContext( join(dirname(fileURLToPath(import.meta.url)), '../main.db') @@ -38,7 +38,7 @@ export const createDevServerOptions = async (): Promise => { export const createTestServerOptions = async (): Promise => { const { createInMemoryDatabaseContext } = await import( - '@gsa-tts/forms-database/context' + '@flexion/forms-database/context' ); const db = await createInMemoryDatabaseContext(); return { diff --git a/packages/server/src/config/services.ts b/packages/server/src/config/services.ts index f6d5804c..1655433d 100644 --- a/packages/server/src/config/services.ts +++ b/packages/server/src/config/services.ts @@ -4,7 +4,7 @@ import { createFormsRepository, defaultFormConfig, parsePdf, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { type ServerOptions } from './options.js'; export const createServerFormService = ( diff --git a/packages/server/src/lib/api-client.ts b/packages/server/src/lib/api-client.ts index 3b8e7bb7..f31da251 100644 --- a/packages/server/src/lib/api-client.ts +++ b/packages/server/src/lib/api-client.ts @@ -1,4 +1,4 @@ -import { type Result } from '@gsa-tts/forms-common'; +import { type Result } from '@flexion/forms-common'; import { type FormRoute, type FormSession, @@ -6,8 +6,8 @@ import { type Blueprint, type FormService, type FormSummary, -} from '@gsa-tts/forms-core'; -import { type FormServiceContext } from '@gsa-tts/forms-core/context'; +} from '@flexion/forms-core'; +import { type FormServiceContext } from '@flexion/forms-core/context'; type FormServiceClientContext = { baseUrl: string; diff --git a/packages/server/src/lib/initialize.ts b/packages/server/src/lib/initialize.ts index 2c9f2d73..ddb01758 100644 --- a/packages/server/src/lib/initialize.ts +++ b/packages/server/src/lib/initialize.ts @@ -1,4 +1,4 @@ /** * Global initialization script. */ -import '@gsa-tts/forms-design'; +import '@flexion/forms-design'; diff --git a/packages/server/src/middleware.ts b/packages/server/src/middleware.ts index 66385300..32d4a4bb 100644 --- a/packages/server/src/middleware.ts +++ b/packages/server/src/middleware.ts @@ -1,6 +1,6 @@ import { defineMiddleware } from 'astro/middleware'; -import { processSessionCookie } from '@gsa-tts/forms-auth'; +import { processSessionCookie } from '@flexion/forms-auth'; import { getServerContext } from './config/astro.js'; diff --git a/packages/server/src/pages/forms/[id].astro b/packages/server/src/pages/forms/[id].astro index 4923beb9..be1f642e 100644 --- a/packages/server/src/pages/forms/[id].astro +++ b/packages/server/src/pages/forms/[id].astro @@ -2,7 +2,7 @@ import { type FormRoute, getRouteDataFromQueryString, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { AppForm } from '../../components/AppForm'; import { diff --git a/packages/server/src/pages/forms/[id].test.ts b/packages/server/src/pages/forms/[id].test.ts index a6f15c14..27680116 100644 --- a/packages/server/src/pages/forms/[id].test.ts +++ b/packages/server/src/pages/forms/[id].test.ts @@ -11,7 +11,7 @@ import { type PagePattern, type PageSetPattern, createForm, -} from '@gsa-tts/forms-core'; +} from '@flexion/forms-core'; import { type ServerOptions, diff --git a/packages/server/src/pages/signin/callback.ts b/packages/server/src/pages/signin/callback.ts index 2d9f3044..82afeecf 100644 --- a/packages/server/src/pages/signin/callback.ts +++ b/packages/server/src/pages/signin/callback.ts @@ -1,6 +1,6 @@ import type { APIContext } from 'astro'; -import { processProviderCallback } from '@gsa-tts/forms-auth'; +import { processProviderCallback } from '@flexion/forms-auth'; import { getServerContext } from '../../config/astro.js'; import * as routes from '../../routes.js'; diff --git a/packages/server/src/pages/signin/index.ts b/packages/server/src/pages/signin/index.ts index a2522538..264619ff 100644 --- a/packages/server/src/pages/signin/index.ts +++ b/packages/server/src/pages/signin/index.ts @@ -1,5 +1,5 @@ import type { APIContext } from 'astro'; -import { getProviderRedirect } from '@gsa-tts/forms-auth'; +import { getProviderRedirect } from '@flexion/forms-auth'; import { getServerContext } from '../../config/astro.js'; diff --git a/packages/server/src/pages/signout/confirm.ts b/packages/server/src/pages/signout/confirm.ts index 63599e4c..772ec9e8 100644 --- a/packages/server/src/pages/signout/confirm.ts +++ b/packages/server/src/pages/signout/confirm.ts @@ -1,6 +1,6 @@ import type { APIContext } from 'astro'; -import { logOut } from '@gsa-tts/forms-auth'; +import { logOut } from '@flexion/forms-auth'; import { getServerContext } from '../../config/astro.js'; import * as routes from '../../routes.js'; diff --git a/packages/server/src/styles.css b/packages/server/src/styles.css index 40f8ac4f..26f6dc29 100644 --- a/packages/server/src/styles.css +++ b/packages/server/src/styles.css @@ -1 +1 @@ -@import '@gsa-tts/forms-design/static/uswds/styles/styles.css'; +@import '@flexion/forms-design/static/uswds/styles/styles.css'; diff --git a/packages/server/vitest.config.browser.ts b/packages/server/vitest.config.browser.ts index 64cda4e7..d1dc5eb7 100644 --- a/packages/server/vitest.config.browser.ts +++ b/packages/server/vitest.config.browser.ts @@ -5,7 +5,7 @@ export default defineConfig({ exclude: ['chromium-bidi', 'fsevents'], }, test: { - name: '@gsa-tts/forms-server:browser', + name: '@flexion/forms-server:browser', browser: { provider: 'playwright', enabled: true, diff --git a/packages/server/vitest.config.ts b/packages/server/vitest.config.ts index 09447d81..eb8bff8e 100644 --- a/packages/server/vitest.config.ts +++ b/packages/server/vitest.config.ts @@ -5,7 +5,7 @@ import { configDefaults } from 'vitest/config'; export default getViteConfig({ test: { ...configDefaults, - name: '@gsa-tts/forms-server:node', + name: '@flexion/forms-server:node', setupFiles: ['./vitest.setup.ts'], environment: 'node', include: ['src/**/*.test.ts'], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e27193f..81285b89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: version: 3.1.1(playwright@1.51.1)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))(vitest@3.1.1) '@vitest/coverage-v8': specifier: ^3.0.5 - version: 3.1.1(@vitest/browser@3.1.1)(vitest@3.1.1) + version: 3.1.1(@vitest/browser@3.1.1(playwright@1.51.1)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))(vitest@3.1.1))(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) '@vitest/ui': specifier: ^3.0.5 version: 3.1.1(vitest@3.1.1) @@ -76,17 +76,17 @@ importers: version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) vitest-mock-extended: specifier: ^2.0.2 - version: 2.0.2(typescript@5.8.2)(vitest@3.1.1) + version: 2.0.2(typescript@5.8.2)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) apps/cli: dependencies: - '@gsa-tts/forms-auth': + '@flexion/forms-auth': specifier: workspace:^ version: link:../../packages/auth - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../../packages/database - '@gsa-tts/forms-infra-core': + '@flexion/forms-infra-core': specifier: workspace:* version: link:../../infra/core commander: @@ -95,13 +95,13 @@ importers: apps/sandbox: dependencies: - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../../packages/database - '@gsa-tts/forms-infra-core': + '@flexion/forms-infra-core': specifier: workspace:* version: link:../../infra/core - '@gsa-tts/forms-server': + '@flexion/forms-server': specifier: workspace:* version: link:../../packages/server devDependencies: @@ -114,13 +114,13 @@ importers: apps/server-doj: dependencies: - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../../packages/database - '@gsa-tts/forms-infra-core': + '@flexion/forms-infra-core': specifier: workspace:* version: link:../../infra/core - '@gsa-tts/forms-server': + '@flexion/forms-server': specifier: workspace:* version: link:../../packages/server devDependencies: @@ -136,18 +136,18 @@ importers: '@astrojs/react': specifier: ^3.6.1 version: 3.6.3(@types/node@22.14.0)(@types/react-dom@19.1.1(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.83.4)(terser@5.39.0) - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../../packages/common - '@gsa-tts/forms-core': + '@flexion/forms-core': specifier: workspace:* version: link:../../packages/forms - '@gsa-tts/forms-design': + '@flexion/forms-design': specifier: workspace:* version: link:../../packages/design astro: specifier: ^4.16.18 - version: 4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428) + version: 4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903) qs: specifier: ^6.13.0 version: 6.14.0 @@ -172,7 +172,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.4.1 - version: 0.4.1(prettier@3.5.3)(typescript@5.9.0-dev.20250428) + version: 0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20250903) '@size-limit/preset-app': specifier: ^11.1.6 version: 11.2.0(size-limit@11.2.0) @@ -188,7 +188,7 @@ importers: e2e: dependencies: - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../packages/common devDependencies: @@ -207,7 +207,7 @@ importers: '@aws-cdk/aws-apprunner-alpha': specifier: 2.184.1-alpha.0 version: 2.184.1-alpha.0(aws-cdk-lib@2.184.1(constructs@10.4.2))(constructs@10.4.2) - '@gsa-tts/forms-infra-core': + '@flexion/forms-infra-core': specifier: workspace:* version: link:../core aws-cdk: @@ -232,7 +232,7 @@ importers: '@aws-sdk/client-ssm': specifier: ^3.750.0 version: 3.782.0 - '@gsa-tts/forms-infra-aws-cdk': + '@flexion/forms-infra-aws-cdk': specifier: workspace:* version: link:../aws-cdk cdktf: @@ -253,10 +253,10 @@ importers: '@aws-sdk/client-ssm': specifier: ^3.624.0 version: 3.782.0 - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../../packages/common - '@gsa-tts/forms-core': + '@flexion/forms-core': specifier: workspace:* version: link:../../packages/forms zod: @@ -265,10 +265,10 @@ importers: packages/auth: dependencies: - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:^ version: link:../common - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../database '@lucia-auth/adapter-postgresql': @@ -295,13 +295,13 @@ importers: version: 7.6.12 vitest-fetch-mock: specifier: ^0.4.3 - version: 0.4.5(vitest@3.1.1) + version: 0.4.5(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) packages/common: {} packages/database: dependencies: - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../common '@types/pg': @@ -344,10 +344,10 @@ importers: '@dnd-kit/utilities': specifier: ^3.2.2 version: 3.2.2(react@18.3.1) - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../common - '@gsa-tts/forms-core': + '@flexion/forms-core': specifier: workspace:* version: link:../forms '@size-limit/preset-big-lib': @@ -416,22 +416,22 @@ importers: version: 8.6.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3)) '@storybook/experimental-addon-test': specifier: ^8.4.7 - version: 8.6.12(@vitest/browser@3.1.1)(@vitest/runner@3.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(vitest@3.1.1) + version: 8.6.12(@vitest/browser@3.1.1(playwright@1.51.1)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))(vitest@3.1.1))(@vitest/runner@3.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) '@storybook/preview-api': specifier: ^8.4.7 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/react': specifier: ^8.4.7 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@5.9.0-dev.20250428) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20250903) '@storybook/react-vite': specifier: ^8.4.7 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) '@storybook/test': specifier: ^8.4.7 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/test-runner': specifier: ^0.21.0 - version: 0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + version: 0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) '@storybook/types': specifier: ^8.4.7 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) @@ -455,13 +455,13 @@ importers: version: 19.1.1(@types/react@18.3.20) '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428))(eslint@8.57.1)(typescript@5.9.0-dev.20250428) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903))(eslint@8.57.1)(typescript@6.0.0-dev.20250903) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428) + version: 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903) '@uswds/compile': specifier: ^1.2.2 - version: 1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + version: 1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) @@ -494,17 +494,17 @@ importers: version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) vite-plugin-dts: specifier: ^4.4.0 - version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) wait-on: specifier: ^7.2.0 version: 7.2.0 packages/forms: dependencies: - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../common - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../database pdf-lib: @@ -528,31 +528,31 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.5.3)(typescript@5.9.0-dev.20250428) + version: 0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20250903) '@astrojs/node': specifier: ^9.0.0 - version: 9.1.3(astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428)(yaml@2.7.1)) + version: 9.1.3(astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903)(yaml@2.7.1)) '@astrojs/react': specifier: ^4.1.2 version: 4.2.3(@types/node@22.14.0)(@types/react-dom@19.1.1(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.4.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) - '@gsa-tts/forms-auth': + '@flexion/forms-auth': specifier: workspace:^ version: link:../auth - '@gsa-tts/forms-common': + '@flexion/forms-common': specifier: workspace:* version: link:../common - '@gsa-tts/forms-core': + '@flexion/forms-core': specifier: workspace:* version: link:../forms - '@gsa-tts/forms-database': + '@flexion/forms-database': specifier: workspace:* version: link:../database - '@gsa-tts/forms-design': + '@flexion/forms-design': specifier: workspace:* version: link:../design astro: specifier: ^5.1.3 - version: 5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428)(yaml@2.7.1) + version: 5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903)(yaml@2.7.1) express: specifier: ^4.21.0 version: 4.21.2 @@ -9142,8 +9142,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.9.0-dev.20250428: - resolution: {integrity: sha512-/6K3WJlc0zjdAgLJMpU40jIxBIQ4fpAfE3o35EsPBTaqvDh9X6rY+c0NBYpYb/3UG0a2wgSr0yD0sS1l6Km7Fw==} + typescript@6.0.0-dev.20250903: + resolution: {integrity: sha512-+JORvpkdEk66EV3TFpTTlaEq+hg7mivLa73KRr3g3kI+GhNhmdCWOxfwC6jOG+EgagKX6b8TqO5lsCiaEn3IJA==} engines: {node: '>=14.17'} hasBin: true @@ -10029,24 +10029,24 @@ snapshots: '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3 - '@astrojs/check@0.4.1(prettier@3.5.3)(typescript@5.9.0-dev.20250428)': + '@astrojs/check@0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20250903)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@5.9.0-dev.20250428) + '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20250903) chokidar: 3.6.0 fast-glob: 3.3.3 kleur: 4.1.5 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.4(prettier@3.5.3)(typescript@5.9.0-dev.20250428)': + '@astrojs/check@0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20250903)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@5.9.0-dev.20250428) + '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20250903) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -10058,12 +10058,12 @@ snapshots: '@astrojs/internal-helpers@0.6.1': {} - '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@5.9.0-dev.20250428)': + '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20250903)': dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.12(typescript@5.9.0-dev.20250428) + '@volar/kit': 2.4.12(typescript@6.0.0-dev.20250903) '@volar/language-core': 2.4.12 '@volar/language-server': 2.4.12 '@volar/language-service': 2.4.12 @@ -10132,10 +10132,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.1.3(astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428)(yaml@2.7.1))': + '@astrojs/node@9.1.3(astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903)(yaml@2.7.1))': dependencies: '@astrojs/internal-helpers': 0.6.1 - astro: 5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428)(yaml@2.7.1) + astro: 5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903)(yaml@2.7.1) send: 1.2.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -11645,7 +11645,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -11659,7 +11659,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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -11802,14 +11802,14 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': dependencies: glob: 10.4.5 magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.9.0-dev.20250428) + react-docgen-typescript: 2.2.2(typescript@6.0.0-dev.20250903) vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -12908,7 +12908,7 @@ snapshots: dependencies: type-fest: 2.19.0 - '@storybook/experimental-addon-test@8.6.12(@vitest/browser@3.1.1)(@vitest/runner@3.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(vitest@3.1.1)': + '@storybook/experimental-addon-test@8.6.12(@vitest/browser@3.1.1(playwright@1.51.1)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))(vitest@3.1.1))(@vitest/runner@3.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': dependencies: '@storybook/global': 5.0.0 '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -12953,12 +12953,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.6.12(prettier@3.5.3) - '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': + '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) '@rollup/pluginutils': 5.1.4(rollup@4.39.0) '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)) - '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@5.9.0-dev.20250428) + '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20250903) find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 @@ -12975,7 +12975,7 @@ snapshots: - supports-color - typescript - '@storybook/react@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@5.9.0-dev.20250428)': + '@storybook/react@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20250903)': dependencies: '@storybook/components': 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/global': 5.0.0 @@ -12988,9 +12988,9 @@ snapshots: storybook: 8.6.12(prettier@3.5.3) optionalDependencies: '@storybook/test': 8.6.12(storybook@8.6.12(prettier@3.5.3)) - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 - '@storybook/test-runner@0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))': + '@storybook/test-runner@0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.27.0 @@ -13001,14 +13001,14 @@ snapshots: '@swc/core': 1.11.16 '@swc/jest': 0.2.37(@swc/core@1.11.16) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))) + 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))) nyc: 15.1.0 playwright: 1.51.1 storybook: 8.6.12(prettier@3.5.3) @@ -13587,34 +13587,34 @@ snapshots: '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428))(eslint@8.57.1)(typescript@5.9.0-dev.20250428)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903))(eslint@8.57.1)(typescript@6.0.0-dev.20250903)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.9.0-dev.20250428) + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20250903) optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.0-dev.20250428) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20250903) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.0 eslint: 8.57.1 optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 transitivePeerDependencies: - supports-color @@ -13623,21 +13623,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.1)(typescript@5.9.0-dev.20250428)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.0-dev.20250428) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20250903) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903) debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.0-dev.20250428) + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20250903) optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.0-dev.20250428)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@6.0.0-dev.20250903)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -13646,18 +13646,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.9.0-dev.20250428) + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20250903) optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.0-dev.20250428)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20250903)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.0-dev.20250428) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20250903) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -13670,11 +13670,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@uswds/compile@1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))': + '@uswds/compile@1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))': dependencies: autoprefixer: 10.4.20(postcss@8.5.2) gulp: 5.0.0 - gulp-postcss: 9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + gulp-postcss: 9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) gulp-rename: 2.0.0 gulp-replace: 1.1.4 gulp-sass: 5.1.0 @@ -13730,7 +13730,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@3.1.1(@vitest/browser@3.1.1)(vitest@3.1.1)': + '@vitest/coverage-v8@3.1.1(@vitest/browser@3.1.1(playwright@1.51.1)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))(vitest@3.1.1))(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -13833,12 +13833,12 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@volar/kit@2.4.12(typescript@5.9.0-dev.20250428)': + '@volar/kit@2.4.12(typescript@6.0.0-dev.20250903)': dependencies: '@volar/language-service': 2.4.12 '@volar/typescript': 2.4.12 typesafe-path: 0.2.2 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -13901,7 +13901,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@5.9.0-dev.20250428)': + '@vue/language-core@2.2.0(typescript@6.0.0-dev.20250903)': dependencies: '@volar/language-core': 2.4.12 '@vue/compiler-dom': 3.5.13 @@ -13912,7 +13912,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 '@vue/shared@3.5.13': {} @@ -14299,7 +14299,7 @@ snapshots: astral-regex@2.0.0: {} - astro@4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428): + astro@4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.4.1 @@ -14352,7 +14352,7 @@ snapshots: semver: 7.7.1 shiki: 1.29.2 tinyexec: 0.3.2 - tsconfck: 3.1.5(typescript@5.9.0-dev.20250428) + tsconfck: 3.1.5(typescript@6.0.0-dev.20250903) unist-util-visit: 5.0.0 vfile: 6.0.3 vite: 5.4.17(@types/node@22.14.0)(sass-embedded@1.83.4)(terser@5.39.0) @@ -14362,7 +14362,7 @@ snapshots: yargs-parser: 21.1.1 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@5.9.0-dev.20250428)(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@6.0.0-dev.20250903)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -14378,7 +14378,7 @@ snapshots: - terser - typescript - astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@5.9.0-dev.20250428)(yaml@2.7.1): + astro@5.6.0(@types/node@22.14.0)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20250903)(yaml@2.7.1): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.6.1 @@ -14424,7 +14424,7 @@ snapshots: shiki: 3.2.1 tinyexec: 0.3.2 tinyglobby: 0.2.12 - tsconfck: 3.1.5(typescript@5.9.0-dev.20250428) + tsconfck: 3.1.5(typescript@6.0.0-dev.20250903) ultrahtml: 1.5.3 unist-util-visit: 5.0.0 unstorage: 1.15.0 @@ -14436,7 +14436,7 @@ snapshots: yocto-spinner: 0.2.1 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@5.9.0-dev.20250428)(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@6.0.0-dev.20250903)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -15186,13 +15186,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 - create-jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + create-jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -15521,7 +15521,7 @@ snapshots: dependencies: semver: 7.7.1 shelljs: 0.8.5 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 dset@3.1.4: {} @@ -16484,12 +16484,12 @@ snapshots: v8flags: 4.0.1 yargs: 16.2.0 - gulp-postcss@9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + gulp-postcss@9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): dependencies: fancy-log: 1.3.3 plugin-error: 1.0.1 postcss: 8.5.2 - postcss-load-config: 3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + postcss-load-config: 3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) vinyl-sourcemaps-apply: 0.2.1 transitivePeerDependencies: - ts-node @@ -17228,16 +17228,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + jest-cli@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + create-jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -17247,7 +17247,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + jest-config@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -17273,7 +17273,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.14.0 - ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428) + ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17361,10 +17361,10 @@ snapshots: '@types/node': 22.14.0 jest-util: 29.7.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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))): + 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -17518,11 +17518,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428))): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903))): dependencies: ansi-escapes: 6.2.1 chalk: 5.4.1 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -17553,12 +17553,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)) + jest-cli: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18993,13 +18993,13 @@ snapshots: csso: 5.0.5 postcss: 8.5.2 - postcss-load-config@3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428)): + postcss-load-config@3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.2 - ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428) + ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903) postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(yaml@2.7.1): dependencies: @@ -19341,9 +19341,9 @@ snapshots: - bufferutil - utf-8-validate - react-docgen-typescript@2.2.2(typescript@5.9.0-dev.20250428): + react-docgen-typescript@2.2.2(typescript@6.0.0-dev.20250903): dependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 react-docgen@7.1.1: dependencies: @@ -20698,9 +20698,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@5.9.0-dev.20250428): + ts-api-utils@1.4.3(typescript@6.0.0-dev.20250903): dependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 ts-dedent@2.2.0: {} @@ -20730,7 +20730,7 @@ snapshots: optionalDependencies: '@swc/core': 1.11.16 - ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@5.9.0-dev.20250428): + ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20250903): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -20744,7 +20744,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -20755,9 +20755,9 @@ snapshots: optionalDependencies: typescript: 5.8.2 - tsconfck@3.1.5(typescript@5.9.0-dev.20250428): + tsconfck@3.1.5(typescript@6.0.0-dev.20250903): optionalDependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 tsconfig-paths@4.2.0: dependencies: @@ -20901,7 +20901,7 @@ snapshots: typescript@5.8.2: {} - typescript@5.9.0-dev.20250428: {} + typescript@6.0.0-dev.20250903: {} uc.micro@2.1.0: {} @@ -21171,18 +21171,18 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@5.9.0-dev.20250428)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)): + vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20250903)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)): dependencies: '@microsoft/api-extractor': 7.52.2(@types/node@22.14.0) '@rollup/pluginutils': 5.1.4(rollup@4.39.0) '@volar/typescript': 2.4.12 - '@vue/language-core': 2.2.0(typescript@5.9.0-dev.20250428) + '@vue/language-core': 2.2.0(typescript@6.0.0-dev.20250903) compare-versions: 6.1.1 debug: 4.4.0 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 optionalDependencies: vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) transitivePeerDependencies: @@ -21242,11 +21242,11 @@ snapshots: optionalDependencies: vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) - vitest-fetch-mock@0.4.5(vitest@3.1.1): + vitest-fetch-mock@0.4.5(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)): dependencies: vitest: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1) - vitest-mock-extended@2.0.2(typescript@5.8.2)(vitest@3.1.1): + vitest-mock-extended@2.0.2(typescript@5.8.2)(vitest@3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(@vitest/browser@3.1.1)(@vitest/ui@3.1.1)(jiti@2.4.2)(jsdom@25.0.1)(sass-embedded@1.83.4)(terser@5.39.0)(yaml@2.7.1)): dependencies: ts-essentials: 10.0.4(typescript@5.8.2) typescript: 5.8.2 @@ -21750,9 +21750,9 @@ snapshots: dependencies: zod: 3.24.2 - zod-to-ts@1.2.0(typescript@5.9.0-dev.20250428)(zod@3.24.2): + zod-to-ts@1.2.0(typescript@6.0.0-dev.20250903)(zod@3.24.2): dependencies: - typescript: 5.9.0-dev.20250428 + typescript: 6.0.0-dev.20250903 zod: 3.24.2 zod@3.22.4: {} From a26514b7c25d45e056dea8a25794e13e7f6b9da8 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 3 Sep 2025 19:00:47 -0500 Subject: [PATCH 04/40] Try to increase max-old-space-size to workaround Github CI memory issue. --- .github/workflows/_terraform-plan-pr-comment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/_terraform-plan-pr-comment.yml b/.github/workflows/_terraform-plan-pr-comment.yml index 4e7dc4ea..36f0e036 100644 --- a/.github/workflows/_terraform-plan-pr-comment.yml +++ b/.github/workflows/_terraform-plan-pr-comment.yml @@ -72,7 +72,7 @@ jobs: - name: Build Terraform configuration shell: bash - run: pnpm turbo run --filter @flexion/forms-infra-cdktf build + run: NODE_OPTIONS=--max-old-space-size=6144 pnpm turbo run --filter @flexion/forms-infra-cdktf build - name: Get Terraform stack name id: get_stack_name From 33529d5d3b27a28252c99029b775325b6c471a6b Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Thu, 4 Sep 2025 14:59:30 -0500 Subject: [PATCH 05/40] Comment out unnecessary github actions --- .github/workflows/_validate.yml | 20 +++++++++---------- .../workflows/add-terraform-plan-to-pr.yml | 17 ++++++++-------- .github/workflows/release.yml | 20 ++++++++----------- .github/workflows/run-tests.yml | 6 +++--- 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/.github/workflows/_validate.yml b/.github/workflows/_validate.yml index cc6331ec..c94e99f4 100644 --- a/.github/workflows/_validate.yml +++ b/.github/workflows/_validate.yml @@ -96,16 +96,16 @@ jobs: with: terraform_version: '1.10.4' - - name: Initialize Terraform CDK configuration - shell: bash - working-directory: infra/cdktf - run: | - pnpm cdktf get - pnpm build:tsc - - - name: Typecheck source code - shell: bash - run: pnpm typecheck + # - name: Initialize Terraform CDK configuration + # shell: bash + # working-directory: infra/cdktf + # run: | + # pnpm cdktf get + # pnpm build:tsc + + # - name: Typecheck source code + # shell: bash + # run: pnpm typecheck # - name: Vitest Coverage Report # if: always() diff --git a/.github/workflows/add-terraform-plan-to-pr.yml b/.github/workflows/add-terraform-plan-to-pr.yml index 818df188..18daf9bd 100644 --- a/.github/workflows/add-terraform-plan-to-pr.yml +++ b/.github/workflows/add-terraform-plan-to-pr.yml @@ -1,14 +1,15 @@ name: Post Terraform plan to PR comment on: - pull_request: - branches: - - demo - - main - types: - - opened - - synchronize - - reopened + workflow_dispatch: + # pull_request: + # branches: + # - demo + # - main + # types: + # - opened + # - synchronize + # - reopened jobs: add-terraform-plan-to-demo-pr: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0601b85c..d665f1b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,10 +4,6 @@ on: push: branches: - main - inputs: - playwright-version: - description: "Set the Playwright version" - default: "1.51.1" concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -47,11 +43,11 @@ jobs: - name: Build packages run: pnpm run build - - name: Create Release Pull Request or Publish to npm - id: changesets - uses: changesets/action@v1 - with: - publish: pnpm release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # - name: Create Release Pull Request or Publish to npm + # id: changesets + # uses: changesets/action@v1 + # with: + # publish: pnpm release + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 63742921..f982e064 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -9,6 +9,6 @@ on: jobs: run-tests: uses: ./.github/workflows/_validate.yml - e2e: - uses: ./.github/workflows/_end-to-end.yml - secrets: inherit \ No newline at end of file + # e2e: + # uses: ./.github/workflows/_end-to-end.yml + # secrets: inherit From 9a66e48c0b71d5d32d1fb06d54acc3e03f182005 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Tue, 9 Sep 2025 12:51:40 -0500 Subject: [PATCH 06/40] Add public config for Github npm registry. --- apps/cli/package.json | 3 +++ apps/sandbox/package.json | 3 +++ apps/server-doj/package.json | 3 +++ apps/spotlight/package.json | 3 +++ infra/aws-cdk/package.json | 3 +++ infra/cdktf/package.json | 3 +++ infra/core/package.json | 3 +++ packages/auth/package.json | 3 +++ packages/common/package.json | 3 +++ packages/database/package.json | 3 +++ packages/design/package.json | 3 +++ packages/forms/package.json | 3 +++ packages/server/package.json | 3 +++ 13 files changed, 39 insertions(+) diff --git a/apps/cli/package.json b/apps/cli/package.json index 8ff0d183..b4ee0133 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -5,6 +5,9 @@ "type": "module", "license": "CC0", "main": "src/index.ts", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsup src/* --format esm", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index 27767cf9..4b90817a 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -6,6 +6,9 @@ "license": "CC0", "main": "src/index.ts", "private": true, + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsup src/* --format esm", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index b9ad882f..45cd8662 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -6,6 +6,9 @@ "license": "CC0", "main": "src/index.ts", "private": true, + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsup src/* --format esm", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index 778a6336..feaa0492 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -3,6 +3,9 @@ "type": "module", "version": "0.1.3", "private": true, + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "astro": "astro", "build": "astro build", diff --git a/infra/aws-cdk/package.json b/infra/aws-cdk/package.json index 09fdfca7..cd289f08 100644 --- a/infra/aws-cdk/package.json +++ b/infra/aws-cdk/package.json @@ -1,6 +1,9 @@ { "name": "@flexion/forms-infra-aws-cdk", "version": "0.1.12", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "bin": { "aws-cdk": "bin/aws-cdk.js", "forms-apply-stack": "bin/forms-apply-stack", diff --git a/infra/cdktf/package.json b/infra/cdktf/package.json index 4c943e55..4a0c1183 100644 --- a/infra/cdktf/package.json +++ b/infra/cdktf/package.json @@ -4,6 +4,9 @@ "description": "10x Forms Platform Terraform CDK", "main": "src/index.js", "types": "src/index.ts", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "echo $PATH && pnpm build:tsc && pnpm build:synth", "build:get": "cdktf get", diff --git a/infra/core/package.json b/infra/core/package.json index 088e7efe..8d664239 100644 --- a/infra/core/package.json +++ b/infra/core/package.json @@ -6,6 +6,9 @@ "license": "CC0", "main": "dist/index.js", "types": "dist/index.d.js", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsc", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/packages/auth/package.json b/packages/auth/package.json index e9a0cbbf..c5be4e9c 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -6,6 +6,9 @@ "license": "CC0", "main": "dist/index.js", "types": "dist/index.d.js", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsc", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/packages/common/package.json b/packages/common/package.json index 11e627fd..cb6947c8 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -6,6 +6,9 @@ "license": "CC0", "main": "dist/index.js", "types": "dist/index.d.ts", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "tsc", "clean": "rimraf dist tsconfig.tsbuildinfo coverage", diff --git a/packages/database/package.json b/packages/database/package.json index ea88b39e..f87ac9e5 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -7,6 +7,9 @@ "main": "dist/cjs/index.js", "module": "dist/esm/index.js", "types": "dist/types/index.d.ts", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "exports": { ".": { "types": "./dist/types/index.d.ts", diff --git a/packages/design/package.json b/packages/design/package.json index e7ee6d2a..82ec657a 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -3,6 +3,9 @@ "version": "0.1.2", "main": "src/index.ts", "type": "module", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "build": "run-p build:lib build:styles && pnpm build:storybook", "build:lib": "vite build", diff --git a/packages/forms/package.json b/packages/forms/package.json index 61588205..9fbb9775 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -7,6 +7,9 @@ "main": "dist/cjs/index.js", "module": "dist/esm/index.js", "types": "dist/types/index.d.ts", + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "exports": { ".": { "types": "./dist/types/index.d.ts", diff --git a/packages/server/package.json b/packages/server/package.json index 9e678379..7c068323 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -7,6 +7,9 @@ "files": [ "dist" ], + "publishConfig": { + "registry": "https://npm.pkg.github.com" + }, "scripts": { "astro": "astro", "build": "astro check && astro build && pnpm build:handler", From 0a171f1f8446d34a5b2385862ee0190ded5cde1f Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Tue, 9 Sep 2025 12:56:16 -0500 Subject: [PATCH 07/40] Initial release of Flexion Forms --- .changeset/odd-turtles-end.md | 18 ++++++++++++++++++ .changeset/old-wolves-speak.md | 8 -------- apps/cli/CHANGELOG.md | 9 +++++++++ apps/cli/package.json | 2 +- apps/sandbox/CHANGELOG.md | 8 ++++++++ apps/sandbox/package.json | 2 +- apps/server-doj/CHANGELOG.md | 8 ++++++++ apps/server-doj/package.json | 2 +- apps/spotlight/CHANGELOG.md | 9 +++++++++ apps/spotlight/package.json | 2 +- e2e/CHANGELOG.md | 8 ++++++++ e2e/package.json | 2 +- infra/aws-cdk/CHANGELOG.md | 6 ++++++ infra/aws-cdk/package.json | 2 +- infra/cdktf/CHANGELOG.md | 6 ++++++ infra/cdktf/package.json | 2 +- infra/core/CHANGELOG.md | 8 ++++++++ infra/core/package.json | 2 +- packages/auth/CHANGELOG.md | 8 ++++++++ packages/auth/package.json | 2 +- packages/common/CHANGELOG.md | 6 ++++++ packages/common/package.json | 2 +- packages/database/CHANGELOG.md | 7 +++++++ packages/database/package.json | 2 +- packages/design/CHANGELOG.md | 9 +++++++++ packages/design/package.json | 2 +- packages/forms/CHANGELOG.md | 8 ++++++++ packages/forms/package.json | 2 +- packages/server/CHANGELOG.md | 11 +++++++++++ packages/server/package.json | 2 +- 30 files changed, 143 insertions(+), 22 deletions(-) create mode 100644 .changeset/odd-turtles-end.md delete mode 100644 .changeset/old-wolves-speak.md diff --git a/.changeset/odd-turtles-end.md b/.changeset/odd-turtles-end.md new file mode 100644 index 00000000..f7549c2c --- /dev/null +++ b/.changeset/odd-turtles-end.md @@ -0,0 +1,18 @@ +--- +'@flexion/forms-cli': minor +'@flexion/forms-sandbox': minor +'@flexion/forms-server-doj': minor +'@flexion/forms-spotlight': minor +'@flexion/forms-e2e': minor +'@flexion/forms-infra-aws-cdk': minor +'@flexion/forms-infra-cdktf': minor +'@flexion/forms-infra-core': minor +'@flexion/forms-auth': minor +'@flexion/forms-common': minor +'@flexion/forms-database': minor +'@flexion/forms-design': minor +'@flexion/forms-core': minor +'@flexion/forms-server': minor +--- + +Initial Flexion Forms release diff --git a/.changeset/old-wolves-speak.md b/.changeset/old-wolves-speak.md deleted file mode 100644 index f5379a1e..00000000 --- a/.changeset/old-wolves-speak.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@flexion/forms-cli": patch -"@flexion/forms-e2e": patch -"@flexion/forms-common": patch -"@flexion/forms-design": patch ---- - -Change end-to-end tests to run against server rendered app diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index 1a7edeea..b6f14749 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @gsa-tts/forms-cli +## 0.1.5 + +### Patch Changes + +- bbd065d: Change end-to-end tests to run against server rendered app + - @flexion/forms-infra-core@0.1.5 + - @flexion/forms-auth@0.1.3 + - @flexion/forms-database@0.1.3 + ## 0.1.4 ### Patch Changes diff --git a/apps/cli/package.json b/apps/cli/package.json index b4ee0133..c44d363f 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-cli", - "version": "0.1.4", + "version": "0.1.5", "description": "10x Forms Platform command-line interface", "type": "module", "license": "CC0", diff --git a/apps/sandbox/CHANGELOG.md b/apps/sandbox/CHANGELOG.md index 19adc05c..f8cef7cf 100644 --- a/apps/sandbox/CHANGELOG.md +++ b/apps/sandbox/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-server-doj +## 0.1.5 + +### Patch Changes + +- @flexion/forms-infra-core@0.1.5 +- @flexion/forms-database@0.1.3 +- @flexion/forms-server@0.1.3 + ## 0.1.4 ### Patch Changes diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index 4b90817a..3dbc9abb 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-sandbox", - "version": "0.1.4", + "version": "0.1.5", "description": "Form server sandbox for evaluating functionality.", "type": "module", "license": "CC0", diff --git a/apps/server-doj/CHANGELOG.md b/apps/server-doj/CHANGELOG.md index 19adc05c..f8cef7cf 100644 --- a/apps/server-doj/CHANGELOG.md +++ b/apps/server-doj/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-server-doj +## 0.1.5 + +### Patch Changes + +- @flexion/forms-infra-core@0.1.5 +- @flexion/forms-database@0.1.3 +- @flexion/forms-server@0.1.3 + ## 0.1.4 ### Patch Changes diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index 45cd8662..ced39f3b 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-server-doj", - "version": "0.1.4", + "version": "0.1.5", "description": "Form server instance for DOJ", "type": "module", "license": "CC0", diff --git a/apps/spotlight/CHANGELOG.md b/apps/spotlight/CHANGELOG.md index 5b6323fb..ed1057ce 100644 --- a/apps/spotlight/CHANGELOG.md +++ b/apps/spotlight/CHANGELOG.md @@ -1,5 +1,14 @@ # @gsa-tts/forms-spotlight +## 0.1.4 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-design@0.1.3 + - @flexion/forms-core@0.1.3 + ## 0.1.3 ### Patch Changes diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index feaa0492..e35eff16 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-spotlight", "type": "module", - "version": "0.1.3", + "version": "0.1.4", "private": true, "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/e2e/CHANGELOG.md b/e2e/CHANGELOG.md index bfe2a953..571ee43b 100644 --- a/e2e/CHANGELOG.md +++ b/e2e/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-e2e +## 0.1.4 + +### Patch Changes + +- bbd065d: Change end-to-end tests to run against server rendered app +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + ## 0.1.3 ### Patch Changes diff --git a/e2e/package.json b/e2e/package.json index 4f763b86..a330aa35 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-e2e", - "version": "0.1.3", + "version": "0.1.4", "private": true, "scripts": { "auth": "pnpm --filter=@flexion/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env", diff --git a/infra/aws-cdk/CHANGELOG.md b/infra/aws-cdk/CHANGELOG.md index 0f684ffa..006a03bb 100644 --- a/infra/aws-cdk/CHANGELOG.md +++ b/infra/aws-cdk/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-infra-aws-cdk +## 0.1.13 + +### Patch Changes + +- @flexion/forms-infra-core@0.1.5 + ## 0.1.12 ### Patch Changes diff --git a/infra/aws-cdk/package.json b/infra/aws-cdk/package.json index cd289f08..383b1b8b 100644 --- a/infra/aws-cdk/package.json +++ b/infra/aws-cdk/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-aws-cdk", - "version": "0.1.12", + "version": "0.1.13", "publishConfig": { "registry": "https://npm.pkg.github.com" }, diff --git a/infra/cdktf/CHANGELOG.md b/infra/cdktf/CHANGELOG.md index fb4563d6..d27e97da 100644 --- a/infra/cdktf/CHANGELOG.md +++ b/infra/cdktf/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-infra-cdktf +## 0.1.13 + +### Patch Changes + +- @flexion/forms-infra-aws-cdk@0.1.13 + ## 0.1.12 ### Patch Changes diff --git a/infra/cdktf/package.json b/infra/cdktf/package.json index 4a0c1183..c1f8e21d 100644 --- a/infra/cdktf/package.json +++ b/infra/cdktf/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-cdktf", - "version": "0.1.12", + "version": "0.1.13", "description": "10x Forms Platform Terraform CDK", "main": "src/index.js", "types": "src/index.ts", diff --git a/infra/core/CHANGELOG.md b/infra/core/CHANGELOG.md index bcc8da0c..655c24b7 100644 --- a/infra/core/CHANGELOG.md +++ b/infra/core/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-infra-core +## 0.1.5 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-core@0.1.3 + ## 0.1.4 ### Patch Changes diff --git a/infra/core/package.json b/infra/core/package.json index 8d664239..732255db 100644 --- a/infra/core/package.json +++ b/infra/core/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-core", - "version": "0.1.4", + "version": "0.1.5", "description": "10x Forms Platform core infrastructure management", "type": "module", "license": "CC0", diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md index 847fd578..fc3358f8 100644 --- a/packages/auth/CHANGELOG.md +++ b/packages/auth/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-auth +## 0.1.3 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-database@0.1.3 + ## 0.1.2 ### Patch Changes diff --git a/packages/auth/package.json b/packages/auth/package.json index c5be4e9c..14fc8e4b 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-auth", - "version": "0.1.2", + "version": "0.1.3", "description": "10x Forms Platform auth module", "type": "module", "license": "CC0", diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index ddf20648..1498e7af 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-common +## 0.1.3 + +### Patch Changes + +- bbd065d: Change end-to-end tests to run against server rendered app + ## 0.1.2 ### Patch Changes diff --git a/packages/common/package.json b/packages/common/package.json index cb6947c8..1733d972 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-common", - "version": "0.1.2", + "version": "0.1.3", "description": "10x Forms Platform shared resources", "type": "module", "license": "CC0", diff --git a/packages/database/CHANGELOG.md b/packages/database/CHANGELOG.md index 985ab384..7a557439 100644 --- a/packages/database/CHANGELOG.md +++ b/packages/database/CHANGELOG.md @@ -1,5 +1,12 @@ # @gsa-tts/forms-database +## 0.1.3 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + ## 0.1.2 ### Patch Changes diff --git a/packages/database/package.json b/packages/database/package.json index f87ac9e5..5e1f13e1 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-database", - "version": "0.1.2", + "version": "0.1.3", "description": "10x Forms Platform database", "type": "module", "license": "CC0", diff --git a/packages/design/CHANGELOG.md b/packages/design/CHANGELOG.md index 28403260..a404f582 100644 --- a/packages/design/CHANGELOG.md +++ b/packages/design/CHANGELOG.md @@ -1,5 +1,14 @@ # @gsa-tts/forms-design +## 0.1.3 + +### Patch Changes + +- bbd065d: Change end-to-end tests to run against server rendered app +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-core@0.1.3 + ## 0.1.2 ### Patch Changes diff --git a/packages/design/package.json b/packages/design/package.json index 82ec657a..aad147b0 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-design", - "version": "0.1.2", + "version": "0.1.3", "main": "src/index.ts", "type": "module", "publishConfig": { diff --git a/packages/forms/CHANGELOG.md b/packages/forms/CHANGELOG.md index 9d9d703c..c36e3442 100644 --- a/packages/forms/CHANGELOG.md +++ b/packages/forms/CHANGELOG.md @@ -1,5 +1,13 @@ # @gsa-tts/forms-core +## 0.1.3 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-database@0.1.3 + ## 0.1.2 ### Patch Changes diff --git a/packages/forms/package.json b/packages/forms/package.json index 9fbb9775..fd64f874 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-core", - "version": "0.1.2", + "version": "0.1.3", "description": "10x Forms Platform form handling", "type": "module", "license": "CC0", diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index c0451958..3ce773ca 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,16 @@ # @gsa-tts/forms-server +## 0.1.3 + +### Patch Changes + +- Updated dependencies [bbd065d] + - @flexion/forms-common@0.1.3 + - @flexion/forms-design@0.1.3 + - @flexion/forms-auth@0.1.3 + - @flexion/forms-database@0.1.3 + - @flexion/forms-core@0.1.3 + ## 0.1.2 ### Patch Changes diff --git a/packages/server/package.json b/packages/server/package.json index 7c068323..0e06f9b1 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-server", "type": "module", - "version": "0.1.2", + "version": "0.1.3", "main": "dist/handler.js", "types": "handler.ts", "files": [ From 3747506e4adcda336862c6f270fd0cef80388f5d Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Tue, 9 Sep 2025 13:14:26 -0500 Subject: [PATCH 08/40] Uncomment changesets publish release --- .github/workflows/release.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d665f1b7..08bbc3b8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,11 +43,11 @@ jobs: - name: Build packages run: pnpm run build - # - name: Create Release Pull Request or Publish to npm - # id: changesets - # uses: changesets/action@v1 - # with: - # publish: pnpm release - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + publish: pnpm release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + #NPM_TOKEN: ${{ secrets.NPM_TOKEN }} From 52812233062842595ddab1b703d3bc72651078b5 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Tue, 9 Sep 2025 13:47:56 -0500 Subject: [PATCH 09/40] Remove tests from precommit hook for now --- .husky/pre-commit | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 8db69672..bb7884ce 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,5 @@ #!/bin/sh pnpm lint pnpm format -pnpm test:ci +echo "*** NOTE: Running tests is temporarily disabled ***" +#pnpm test:ci From eab1595adba7ad13c0f8f1c9e6d45f934910900c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 18:51:43 +0000 Subject: [PATCH 10/40] Version Packages --- .changeset/odd-turtles-end.md | 18 ------------------ apps/cli/CHANGELOG.md | 13 +++++++++++++ apps/cli/package.json | 2 +- apps/sandbox/CHANGELOG.md | 13 +++++++++++++ apps/sandbox/package.json | 2 +- apps/server-doj/CHANGELOG.md | 13 +++++++++++++ apps/server-doj/package.json | 2 +- apps/spotlight/CHANGELOG.md | 13 +++++++++++++ apps/spotlight/package.json | 2 +- e2e/CHANGELOG.md | 11 +++++++++++ e2e/package.json | 2 +- infra/aws-cdk/CHANGELOG.md | 11 +++++++++++ infra/aws-cdk/package.json | 2 +- infra/cdktf/CHANGELOG.md | 11 +++++++++++ infra/cdktf/package.json | 2 +- infra/core/CHANGELOG.md | 12 ++++++++++++ infra/core/package.json | 2 +- packages/auth/CHANGELOG.md | 12 ++++++++++++ packages/auth/package.json | 2 +- packages/common/CHANGELOG.md | 6 ++++++ packages/common/package.json | 2 +- packages/database/CHANGELOG.md | 11 +++++++++++ packages/database/package.json | 2 +- packages/design/CHANGELOG.md | 12 ++++++++++++ packages/design/package.json | 2 +- packages/forms/CHANGELOG.md | 12 ++++++++++++ packages/forms/package.json | 2 +- packages/server/CHANGELOG.md | 15 +++++++++++++++ packages/server/package.json | 2 +- 29 files changed, 179 insertions(+), 32 deletions(-) delete mode 100644 .changeset/odd-turtles-end.md diff --git a/.changeset/odd-turtles-end.md b/.changeset/odd-turtles-end.md deleted file mode 100644 index f7549c2c..00000000 --- a/.changeset/odd-turtles-end.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -'@flexion/forms-cli': minor -'@flexion/forms-sandbox': minor -'@flexion/forms-server-doj': minor -'@flexion/forms-spotlight': minor -'@flexion/forms-e2e': minor -'@flexion/forms-infra-aws-cdk': minor -'@flexion/forms-infra-cdktf': minor -'@flexion/forms-infra-core': minor -'@flexion/forms-auth': minor -'@flexion/forms-common': minor -'@flexion/forms-database': minor -'@flexion/forms-design': minor -'@flexion/forms-core': minor -'@flexion/forms-server': minor ---- - -Initial Flexion Forms release diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index b6f14749..a35d3c96 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,18 @@ # @gsa-tts/forms-cli +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-infra-core@0.2.0 + - @flexion/forms-auth@0.2.0 + - @flexion/forms-database@0.2.0 + ## 0.1.5 ### Patch Changes diff --git a/apps/cli/package.json b/apps/cli/package.json index c44d363f..10067086 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-cli", - "version": "0.1.5", + "version": "0.2.0", "description": "10x Forms Platform command-line interface", "type": "module", "license": "CC0", diff --git a/apps/sandbox/CHANGELOG.md b/apps/sandbox/CHANGELOG.md index f8cef7cf..403e2565 100644 --- a/apps/sandbox/CHANGELOG.md +++ b/apps/sandbox/CHANGELOG.md @@ -1,5 +1,18 @@ # @gsa-tts/forms-server-doj +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-infra-core@0.2.0 + - @flexion/forms-database@0.2.0 + - @flexion/forms-server@0.2.0 + ## 0.1.5 ### Patch Changes diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index 3dbc9abb..c8b5afc1 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-sandbox", - "version": "0.1.5", + "version": "0.2.0", "description": "Form server sandbox for evaluating functionality.", "type": "module", "license": "CC0", diff --git a/apps/server-doj/CHANGELOG.md b/apps/server-doj/CHANGELOG.md index f8cef7cf..403e2565 100644 --- a/apps/server-doj/CHANGELOG.md +++ b/apps/server-doj/CHANGELOG.md @@ -1,5 +1,18 @@ # @gsa-tts/forms-server-doj +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-infra-core@0.2.0 + - @flexion/forms-database@0.2.0 + - @flexion/forms-server@0.2.0 + ## 0.1.5 ### Patch Changes diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index ced39f3b..94120bac 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-server-doj", - "version": "0.1.5", + "version": "0.2.0", "description": "Form server instance for DOJ", "type": "module", "license": "CC0", diff --git a/apps/spotlight/CHANGELOG.md b/apps/spotlight/CHANGELOG.md index ed1057ce..c1b0089b 100644 --- a/apps/spotlight/CHANGELOG.md +++ b/apps/spotlight/CHANGELOG.md @@ -1,5 +1,18 @@ # @gsa-tts/forms-spotlight +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + - @flexion/forms-design@0.2.0 + - @flexion/forms-core@0.2.0 + ## 0.1.4 ### Patch Changes diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index e35eff16..2e755c54 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-spotlight", "type": "module", - "version": "0.1.4", + "version": "0.2.0", "private": true, "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/e2e/CHANGELOG.md b/e2e/CHANGELOG.md index 571ee43b..4d752e85 100644 --- a/e2e/CHANGELOG.md +++ b/e2e/CHANGELOG.md @@ -1,5 +1,16 @@ # @gsa-tts/forms-e2e +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + ## 0.1.4 ### Patch Changes diff --git a/e2e/package.json b/e2e/package.json index a330aa35..b041e75d 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-e2e", - "version": "0.1.4", + "version": "0.2.0", "private": true, "scripts": { "auth": "pnpm --filter=@flexion/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env", diff --git a/infra/aws-cdk/CHANGELOG.md b/infra/aws-cdk/CHANGELOG.md index 006a03bb..eafd1b9f 100644 --- a/infra/aws-cdk/CHANGELOG.md +++ b/infra/aws-cdk/CHANGELOG.md @@ -1,5 +1,16 @@ # @gsa-tts/forms-infra-aws-cdk +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-infra-core@0.2.0 + ## 0.1.13 ### Patch Changes diff --git a/infra/aws-cdk/package.json b/infra/aws-cdk/package.json index 383b1b8b..160cd385 100644 --- a/infra/aws-cdk/package.json +++ b/infra/aws-cdk/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-aws-cdk", - "version": "0.1.13", + "version": "0.2.0", "publishConfig": { "registry": "https://npm.pkg.github.com" }, diff --git a/infra/cdktf/CHANGELOG.md b/infra/cdktf/CHANGELOG.md index d27e97da..7f1121b5 100644 --- a/infra/cdktf/CHANGELOG.md +++ b/infra/cdktf/CHANGELOG.md @@ -1,5 +1,16 @@ # @gsa-tts/forms-infra-cdktf +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-infra-aws-cdk@0.2.0 + ## 0.1.13 ### Patch Changes diff --git a/infra/cdktf/package.json b/infra/cdktf/package.json index c1f8e21d..4a8db4fa 100644 --- a/infra/cdktf/package.json +++ b/infra/cdktf/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-cdktf", - "version": "0.1.13", + "version": "0.2.0", "description": "10x Forms Platform Terraform CDK", "main": "src/index.js", "types": "src/index.ts", diff --git a/infra/core/CHANGELOG.md b/infra/core/CHANGELOG.md index 655c24b7..3c63ea3b 100644 --- a/infra/core/CHANGELOG.md +++ b/infra/core/CHANGELOG.md @@ -1,5 +1,17 @@ # @gsa-tts/forms-infra-core +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + - @flexion/forms-core@0.2.0 + ## 0.1.5 ### Patch Changes diff --git a/infra/core/package.json b/infra/core/package.json index 732255db..0601033a 100644 --- a/infra/core/package.json +++ b/infra/core/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-infra-core", - "version": "0.1.5", + "version": "0.2.0", "description": "10x Forms Platform core infrastructure management", "type": "module", "license": "CC0", diff --git a/packages/auth/CHANGELOG.md b/packages/auth/CHANGELOG.md index fc3358f8..16e5263a 100644 --- a/packages/auth/CHANGELOG.md +++ b/packages/auth/CHANGELOG.md @@ -1,5 +1,17 @@ # @gsa-tts/forms-auth +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + - @flexion/forms-database@0.2.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/auth/package.json b/packages/auth/package.json index 14fc8e4b..d363d0f7 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-auth", - "version": "0.1.3", + "version": "0.2.0", "description": "10x Forms Platform auth module", "type": "module", "license": "CC0", diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index 1498e7af..e16ac2e2 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-common +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + ## 0.1.3 ### Patch Changes diff --git a/packages/common/package.json b/packages/common/package.json index 1733d972..48246d6f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-common", - "version": "0.1.3", + "version": "0.2.0", "description": "10x Forms Platform shared resources", "type": "module", "license": "CC0", diff --git a/packages/database/CHANGELOG.md b/packages/database/CHANGELOG.md index 7a557439..2adea410 100644 --- a/packages/database/CHANGELOG.md +++ b/packages/database/CHANGELOG.md @@ -1,5 +1,16 @@ # @gsa-tts/forms-database +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/database/package.json b/packages/database/package.json index 5e1f13e1..38ca8d0a 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-database", - "version": "0.1.3", + "version": "0.2.0", "description": "10x Forms Platform database", "type": "module", "license": "CC0", diff --git a/packages/design/CHANGELOG.md b/packages/design/CHANGELOG.md index a404f582..05041a1f 100644 --- a/packages/design/CHANGELOG.md +++ b/packages/design/CHANGELOG.md @@ -1,5 +1,17 @@ # @gsa-tts/forms-design +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + - @flexion/forms-core@0.2.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/design/package.json b/packages/design/package.json index aad147b0..fd0f0ca6 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-design", - "version": "0.1.3", + "version": "0.2.0", "main": "src/index.ts", "type": "module", "publishConfig": { diff --git a/packages/forms/CHANGELOG.md b/packages/forms/CHANGELOG.md index c36e3442..370c7db9 100644 --- a/packages/forms/CHANGELOG.md +++ b/packages/forms/CHANGELOG.md @@ -1,5 +1,17 @@ # @gsa-tts/forms-core +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-common@0.2.0 + - @flexion/forms-database@0.2.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/forms/package.json b/packages/forms/package.json index fd64f874..a9f95d20 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-core", - "version": "0.1.3", + "version": "0.2.0", "description": "10x Forms Platform form handling", "type": "module", "license": "CC0", diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index 3ce773ca..42cc2640 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,20 @@ # @gsa-tts/forms-server +## 0.2.0 + +### Minor Changes + +- 0a171f1: Initial Flexion Forms release + +### Patch Changes + +- Updated dependencies [0a171f1] + - @flexion/forms-auth@0.2.0 + - @flexion/forms-common@0.2.0 + - @flexion/forms-database@0.2.0 + - @flexion/forms-design@0.2.0 + - @flexion/forms-core@0.2.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/server/package.json b/packages/server/package.json index 0e06f9b1..22a49a9b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-server", "type": "module", - "version": "0.1.3", + "version": "0.2.0", "main": "dist/handler.js", "types": "handler.ts", "files": [ From d1abc50f5eaa0ffac2ea134c7f87c9a287b162f9 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 10 Sep 2025 09:32:57 -0500 Subject: [PATCH 11/40] Point main attribute at dist instead of src --- packages/design/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/design/package.json b/packages/design/package.json index fd0f0ca6..2a16b380 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,7 +1,8 @@ { "name": "@flexion/forms-design", "version": "0.2.0", - "main": "src/index.ts", + "main": "dist/index.js", + "types": "dist/index.d.ts", "type": "module", "publishConfig": { "registry": "https://npm.pkg.github.com" From a194e0adc9353c46b7bdedabda568a7ac1769b0d Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 10 Sep 2025 09:37:26 -0500 Subject: [PATCH 12/40] Rev design package version --- apps/sandbox/CHANGELOG.md | 6 ++++++ apps/sandbox/package.json | 2 +- apps/server-doj/CHANGELOG.md | 6 ++++++ apps/server-doj/package.json | 2 +- apps/spotlight/CHANGELOG.md | 7 +++++++ apps/spotlight/package.json | 2 +- packages/design/CHANGELOG.md | 6 ++++++ packages/design/package.json | 2 +- packages/server/CHANGELOG.md | 7 +++++++ packages/server/package.json | 2 +- 10 files changed, 37 insertions(+), 5 deletions(-) diff --git a/apps/sandbox/CHANGELOG.md b/apps/sandbox/CHANGELOG.md index 403e2565..3d6c9697 100644 --- a/apps/sandbox/CHANGELOG.md +++ b/apps/sandbox/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-server-doj +## 0.2.1 + +### Patch Changes + +- @flexion/forms-server@0.2.1 + ## 0.2.0 ### Minor Changes diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index c8b5afc1..7aa2cd17 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-sandbox", - "version": "0.2.0", + "version": "0.2.1", "description": "Form server sandbox for evaluating functionality.", "type": "module", "license": "CC0", diff --git a/apps/server-doj/CHANGELOG.md b/apps/server-doj/CHANGELOG.md index 403e2565..3d6c9697 100644 --- a/apps/server-doj/CHANGELOG.md +++ b/apps/server-doj/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-server-doj +## 0.2.1 + +### Patch Changes + +- @flexion/forms-server@0.2.1 + ## 0.2.0 ### Minor Changes diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index 94120bac..2b5507e9 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-server-doj", - "version": "0.2.0", + "version": "0.2.1", "description": "Form server instance for DOJ", "type": "module", "license": "CC0", diff --git a/apps/spotlight/CHANGELOG.md b/apps/spotlight/CHANGELOG.md index c1b0089b..8d755937 100644 --- a/apps/spotlight/CHANGELOG.md +++ b/apps/spotlight/CHANGELOG.md @@ -1,5 +1,12 @@ # @gsa-tts/forms-spotlight +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @flexion/forms-design@0.2.1 + ## 0.2.0 ### Minor Changes diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index 2e755c54..75a1fd26 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-spotlight", "type": "module", - "version": "0.2.0", + "version": "0.2.1", "private": true, "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/packages/design/CHANGELOG.md b/packages/design/CHANGELOG.md index 05041a1f..632ba79c 100644 --- a/packages/design/CHANGELOG.md +++ b/packages/design/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-design +## 0.2.1 + +### Patch Changes + +- Update main attribute in package.json + ## 0.2.0 ### Minor Changes diff --git a/packages/design/package.json b/packages/design/package.json index 2a16b380..25a29fca 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-design", - "version": "0.2.0", + "version": "0.2.1", "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index 42cc2640..21fd9905 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,12 @@ # @gsa-tts/forms-server +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @flexion/forms-design@0.2.1 + ## 0.2.0 ### Minor Changes diff --git a/packages/server/package.json b/packages/server/package.json index 22a49a9b..9f1ca880 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-server", "type": "module", - "version": "0.2.0", + "version": "0.2.1", "main": "dist/handler.js", "types": "handler.ts", "files": [ From b136dac450b1ab339327c5b280cf3bec9184558a Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 10 Sep 2025 18:53:14 -0500 Subject: [PATCH 13/40] Add static files and sass source to built package. --- packages/design/package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/design/package.json b/packages/design/package.json index 25a29fca..dc2a8e15 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -27,7 +27,9 @@ "test:watch": "pnpm onchange './**/*.{tsx,ts}' -- pnpm test:url" }, "files": [ - "dist/**/*" + "dist/**/*", + "static/**/*", + "sass/**/*" ], "size-limit": [ { From 91add5666a456aa5a1f1cbac171b73a75e6455c1 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Wed, 10 Sep 2025 18:55:20 -0500 Subject: [PATCH 14/40] Rev versions --- apps/sandbox/CHANGELOG.md | 6 ++++++ apps/sandbox/package.json | 2 +- apps/server-doj/CHANGELOG.md | 6 ++++++ apps/server-doj/package.json | 2 +- apps/spotlight/CHANGELOG.md | 7 +++++++ apps/spotlight/package.json | 2 +- packages/design/CHANGELOG.md | 6 ++++++ packages/design/package.json | 2 +- packages/server/CHANGELOG.md | 7 +++++++ packages/server/package.json | 2 +- 10 files changed, 37 insertions(+), 5 deletions(-) diff --git a/apps/sandbox/CHANGELOG.md b/apps/sandbox/CHANGELOG.md index 3d6c9697..bb9e7912 100644 --- a/apps/sandbox/CHANGELOG.md +++ b/apps/sandbox/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-server-doj +## 0.2.2 + +### Patch Changes + +- @flexion/forms-server@0.2.2 + ## 0.2.1 ### Patch Changes diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index 7aa2cd17..50f53179 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-sandbox", - "version": "0.2.1", + "version": "0.2.2", "description": "Form server sandbox for evaluating functionality.", "type": "module", "license": "CC0", diff --git a/apps/server-doj/CHANGELOG.md b/apps/server-doj/CHANGELOG.md index 3d6c9697..bb9e7912 100644 --- a/apps/server-doj/CHANGELOG.md +++ b/apps/server-doj/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-server-doj +## 0.2.2 + +### Patch Changes + +- @flexion/forms-server@0.2.2 + ## 0.2.1 ### Patch Changes diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index 2b5507e9..3e5b1351 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-server-doj", - "version": "0.2.1", + "version": "0.2.2", "description": "Form server instance for DOJ", "type": "module", "license": "CC0", diff --git a/apps/spotlight/CHANGELOG.md b/apps/spotlight/CHANGELOG.md index 8d755937..74e7df49 100644 --- a/apps/spotlight/CHANGELOG.md +++ b/apps/spotlight/CHANGELOG.md @@ -1,5 +1,12 @@ # @gsa-tts/forms-spotlight +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @flexion/forms-design@0.2.2 + ## 0.2.1 ### Patch Changes diff --git a/apps/spotlight/package.json b/apps/spotlight/package.json index 75a1fd26..5280b7e0 100644 --- a/apps/spotlight/package.json +++ b/apps/spotlight/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-spotlight", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "private": true, "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/packages/design/CHANGELOG.md b/packages/design/CHANGELOG.md index 632ba79c..c363458c 100644 --- a/packages/design/CHANGELOG.md +++ b/packages/design/CHANGELOG.md @@ -1,5 +1,11 @@ # @gsa-tts/forms-design +## 0.2.2 + +### Patch Changes + +- Include static assets and sass source in package + ## 0.2.1 ### Patch Changes diff --git a/packages/design/package.json b/packages/design/package.json index dc2a8e15..9df51537 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -1,6 +1,6 @@ { "name": "@flexion/forms-design", - "version": "0.2.1", + "version": "0.2.2", "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index 21fd9905..33bafc2d 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,12 @@ # @gsa-tts/forms-server +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @flexion/forms-design@0.2.2 + ## 0.2.1 ### Patch Changes diff --git a/packages/server/package.json b/packages/server/package.json index 9f1ca880..0239f7b4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "name": "@flexion/forms-server", "type": "module", - "version": "0.2.1", + "version": "0.2.2", "main": "dist/handler.js", "types": "handler.ts", "files": [ From d1fd0edbed7850dd205c7cc503ee5bbf7a5c7746 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Mon, 15 Sep 2025 08:47:51 -0500 Subject: [PATCH 15/40] Be more agressive about reloading the forms list --- packages/design/src/AvailableFormList/index.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/design/src/AvailableFormList/index.tsx b/packages/design/src/AvailableFormList/index.tsx index dc77108a..8d9235b1 100644 --- a/packages/design/src/AvailableFormList/index.tsx +++ b/packages/design/src/AvailableFormList/index.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { Link } from 'react-router-dom'; +import { Link, useLocation } from 'react-router-dom'; import { type FormService } from '@flexion/forms-core'; @@ -23,13 +23,20 @@ export default function AvailableFormList({ urlForFormManager: UrlForFormManager; }) { const [forms, setForms] = useState([]); - useEffect(() => { + const location = useLocation(); + + const loadForms = React.useCallback(() => { formService.getFormList().then(result => { if (result.success) { setForms(result.data); } }); - }, []); + }, [formService]); + + useEffect(() => { + loadForms(); + }, [location.pathname, location.hash, location.key, loadForms]); + return ( <>
From f3bc441ae97977acd39c1c27295d6fe49c391f95 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Mon, 15 Sep 2025 08:49:35 -0500 Subject: [PATCH 16/40] Add changeset --- .changeset/modern-facts-watch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/modern-facts-watch.md diff --git a/.changeset/modern-facts-watch.md b/.changeset/modern-facts-watch.md new file mode 100644 index 00000000..7646badb --- /dev/null +++ b/.changeset/modern-facts-watch.md @@ -0,0 +1,5 @@ +--- +'@flexion/forms-design': patch +--- + +More agressive refresh of forms list on AvailableFormList From 1eeb2f34b59b558c06626c44f2bb2733cb58ff9f Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Mon, 15 Sep 2025 09:11:42 -0500 Subject: [PATCH 17/40] Update .changeset/modern-facts-watch.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .changeset/modern-facts-watch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/modern-facts-watch.md b/.changeset/modern-facts-watch.md index 7646badb..96810128 100644 --- a/.changeset/modern-facts-watch.md +++ b/.changeset/modern-facts-watch.md @@ -2,4 +2,4 @@ '@flexion/forms-design': patch --- -More agressive refresh of forms list on AvailableFormList +More aggressive refresh of forms list on AvailableFormList From 82bb94dd03765a3e52bdcbd331cfcf26c900ad36 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Mon, 15 Sep 2025 14:19:47 -0500 Subject: [PATCH 18/40] Make form link optional (#8) --- .changeset/heavy-rooms-rule.md | 5 ++ .../design/src/AvailableFormList/index.tsx | 62 ++++++++++++------- 2 files changed, 45 insertions(+), 22 deletions(-) create mode 100644 .changeset/heavy-rooms-rule.md diff --git a/.changeset/heavy-rooms-rule.md b/.changeset/heavy-rooms-rule.md new file mode 100644 index 00000000..2c718c54 --- /dev/null +++ b/.changeset/heavy-rooms-rule.md @@ -0,0 +1,5 @@ +--- +'@flexion/forms-design': patch +--- + +Make form link in form list optional diff --git a/packages/design/src/AvailableFormList/index.tsx b/packages/design/src/AvailableFormList/index.tsx index 8d9235b1..5a438eea 100644 --- a/packages/design/src/AvailableFormList/index.tsx +++ b/packages/design/src/AvailableFormList/index.tsx @@ -10,7 +10,7 @@ type FormDetails = { title: string; description: string; }; -export type UrlForForm = (id: string) => string; +export type UrlForForm = (id: string) => string | null; export type UrlForFormManager = UrlForForm; export default function AvailableFormList({ @@ -110,27 +110,11 @@ const FormList = ({ {form.description} - + )) @@ -140,6 +124,40 @@ const FormList = ({ ); }; +const FormActions = ({ + form, + urlForForm, + urlForFormManager, +}: { + form: FormDetails; + urlForForm: UrlForForm; + urlForFormManager: UrlForFormManager; +}) => { + const formUrl = urlForForm(form.id); + + return ( +
+ {formUrl && ( + + Go to form + + )} + + Edit + + + Delete + +
+ ); +}; + const DebugTools = () => { return ( +

+ {showError && form.latestJob.errorMessage && ( +
+ Technical details +
+                      {form.latestJob.errorMessage}
+                    
+
+ )} + + + + + )} + + ); +}; + const FormActions = ({ form, urlForForm, urlForFormManager, }: { - form: FormDetails; + form: FormListItem; urlForForm: UrlForForm; urlForFormManager: UrlForFormManager; }) => { const formUrl = urlForForm(form.id); + const isProcessing = form.latestJob?.status === 'processing'; return ( ; } - const form = useBlueprint(formId, context.formService); - if (form === null) { + const { form, status, isLoading, isProcessing } = + useBlueprintWithStatus(formId, context.formService); + + if (isProcessing && status) { + return ( + + + + + + ); + } + + if (isLoading || form === null) { return
Loading...
; } + return ( formId is undefined; } - const form = useBlueprint(formId, context.formService); - if (form === null) { + const { form, status, isLoading, isProcessing } = + useBlueprintWithStatus(formId, context.formService); + + if (isProcessing && status) { + return ( + + + + + + ); + } + + if (isLoading || form === null) { return
Loading...
; } + return ( formId is undefined; } - const form = useBlueprint(formId, context.formService); - if (form === null) { + const { form, status, isLoading, isProcessing } = + useBlueprintWithStatus(formId, context.formService); + + if (isProcessing && status) { + return ( + + + + + + ); + } + + if (isLoading || form === null) { return
Loading...
; } + return ( formId is undefined; } - const form = useBlueprint(formId, context.formService); - if (form === null) { + const { form, status, isLoading, isProcessing } = + useBlueprintWithStatus(formId, context.formService); + + if (isProcessing && status) { + return ( + + + + + + ); + } + + if (isLoading || form === null) { return
Loading...
; } + const session = createFormSession(form); return ( ); } - -const useBlueprint = (formId: string | undefined, formService: FormService) => { - if (formId === undefined) { - console.error('formId is undefined'); - return null; - } - const [form, setForm] = useState(null); - useEffect(() => { - formService.getForm(formId).then(result => { - if (result.success) { - setForm(result.data); - } else { - console.error('Error loading form', result.error); - } - }); - }, []); - return form; -}; diff --git a/packages/design/src/FormManager/FormManagerLayout/FormManagerLayout.stories.tsx b/packages/design/src/FormManager/FormManagerLayout/FormManagerLayout.stories.tsx index 80c7ef0d..dbd93b80 100644 --- a/packages/design/src/FormManager/FormManagerLayout/FormManagerLayout.stories.tsx +++ b/packages/design/src/FormManager/FormManagerLayout/FormManagerLayout.stories.tsx @@ -43,7 +43,6 @@ export const Edit = { step: NavPage.edit, next: '#', back: '#', - preview: '#', }, } satisfies StoryObj; @@ -52,6 +51,5 @@ export const Publish = { step: NavPage.publish, next: '#', back: '#', - preview: '#', }, } satisfies StoryObj; diff --git a/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.stories.tsx b/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.stories.tsx new file mode 100644 index 00000000..f281991c --- /dev/null +++ b/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.stories.tsx @@ -0,0 +1,147 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { FormProcessingIndicator } from './FormProcessingIndicator.js'; + +const meta = { + title: 'FormManager/FormProcessingIndicator', + component: FormProcessingIndicator, + parameters: { + layout: 'fullscreen', + }, + tags: ['autodocs'], +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +/** + * The processing indicator shown immediately after PDF upload. + * Shows an animated spinner, progress steps, and elapsed time. + */ +export const Processing: Story = { + args: { + formId: 'test-form-123', + status: { + formId: 'test-form-123', + formStatus: 'draft', + latestJob: { + id: 'job-123', + jobType: 'import-pdf', + status: 'processing', + createdAt: new Date(Date.now() - 15000).toISOString(), // 15 seconds ago + }, + }, + }, +}; + +/** + * Processing state after 45 seconds (approaching the upper end of expected time). + */ +export const ProcessingLongRunning: Story = { + args: { + formId: 'test-form-456', + status: { + formId: 'test-form-456', + formStatus: 'draft', + latestJob: { + id: 'job-456', + jobType: 'import-pdf', + status: 'processing', + createdAt: new Date(Date.now() - 45000).toISOString(), // 45 seconds ago + }, + }, + }, +}; + +/** + * Processing state after more than a minute (exceeding expected time). + */ +export const ProcessingVeryLongRunning: Story = { + args: { + formId: 'test-form-789', + status: { + formId: 'test-form-789', + formStatus: 'draft', + latestJob: { + id: 'job-789', + jobType: 'import-pdf', + status: 'processing', + createdAt: new Date(Date.now() - 90000).toISOString(), // 90 seconds ago + }, + }, + }, +}; + +/** + * Failed processing state with generic error message. + */ +export const Failed: Story = { + args: { + formId: 'test-form-error', + status: { + formId: 'test-form-error', + formStatus: 'draft', + latestJob: { + id: 'job-error', + jobType: 'import-pdf', + status: 'failed', + createdAt: new Date(Date.now() - 30000).toISOString(), + completedAt: new Date(Date.now() - 5000).toISOString(), + }, + }, + }, +}; + +/** + * Failed processing state with specific error message. + */ +export const FailedWithMessage: Story = { + args: { + formId: 'test-form-error-msg', + status: { + formId: 'test-form-error-msg', + formStatus: 'draft', + latestJob: { + id: 'job-error-msg', + jobType: 'import-pdf', + status: 'failed', + createdAt: new Date(Date.now() - 30000).toISOString(), + completedAt: new Date(Date.now() - 5000).toISOString(), + errorMessage: + 'Unable to extract text from PDF. The document may be image-based or corrupted.', + }, + }, + }, +}; + +/** + * Completed state - component should not render anything. + */ +export const Completed: Story = { + args: { + formId: 'test-form-complete', + status: { + formId: 'test-form-complete', + formStatus: 'ready', + latestJob: { + id: 'job-complete', + jobType: 'import-pdf', + status: 'completed', + createdAt: new Date(Date.now() - 60000).toISOString(), + completedAt: new Date(Date.now() - 5000).toISOString(), + }, + }, + }, +}; + +/** + * No job state - component should not render anything. + */ +export const NoJob: Story = { + args: { + formId: 'test-form-no-job', + status: { + formId: 'test-form-no-job', + formStatus: 'draft', + }, + }, +}; diff --git a/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.tsx b/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.tsx new file mode 100644 index 00000000..76aee924 --- /dev/null +++ b/packages/design/src/FormManager/FormProcessingIndicator/FormProcessingIndicator.tsx @@ -0,0 +1,143 @@ +import React, { useState, useEffect } from 'react'; +import type { FormStatusResponse } from '@flexion/forms-core'; +import styles from './formProcessingIndicator.module.css'; + +type FormProcessingIndicatorProps = { + formId: string; + status: FormStatusResponse; +}; + +export const FormProcessingIndicator: React.FC< + FormProcessingIndicatorProps +> = ({ formId, status }) => { + const { latestJob } = status; + const [elapsedSeconds, setElapsedSeconds] = useState(0); + + // Don't show anything if no job or job is completed + if (!latestJob || latestJob.status === 'completed') { + return null; + } + + const isProcessing = latestJob.status === 'processing'; + const isFailed = latestJob.status === 'failed'; + + // Calculate elapsed time for processing jobs + useEffect(() => { + if (!isProcessing || !latestJob.createdAt) { + return; + } + + const startTime = new Date(latestJob.createdAt).getTime(); + + const updateElapsed = () => { + const now = Date.now(); + const elapsed = Math.floor((now - startTime) / 1000); + setElapsedSeconds(elapsed); + }; + + // Update immediately + updateElapsed(); + + // Then update every second + const interval = setInterval(updateElapsed, 1000); + + return () => clearInterval(interval); + }, [isProcessing, latestJob.createdAt]); + + const formatElapsedTime = (seconds: number): string => { + if (seconds < 60) { + return `${seconds} second${seconds !== 1 ? 's' : ''}`; + } + const minutes = Math.floor(seconds / 60); + const remainingSeconds = seconds % 60; + return `${minutes} minute${minutes !== 1 ? 's' : ''}, ${remainingSeconds} second${remainingSeconds !== 1 ? 's' : ''}`; + }; + + return ( +
+ ); +}; diff --git a/packages/design/src/FormManager/FormProcessingIndicator/formProcessingIndicator.module.css b/packages/design/src/FormManager/FormProcessingIndicator/formProcessingIndicator.module.css new file mode 100644 index 00000000..5aadcd9f --- /dev/null +++ b/packages/design/src/FormManager/FormProcessingIndicator/formProcessingIndicator.module.css @@ -0,0 +1,120 @@ +/* Alert container styling */ +.processingAlert { + border-left-width: 0.5rem; + box-shadow: 0 0.25rem 0.5rem rgba(0, 0, 0, 0.1); +} + +/* Main content layout */ +.processingContent { + display: flex; + align-items: flex-start; + gap: 1.5rem; + padding: 0.5rem 0; +} + +/* Spinner container and animation */ +.spinnerContainer { + flex-shrink: 0; + width: 3.5rem; + height: 3.5rem; + position: relative; +} + +.spinner { + width: 100%; + height: 100%; + animation: rotate 2s linear infinite; +} + +.spinnerTrack { + stroke: #dfe1e2; /* USWDS gray-cool-10 */ + opacity: 0.3; +} + +.spinnerProgress { + stroke: #005ea2; /* USWDS primary blue */ + stroke-linecap: round; + stroke-dasharray: 80, 200; + stroke-dashoffset: 0; + animation: dash 1.5s ease-in-out infinite; + transform-origin: center; +} + +@keyframes rotate { + 100% { + transform: rotate(360deg); + } +} + +@keyframes dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0; + } + 50% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -15; + } + 100% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -125; + } +} + +/* Text content */ +.processingText { + flex: 1; + min-width: 0; +} + +.heading { + margin-top: 0; + margin-bottom: 1rem; + color: #1b1b1b; /* USWDS ink */ +} + +/* Description text */ +.description { + margin: 0 0 1.5rem 0; + font-size: 0.9375rem; /* 15px - USWDS body size */ + line-height: 1.5; + color: #1b1b1b; /* USWDS ink */ +} + +/* Time information */ +.timeInfo { + padding: 1rem; + background-color: #f0f0f0; /* USWDS gray-cool-5 */ + border-radius: 0.25rem; + border-left: 4px solid #005ea2; +} + +.elapsedTime { + margin: 0 0 0.5rem 0; + font-size: 0.9375rem; + color: #1b1b1b; +} + +.elapsedTime strong { + font-weight: 700; +} + +.warningText { + margin: 0.5rem 0 0 0; + font-size: 0.875rem; /* 14px - USWDS small text */ + color: #b50909; /* USWDS red-warm-60v */ + font-weight: 600; +} + +/* Responsive adjustments */ +@media (max-width: 640px) { + .processingContent { + flex-direction: column; + gap: 1rem; + } + + .spinnerContainer { + width: 3rem; + height: 3rem; + } +} diff --git a/packages/design/src/FormManager/FormProcessingIndicator/index.ts b/packages/design/src/FormManager/FormProcessingIndicator/index.ts new file mode 100644 index 00000000..ad1e2f3b --- /dev/null +++ b/packages/design/src/FormManager/FormProcessingIndicator/index.ts @@ -0,0 +1 @@ +export { FormProcessingIndicator } from './FormProcessingIndicator.js'; diff --git a/packages/design/src/FormManager/hooks.ts b/packages/design/src/FormManager/hooks.ts index 34bae99b..f6b53096 100644 --- a/packages/design/src/FormManager/hooks.ts +++ b/packages/design/src/FormManager/hooks.ts @@ -18,3 +18,6 @@ export const useRouteParams = (): { pathname: location.pathname, }; }; + +export { useFormStatus } from './hooks/useFormStatus.js'; +export { useBlueprintWithStatus } from './hooks/useBlueprintWithStatus.js'; diff --git a/packages/design/src/FormManager/hooks/useBlueprintWithStatus.ts b/packages/design/src/FormManager/hooks/useBlueprintWithStatus.ts new file mode 100644 index 00000000..513c7ead --- /dev/null +++ b/packages/design/src/FormManager/hooks/useBlueprintWithStatus.ts @@ -0,0 +1,99 @@ +import { useState, useEffect, useRef } from 'react'; +import type { + Blueprint, + FormService, + FormStatusResponse, +} from '@flexion/forms-core'; +import { useFormStatus } from './useFormStatus.js'; + +type UseBlueprintWithStatusResult = { + form: Blueprint | null; + status: FormStatusResponse | null; + isLoading: boolean; + isProcessing: boolean; + error: string | null; +}; + +/** + * Combined hook that loads a form blueprint and monitors its processing status. + * Returns both the form data and status information, automatically polling + * when the form is being processed. + */ +export const useBlueprintWithStatus = ( + formId: string | undefined, + formService: FormService +): UseBlueprintWithStatusResult => { + const [form, setForm] = useState(null); + const [formError, setFormError] = useState(null); + const [formLoading, setFormLoading] = useState(true); + const previousStatusRef = useRef(null); + + const { + status, + isLoading: statusLoading, + error: statusError, + } = useFormStatus(formId, formService); + + const currentStatus = status?.latestJob?.status || null; + + // Load the form initially + useEffect(() => { + if (!formId) { + setFormLoading(false); + return; + } + + setFormLoading(true); + formService.getForm(formId).then(result => { + if (result.success) { + setForm(result.data); + setFormError(null); + } else { + console.error('Error loading form', result.error); + setFormError('Failed to load form'); + } + setFormLoading(false); + }); + }, [formId]); + + // Reload form when processing completes (transition from 'processing' to 'completed') + useEffect(() => { + const previousStatus = previousStatusRef.current; + const hasTransitionedToCompleted = + previousStatus === 'processing' && currentStatus === 'completed'; + + if (hasTransitionedToCompleted && formId) { + console.log('Processing completed, reloading form...'); + setFormLoading(true); + formService.getForm(formId).then(result => { + if (result.success) { + console.log( + 'Form reloaded successfully with patterns:', + Object.keys(result.data.patterns).length + ); + setForm(result.data); + setFormError(null); + } else { + console.error('Failed to reload form:', result.error); + setFormError('Failed to load form'); + } + setFormLoading(false); + }); + } + + // Update the previous status ref + previousStatusRef.current = currentStatus; + }, [currentStatus, formId]); + + const isProcessing = currentStatus === 'processing'; + const isLoading = formLoading || statusLoading; + const error = formError || statusError; + + return { + form, + status, + isLoading, + isProcessing, + error, + }; +}; diff --git a/packages/design/src/FormManager/hooks/useFormStatus.ts b/packages/design/src/FormManager/hooks/useFormStatus.ts new file mode 100644 index 00000000..6375d036 --- /dev/null +++ b/packages/design/src/FormManager/hooks/useFormStatus.ts @@ -0,0 +1,111 @@ +import { useState, useEffect, useRef } from 'react'; +import type { FormService, FormStatusResponse } from '@flexion/forms-core'; + +type UseFormStatusResult = { + status: FormStatusResponse | null; + isLoading: boolean; + error: string | null; + refetch: () => void; +}; + +/** + * Hook to poll form status. Automatically refreshes when form is processing. + * Stops polling when processing is complete or failed. + */ +export const useFormStatus = ( + formId: string | undefined, + formService: FormService, + options?: { + pollInterval?: number; // milliseconds, defaults to 2000 (2 seconds) + enabled?: boolean; // whether to poll, defaults to true + } +): UseFormStatusResult => { + const [status, setStatus] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const pollIntervalRef = useRef(null); + const mountedRef = useRef(true); + + const pollInterval = options?.pollInterval ?? 2000; + const enabled = options?.enabled ?? true; + + const fetchStatus = async () => { + if (!formId || !enabled) { + return; + } + + try { + const result = await formService.getFormStatus(formId); + + if (!mountedRef.current) { + return; + } + + if (result.success) { + setStatus(result.data); + setError(null); + } else { + setError(result.error.message); + } + } catch (err) { + if (!mountedRef.current) { + return; + } + setError((err as Error).message); + } finally { + if (mountedRef.current) { + setIsLoading(false); + } + } + }; + + const shouldPoll = (currentStatus: FormStatusResponse | null): boolean => { + if (!currentStatus?.latestJob) { + return false; + } + return currentStatus.latestJob.status === 'processing'; + }; + + useEffect(() => { + mountedRef.current = true; + + // Initial fetch + fetchStatus(); + + return () => { + mountedRef.current = false; + if (pollIntervalRef.current) { + clearInterval(pollIntervalRef.current); + } + }; + }, [formId, enabled]); + + // Set up polling based on status + useEffect(() => { + // Clear any existing interval + if (pollIntervalRef.current) { + clearInterval(pollIntervalRef.current); + pollIntervalRef.current = null; + } + + // Only poll if we should + if (shouldPoll(status)) { + pollIntervalRef.current = setInterval(() => { + fetchStatus(); + }, pollInterval); + } + + return () => { + if (pollIntervalRef.current) { + clearInterval(pollIntervalRef.current); + } + }; + }, [status, pollInterval, enabled]); + + return { + status, + isLoading, + error, + refetch: fetchStatus, + }; +}; diff --git a/packages/design/src/experiments/document-assembler.tsx b/packages/design/src/experiments/document-assembler.tsx deleted file mode 100644 index 55118680..00000000 --- a/packages/design/src/experiments/document-assembler.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React, { useState } from 'react'; - -import { generateDummyPDF } from '@flexion/forms-core'; - -export const downloadPdfBytes = (bytes: Uint8Array) => { - const base64 = btoa(String.fromCharCode(...bytes)); - const element = document.createElement('a'); - element.setAttribute( - 'href', - 'data:application/pdf;base64,' + encodeURIComponent(base64) - ); - element.setAttribute('download', 'sample-document.pdf'); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); -}; - -const generatePDF = async () => { - const timestamp = new Date().toISOString(); - const pdfBytes = await generateDummyPDF({ timestamp }); - downloadPdfBytes(pdfBytes); -}; - -const previewPDF = async (setPreviewPdfUrl: (url: string) => void) => { - const timestamp = new Date().toISOString(); - const pdfBytes = await generateDummyPDF({ timestamp }); - const pdfBlob = new Blob([pdfBytes], { type: 'application/pdf' }); - setPreviewPdfUrl(URL.createObjectURL(pdfBlob)); -}; - -export const DocumentAssembler = () => { - const [previewPdfUrl, setPreviewPdfUrl] = useState(); - return ( -
- - -
- {previewPdfUrl ? ( - - ) : null} -
-
- ); -}; diff --git a/apps/cli/__fixtures__/ai-cache/8f/8fd9b9039c736540e0f3becade55e2d36a3d5afe3f448c8efdb86b10525cdfd4.json b/packages/forms/fixtures/ai-cache/8f/8fd9b9039c736540e0f3becade55e2d36a3d5afe3f448c8efdb86b10525cdfd4.json similarity index 100% rename from apps/cli/__fixtures__/ai-cache/8f/8fd9b9039c736540e0f3becade55e2d36a3d5afe3f448c8efdb86b10525cdfd4.json rename to packages/forms/fixtures/ai-cache/8f/8fd9b9039c736540e0f3becade55e2d36a3d5afe3f448c8efdb86b10525cdfd4.json diff --git a/packages/forms/fixtures/ai-cache/a3/a353b2de50409d3a56d22762b1d1a46dde3065a938de55877960826eff5c2b01.json b/packages/forms/fixtures/ai-cache/a3/a353b2de50409d3a56d22762b1d1a46dde3065a938de55877960826eff5c2b01.json new file mode 100644 index 00000000..2c34744a --- /dev/null +++ b/packages/forms/fixtures/ai-cache/a3/a353b2de50409d3a56d22762b1d1a46dde3065a938de55877960826eff5c2b01.json @@ -0,0 +1,399 @@ +{ + "object": { + "form_summary": { + "title": "Application for Certificate of Pardon for Marijuana Offenses", + "description": "Apply for a certificate of pardon for federal offenses of simple possession, attempted possession, or use of marijuana under presidential proclamations." + }, + "pages": [ + { + "title": "Introduction", + "elements": [ + { + "component_type": "rich_text", + "text": "

Application for Certificate of Pardon for Marijuana Offenses

On October 6, 2022, and December 22, 2023, President Biden issued presidential proclamations pardoning federal and D.C. offenses for simple marijuana possession, attempted possession, and use.

How a Pardon Can Help You

A pardon is an expression of the President's forgiveness. It does not mean you are innocent or expunge your conviction, but it does remove civil disabilities such as restrictions on voting, holding office, or serving on a jury. It may also help with obtaining licenses, bonding, or employment.

You Qualify If:

  • On or before December 22, 2023, you were charged with or convicted of simple possession, attempted possession, or use of marijuana under federal code, D.C. code, or Code of Federal Regulations
  • You were a U.S. citizen or lawfully present in the United States at the time of the offense
  • You were a U.S. citizen or lawful permanent resident on December 22, 2023
" + }, + { + "component_type": "rich_text", + "text": "

What You'll Need

About You: Personal details including name, citizenship status, and contact information (mailing address and/or email).

About the Charge or Conviction: Whether it was a charge or conviction, court district, date, and if possible, case information (docket number, code section) and supporting documents.

Important: Submit a separate form for each conviction or charge. Without complete information, we cannot guarantee we can determine your eligibility.

" + }, + { + "component_type": "paragraph", + "text": "The estimated time to complete this application is 120 minutes. Information regarding gender, race, or ethnicity is optional and will not affect processing." + } + ] + }, + { + "title": "Personal Information", + "elements": [ + { + "component_type": "paragraph", + "text": "Provide your current legal name." + }, + { + "component_type": "fieldset", + "legend": "Current Name", + "fields": [ + { + "component_type": "text_input", + "id": "Fst Name 1", + "label": "First Name", + "required": true + }, + { + "component_type": "text_input", + "id": "Mid Name 1", + "label": "Middle Name", + "required": false + }, + { + "component_type": "text_input", + "id": "Lst Name 1", + "label": "Last Name", + "required": true + } + ] + }, + { + "component_type": "paragraph", + "text": "If your name was different at the time of conviction, provide that name below." + }, + { + "component_type": "fieldset", + "legend": "Name at Conviction (if different)", + "fields": [ + { + "component_type": "text_input", + "id": "Conv Fst Name", + "label": "First Name", + "required": false + }, + { + "component_type": "text_input", + "id": "Conv Mid Name", + "label": "Middle Name", + "required": false + }, + { + "component_type": "text_input", + "id": "Conv Lst Name", + "label": "Last Name", + "required": false + } + ] + }, + { + "component_type": "text_input", + "id": "Date of Birth", + "label": "Date of Birth (MM/DD/YYYY)", + "required": true + }, + { + "component_type": "text_input", + "id": "Gender", + "label": "Gender (optional)", + "required": false + } + ] + }, + { + "title": "Contact Information", + "elements": [ + { + "component_type": "paragraph", + "text": "Provide your mailing address and/or email address. We strongly recommend including an email address for faster communication." + }, + { + "component_type": "fieldset", + "legend": "Mailing Address", + "fields": [ + { + "component_type": "text_input", + "id": "Address", + "label": "Street Address (number, street, apartment/unit)", + "required": false + }, + { + "component_type": "text_input", + "id": "City", + "label": "City", + "required": false + }, + { + "component_type": "text_input", + "id": "State", + "label": "State", + "required": false + }, + { + "component_type": "text_input", + "id": "Zip Code", + "label": "ZIP Code", + "required": false + } + ] + }, + { + "component_type": "text_input", + "id": "Email Address", + "label": "Email Address", + "required": false + }, + { + "component_type": "text_input", + "id": "Phone Number", + "label": "Phone Number", + "required": false + } + ] + }, + { + "title": "Demographics", + "elements": [ + { + "component_type": "paragraph", + "text": "The following demographic information is optional and will not affect the processing of your application." + }, + { + "component_type": "radio_group", + "id": "Ethnicity.undefined", + "legend": "Are you Hispanic or Latino?", + "options": [ + { + "id": "Ethnicity.0", + "label": "Yes", + "name": "Ethnicity.undefined", + "default_checked": false + }, + { + "id": "Ethnicity.1", + "label": "No", + "name": "Ethnicity.undefined", + "default_checked": false + } + ] + }, + { + "component_type": "checkbox_group", + "legend": "Race (check all that apply)", + "options": [ + { + "id": "Nat Amer", + "label": "Alaska Native or American Indian", + "default_checked": false + }, + { + "id": "Asian", + "label": "Asian", + "default_checked": false + }, + { + "id": "Blck Amer", + "label": "Black or African American", + "default_checked": false + }, + { + "id": "Nat Haw Islander", + "label": "Native Hawaiian or Other Pacific Islander", + "default_checked": false + }, + { + "id": "White", + "label": "White", + "default_checked": false + }, + { + "id": "Other", + "label": "Other", + "default_checked": false + } + ] + } + ] + }, + { + "title": "Citizenship and Residency", + "elements": [ + { + "component_type": "paragraph", + "text": "Select your citizenship or residency status. If you are a naturalized citizen or lawful permanent resident, provide the relevant dates and documentation numbers." + }, + { + "component_type": "radio_group", + "id": "Citizenship.undefined", + "legend": "Citizenship or Residency Status", + "options": [ + { + "id": "Citizenship.0", + "label": "U.S. citizen by birth", + "name": "Citizenship.undefined", + "default_checked": false + }, + { + "id": "Citizenship.1", + "label": "U.S. naturalized citizen", + "name": "Citizenship.undefined", + "default_checked": false + }, + { + "id": "Citizenship.2", + "label": "Lawful Permanent Resident", + "name": "Citizenship.undefined", + "default_checked": false + } + ] + }, + { + "component_type": "text_input", + "id": "Naturalization Date_af_date", + "label": "Date Naturalization Granted (if applicable)", + "required": false + }, + { + "component_type": "text_input", + "id": "Residency Date_af_date", + "label": "Date Residency Granted (if applicable)", + "required": false + }, + { + "component_type": "text_input", + "id": "A-Number", + "label": "Alien Registration Number (A-Number), Certificate of Naturalization Number, or Citizenship Number (if applicable)", + "required": false + } + ] + }, + { + "title": "Conviction Information", + "elements": [ + { + "component_type": "paragraph", + "text": "Complete this section if you were CONVICTED of simple possession, attempted possession, or use of marijuana. Provide the conviction date, court information, docket number, and code section." + }, + { + "component_type": "text_input", + "id": "Convict-Date_af_date", + "label": "Date of Conviction (MM/DD/YYYY)", + "required": false + }, + { + "component_type": "text_input", + "id": "US District Court", + "label": "U.S. District Court (e.g., Northern, Eastern, Southern, Western)", + "required": false + }, + { + "component_type": "text_input", + "id": "Dist State", + "label": "District of (State)", + "required": false + }, + { + "component_type": "checkbox", + "id": "D.C. Superior Court 1", + "label": "D.C. Superior Court (check if applicable instead of U.S. District Court)", + "default_checked": false + }, + { + "component_type": "text_input", + "id": "Docket No", + "label": "Docket Number", + "required": false + }, + { + "component_type": "text_input", + "id": "Code Section", + "label": "Code Section", + "required": false + } + ] + }, + { + "title": "Charge Information", + "elements": [ + { + "component_type": "paragraph", + "text": "Complete this section if you were CHARGED (but not convicted) with simple possession, attempted possession, or use of marijuana. Provide the court information, code section, and docket number." + }, + { + "component_type": "text_input", + "id": "Code Section_2", + "label": "Code Section", + "required": false + }, + { + "component_type": "text_input", + "id": "US District Court_2", + "label": "U.S. District Court (e.g., Northern, Eastern, Southern, Western)", + "required": false + }, + { + "component_type": "text_input", + "id": "District 2", + "label": "District of (State)", + "required": false + }, + { + "component_type": "checkbox", + "id": "D.C. Superior Court 2", + "label": "D.C. Superior Court (check if applicable instead of U.S. District Court)", + "default_checked": false + }, + { + "component_type": "text_input", + "id": "Docket No 2", + "label": "Docket Number", + "required": false + } + ] + }, + { + "title": "Certification and Signature", + "elements": [ + { + "component_type": "rich_text", + "text": "

Certification

With knowledge of the penalties for false statements to Federal Agencies, as provided by 18 U.S.C. § 1001, and with knowledge that this statement is submitted to affect action by the U.S. Department of Justice, I certify that:

  1. The applicant was either a U.S. citizen or lawfully present in the United States at the time of the offense.
  2. The applicant was a U.S. citizen or lawful permanent resident on December 22, 2023.
  3. The above statements, and accompanying documents, are true and complete to the best of my knowledge, information, and belief.
  4. I acknowledge that any certificate issued in reliance on the above information will be voided if the information is subsequently determined to be false.
" + }, + { + "component_type": "text_input", + "id": "App Date", + "label": "Date (MM/DD/YYYY)", + "required": true + }, + { + "component_type": "paragraph", + "text": "After completing this form, sign and submit it with any supporting documents to USPardon.Attorney@usdoj.gov or mail to: U.S. Department of Justice, Office of the Pardon Attorney, 950 Pennsylvania Avenue NW, Washington, DC 20530." + } + ] + } + ] + }, + "finishReason": "tool-calls", + "usage": { + "inputTokens": 8233, + "outputTokens": 3532, + "totalTokens": 11765, + "cachedInputTokens": 0 + }, + "warnings": [], + "providerMetadata": { + "bedrock": { + "usage": { + "cacheWriteInputTokens": 0 + }, + "isJsonResponseFromTool": true + } + }, + "response": { + "id": "aiobj-lBGkNnDR0D5WSAaylwbnO2hf", + "timestamp": "2025-10-09T05:12:43.629Z", + "modelId": "us.anthropic.claude-sonnet-4-5-20250929-v1:0", + "headers": { + "connection": "keep-alive", + "content-length": "9747", + "content-type": "application/json", + "date": "Thu, 09 Oct 2025 05:12:43 GMT", + "x-amzn-requestid": "abf19a6e-cba7-49cd-bf04-5434f3ac2a94" + } + }, + "request": {} +} \ No newline at end of file diff --git a/packages/forms/package.json b/packages/forms/package.json index 7c879d00..4347d429 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -12,19 +12,40 @@ }, "exports": { ".": { + "development": { + "types": "./src/index.ts", + "import": "./src/index.ts" + }, "types": "./dist/types/index.d.ts", "import": "./dist/esm/index.js", "require": "./dist/cjs/index.js" }, "./context": { + "development": { + "types": "./src/context/index.ts", + "import": "./src/context/index.ts" + }, "types": "./dist/types/context/index.d.ts", "import": "./dist/esm/context.js", "require": "./dist/cjs/context.js" }, "./documents/pdf/context": { + "development": { + "types": "./src/documents/pdf/context.ts", + "import": "./src/documents/pdf/context.ts" + }, "types": "./dist/types/documents/pdf/context.d.ts", "import": "./dist/esm/documents/pdf/context.js", "require": "./dist/cjs/documents/pdf/context.js" + }, + "./repository": { + "development": { + "types": "./src/repository/index.ts", + "import": "./src/repository/index.ts" + }, + "types": "./dist/types/repository/index.d.ts", + "import": "./dist/esm/repository.js", + "require": "./dist/cjs/repository.js" } }, "scripts": { diff --git a/packages/forms/rollup.config.js b/packages/forms/rollup.config.js index a6d02662..3125c2c5 100644 --- a/packages/forms/rollup.config.js +++ b/packages/forms/rollup.config.js @@ -15,6 +15,7 @@ export default { index: 'src/index.ts', context: 'src/context/index.ts', 'documents/pdf/context': 'src/documents/pdf/context.ts', + repository: 'src/repository/index.ts', }, output: [ { diff --git a/packages/forms/src/blueprint.ts b/packages/forms/src/blueprint.ts index b9c61887..5de67c96 100644 --- a/packages/forms/src/blueprint.ts +++ b/packages/forms/src/blueprint.ts @@ -710,14 +710,33 @@ export const addFormOutput = ( /** * Updates the summary of a given form with the provided summary details. + * Also updates the form-summary pattern to keep them in sync. */ export const updateFormSummary = ( form: Blueprint, summary: FormSummary ): Blueprint => { + // Find the form-summary pattern and update it + const formSummaryPatternEntry = Object.entries(form.patterns).find( + ([_, pattern]) => pattern.type === 'form-summary' + ); + + const updatedPatterns = { ...form.patterns }; + if (formSummaryPatternEntry) { + const [patternId, pattern] = formSummaryPatternEntry; + updatedPatterns[patternId] = { + ...pattern, + data: { + ...pattern.data, + ...summary, + }, + }; + } + return { ...form, summary, + patterns: updatedPatterns, }; }; diff --git a/packages/forms/src/builder/parse-form.test.ts b/packages/forms/src/builder/parse-form.test.ts index 6748256a..72a40704 100644 --- a/packages/forms/src/builder/parse-form.test.ts +++ b/packages/forms/src/builder/parse-form.test.ts @@ -139,11 +139,11 @@ describe('parseFormString', () => { '[\n' + ' {\n' + ' "code": "custom",\n' + - ' "message": "Invalid pattern",\n' + ' "path": [\n' + ' "patterns",\n' + ' "invalidPattern"\n' + - ' ]\n' + + ' ],\n' + + ' "message": "Invalid pattern"\n' + ' }\n' + ']', }); diff --git a/packages/forms/src/context/browser/form-repo.ts b/packages/forms/src/context/browser/form-repo.ts index 84fa8bef..c3bc138a 100644 --- a/packages/forms/src/context/browser/form-repo.ts +++ b/packages/forms/src/context/browser/form-repo.ts @@ -144,7 +144,7 @@ export class BrowserFormRepository implements FormRepository { addDocument(document: { fileName: string; data: Uint8Array; - extract: { parsedPdf: ParsedPdf; fields: DocumentFieldMap }; + extract?: { parsedPdf: ParsedPdf; fields: DocumentFieldMap }; }) { const documentId = crypto.randomUUID(); const data = uint8ArrayToBase64(document.data); @@ -155,7 +155,7 @@ export class BrowserFormRepository implements FormRepository { type: 'pdf', file_name: document.fileName, data, - extract: JSON.stringify(document.extract), + extract: document.extract ? JSON.stringify(document.extract) : '', }) ); return Promise.resolve( @@ -183,6 +183,33 @@ export class BrowserFormRepository implements FormRepository { data: base64ToUint8Array(json.data), }); } + + // Job methods are not supported in browser context + createFormJob(): Promise { + return Promise.resolve( + failure('Job management is not supported in browser context') + ); + } + + completeFormJob(): Promise { + return Promise.resolve( + failure('Job management is not supported in browser context') + ); + } + + failFormJob(): Promise { + return Promise.resolve( + failure('Job management is not supported in browser context') + ); + } + + getLatestFormJob(): Promise { + return Promise.resolve(success(null)); + } + + getFormJobs(): Promise { + return Promise.resolve(success([])); + } } /** diff --git a/packages/forms/src/context/index.ts b/packages/forms/src/context/index.ts index 92bb4ebf..a0e52b57 100644 --- a/packages/forms/src/context/index.ts +++ b/packages/forms/src/context/index.ts @@ -23,6 +23,7 @@ export type FormServiceContext = { repository: FormRepository; config: FormConfig; isUserLoggedIn: () => boolean; + getUserId?: () => string; parser: PdfParser; }; diff --git a/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts b/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts index 9dbdb00b..b8b3cd92 100644 --- a/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts +++ b/packages/forms/src/documents/__tests__/doj-pardon-marijuana.test.ts @@ -81,49 +81,42 @@ describe('DOJ Pardon Attorney Office - Marijuana pardon application form', () => }); }); - // Only run if AWS credentials available - const skipIfNoCredentials = process.env.AWS_ACCESS_KEY_ID ? test : test.skip; - - skipIfNoCredentials( - 'generates guided interview from PDF via Bedrock', - async () => { - const pdfBytes = await loadSamplePDF( - 'doj-pardon-marijuana/demo-application_for_certificate_of_pardon_for_simple_marijuana_possession.pdf' - ); + test('generates guided interview from PDF via Bedrock', async () => { + const pdfBytes = await loadSamplePDF( + 'doj-pardon-marijuana/demo-application_for_certificate_of_pardon_for_simple_marijuana_possession.pdf' + ); - const { createTestPdfParser } = await import('../pdf/context.js'); - const { defaultFormConfig } = await import('../../patterns/index.js'); - const parser = createTestPdfParser(); - const result = await parsePdf( - { parser, formConfig: defaultFormConfig }, - pdfBytes - ); - const { parsedPdf, fields } = result; + const { createTestPdfParser } = await import('../pdf/context.js'); + const { defaultFormConfig } = await import('../../patterns/index.js'); + const parser = createTestPdfParser(); + const result = await parsePdf( + { parser, formConfig: defaultFormConfig }, + pdfBytes + ); + const { parsedPdf, fields } = result; - // Should create valid pattern structure - expect(parsedPdf.root).toBe('root'); - expect(parsedPdf.patterns['root']).toBeDefined(); - expect(parsedPdf.errors.length).toBe(0); + // Should create valid pattern structure + expect(parsedPdf.root).toBe('root'); + expect(parsedPdf.patterns['root']).toBeDefined(); + expect(parsedPdf.errors.length).toBe(0); - // Should organize into pages - const rootPattern = parsedPdf.patterns['root'] as PageSetPattern; - expect(rootPattern.data.pages.length).toBeGreaterThan(0); + // Should organize into pages + const rootPattern = parsedPdf.patterns['root'] as PageSetPattern; + expect(rootPattern.data.pages.length).toBeGreaterThan(0); - // Should maintain field mappings - const fieldNames = Object.values(parsedPdf.outputs).map( - output => output.name - ); - expect(fieldNames.length).toBeGreaterThan(0); + // Should maintain field mappings + const fieldNames = Object.values(parsedPdf.outputs).map( + output => output.name + ); + expect(fieldNames.length).toBeGreaterThan(0); - // Should have a title and description - expect(parsedPdf.title).toBeTruthy(); - expect(parsedPdf.description).toBeTruthy(); + // Should have a title and description + expect(parsedPdf.title).toBeTruthy(); + expect(parsedPdf.description).toBeTruthy(); - // Should also extract raw field data - expect(Object.keys(fields).length).toBeGreaterThan(0); - }, - 30000 - ); // Longer timeout for LLM call + // Should also extract raw field data + expect(Object.keys(fields).length).toBeGreaterThan(0); + }, 300000); // 5 minute timeout for initial Bedrock call and caching }); const getFieldByName = (fields: DocumentFieldMap, name: string) => { diff --git a/packages/forms/src/documents/pdf/context.ts b/packages/forms/src/documents/pdf/context.ts index 07744a54..b1bad74f 100644 --- a/packages/forms/src/documents/pdf/context.ts +++ b/packages/forms/src/documents/pdf/context.ts @@ -29,19 +29,20 @@ export const createProductionPdfParser = (db: DatabaseContext): PdfParser => { * Creates a test PDF parser with filesystem-backed LLM caching (VCR pattern). * Enables "record once, replay forever" testing workflow. * - * @param cachePath - Directory path for storing cached LLM responses + * By default, uses a shared cache directory at the workspace root to ensure + * all tests and CLI tools can share cached Bedrock responses. + * + * @param cachePath - Directory path for storing cached LLM responses (defaults to workspace root) * @returns PdfParser configured for testing * * @example * ```typescript - * const parser = createTestPdfParser('__fixtures__/ai-cache'); - * // First run: records live Bedrock API response to disk - * // Subsequent runs: replays from disk, no API calls + * const parser = createTestPdfParser(); + * // First run: records live Bedrock API response to workspace root cache + * // Subsequent runs: replays from shared cache, no API calls * ``` */ -export const createTestPdfParser = ( - cachePath: string = '__fixtures__/ai-cache' -): PdfParser => { +export const createTestPdfParser = (cachePath?: string): PdfParser => { const llmContext = createTestLlmContext(cachePath); return createBedrockParser(llmContext); }; diff --git a/packages/forms/src/documents/pdf/scripts/parse-pdf-with-bedrock.ts b/packages/forms/src/documents/pdf/scripts/parse-pdf-with-bedrock.ts index 27c4b106..a4d3b69a 100644 --- a/packages/forms/src/documents/pdf/scripts/parse-pdf-with-bedrock.ts +++ b/packages/forms/src/documents/pdf/scripts/parse-pdf-with-bedrock.ts @@ -43,8 +43,8 @@ async function main() { console.log('Invoking Bedrock...'); const startTime = Date.now(); - // Use test LLM context with filesystem caching - const llmContext = createTestLlmContext('__fixtures__/ai-cache'); + // Use test LLM context with filesystem caching (shared workspace root) + const llmContext = createTestLlmContext(); const parser = createBedrockParser(llmContext); const result = await parser.parse( new Uint8Array(pdfBytes), diff --git a/packages/forms/src/index.ts b/packages/forms/src/index.ts index 9312eb9c..cf79f766 100644 --- a/packages/forms/src/index.ts +++ b/packages/forms/src/index.ts @@ -11,6 +11,11 @@ export * from './types.js'; export * from './util/base64.js'; export * from './patterns/address/jurisdictions.js'; export { type FormService, createFormService } from './services/index.js'; +export { + type FormStatusResponse, + type GetFormStatusError, +} from './services/get-form-status.js'; +export { type FormListItem } from './services/get-form-list.js'; export { defaultFormConfig, attachmentFileTypeOptions, @@ -23,10 +28,6 @@ import { type SequencePattern } from './patterns/sequence.js'; import { FieldsetPattern } from './patterns/index.js'; import { type FormSummaryPattern } from './patterns/form-summary/form-summary.js'; import { RepeaterPattern } from './patterns/index.js'; -export { - type FormRepository, - createFormsRepository, -} from './repository/index.js'; export { type FormRoute, type RouteData, diff --git a/packages/forms/src/llm/cache/backends/database.test.ts b/packages/forms/src/llm/cache/backends/database.test.ts new file mode 100644 index 00000000..f31a7cd0 --- /dev/null +++ b/packages/forms/src/llm/cache/backends/database.test.ts @@ -0,0 +1,69 @@ +import { expect, it } from 'vitest'; +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { DatabaseCache } from './database.js'; +import { testCacheSpecification } from '../cache-spec.js'; + +describeDatabase('DatabaseCache', () => { + it('passes shared cache specification', async ({ db }) => { + const cache = new DatabaseCache(db.ctx); + await testCacheSpecification(cache); + }); + + it('tracks access statistics on cache hits', async ({ + db, + }) => { + const cache = new DatabaseCache(db.ctx); + await cache.set('key', 'value'); + + const kysely = await db.ctx.getKysely(); + const initial = await kysely + .selectFrom('llm_request_cache') + .select('access_count') + .where('cache_key', '=', 'key') + .executeTakeFirst(); + + expect(initial?.access_count).toBe(1); + + // Trigger cache hit (stats update is async) + await cache.get('key'); + await new Promise(resolve => setTimeout(resolve, 100)); + + const updated = await kysely + .selectFrom('llm_request_cache') + .select('access_count') + .where('cache_key', '=', 'key') + .executeTakeFirst(); + + expect(updated?.access_count).toBe(2); + }, 10000); + + it('handles concurrent writes to same key', async ({ db }) => { + const cache = new DatabaseCache(db.ctx); + const key = 'concurrent'; + + // SQLite: sequential writes; Postgres: concurrent writes + if (db.engine === 'sqlite') { + for (let i = 0; i < 5; i++) { + await cache.set(key, `v${i}`); + } + } else { + await Promise.all( + Array.from({ length: 5 }, (_, i) => cache.set(key, `v${i}`)) + ); + } + + // Should have exactly one entry + const kysely = await db.ctx.getKysely(); + const count = await kysely + .selectFrom('llm_request_cache') + .select(kysely.fn.count('id').as('count')) + .where('cache_key', '=', key) + .executeTakeFirst(); + + expect(Number(count?.count)).toBe(1); + expect(await cache.get(key)).toMatch(/^v[0-4]$/); + }, 10000); +}); diff --git a/packages/forms/src/llm/cache/database.ts b/packages/forms/src/llm/cache/backends/database.ts similarity index 89% rename from packages/forms/src/llm/cache/database.ts rename to packages/forms/src/llm/cache/backends/database.ts index da1e55ef..96e03170 100644 --- a/packages/forms/src/llm/cache/database.ts +++ b/packages/forms/src/llm/cache/backends/database.ts @@ -1,7 +1,7 @@ import { sql } from 'kysely'; -import { type DatabaseContext } from '@flexion/forms-database'; -import type { AiRequestCache } from './types.js'; +import { type DatabaseContext, dateValue } from '@flexion/forms-database'; +import type { AiRequestCache } from '../types.js'; /** * Database-backed cache for production use. @@ -34,7 +34,7 @@ export class DatabaseCache implements AiRequestCache { async set(key: string, value: T): Promise { const kysely = await this.db.getKysely(); - const now = new Date(); + const now = dateValue(this.db.engine, new Date()); await kysely .insertInto('llm_request_cache') @@ -69,7 +69,7 @@ export class DatabaseCache implements AiRequestCache { await kysely .updateTable('llm_request_cache') .set({ - accessed_at: new Date(), + accessed_at: dateValue(this.db.engine, new Date()), access_count: sql`access_count + 1`, }) .where('cache_key', '=', key) diff --git a/packages/forms/src/llm/cache/backends/filesystem.test.ts b/packages/forms/src/llm/cache/backends/filesystem.test.ts new file mode 100644 index 00000000..682e8c22 --- /dev/null +++ b/packages/forms/src/llm/cache/backends/filesystem.test.ts @@ -0,0 +1,81 @@ +import fs from 'fs/promises'; +import os from 'os'; +import path from 'path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { FilesystemCache } from './filesystem.js'; +import { testCacheSpecification } from '../cache-spec.js'; + +describe('FilesystemCache', () => { + let tempDir: string; + let cache: FilesystemCache; + + beforeEach(async () => { + tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'cache-test-')); + cache = new FilesystemCache(tempDir); + }); + + afterEach(async () => { + await fs.rm(tempDir, { recursive: true, force: true }); + }); + + it('passes shared cache specification', async () => { + await testCacheSpecification(cache); + }); + + it('organizes cache files by prefix', async () => { + await cache.set('abcdef123', 'test-value'); + + const filePath = path.join(tempDir, 'ab', 'abcdef123.json'); + const exists = await fs + .access(filePath) + .then(() => true) + .catch(() => false); + + expect(exists).toBe(true); + }); + + it('stores JSON in minified format by default', async () => { + const key = 'minified'; + const value = { foo: 'bar', nested: { value: 123 } }; + + await cache.set(key, value); + + const filePath = path.join(tempDir, key.slice(0, 2), `${key}.json`); + const content = await fs.readFile(filePath, 'utf-8'); + + expect(content).not.toContain('\n '); + expect(JSON.parse(content)).toEqual(value); + }); + + it('stores JSON in pretty format when enabled', async () => { + const prettyCache = new FilesystemCache(tempDir, { pretty: true }); + const key = 'pretty'; + const value = { foo: 'bar' }; + + await prettyCache.set(key, value); + + const filePath = path.join(tempDir, key.slice(0, 2), `${key}.json`); + const content = await fs.readFile(filePath, 'utf-8'); + + expect(content).toContain('\n '); + expect(JSON.parse(content)).toEqual(value); + }); + + it('clear succeeds even if directory does not exist', async () => { + const nonExistentCache = new FilesystemCache( + path.join(tempDir, 'non-existent') + ); + + await expect(nonExistentCache.clear()).resolves.toBeUndefined(); + }); + + it('throws error for corrupt cache files', async () => { + const key = 'corrupt'; + const filePath = path.join(tempDir, key.slice(0, 2), `${key}.json`); + + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await fs.writeFile(filePath, 'invalid json', 'utf-8'); + + await expect(cache.get(key)).rejects.toThrow(SyntaxError); + }); +}); diff --git a/packages/forms/src/llm/cache/filesystem.ts b/packages/forms/src/llm/cache/backends/filesystem.ts similarity index 97% rename from packages/forms/src/llm/cache/filesystem.ts rename to packages/forms/src/llm/cache/backends/filesystem.ts index 8eb2bba7..d152999d 100644 --- a/packages/forms/src/llm/cache/filesystem.ts +++ b/packages/forms/src/llm/cache/backends/filesystem.ts @@ -1,6 +1,6 @@ import fs from 'fs/promises'; import path from 'path'; -import type { AiRequestCache } from './types.js'; +import type { AiRequestCache } from '../types.js'; /** * Options for configuring filesystem cache behavior. diff --git a/packages/forms/src/llm/cache/noop.ts b/packages/forms/src/llm/cache/backends/noop.ts similarity index 87% rename from packages/forms/src/llm/cache/noop.ts rename to packages/forms/src/llm/cache/backends/noop.ts index d255e592..5d5a0b6c 100644 --- a/packages/forms/src/llm/cache/noop.ts +++ b/packages/forms/src/llm/cache/backends/noop.ts @@ -1,4 +1,4 @@ -import type { AiRequestCache } from './types.js'; +import type { AiRequestCache } from '../types.js'; /** * No-operation cache that never stores or retrieves values. diff --git a/packages/forms/src/llm/cache/cache-spec.ts b/packages/forms/src/llm/cache/cache-spec.ts new file mode 100644 index 00000000..0bb6c497 --- /dev/null +++ b/packages/forms/src/llm/cache/cache-spec.ts @@ -0,0 +1,52 @@ +import { expect } from 'vitest'; +import type { AiRequestCache } from './types.js'; + +/** + * Shared specification for all cache implementations. + * Tests core functionality: get, set, clear, and basic edge cases. + */ +export async function testCacheSpecification(cache: AiRequestCache) { + // Non-existent key + expect(await cache.get('non-existent')).toBeNull(); + + // Basic string value + await cache.set('key1', 'value1'); + expect(await cache.get('key1')).toBe('value1'); + + // Complex object (tests JSON serialization) + const complexValue = { + text: 'Hello', + nested: { array: [1, 2, 3], nullValue: null, bool: true }, + }; + await cache.set('complex', complexValue); + expect(await cache.get('complex')).toEqual(complexValue); + + // Overwriting existing value + await cache.set('key1', 'updated'); + expect(await cache.get('key1')).toBe('updated'); + + // Multiple independent keys + await cache.set('a', 'value-a'); + await cache.set('b', 'value-b'); + expect(await cache.get('a')).toBe('value-a'); + expect(await cache.get('b')).toBe('value-b'); + + // Edge cases: empty string, null, zero, booleans + await cache.set('empty', ''); + await cache.set('null', null); + await cache.set('zero', 0); + await cache.set('true', true); + await cache.set('false', false); + + expect(await cache.get('empty')).toBe(''); + expect(await cache.get('null')).toBeNull(); + expect(await cache.get('zero')).toBe(0); + expect(await cache.get('true')).toBe(true); + expect(await cache.get('false')).toBe(false); + + // Clear removes all entries + await cache.clear(); + expect(await cache.get('key1')).toBeNull(); + expect(await cache.get('a')).toBeNull(); + expect(await cache.get('complex')).toBeNull(); +} diff --git a/packages/forms/src/llm/cache/hash.ts b/packages/forms/src/llm/cache/hash.ts index 42d3f295..92d12d6e 100644 --- a/packages/forms/src/llm/cache/hash.ts +++ b/packages/forms/src/llm/cache/hash.ts @@ -73,8 +73,16 @@ const sha256 = async (data: string): Promise => { /** * Computes SHA-256 hash of a buffer using Web Crypto API. */ -const sha256Buffer = async (data: Uint8Array): Promise => { - const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', data); +const sha256Buffer = async ( + data: Uint8Array | ArrayBuffer | ArrayBufferLike +): Promise => { + // Create a new Uint8Array to ensure proper ArrayBuffer backing + const bytes = data instanceof Uint8Array ? data : new Uint8Array(data); + const normalizedData = new Uint8Array(bytes); + const hashBuffer = await globalThis.crypto.subtle.digest( + 'SHA-256', + normalizedData + ); return Array.from(new Uint8Array(hashBuffer)) .map(b => b.toString(16).padStart(2, '0')) .join(''); diff --git a/packages/forms/src/llm/cache/index.ts b/packages/forms/src/llm/cache/index.ts index 039cb934..d356c18f 100644 --- a/packages/forms/src/llm/cache/index.ts +++ b/packages/forms/src/llm/cache/index.ts @@ -1,5 +1,5 @@ export type { AiRequestCache, CacheMetadata } from './types.js'; export { computeObjectCacheKey } from './hash.js'; -export { DatabaseCache } from './database.js'; -export { FilesystemCache } from './filesystem.js'; -export { NoOpCache } from './noop.js'; +export { DatabaseCache } from './backends/database.js'; +export { FilesystemCache } from './backends/filesystem.js'; +export { NoOpCache } from './backends/noop.js'; diff --git a/packages/forms/src/llm/cache/types.ts b/packages/forms/src/llm/cache/types.ts index 21b13a2c..b9f0f567 100644 --- a/packages/forms/src/llm/cache/types.ts +++ b/packages/forms/src/llm/cache/types.ts @@ -19,9 +19,9 @@ export interface AiRequestCache { /** * Clears all cached entries. - * Optional - primarily for testing. + * Primarily intended for testing. */ - clear?(): Promise; + clear(): Promise; } /** diff --git a/packages/forms/src/llm/services/context.ts b/packages/forms/src/llm/services/context.ts index 726c4b56..baab547d 100644 --- a/packages/forms/src/llm/services/context.ts +++ b/packages/forms/src/llm/services/context.ts @@ -1,8 +1,9 @@ import type { DatabaseContext } from '@flexion/forms-database'; import type { AiRequestCache } from '../cache/types.js'; -import { DatabaseCache } from '../cache/database.js'; -import { FilesystemCache } from '../cache/filesystem.js'; -import { NoOpCache } from '../cache/noop.js'; +import { DatabaseCache } from '../cache/backends/database.js'; +import { FilesystemCache } from '../cache/backends/filesystem.js'; +import { NoOpCache } from '../cache/backends/noop.js'; +import { getDefaultCachePath } from '../../util/workspace-root.js'; /** * Context for LLM operations. @@ -37,22 +38,25 @@ export const createProductionLlmContext = ( * Creates a test LLM context with filesystem-backed caching (VCR pattern). * Enables "record once, replay forever" testing workflow. * - * @param cachePath - Directory path for storing cached responses + * By default, uses a shared cache directory at the workspace root to ensure + * all tests and CLI tools can share cached responses. + * + * @param cachePath - Directory path for storing cached responses (defaults to workspace root) * @param pretty - Whether to pretty-print JSON files (default: true) * @returns LlmContext configured for testing * * @example * ```typescript - * const llmContext = createTestLlmContext('__fixtures__/ai-cache'); - * // First run: records live API response to disk - * // Subsequent runs: replays from disk, no API calls + * const llmContext = createTestLlmContext(); + * // First run: records live API response to workspace root cache + * // Subsequent runs: replays from shared cache, no API calls * ``` */ export const createTestLlmContext = ( - cachePath: string = '__fixtures__/ai-cache', + cachePath?: string, pretty: boolean = true ): LlmContext => ({ - cache: new FilesystemCache(cachePath, { pretty }), + cache: new FilesystemCache(cachePath ?? getDefaultCachePath(), { pretty }), }); /** diff --git a/packages/forms/src/patterns/phone-number/phone-number.ts b/packages/forms/src/patterns/phone-number/phone-number.ts index f01824ad..4e2f948e 100644 --- a/packages/forms/src/patterns/phone-number/phone-number.ts +++ b/packages/forms/src/patterns/phone-number/phone-number.ts @@ -22,21 +22,37 @@ export type PhoneNumberPatternOutput = z.infer< export const createPhoneSchema = (data: PhoneNumberPattern['data']) => { const phoneSchema = z .string() - .regex(/^(\d{3}-\d{3}-\d{4}|\d{10})$/, { - message: 'Invalid phone number format', + .superRefine((value, ctx) => { + // Allow empty string if not required + if (value === '' && !data.required) { + return; + } + + // Validate format + if (!/^(\d{3}-\d{3}-\d{4}|\d{10})$/.test(value)) { + ctx.addIssue({ + code: 'custom', + message: 'Invalid phone number format', + }); + return; + } + + // Validate length + const digits = value.replace(/[^\d]/g, ''); + if (digits.length !== 10) { + ctx.addIssue({ + code: 'custom', + message: 'Invalid phone number format', + }); + } }) .transform(value => { + if (value === '') { + return value; + } const digits = value.replace(/[^\d]/g, ''); return `${digits.slice(0, 3)}-${digits.slice(3, 6)}-${digits.slice(6)}`; - }) - .refine(value => { - const digits = value.replace(/[^\d]/g, ''); - return digits.length === 10; - }, 'Phone number must contain exactly 10 digits'); - - if (!data.required) { - return z.union([z.literal(''), phoneSchema]); - } + }); return phoneSchema; }; @@ -64,7 +80,7 @@ export const phoneNumberConfig: PatternConfig< return []; }, - createPrompt(_, session, pattern, options) { + createPrompt(_, session, pattern) { const sessionValue = getFormSessionValue(session, pattern.id); const sessionError = getFormSessionError(session, pattern.id); diff --git a/packages/forms/src/repository/add-document.ts b/packages/forms/src/repository/add-document.ts index 16ac29e1..ec1af5ec 100644 --- a/packages/forms/src/repository/add-document.ts +++ b/packages/forms/src/repository/add-document.ts @@ -9,7 +9,7 @@ export type AddDocument = ( document: { fileName: string; data: Uint8Array; - extract: { + extract?: { parsedPdf: ParsedPdf; fields: DocumentFieldMap; }; @@ -30,7 +30,7 @@ export const addDocument: AddDocument = async (ctx, document) => { type: 'pdf', file_name: document.fileName, data: Buffer.from(document.data), - extract: JSON.stringify(document.extract), + extract: document.extract ? JSON.stringify(document.extract) : '', }) .execute() .then(() => diff --git a/packages/forms/src/repository/form-jobs.test.ts b/packages/forms/src/repository/form-jobs.test.ts new file mode 100644 index 00000000..8a02f9d4 --- /dev/null +++ b/packages/forms/src/repository/form-jobs.test.ts @@ -0,0 +1,273 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { createFormJob } from './jobs/create-form-job.js'; +import { completeFormJob } from './jobs/complete-form-job.js'; +import { failFormJob } from './jobs/fail-form-job.js'; +import { getLatestFormJob } from './jobs/get-latest-form-job.js'; +import { getFormJobs } from './jobs/get-form-jobs.js'; +import { addForm } from './add-form.js'; +import { defaultFormConfig } from '../patterns/index.js'; + +describeDatabase('form jobs repository', getDb => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('creates a job in processing state', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form first + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create a job + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + metadata: { + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }, + }); + + if (!jobResult.success) { + console.error('Job creation failed:', jobResult.error); + expect.fail(`createFormJob failed: ${jobResult.error}`); + } + expect(jobResult.success).toBe(true); + + expect(jobResult.data.status).toBe('processing'); + expect(jobResult.data.jobType).toBe('import-pdf'); + expect(jobResult.data.formId).toBe(formResult.data.id); + expect(jobResult.data.metadata).toEqual({ + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }); + }); + + it('completes a job with result data', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create a job + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + // Complete the job + const completeResult = await completeFormJob(ctx, jobResult.data.id, { + patternsAdded: 5, + fieldsExtracted: 12, + documentId: 'doc-1', + }); + + expect(completeResult.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('completed'); + expect(latestResult.data.result).toEqual({ + patternsAdded: 5, + fieldsExtracted: 12, + documentId: 'doc-1', + }); + expect(latestResult.data.completedAt).toBeDefined(); + }); + + it('fails a job with error message', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create a job + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + // Fail the job + const failResult = await failFormJob(ctx, jobResult.data.id, { + message: 'PDF parsing failed', + stack: 'Error stack trace', + }); + + expect(failResult.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('failed'); + expect(latestResult.data.errorMessage).toBe('PDF parsing failed'); + expect(latestResult.data.errorStack).toBe('Error stack trace'); + expect(latestResult.data.completedAt).toBeDefined(); + }); + + it('returns null when no job exists', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Try to get a job that doesn't exist + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + + expect(latestResult.success).toBe(true); + if (!latestResult.success) { + expect.fail('getLatestFormJob failed'); + } + expect(latestResult.data).toBeNull(); + }); + + it('returns job history in chronological order', async ({ + db, + }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create 3 jobs with different timestamps + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 0)); + const job1 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + expect(job1.success).toBe(true); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 1)); + const job2 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + expect(job2.success).toBe(true); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 2)); + const job3 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + metadata: { + validatorVersion: '1.0', + userId: 'user-1', + }, + }); + expect(job3.success).toBe(true); + + // Get all jobs + const historyResult = await getFormJobs(ctx, formResult.data.id); + if (!historyResult.success) { + expect.fail('getFormJobs failed'); + } + + expect(historyResult.data.length).toBe(3); + + // Should be ordered newest first + expect(historyResult.data[0].createdAt.getTime()).toBeGreaterThan( + historyResult.data[1].createdAt.getTime() + ); + expect(historyResult.data[1].createdAt.getTime()).toBeGreaterThan( + historyResult.data[2].createdAt.getTime() + ); + + // Verify the last one is the validate-schema job + expect(historyResult.data[0].jobType).toBe('validate-schema'); + }); + + it('gets only the latest job of a specific type', async ({ + db, + }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create a form + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create 2 import-pdf jobs + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 0)); + await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 1)); + const job2 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!job2.success) { + expect.fail('createFormJob failed'); + } + + // Get latest import-pdf job + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + // Should be the second job + expect(latestResult.data.id).toBe(job2.data.id); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/form-jobs.ts b/packages/forms/src/repository/form-jobs.ts new file mode 100644 index 00000000..cd5d4d3d --- /dev/null +++ b/packages/forms/src/repository/form-jobs.ts @@ -0,0 +1,249 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from './index.js'; +import { dateValue } from '@flexion/forms-database'; + +// Type-safe job metadata by job type +export type JobMetadata = { + 'import-pdf': { + documentId: string; + fileName: string; + userId: string; + }; + 'validate-schema': { + validatorVersion: string; + userId: string; + }; + publish: { + targetEnvironment: 'staging' | 'production'; + publisherId: string; + }; +}; + +// Type-safe job results by job type +export type JobResult = { + 'import-pdf': { + patternsAdded: number; + fieldsExtracted: number; + documentId: string; + }; + 'validate-schema': { + errorsFound: number; + warningsFound: number; + issues: Array<{ field: string; message: string }>; + }; + publish: { + publishedAt: string; + url: string; + }; +}; + +export type JobType = keyof JobMetadata; +export type JobStatus = 'pending' | 'processing' | 'completed' | 'failed'; + +export type FormJob = { + id: string; + formId: string; + jobType: T; + status: JobStatus; + createdAt: Date; + startedAt?: Date; + completedAt?: Date; + errorMessage?: string; + errorStack?: string; + metadata?: JobMetadata[T]; + result?: JobResult[T]; +}; + +/** + * Create a new job record in 'processing' state. + * Call this before starting async work. + */ +export type CreateFormJob = ( + ctx: FormRepositoryContext, + params: { + formId: string; + jobType: T; + metadata?: JobMetadata[T]; + } +) => Promise, string>>; + +export const createFormJob: CreateFormJob = async (ctx, params) => { + const uuid = crypto.randomUUID(); + const db = await ctx.db.getKysely(); + + try { + const now = new Date(); + await db + .insertInto('form_jobs') + .values({ + id: uuid, + form_id: params.formId, + job_type: params.jobType, + status: 'processing', + created_at: dateValue(ctx.db.engine, now), + started_at: dateValue(ctx.db.engine, now), + metadata: params.metadata ? JSON.stringify(params.metadata) : null, + }) + .execute(); + + return success({ + id: uuid, + formId: params.formId, + jobType: params.jobType, + status: 'processing' as JobStatus, + createdAt: new Date(), + startedAt: new Date(), + metadata: params.metadata, + }) as any; + } catch (err) { + return failure(`Failed to create job: ${(err as Error).message}`); + } +}; + +/** + * Mark a job as completed with result data. + */ +export type CompleteFormJob = ( + ctx: FormRepositoryContext, + jobId: string, + result?: JobResult[T] +) => Promise>; + +export const completeFormJob: CompleteFormJob = async (ctx, jobId, result) => { + const db = await ctx.db.getKysely(); + + try { + await db + .updateTable('form_jobs') + .set({ + status: 'completed', + completed_at: new Date().toISOString() as any, + result: result ? JSON.stringify(result) : null, + }) + .where('id', '=', jobId) + .execute(); + + return success(undefined); + } catch (err) { + return failure(`Failed to complete job: ${(err as Error).message}`); + } +}; + +/** + * Mark a job as failed with error information. + */ +export type FailFormJob = ( + ctx: FormRepositoryContext, + jobId: string, + error: { message: string; stack?: string } +) => Promise>; + +export const failFormJob: FailFormJob = async (ctx, jobId, error) => { + const db = await ctx.db.getKysely(); + + try { + await db + .updateTable('form_jobs') + .set({ + status: 'failed', + completed_at: new Date().toISOString() as any, + error_message: error.message, + error_stack: error.stack || null, + }) + .where('id', '=', jobId) + .execute(); + + return success(undefined); + } catch (err) { + return failure(`Failed to fail job: ${(err as Error).message}`); + } +}; + +/** + * Get the latest job for a form of a specific type. + * Useful for status polling: "What's the current import-pdf job status?" + */ +export type GetLatestFormJob = ( + ctx: FormRepositoryContext, + formId: string, + jobType: T +) => Promise | null, string>>; + +export const getLatestFormJob: GetLatestFormJob = async ( + ctx, + formId, + jobType +) => { + const db = await ctx.db.getKysely(); + + try { + const row = await db + .selectFrom('form_jobs') + .selectAll() + .where('form_id', '=', formId) + .where('job_type', '=', jobType) + .orderBy('created_at', 'desc') + .limit(1) + .executeTakeFirst(); + + if (!row) { + return success(null); + } + + return success({ + id: row.id, + formId: row.form_id, + jobType: row.job_type as JobType, + status: row.status as JobStatus, + createdAt: new Date(row.created_at), + startedAt: row.started_at ? new Date(row.started_at) : undefined, + completedAt: row.completed_at ? new Date(row.completed_at) : undefined, + errorMessage: row.error_message || undefined, + errorStack: row.error_stack || undefined, + metadata: row.metadata ? JSON.parse(row.metadata) : undefined, + result: row.result ? JSON.parse(row.result) : undefined, + }) as any; + } catch (err) { + return failure(`Failed to get latest job: ${(err as Error).message}`); + } +}; + +/** + * Get all jobs for a form (full history). + * Useful for debugging and audit logs. + */ +export type GetFormJobs = ( + ctx: FormRepositoryContext, + formId: string +) => Promise>; + +export const getFormJobs: GetFormJobs = async (ctx, formId) => { + const db = await ctx.db.getKysely(); + + try { + const rows = await db + .selectFrom('form_jobs') + .selectAll() + .where('form_id', '=', formId) + .orderBy('created_at', 'desc') + .execute(); + + const jobs = rows.map(row => ({ + id: row.id, + formId: row.form_id, + jobType: row.job_type as JobType, + status: row.status as JobStatus, + createdAt: new Date(row.created_at), + startedAt: row.started_at ? new Date(row.started_at) : undefined, + completedAt: row.completed_at ? new Date(row.completed_at) : undefined, + errorMessage: row.error_message || undefined, + errorStack: row.error_stack || undefined, + metadata: row.metadata ? JSON.parse(row.metadata) : undefined, + result: row.result ? JSON.parse(row.result) : undefined, + })); + + return success(jobs as FormJob[]); + } catch (err) { + return failure(`Failed to get jobs: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/get-document.ts b/packages/forms/src/repository/get-document.ts index dd13a3b9..63d199c8 100644 --- a/packages/forms/src/repository/get-document.ts +++ b/packages/forms/src/repository/get-document.ts @@ -29,8 +29,11 @@ export const getDocument: GetDocument = async (ctx, id) => { .where('id', '=', id) .executeTakeFirstOrThrow() .then(data => { + // Handle documents without extract (stored during async processing initialization) const extract: { parsedPdf: ParsedPdf; fields: DocumentFieldMap } = - JSON.parse(data.extract); + data.extract && data.extract !== '' + ? JSON.parse(data.extract) + : { parsedPdf: {} as ParsedPdf, fields: {} }; return success({ id: data.id, data: data.data, diff --git a/packages/forms/src/repository/get-form-list.ts b/packages/forms/src/repository/get-form-list.ts index 77822733..4f7d1aa5 100644 --- a/packages/forms/src/repository/get-form-list.ts +++ b/packages/forms/src/repository/get-form-list.ts @@ -1,27 +1,70 @@ import type { FormRepositoryContext } from '.'; +import type { JobStatus } from './jobs/types.js'; -export type GetFormList = (ctx: FormRepositoryContext) => Promise< - | { - id: string; - title: string; - description: string; - }[] - | null ->; +export type FormListItem = { + id: string; + title: string; + description: string; + latestJob?: { + id: string; + jobType: string; + status: JobStatus; + createdAt: Date; + completedAt?: Date; + errorMessage?: string; + }; +}; + +export type GetFormList = ( + ctx: FormRepositoryContext +) => Promise; /** - * Retrieves a list of forms from the database. + * Retrieves a list of forms from the database with their latest job status. */ export const getFormList: GetFormList = async ctx => { const db = await ctx.db.getKysely(); - const rows = await db.selectFrom('forms').select(['id', 'data']).execute(); - - return rows.map(row => { - const form = JSON.parse(row.data); - return { - id: row.id, - title: form.summary.title, - description: form.summary.description, - }; - }); + + // Get all forms + const forms = await db.selectFrom('forms').select(['id', 'data']).execute(); + + // For each form, get the latest import-pdf job + const formList = await Promise.all( + forms.map(async row => { + const form = JSON.parse(row.data); + + // Get latest import-pdf job for this form + const latestJob = await db + .selectFrom('form_jobs') + .selectAll() + .where('form_id', '=', row.id) + .where('job_type', '=', 'import-pdf') + .orderBy('created_at', 'desc') + .limit(1) + .executeTakeFirst(); + + const formListItem: FormListItem = { + id: row.id, + title: form.summary.title, + description: form.summary.description, + }; + + if (latestJob) { + formListItem.latestJob = { + id: latestJob.id, + jobType: latestJob.job_type, + status: latestJob.status as JobStatus, + createdAt: new Date(latestJob.created_at), + completedAt: latestJob.completed_at + ? new Date(latestJob.completed_at) + : undefined, + errorMessage: latestJob.error_message || undefined, + }; + } + + return formListItem; + }) + ); + + return formList; }; diff --git a/packages/forms/src/repository/index.ts b/packages/forms/src/repository/index.ts index b09c4511..e70bc403 100644 --- a/packages/forms/src/repository/index.ts +++ b/packages/forms/src/repository/index.ts @@ -16,6 +16,18 @@ import { type UpsertFormSession, upsertFormSession, } from './upsert-form-session.js'; +import { type CreateFormJob, createFormJob } from './jobs/create-form-job.js'; +import { + type CompleteFormJob, + completeFormJob, +} from './jobs/complete-form-job.js'; +import { type FailFormJob, failFormJob } from './jobs/fail-form-job.js'; +import { + type GetLatestFormJob, + getLatestFormJob, +} from './jobs/get-latest-form-job.js'; +import { type GetFormJobs, getFormJobs } from './jobs/get-form-jobs.js'; +import { type FormJob, type JobType, type JobStatus } from './jobs/types.js'; export type { FormRepository }; @@ -24,6 +36,8 @@ export type FormRepositoryContext = { formConfig: FormConfig; }; +export { type FormJob, type JobType, type JobStatus } from './jobs/types.js'; + export const createFormsRepository = ( ctx: FormRepositoryContext ): FormRepository => @@ -37,4 +51,9 @@ export const createFormsRepository = ( getForm, saveForm, upsertFormSession, + createFormJob, + completeFormJob, + failFormJob, + getLatestFormJob, + getFormJobs, }); diff --git a/packages/forms/src/repository/jobs/complete-form-job.test.ts b/packages/forms/src/repository/jobs/complete-form-job.test.ts new file mode 100644 index 00000000..02b4db80 --- /dev/null +++ b/packages/forms/src/repository/jobs/complete-form-job.test.ts @@ -0,0 +1,104 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { completeFormJob } from './complete-form-job.js'; +import { createFormJob } from './create-form-job.js'; +import { getLatestFormJob } from './get-latest-form-job.js'; +import { addForm } from '../add-form.js'; +import { defaultFormConfig } from '../../patterns/index.js'; + +describeDatabase('completeFormJob', () => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('completes a job with result data', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + const result = await completeFormJob(ctx, jobResult.data.id, { + patternsAdded: 5, + fieldsExtracted: 12, + documentId: 'doc-1', + }); + + expect(result.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('completed'); + expect(latestResult.data.completedAt).toBeDefined(); + expect(latestResult.data.result).toEqual({ + patternsAdded: 5, + fieldsExtracted: 12, + documentId: 'doc-1', + }); + }); + + it('completes a job without result data', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + const result = await completeFormJob(ctx, jobResult.data.id); + + expect(result.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('completed'); + expect(latestResult.data.completedAt).toBeDefined(); + expect(latestResult.data.result).toBeUndefined(); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/jobs/complete-form-job.ts b/packages/forms/src/repository/jobs/complete-form-job.ts new file mode 100644 index 00000000..f90874c1 --- /dev/null +++ b/packages/forms/src/repository/jobs/complete-form-job.ts @@ -0,0 +1,32 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from '../index.js'; +import { type JobResult, type JobType } from './types.js'; + +/** + * Mark a job as completed with result data. + */ +export type CompleteFormJob = ( + ctx: FormRepositoryContext, + jobId: string, + result?: JobResult[T] +) => Promise>; + +export const completeFormJob: CompleteFormJob = async (ctx, jobId, result) => { + const db = await ctx.db.getKysely(); + + try { + await db + .updateTable('form_jobs') + .set({ + status: 'completed', + completed_at: new Date().toISOString() as any, + result: result ? JSON.stringify(result) : null, + }) + .where('id', '=', jobId) + .execute(); + + return success(undefined); + } catch (err) { + return failure(`Failed to complete job: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/jobs/create-form-job.test.ts b/packages/forms/src/repository/jobs/create-form-job.test.ts new file mode 100644 index 00000000..494ff19b --- /dev/null +++ b/packages/forms/src/repository/jobs/create-form-job.test.ts @@ -0,0 +1,108 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { createFormJob } from './create-form-job.js'; +import { addForm } from '../add-form.js'; +import { defaultFormConfig } from '../../patterns/index.js'; + +describeDatabase('createFormJob', () => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('creates a job in processing state', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const result = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + metadata: { + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }, + }); + + if (!result.success) { + expect.fail(`createFormJob failed: ${result.error}`); + } + + expect(result.data.status).toBe('processing'); + expect(result.data.jobType).toBe('import-pdf'); + expect(result.data.formId).toBe(formResult.data.id); + expect(result.data.createdAt).toEqual(today); + expect(result.data.startedAt).toEqual(today); + expect(result.data.metadata).toEqual({ + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }); + expect(result.data.id).toBeDefined(); + }); + + it('creates a job without metadata', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const result = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + + if (!result.success) { + expect.fail(`createFormJob failed: ${result.error}`); + } + + expect(result.data.status).toBe('processing'); + expect(result.data.metadata).toBeUndefined(); + }); + + it('creates jobs with different types', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const validateResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + metadata: { + validatorVersion: '1.0', + userId: 'user-1', + }, + }); + + if (!validateResult.success) { + expect.fail('createFormJob failed'); + } + + expect(validateResult.data.jobType).toBe('validate-schema'); + expect(validateResult.data.metadata).toEqual({ + validatorVersion: '1.0', + userId: 'user-1', + }); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/jobs/create-form-job.ts b/packages/forms/src/repository/jobs/create-form-job.ts new file mode 100644 index 00000000..604d025c --- /dev/null +++ b/packages/forms/src/repository/jobs/create-form-job.ts @@ -0,0 +1,55 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from '../index.js'; +import { + type FormJob, + type JobMetadata, + type JobStatus, + type JobType, +} from './types.js'; +import { dateValue } from '@flexion/forms-database'; + +/** + * Create a new job record in 'processing' state. + * Call this before starting async work. + */ +export type CreateFormJob = ( + ctx: FormRepositoryContext, + params: { + formId: string; + jobType: T; + metadata?: JobMetadata[T]; + } +) => Promise, string>>; + +export const createFormJob: CreateFormJob = async (ctx, params) => { + const uuid = crypto.randomUUID(); + const db = await ctx.db.getKysely(); + + try { + const now = new Date(); + await db + .insertInto('form_jobs') + .values({ + id: uuid, + form_id: params.formId, + job_type: params.jobType, + status: 'processing', + created_at: dateValue(ctx.db.engine, now), + started_at: dateValue(ctx.db.engine, now), + metadata: params.metadata ? JSON.stringify(params.metadata) : null, + }) + .execute(); + + return success({ + id: uuid, + formId: params.formId, + jobType: params.jobType, + status: 'processing' as JobStatus, + createdAt: now, + startedAt: now, + metadata: params.metadata, + }) as any; + } catch (err) { + return failure(`Failed to create job: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/jobs/fail-form-job.test.ts b/packages/forms/src/repository/jobs/fail-form-job.test.ts new file mode 100644 index 00000000..1faea1d3 --- /dev/null +++ b/packages/forms/src/repository/jobs/fail-form-job.test.ts @@ -0,0 +1,107 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { failFormJob } from './fail-form-job.js'; +import { createFormJob } from './create-form-job.js'; +import { getLatestFormJob } from './get-latest-form-job.js'; +import { addForm } from '../add-form.js'; +import { defaultFormConfig } from '../../patterns/index.js'; + +describeDatabase('failFormJob', () => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('fails a job with error message and stack', async ({ + db, + }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + const result = await failFormJob(ctx, jobResult.data.id, { + message: 'PDF parsing failed', + stack: 'Error: PDF parsing failed\n at parsePDF', + }); + + expect(result.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('failed'); + expect(latestResult.data.completedAt).toBeDefined(); + expect(latestResult.data.errorMessage).toBe('PDF parsing failed'); + expect(latestResult.data.errorStack).toBe( + 'Error: PDF parsing failed\n at parsePDF' + ); + }); + + it('fails a job without stack trace', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + const result = await failFormJob(ctx, jobResult.data.id, { + message: 'Validation failed', + }); + + expect(result.success).toBe(true); + + // Verify the job was updated + const latestResult = await getLatestFormJob( + ctx, + formResult.data.id, + 'validate-schema' + ); + if (!latestResult.success || !latestResult.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(latestResult.data.status).toBe('failed'); + expect(latestResult.data.completedAt).toBeDefined(); + expect(latestResult.data.errorMessage).toBe('Validation failed'); + expect(latestResult.data.errorStack).toBeUndefined(); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/jobs/fail-form-job.ts b/packages/forms/src/repository/jobs/fail-form-job.ts new file mode 100644 index 00000000..10577d1f --- /dev/null +++ b/packages/forms/src/repository/jobs/fail-form-job.ts @@ -0,0 +1,32 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from '../index.js'; + +/** + * Mark a job as failed with error information. + */ +export type FailFormJob = ( + ctx: FormRepositoryContext, + jobId: string, + error: { message: string; stack?: string } +) => Promise>; + +export const failFormJob: FailFormJob = async (ctx, jobId, error) => { + const db = await ctx.db.getKysely(); + + try { + await db + .updateTable('form_jobs') + .set({ + status: 'failed', + completed_at: new Date().toISOString() as any, + error_message: error.message, + error_stack: error.stack || null, + }) + .where('id', '=', jobId) + .execute(); + + return success(undefined); + } catch (err) { + return failure(`Failed to fail job: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/jobs/get-form-jobs.test.ts b/packages/forms/src/repository/jobs/get-form-jobs.test.ts new file mode 100644 index 00000000..58db29d0 --- /dev/null +++ b/packages/forms/src/repository/jobs/get-form-jobs.test.ts @@ -0,0 +1,126 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { getFormJobs } from './get-form-jobs.js'; +import { createFormJob } from './create-form-job.js'; +import { addForm } from '../add-form.js'; +import { defaultFormConfig } from '../../patterns/index.js'; + +describeDatabase('getFormJobs', () => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('returns empty array when no jobs exist', async ({ + db, + }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const result = await getFormJobs(ctx, formResult.data.id); + + if (!result.success) { + expect.fail('getFormJobs failed'); + } + + expect(result.data).toEqual([]); + }); + + it('returns all jobs in descending order', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create 3 jobs with different timestamps + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 0)); + const job1 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + expect(job1.success).toBe(true); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 1)); + const job2 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + }); + expect(job2.success).toBe(true); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 2)); + const job3 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'publish', + }); + expect(job3.success).toBe(true); + + const result = await getFormJobs(ctx, formResult.data.id); + + if (!result.success) { + expect.fail('getFormJobs failed'); + } + + expect(result.data.length).toBe(3); + + // Should be ordered newest first + expect(result.data[0].createdAt.getTime()).toBeGreaterThan( + result.data[1].createdAt.getTime() + ); + expect(result.data[1].createdAt.getTime()).toBeGreaterThan( + result.data[2].createdAt.getTime() + ); + + // Verify order of job types + expect(result.data[0].jobType).toBe('publish'); + expect(result.data[1].jobType).toBe('validate-schema'); + expect(result.data[2].jobType).toBe('import-pdf'); + }); + + it('returns jobs for specific form only', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + // Create two forms + const form1Result = await addForm(ctx, testForm); + const form2Result = await addForm(ctx, testForm); + if (!form1Result.success || !form2Result.success) { + expect.fail('addForm failed'); + } + + // Create jobs for both forms + await createFormJob(ctx, { + formId: form1Result.data.id, + jobType: 'import-pdf', + }); + await createFormJob(ctx, { + formId: form2Result.data.id, + jobType: 'import-pdf', + }); + + const result = await getFormJobs(ctx, form1Result.data.id); + + if (!result.success) { + expect.fail('getFormJobs failed'); + } + + expect(result.data.length).toBe(1); + expect(result.data[0].formId).toBe(form1Result.data.id); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/jobs/get-form-jobs.ts b/packages/forms/src/repository/jobs/get-form-jobs.ts new file mode 100644 index 00000000..6effe49f --- /dev/null +++ b/packages/forms/src/repository/jobs/get-form-jobs.ts @@ -0,0 +1,31 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from '../index.js'; +import { type FormJob, rowToFormJob } from './types.js'; + +/** + * Get all jobs for a form (full history). + * Useful for debugging and audit logs. + */ +export type GetFormJobs = ( + ctx: FormRepositoryContext, + formId: string +) => Promise>; + +export const getFormJobs: GetFormJobs = async (ctx, formId) => { + const db = await ctx.db.getKysely(); + + try { + const rows = await db + .selectFrom('form_jobs') + .selectAll() + .where('form_id', '=', formId) + .orderBy('created_at', 'desc') + .execute(); + + const jobs = rows.map(rowToFormJob); + + return success(jobs as FormJob[]); + } catch (err) { + return failure(`Failed to get jobs: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/jobs/get-latest-form-job.test.ts b/packages/forms/src/repository/jobs/get-latest-form-job.test.ts new file mode 100644 index 00000000..8e535901 --- /dev/null +++ b/packages/forms/src/repository/jobs/get-latest-form-job.test.ts @@ -0,0 +1,162 @@ +import { beforeAll, expect, it, vi } from 'vitest'; + +import { + type DbTestContext, + describeDatabase, +} from '@flexion/forms-database/testing'; +import { getLatestFormJob } from './get-latest-form-job.js'; +import { createFormJob } from './create-form-job.js'; +import { addForm } from '../add-form.js'; +import { defaultFormConfig } from '../../patterns/index.js'; + +describeDatabase('getLatestFormJob', () => { + const today = new Date(2000, 1, 1); + + beforeAll(async () => { + vi.setSystemTime(today); + }); + + it('returns null when no job exists', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const result = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + + if (!result.success) { + expect.fail('getLatestFormJob failed'); + } + + expect(result.data).toBeNull(); + }); + + it('returns the latest job of specific type', async ({ + db, + }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create two jobs of the same type + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 0)); + const job1 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + expect(job1.success).toBe(true); + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 1)); + const job2 = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!job2.success) { + expect.fail('createFormJob failed'); + } + + const result = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + + if (!result.success || !result.data) { + expect.fail('getLatestFormJob failed'); + } + + // Should return the second (newer) job + expect(result.data.id).toBe(job2.data.id); + }); + + it('returns job of specific type only', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + // Create jobs of different types + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 0)); + const importJob = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'import-pdf', + }); + if (!importJob.success) { + expect.fail('createFormJob failed'); + } + + vi.setSystemTime(new Date(2000, 1, 1, 0, 0, 1)); + await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + }); + + // Should return import-pdf job, not the newer validate-schema + const result = await getLatestFormJob( + ctx, + formResult.data.id, + 'import-pdf' + ); + + if (!result.success || !result.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(result.data.jobType).toBe('import-pdf'); + expect(result.data.id).toBe(importJob.data.id); + }); + + it('returns job with metadata and result', async ({ db }) => { + const ctx = { db: db.ctx, formConfig: defaultFormConfig }; + + const formResult = await addForm(ctx, testForm); + if (!formResult.success) { + expect.fail('addForm failed'); + } + + const jobResult = await createFormJob(ctx, { + formId: formResult.data.id, + jobType: 'validate-schema', + metadata: { + validatorVersion: '2.0', + userId: 'user-123', + }, + }); + if (!jobResult.success) { + expect.fail('createFormJob failed'); + } + + const result = await getLatestFormJob( + ctx, + formResult.data.id, + 'validate-schema' + ); + + if (!result.success || !result.data) { + expect.fail('getLatestFormJob failed'); + } + + expect(result.data.metadata).toEqual({ + validatorVersion: '2.0', + userId: 'user-123', + }); + }); +}); + +const testForm = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { root: { type: 'sequence', id: 'root', data: { patterns: [] } } }, + outputs: [], +}; diff --git a/packages/forms/src/repository/jobs/get-latest-form-job.ts b/packages/forms/src/repository/jobs/get-latest-form-job.ts new file mode 100644 index 00000000..651a3a94 --- /dev/null +++ b/packages/forms/src/repository/jobs/get-latest-form-job.ts @@ -0,0 +1,40 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { FormRepositoryContext } from '../index.js'; +import { type FormJob, type JobType, rowToFormJob } from './types.js'; + +/** + * Get the latest job for a form of a specific type. + * Useful for status polling: "What's the current import-pdf job status?" + */ +export type GetLatestFormJob = ( + ctx: FormRepositoryContext, + formId: string, + jobType: T +) => Promise | null, string>>; + +export const getLatestFormJob: GetLatestFormJob = async ( + ctx, + formId, + jobType +) => { + const db = await ctx.db.getKysely(); + + try { + const row = await db + .selectFrom('form_jobs') + .selectAll() + .where('form_id', '=', formId) + .where('job_type', '=', jobType) + .orderBy('created_at', 'desc') + .limit(1) + .executeTakeFirst(); + + if (!row) { + return success(null); + } + + return success(rowToFormJob(row)) as any; + } catch (err) { + return failure(`Failed to get latest job: ${(err as Error).message}`); + } +}; diff --git a/packages/forms/src/repository/jobs/types.ts b/packages/forms/src/repository/jobs/types.ts new file mode 100644 index 00000000..9af83d49 --- /dev/null +++ b/packages/forms/src/repository/jobs/types.ts @@ -0,0 +1,69 @@ +// Type-safe job metadata by job type +export type JobMetadata = { + 'import-pdf': { + documentId: string; + fileName: string; + userId: string; + }; + 'validate-schema': { + validatorVersion: string; + userId: string; + }; + publish: { + targetEnvironment: 'staging' | 'production'; + publisherId: string; + }; +}; + +// Type-safe job results by job type +export type JobResult = { + 'import-pdf': { + patternsAdded: number; + fieldsExtracted: number; + documentId: string; + }; + 'validate-schema': { + errorsFound: number; + warningsFound: number; + issues: Array<{ field: string; message: string }>; + }; + publish: { + publishedAt: string; + url: string; + }; +}; + +export type JobType = keyof JobMetadata; +export type JobStatus = 'pending' | 'processing' | 'completed' | 'failed'; + +export type FormJob = { + id: string; + formId: string; + jobType: T; + status: JobStatus; + createdAt: Date; + startedAt?: Date; + completedAt?: Date; + errorMessage?: string; + errorStack?: string; + metadata?: JobMetadata[T]; + result?: JobResult[T]; +}; + +/** + * Helper to convert database row to FormJob object. + * Handles date conversions and JSON parsing. + */ +export const rowToFormJob = (row: any): FormJob => ({ + id: row.id, + formId: row.form_id, + jobType: row.job_type as JobType, + status: row.status as JobStatus, + createdAt: new Date(row.created_at), + startedAt: row.started_at ? new Date(row.started_at) : undefined, + completedAt: row.completed_at ? new Date(row.completed_at) : undefined, + errorMessage: row.error_message || undefined, + errorStack: row.error_stack || undefined, + metadata: row.metadata ? JSON.parse(row.metadata) : undefined, + result: row.result ? JSON.parse(row.result) : undefined, +}); diff --git a/packages/forms/src/repository/types.ts b/packages/forms/src/repository/types.ts index 07142ed0..9291a6b8 100644 --- a/packages/forms/src/repository/types.ts +++ b/packages/forms/src/repository/types.ts @@ -9,6 +9,11 @@ import type { GetFormList } from './get-form-list.js'; import type { GetFormSession } from './get-form-session.js'; import type { SaveForm } from './save-form.js'; import type { UpsertFormSession } from './upsert-form-session.js'; +import type { CreateFormJob } from './jobs/create-form-job.js'; +import type { CompleteFormJob } from './jobs/complete-form-job.js'; +import type { FailFormJob } from './jobs/fail-form-job.js'; +import type { GetLatestFormJob } from './jobs/get-latest-form-job.js'; +import type { GetFormJobs } from './jobs/get-form-jobs.js'; /** * Interface for the forms repository. @@ -24,4 +29,9 @@ export interface FormRepository { getFormList: ServiceMethod; saveForm: ServiceMethod; upsertFormSession: ServiceMethod; + createFormJob: ServiceMethod; + completeFormJob: ServiceMethod; + failFormJob: ServiceMethod; + getLatestFormJob: ServiceMethod; + getFormJobs: ServiceMethod; } diff --git a/packages/forms/src/services/get-form-list.test.ts b/packages/forms/src/services/get-form-list.test.ts index 058704e7..26d0f71c 100644 --- a/packages/forms/src/services/get-form-list.test.ts +++ b/packages/forms/src/services/get-form-list.test.ts @@ -16,7 +16,7 @@ describe('getFormList', () => { success: false, error: { status: 401, - message: 'You must be logged in to delete a form', + message: 'You must be logged in to get form list', }, }); }); diff --git a/packages/forms/src/services/get-form-list.ts b/packages/forms/src/services/get-form-list.ts index eaaf1935..0626524d 100644 --- a/packages/forms/src/services/get-form-list.ts +++ b/packages/forms/src/services/get-form-list.ts @@ -1,12 +1,10 @@ import { type Result, failure, success } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; +import type { FormListItem as RepositoryFormListItem } from '../repository/get-form-list.js'; + +export type FormListItem = RepositoryFormListItem; -export type FormListItem = { - id: string; - title: string; - description: string; -}; type FormListError = { status: number; message: string; @@ -24,7 +22,7 @@ export const getFormList: GetFormList = async ctx => { if (!ctx.isUserLoggedIn()) { return failure({ status: 401, - message: 'You must be logged in to delete a form', + message: 'You must be logged in to get form list', }); } const forms = await ctx.repository.getFormList(); diff --git a/packages/forms/src/services/get-form-status.test.ts b/packages/forms/src/services/get-form-status.test.ts new file mode 100644 index 00000000..e1a91feb --- /dev/null +++ b/packages/forms/src/services/get-form-status.test.ts @@ -0,0 +1,210 @@ +import { describe, expect, it } from 'vitest'; + +import { createForm } from '../index.js'; +import { createTestFormServiceContext } from '../testing.js'; +import { getFormStatus } from './get-form-status.js'; + +const TEST_FORM = createForm({ title: 'Form Title', description: '' }); + +const TEST_FORM_WITH_PATTERNS = { + summary: { title: 'Test form', description: 'Test description' }, + root: 'root', + patterns: { + root: { type: 'sequence', id: 'root', data: { patterns: ['page1'] } }, + page1: { + type: 'page', + id: 'page1', + data: { title: 'Page 1', patterns: [] }, + }, + }, + outputs: [], +}; + +describe('getFormStatus', () => { + it('returns 404 for non-existent form', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + const result = await getFormStatus(ctx, 'non-existent-id'); + + expect(result).toEqual({ + success: false, + error: { + status: 404, + message: 'Form not found', + }, + }); + }); + + it('returns draft status for empty form with no job', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + const addResult = await ctx.repository.addForm(TEST_FORM); + if (!addResult.success) { + expect.fail('Failed to add form'); + } + + const result = await getFormStatus(ctx, addResult.data.id); + + if (!result.success) { + expect.fail(`Failed to get form status: ${JSON.stringify(result.error)}`); + } + + expect(result.data.formStatus).toBe('draft'); + expect(result.data.latestJob).toBeUndefined(); + }); + + it('returns ready status for form with patterns and no job', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + const addResult = await ctx.repository.addForm(TEST_FORM_WITH_PATTERNS); + if (!addResult.success) { + expect.fail('Failed to add form'); + } + + const result = await getFormStatus(ctx, addResult.data.id); + + if (!result.success) { + expect.fail(`Failed to get form status: ${JSON.stringify(result.error)}`); + } + + expect(result.data.formStatus).toBe('ready'); + expect(result.data.latestJob).toBeUndefined(); + }); + + it('returns draft status when job is processing (race condition fix)', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + // Create form with patterns (simulating mid-processing state where patterns exist) + const addResult = await ctx.repository.addForm(TEST_FORM_WITH_PATTERNS); + if (!addResult.success) { + expect.fail('Failed to add form'); + } + + // Create a processing job + const jobResult = await ctx.repository.createFormJob({ + formId: addResult.data.id, + jobType: 'import-pdf', + metadata: { + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }, + }); + if (!jobResult.success) { + expect.fail('Failed to create job'); + } + + // Get form status - should be 'draft' even though patterns exist + // because the job is still processing + const result = await getFormStatus(ctx, addResult.data.id); + + if (!result.success) { + expect.fail(`Failed to get form status: ${JSON.stringify(result.error)}`); + } + + // Key assertion: form status should be 'draft' because job is still processing + expect(result.data.formStatus).toBe('draft'); + expect(result.data.latestJob).toBeDefined(); + expect(result.data.latestJob?.status).toBe('processing'); + }); + + it('returns ready status after job completes successfully', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + // Create form + const addResult = await ctx.repository.addForm(TEST_FORM); + if (!addResult.success) { + expect.fail('Failed to add form'); + } + + // Create and complete a job + const jobResult = await ctx.repository.createFormJob({ + formId: addResult.data.id, + jobType: 'import-pdf', + metadata: { + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }, + }); + if (!jobResult.success) { + expect.fail('Failed to create job'); + } + + // Add patterns to form (simulating job completion) + await ctx.repository.saveForm( + addResult.data.id, + TEST_FORM_WITH_PATTERNS as any + ); + + // Complete the job + await ctx.repository.completeFormJob(jobResult.data.id, { + patternsAdded: 1, + fieldsExtracted: 5, + documentId: 'doc-1', + }); + + // Get form status - should be 'ready' now + const result = await getFormStatus(ctx, addResult.data.id); + + if (!result.success) { + expect.fail(`Failed to get form status: ${JSON.stringify(result.error)}`); + } + + expect(result.data.formStatus).toBe('ready'); + expect(result.data.latestJob).toBeDefined(); + expect(result.data.latestJob?.status).toBe('completed'); + }); + + it('returns draft status when job fails', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => false, + }); + + // Create form + const addResult = await ctx.repository.addForm(TEST_FORM); + if (!addResult.success) { + expect.fail('Failed to add form'); + } + + // Create and fail a job + const jobResult = await ctx.repository.createFormJob({ + formId: addResult.data.id, + jobType: 'import-pdf', + metadata: { + documentId: 'doc-1', + fileName: 'test.pdf', + userId: 'user-1', + }, + }); + if (!jobResult.success) { + expect.fail('Failed to create job'); + } + + await ctx.repository.failFormJob(jobResult.data.id, { + message: 'Processing failed', + }); + + // Get form status - should be 'draft' because no patterns and job failed + const result = await getFormStatus(ctx, addResult.data.id); + + if (!result.success) { + expect.fail(`Failed to get form status: ${JSON.stringify(result.error)}`); + } + + expect(result.data.formStatus).toBe('draft'); + expect(result.data.latestJob).toBeDefined(); + expect(result.data.latestJob?.status).toBe('failed'); + expect(result.data.latestJob?.errorMessage).toBe('Processing failed'); + }); +}); diff --git a/packages/forms/src/services/get-form-status.ts b/packages/forms/src/services/get-form-status.ts new file mode 100644 index 00000000..4d7cd241 --- /dev/null +++ b/packages/forms/src/services/get-form-status.ts @@ -0,0 +1,92 @@ +import { type Result, success, failure } from '@flexion/forms-common'; +import type { InternalFormServiceContext } from '../context/index.js'; +import type { JobStatus } from '../repository/jobs/types.js'; + +export type FormStatusResponse = { + formId: string; + formStatus: 'draft' | 'ready'; // Usability status + latestJob?: { + id: string; + jobType: string; + status: JobStatus; + createdAt: string; + completedAt?: string; + errorMessage?: string; + }; +}; + +export type GetFormStatusError = { + status: number; + message: string; +}; + +export type GetFormStatus = ( + ctx: InternalFormServiceContext, + formId: string +) => Promise>; + +/** + * Get form status and latest import-pdf job status. + * Used by frontend polling to check processing progress. + */ +export const getFormStatus: GetFormStatus = async (ctx, formId) => { + // Get form to check if it exists + const formResult = await ctx.repository.getForm(formId); + if (!formResult.success) { + return failure({ + status: 404, + message: 'Form not found', + }); + } + + const form = formResult.data; + if (!form) { + return failure({ + status: 404, + message: 'Form not found', + }); + } + + // Get latest import-pdf job (if any) + const latestJobResult = await ctx.repository.getLatestFormJob( + formId, + 'import-pdf' + ); + + if (!latestJobResult.success) { + return failure({ + status: 500, + message: 'Failed to get job status', + }); + } + + const job = latestJobResult.data; + + // Determine form status based on job state first to avoid race conditions + // If a job is actively processing, keep status as 'draft' even if patterns exist + let formStatus: 'draft' | 'ready'; + + if (job && (job.status === 'pending' || job.status === 'processing')) { + // Job is still active - form is not ready yet + formStatus = 'draft'; + } else { + // No active job - determine status based on content + const hasContent = Object.keys(form.patterns).length > 1; // >1 because root pattern always exists + formStatus = hasContent ? 'ready' : 'draft'; + } + + return success({ + formId, + formStatus, + latestJob: job + ? { + id: job.id, + jobType: job.jobType, + status: job.status, + createdAt: job.createdAt.toISOString(), + completedAt: job.completedAt?.toISOString(), + errorMessage: job.errorMessage, + } + : undefined, + }); +}; diff --git a/packages/forms/src/services/index.ts b/packages/forms/src/services/index.ts index 161b0e2d..7c35be75 100644 --- a/packages/forms/src/services/index.ts +++ b/packages/forms/src/services/index.ts @@ -11,6 +11,7 @@ import { type DeleteForm, deleteForm } from './delete-form.js'; import { type GetForm, getForm } from './get-form.js'; import { type GetFormList, getFormList } from './get-form-list.js'; import { type GetFormSession, getFormSession } from './get-form-session.js'; +import { type GetFormStatus, getFormStatus } from './get-form-status.js'; import { type InitializeForm, initializeForm } from './initialize-form.js'; import { type SaveForm, saveForm } from './save-form.js'; import { type SubmitForm, submitForm } from './submit-form.js'; @@ -34,6 +35,7 @@ export const createFormService = (ctx: FormServiceContext): FormService => { getForm, getFormList, getFormSession, + getFormStatus, initializeForm, saveForm, submitForm, @@ -46,6 +48,7 @@ export type FormService = { getForm: ServiceMethod; getFormList: ServiceMethod; getFormSession: ServiceMethod; + getFormStatus: ServiceMethod; initializeForm: ServiceMethod; saveForm: ServiceMethod; submitForm: ServiceMethod; diff --git a/packages/forms/src/services/initialize-form.test.ts b/packages/forms/src/services/initialize-form.test.ts index f9ee4695..efedf88a 100644 --- a/packages/forms/src/services/initialize-form.test.ts +++ b/packages/forms/src/services/initialize-form.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { createTestFormServiceContext } from '../testing.js'; @@ -31,25 +31,248 @@ describe('initializeForm', () => { data: { timestamp: expect.any(String), id: expect.any(String), + status: 'ready', }, }); }); - it.skip('initializes successfully with document when user is logged in', async () => { - // TODO: Update this test to use a fake parser that returns expected structure + it('initializes and returns immediately with document (async processing)', async () => { + const mockParsedPdf = { + title: 'Parsed Form Title', + description: 'This form was parsed from a PDF', + root: 'page1', + patterns: { + page1: { + type: 'page', + id: 'page1', + data: { + title: 'Page 1', + patterns: ['paragraph1', 'input1'], + }, + }, + paragraph1: { + type: 'paragraph', + id: 'paragraph1', + data: { + text: 'Welcome to the parsed form', + }, + }, + input1: { + type: 'input', + id: 'input1', + data: { + label: 'First Name', + required: true, + }, + }, + }, + outputs: { + firstName: { type: 'text' as const, name: 'firstName', value: '' }, + }, + errors: [], + }; + + const mockFields = { + firstName: { + type: 'TextField' as const, + name: 'firstName', + label: 'First Name', + value: '', + required: true, + }, + }; + const ctx = await createTestFormServiceContext({ isUserLoggedIn: () => true, }); + + // Mock parsePdf to avoid needing a real PDF + ctx.parsePdf = async () => ({ + parsedPdf: mockParsedPdf as any, + fields: mockFields, + }); + + // Base64 encoded "This is test PDF data" + const testPdfData = 'VGhpcyBpcyB0ZXN0IFBERiBkYXRh'; + const result = await initializeForm(ctx, { - summary, - document: { fileName: 'test.pdf', data: 'VGhpcyBpcyBub3QgYSBQREYu' }, + document: { fileName: 'test.pdf', data: testPdfData }, }); + + // Should return immediately with processing status expect(result).toEqual({ success: true, data: { timestamp: expect.any(String), id: expect.any(String), + jobId: expect.any(String), + status: 'processing', }, }); + + if (!result.success) return; + + const { id: formId, jobId } = result.data; + + // Wait for async processing to complete + await vi.waitFor( + async () => { + const job = await ctx.repository.getLatestFormJob(formId, 'import-pdf'); + expect(job.success).toBe(true); + if (!job.success) throw new Error('Job not found'); + expect(job.data?.status).toBe('completed'); + }, + { timeout: 5000 } + ); + + // Verify job was completed successfully + const jobResult = await ctx.repository.getLatestFormJob( + formId, + 'import-pdf' + ); + expect(jobResult.success).toBe(true); + if (!jobResult.success) return; + + const job = jobResult.data!; + expect(job.status).toBe('completed'); + expect(job.completedAt).toBeDefined(); + expect(job.result).toEqual({ + patternsAdded: expect.any(Number), + fieldsExtracted: expect.any(Number), + documentId: expect.any(String), + }); + + // Verify form was updated with parsed content + const formResult = await ctx.repository.getForm(formId); + expect(formResult.success).toBe(true); + if (!formResult.success) return; + + const form = formResult.data!; + + // Form should have been updated with parsed title + expect(form.summary.title).toBe('Parsed Form Title'); + expect(form.summary.description).toBe('This form was parsed from a PDF'); + + // Form should have patterns added (more than just root) + expect(Object.keys(form.patterns).length).toBeGreaterThan(1); + }); + + it('handles async processing errors gracefully', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => true, + }); + + // Mock parsePdf to throw an error + ctx.parsePdf = async () => { + throw new Error('Parser failed to process PDF'); + }; + + const testPdfData = 'VGhpcyBpcyB0ZXN0IFBERiBkYXRh'; + + const result = await initializeForm(ctx, { + document: { fileName: 'failing-test.pdf', data: testPdfData }, + }); + + // Should still return successfully (processing happens async) + expect(result.success).toBe(true); + if (!result.success) return; + + const { id: formId } = result.data; + + // Wait for async processing to fail + await vi.waitFor( + async () => { + const job = await ctx.repository.getLatestFormJob(formId, 'import-pdf'); + expect(job.success).toBe(true); + if (!job.success) throw new Error('Job not found'); + expect(job.data?.status).toBe('failed'); + }, + { timeout: 5000 } + ); + + // Verify job failed with error message + const jobResult = await ctx.repository.getLatestFormJob( + formId, + 'import-pdf' + ); + expect(jobResult.success).toBe(true); + if (!jobResult.success) return; + + const job = jobResult.data!; + expect(job.status).toBe('failed'); + expect(job.errorMessage).toContain('Parser failed to process PDF'); + expect(job.completedAt).toBeDefined(); + expect(job.result).toBeUndefined(); + }); + + it('validates document data is valid base64', async () => { + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => true, + }); + + const result = await initializeForm(ctx, { + document: { fileName: 'test.pdf', data: 'not-valid-base64!!!' }, + }); + + expect(result).toEqual({ + success: false, + error: { + status: 400, + message: 'Invalid options', + }, + }); + }); + + it('uses filename as title when no summary provided', async () => { + const mockParsedPdf = { + title: 'Override Title', + description: 'Description from PDF', + root: 'root', + patterns: { + root: { + type: 'page', + id: 'root', + data: { title: 'Page 1', patterns: [] }, + }, + }, + outputs: {}, + errors: [], + }; + + const ctx = await createTestFormServiceContext({ + isUserLoggedIn: () => true, + }); + + // Mock parsePdf + ctx.parsePdf = async () => ({ + parsedPdf: mockParsedPdf as any, + fields: {}, + }); + + const result = await initializeForm(ctx, { + document: { fileName: 'my-form.pdf', data: 'VGVzdA==' }, + }); + + expect(result.success).toBe(true); + if (!result.success) return; + + const { id: formId } = result.data; + + // Wait for processing + await vi.waitFor( + async () => { + const job = await ctx.repository.getLatestFormJob(formId, 'import-pdf'); + if (!job.success) throw new Error('Job not found'); + expect(job.data?.status).toBe('completed'); + }, + { timeout: 5000 } + ); + + // Check that the parsed title was used (not the filename) + const formResult = await ctx.repository.getForm(formId); + expect(formResult.success).toBe(true); + if (!formResult.success) return; + + expect(formResult.data!.summary.title).toBe('Override Title'); }); }); diff --git a/packages/forms/src/services/initialize-form.ts b/packages/forms/src/services/initialize-form.ts index 544f97f8..cd5d35e7 100644 --- a/packages/forms/src/services/initialize-form.ts +++ b/packages/forms/src/services/initialize-form.ts @@ -14,6 +14,8 @@ type InitializeFormError = { type InitializeFormResult = { timestamp: string; id: string; + jobId?: string; + status: 'ready' | 'processing'; }; export type InitializeForm = ( @@ -50,8 +52,9 @@ const optionSchema = z.object({ }); /** - * Asynchronously initializes a new form based on the provided context and options. Handles schema validation, - * document import (parses uploaded PDF), builds a Blueprint, and saves to the repository. + * Asynchronously initializes a new form based on the provided context and options. + * If a document is provided, creates the form immediately and processes the PDF asynchronously. + * Otherwise, creates a form with the provided summary. */ export const initializeForm: InitializeForm = async (ctx, opts) => { if (!ctx.isUserLoggedIn()) { @@ -71,56 +74,164 @@ export const initializeForm: InitializeForm = async (ctx, opts) => { } const { document, summary } = parseResult.data; + // Create empty blueprint const builder = new BlueprintBuilder(ctx.config); - if (document !== undefined) { - const parsePdfResult = await ctx - .parsePdf(document.data) - .then(result => success(result)) - .catch(err => - failure({ - status: 400, - message: `Failed to parse PDF: ${err.message}`, - }) - ); - if (!parsePdfResult.success) { - return parsePdfResult; - } - const { parsedPdf } = parsePdfResult.data; + if (summary) { + builder.setFormSummary(summary); + } else if (document) { builder.setFormSummary({ - title: parsedPdf.title || document.fileName, - description: parsedPdf.description, + title: document.fileName, + description: '', }); + } + // Step 1: Create form in database (empty, draft state) + const formResult = await ctx.repository.addForm(builder.form); + if (!formResult.success) { + console.error('Failed to add form:', formResult.error); + return failure({ + status: 500, + message: formResult.error, + }); + } + + const formId = formResult.data.id; + + // Step 2: If document provided, store it and initiate async processing + if (document !== undefined) { const fileName = document.fileName.split('/').pop() || 'my-form.pdf'; + + // Store document (without extract, will be filled by job processing) const addDocumentResult = await ctx.repository.addDocument({ fileName, data: document.data, - extract: parsePdfResult.data, + extract: undefined, }); + if (!addDocumentResult.success) { return failure({ status: 500, message: `Failed to add document: ${addDocumentResult.error}`, }); } + + const documentId = addDocumentResult.data.id; + + // Create job record (status: 'processing') + const jobResult = await ctx.repository.createFormJob({ + formId, + jobType: 'import-pdf', + metadata: { + documentId, + fileName, + userId: ctx.getUserId?.() || 'system', + }, + }); + + if (!jobResult.success) { + return failure({ + status: 500, + message: 'Failed to create processing job', + }); + } + + const job = jobResult.data; + + // Step 3: Fire async processing (don't await!) + processFormDocumentAsync(ctx, formId, job.id, documentId).catch(err => { + console.error('Async form processing failed:', err); + // Error already logged to database by processFormDocumentAsync + }); + + // Step 4: Return immediately + return success({ + id: formId, + timestamp: formResult.data.timestamp, + jobId: job.id, + status: 'processing', + }); + } + + // No document, form is ready immediately + return success({ + id: formId, + timestamp: formResult.data.timestamp, + status: 'ready', + }); +}; + +/** + * Async function that processes PDF and updates form + job. + * Runs in background, not awaited by HTTP request. + */ +async function processFormDocumentAsync( + ctx: InternalFormServiceContext, + formId: string, + jobId: string, + documentId: string +): Promise { + try { + // Get document data + const documentResult = await ctx.repository.getDocument(documentId); + if (!documentResult.success) { + await ctx.repository.failFormJob(jobId, { + message: `Document not found: ${documentResult.error}`, + }); + return; + } + + // Parse PDF via Bedrock + const parsePdfResult = await ctx.parsePdf(documentResult.data.data); + const { parsedPdf, fields } = parsePdfResult; + + // Get current form + const formResult = await ctx.repository.getForm(formId); + if (!formResult.success || !formResult.data) { + await ctx.repository.failFormJob(jobId, { + message: 'Form not found', + }); + return; + } + + // Build updated form with parsed patterns + const builder = new BlueprintBuilder(ctx.config, formResult.data); + + // Update summary from parsed PDF + builder.setFormSummary({ + title: parsedPdf.title || documentResult.data.path || 'Untitled', + description: parsedPdf.description || '', + }); + + // Add document reference await builder.addDocumentRef({ - id: addDocumentResult.data.id, + id: documentId, extract: parsedPdf, }); - } - if (summary) { - builder.setFormSummary(summary); - } + // Save updated form + const saveResult = await ctx.repository.saveForm(formId, builder.form); + if (!saveResult.success) { + await ctx.repository.failFormJob(jobId, { + message: `Failed to save form: ${saveResult.error}`, + }); + return; + } - const result = await ctx.repository.addForm(builder.form); - if (!result.success) { - console.error('Failed to add form:', result.error); - return failure({ - status: 500, - message: result.error, + // Mark job as completed + await ctx.repository.completeFormJob(jobId, { + patternsAdded: Object.keys(builder.form.patterns).length, + fieldsExtracted: Object.keys(fields).length, + documentId, + }); + + console.log(`Form ${formId} processed successfully`); + } catch (err) { + // Catch any unexpected errors + console.error('Unexpected error in processFormDocumentAsync:', err); + await ctx.repository.failFormJob(jobId, { + message: (err as Error).message, + stack: (err as Error).stack, }); } - return result; -}; +} diff --git a/packages/forms/src/util/workspace-root.ts b/packages/forms/src/util/workspace-root.ts new file mode 100644 index 00000000..c7afc92e --- /dev/null +++ b/packages/forms/src/util/workspace-root.ts @@ -0,0 +1,36 @@ +import { existsSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +/** + * Finds the workspace root by looking for pnpm-workspace.yaml. + * Walks up the directory tree from the current file location. + * + * @returns Absolute path to the workspace root + * @throws Error if workspace root cannot be found + */ +export const findWorkspaceRoot = (): string => { + // Start from the directory containing this file + let currentDir = dirname(fileURLToPath(import.meta.url)); + + // Walk up the directory tree looking for pnpm-workspace.yaml + while (currentDir !== dirname(currentDir)) { + const workspaceFile = join(currentDir, 'pnpm-workspace.yaml'); + if (existsSync(workspaceFile)) { + return currentDir; + } + currentDir = dirname(currentDir); + } + + throw new Error('Could not find workspace root (pnpm-workspace.yaml)'); +}; + +/** + * Gets the default shared cache directory path for the workspace. + * All tests and CLI tools should use this to ensure caches are shared. + * + * @returns Absolute path to __fixtures__/ai-cache at workspace root + */ +export const getDefaultCachePath = (): string => { + return join(findWorkspaceRoot(), 'packages', 'forms', 'fixtures', 'ai-cache'); +}; diff --git a/packages/forms/src/util/zod.ts b/packages/forms/src/util/zod.ts index 99e4c17b..c1885cef 100644 --- a/packages/forms/src/util/zod.ts +++ b/packages/forms/src/util/zod.ts @@ -62,9 +62,15 @@ export const convertZodErrorToFormErrors = ( zodError.issues.forEach((error: z.ZodIssue) => { const path = error.path.join('.'); if (error.code === 'too_small' && error.minimum === 1) { + // Replace default Zod message with consistent custom message + const message = + error.message === 'String must contain at least 1 character(s)' || + error.message.startsWith('Too small') + ? 'String must contain at least 1 character(s)' + : error.message; formErrors[path] = { type: 'required', - message: error.message, + message, }; } else { formErrors[path] = { diff --git a/packages/server/astro.config.mjs b/packages/server/astro.config.mjs index 85e2b0d6..1a53737c 100644 --- a/packages/server/astro.config.mjs +++ b/packages/server/astro.config.mjs @@ -29,6 +29,11 @@ export default defineConfig({ define: { 'import.meta.env.GITHUB': JSON.stringify(githubRepository), }, + resolve: { + conditions: process.env.NODE_ENV === 'production' + ? ['production', 'import', 'module', 'browser', 'default'] + : ['development', 'import', 'module', 'browser', 'default'], + }, }, }); diff --git a/packages/server/src/config/services.ts b/packages/server/src/config/services.ts index 840bd4ea..df43ed6a 100644 --- a/packages/server/src/config/services.ts +++ b/packages/server/src/config/services.ts @@ -1,9 +1,9 @@ import { type FormService, createFormService, - createFormsRepository, defaultFormConfig, } from '@flexion/forms-core'; +import { createFormsRepository } from '@flexion/forms-core/repository'; import { createProductionPdfParser } from '@flexion/forms-core/documents/pdf/context'; import { type ServerOptions } from './options.js'; diff --git a/packages/server/src/lib/api-client.ts b/packages/server/src/lib/api-client.ts index f31da251..fbdb9f26 100644 --- a/packages/server/src/lib/api-client.ts +++ b/packages/server/src/lib/api-client.ts @@ -6,6 +6,8 @@ import { type Blueprint, type FormService, type FormSummary, + type FormStatusResponse, + type GetFormStatusError, } from '@flexion/forms-core'; import { type FormServiceContext } from '@flexion/forms-core/context'; @@ -37,7 +39,12 @@ export class FormServiceClient implements FormService { } ): Promise< Result< - { timestamp: string; id: string }, + { + timestamp: string; + id: string; + jobId?: string; + status: 'ready' | 'processing'; + }, { status: number; message: string } > > { @@ -136,6 +143,15 @@ export class FormServiceClient implements FormService { throw new Error('Not implemented'); } + async getFormStatus( + formId: string + ): Promise> { + const response = await fetch( + `${this.ctx.baseUrl}api/forms/${formId}/status` + ); + return await response.json(); + } + getContext() { return {} as unknown as FormServiceContext; } diff --git a/packages/server/src/pages/api/forms/[id]/status.ts b/packages/server/src/pages/api/forms/[id]/status.ts new file mode 100644 index 00000000..a86e2645 --- /dev/null +++ b/packages/server/src/pages/api/forms/[id]/status.ts @@ -0,0 +1,20 @@ +import type { APIRoute } from 'astro'; +import { getServerContext } from '../../../../config/astro.js'; + +export const GET: APIRoute = async context => { + const ctx = await getServerContext(context); + const formId = context.params.id; + + if (!formId) { + return new Response('Form ID is required', { status: 400 }); + } + + const result = await ctx.formService.getFormStatus(formId); + + return new Response(JSON.stringify(result), { + headers: { + 'Content-Type': 'application/json', + }, + status: result.success ? 200 : result.error.status, + }); +}; diff --git a/packages/server/src/styles.css b/packages/server/src/styles.css index 26f6dc29..5809a82e 100644 --- a/packages/server/src/styles.css +++ b/packages/server/src/styles.css @@ -1 +1,2 @@ @import '@flexion/forms-design/static/uswds/styles/styles.css'; +@import '@flexion/forms-design/dist/assets/forms-design.css'; diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index d8f40787..6e11151a 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -7,7 +7,8 @@ "moduleResolution": "NodeNext", "jsx": "react", "resolveJsonModule": true, - "types": ["@testing-library/jest-dom"] + "types": ["@testing-library/jest-dom"], + "customConditions": ["development"] }, "include": [ "globals.d.ts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09125da5..e649ac55 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: version: link:../../packages/design astro: specifier: ^4.16.18 - version: 4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20251006) + version: 4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20251008) qs: specifier: ^6.13.0 version: 6.14.0 @@ -178,7 +178,7 @@ importers: devDependencies: '@astrojs/check': specifier: ^0.4.1 - version: 0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20251006) + version: 0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20251008) '@size-limit/preset-app': specifier: ^11.1.6 version: 11.2.0(size-limit@11.2.0) @@ -431,16 +431,16 @@ importers: version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/react': specifier: ^8.4.7 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251006) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251008) '@storybook/react-vite': specifier: ^8.4.7 - version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) + version: 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) '@storybook/test': specifier: ^8.4.7 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/test-runner': specifier: ^0.21.0 - version: 0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + version: 0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) '@storybook/types': specifier: ^8.4.7 version: 8.6.12(storybook@8.6.12(prettier@3.5.3)) @@ -464,13 +464,13 @@ importers: version: 19.1.1(@types/react@18.3.20) '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006))(eslint@8.57.1)(typescript@6.0.0-dev.20251006) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008))(eslint@8.57.1)(typescript@6.0.0-dev.20251008) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006) + version: 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008) '@uswds/compile': specifier: ^1.2.2 - version: 1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + version: 1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) '@vitejs/plugin-react': specifier: ^4.3.4 version: 4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) @@ -503,7 +503,7 @@ importers: version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1) vite-plugin-dts: specifier: ^4.4.0 - version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) + version: 4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) wait-on: specifier: ^7.2.0 version: 7.2.0 @@ -552,10 +552,10 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20251006) + version: 0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20251008) '@astrojs/node': specifier: ^9.0.0 - version: 9.1.3(astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251006)(yaml@2.7.1)) + version: 9.1.3(astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251008)(yaml@2.7.1)) '@astrojs/react': specifier: ^4.1.2 version: 4.2.3(@types/node@22.14.0)(@types/react-dom@19.1.1(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.4.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1) @@ -576,7 +576,7 @@ importers: version: link:../design astro: specifier: ^5.1.3 - version: 5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251006)(yaml@2.7.1) + version: 5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251008)(yaml@2.7.1) express: specifier: ^4.21.0 version: 4.21.2 @@ -1645,6 +1645,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -4380,6 +4386,9 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -4956,6 +4965,15 @@ packages: supports-color: optional: true + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -8701,6 +8719,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -9509,8 +9532,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@6.0.0-dev.20251006: - resolution: {integrity: sha512-DHt+o3xZV+a3cambN7XN1l0RH9PP3bYhUn2pwWyHqSA7j5HSR4MjTEf2hFGpty3/IZj6zHztEBtq4B6bGRdJgg==} + typescript@6.0.0-dev.20251008: + resolution: {integrity: sha512-akqwl9XdobElV/XntkoCZ8w4NuY4zleLjYCO5lBCUaJ9suB7SotGJKuw5MoVZZ9drObDYXCyZL4z0RqQPtEm0A==} engines: {node: '>=14.17'} hasBin: true @@ -10432,24 +10455,24 @@ snapshots: '@csstools/css-tokenizer': 3.0.3 lru-cache: 10.4.3 - '@astrojs/check@0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20251006)': + '@astrojs/check@0.4.1(prettier@3.5.3)(typescript@6.0.0-dev.20251008)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251006) + '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251008) chokidar: 3.6.0 fast-glob: 3.3.3 kleur: 4.1.5 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 yargs: 17.7.2 transitivePeerDependencies: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20251006)': + '@astrojs/check@0.9.4(prettier@3.5.3)(typescript@6.0.0-dev.20251008)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251006) + '@astrojs/language-server': 2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251008) chokidar: 4.0.3 kleur: 4.1.5 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 yargs: 17.7.2 transitivePeerDependencies: - prettier @@ -10461,12 +10484,12 @@ snapshots: '@astrojs/internal-helpers@0.6.1': {} - '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251006)': + '@astrojs/language-server@2.15.4(prettier@3.5.3)(typescript@6.0.0-dev.20251008)': dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/yaml2ts': 0.2.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@volar/kit': 2.4.12(typescript@6.0.0-dev.20251006) + '@volar/kit': 2.4.12(typescript@6.0.0-dev.20251008) '@volar/language-core': 2.4.12 '@volar/language-server': 2.4.12 '@volar/language-service': 2.4.12 @@ -10535,10 +10558,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/node@9.1.3(astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251006)(yaml@2.7.1))': + '@astrojs/node@9.1.3(astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251008)(yaml@2.7.1))': dependencies: '@astrojs/internal-helpers': 0.6.1 - astro: 5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251006)(yaml@2.7.1) + astro: 5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251008)(yaml@2.7.1) send: 1.2.0 server-destroy: 1.0.1 transitivePeerDependencies: @@ -11408,7 +11431,7 @@ snapshots: '@babel/traverse': 7.27.0 '@babel/types': 7.27.0 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -11605,7 +11628,7 @@ snapshots: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.4.0 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -12148,6 +12171,11 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': @@ -12412,7 +12440,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))': + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -12426,7 +12454,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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -12569,14 +12597,14 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1))': dependencies: glob: 10.4.5 magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@6.0.0-dev.20251006) + react-docgen-typescript: 2.2.2(typescript@6.0.0-dev.20251008) vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1) optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 '@jridgewell/gen-mapping@0.3.8': dependencies: @@ -12913,11 +12941,11 @@ snapshots: '@puppeteer/browsers@2.9.0': dependencies: - debug: 4.4.0 + debug: 4.4.3 extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.5.0 - semver: 7.7.1 + semver: 7.7.3 tar-fs: 3.0.8 yargs: 17.7.2 transitivePeerDependencies: @@ -13181,7 +13209,7 @@ snapshots: '@sitespeed.io/tracium@0.3.3': dependencies: - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -13991,12 +14019,12 @@ snapshots: react-dom: 18.3.1(react@18.3.1) storybook: 8.6.12(prettier@3.5.3) - '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1))': + '@storybook/react-vite@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.39.0)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) '@rollup/pluginutils': 5.1.4(rollup@4.39.0) '@storybook/builder-vite': 8.6.12(storybook@8.6.12(prettier@3.5.3))(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)) - '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251006) + '@storybook/react': 8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251008) find-up: 5.0.0 magic-string: 0.30.17 react: 18.3.1 @@ -14013,7 +14041,7 @@ snapshots: - supports-color - typescript - '@storybook/react@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251006)': + '@storybook/react@8.6.12(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.12(prettier@3.5.3))(typescript@6.0.0-dev.20251008)': dependencies: '@storybook/components': 8.6.12(storybook@8.6.12(prettier@3.5.3)) '@storybook/global': 5.0.0 @@ -14026,9 +14054,9 @@ snapshots: storybook: 8.6.12(prettier@3.5.3) optionalDependencies: '@storybook/test': 8.6.12(storybook@8.6.12(prettier@3.5.3)) - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 - '@storybook/test-runner@0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))': + '@storybook/test-runner@0.21.3(@types/node@22.14.0)(storybook@8.6.12(prettier@3.5.3))(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.27.0 @@ -14039,14 +14067,14 @@ snapshots: '@swc/core': 1.11.16 '@swc/jest': 0.2.37(@swc/core@1.11.16) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))) + 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))) nyc: 15.1.0 playwright: 1.51.1 storybook: 8.6.12(prettier@3.5.3) @@ -14625,34 +14653,34 @@ snapshots: '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006))(eslint@8.57.1)(typescript@6.0.0-dev.20251006)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008))(eslint@8.57.1)(typescript@6.0.0-dev.20251008)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251006) + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251008) optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251006) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251008) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.3 eslint: 8.57.1 optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 transitivePeerDependencies: - supports-color @@ -14661,41 +14689,41 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251006) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251008) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008) + debug: 4.4.3 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251006) + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251008) optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@6.0.0-dev.20251006)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@6.0.0-dev.20251008)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251006) + semver: 7.7.3 + ts-api-utils: 1.4.3(typescript@6.0.0-dev.20251008) optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251006)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@6.0.0-dev.20251008)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251006) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@6.0.0-dev.20251008) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -14708,11 +14736,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@uswds/compile@1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))': + '@uswds/compile@1.2.2(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))': dependencies: autoprefixer: 10.4.20(postcss@8.5.2) gulp: 5.0.0 - gulp-postcss: 9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + gulp-postcss: 9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) gulp-rename: 2.0.0 gulp-replace: 1.1.4 gulp-sass: 5.1.0 @@ -14871,12 +14899,12 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@volar/kit@2.4.12(typescript@6.0.0-dev.20251006)': + '@volar/kit@2.4.12(typescript@6.0.0-dev.20251008)': dependencies: '@volar/language-service': 2.4.12 '@volar/typescript': 2.4.12 typesafe-path: 0.2.2 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -14939,7 +14967,7 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/language-core@2.2.0(typescript@6.0.0-dev.20251006)': + '@vue/language-core@2.2.0(typescript@6.0.0-dev.20251008)': dependencies: '@volar/language-core': 2.4.12 '@vue/compiler-dom': 3.5.13 @@ -14950,7 +14978,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 '@vue/shared@3.5.13': {} @@ -15059,7 +15087,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15345,7 +15373,7 @@ snapshots: astral-regex@2.0.0: {} - astro@4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20251006): + astro@4.16.18(@types/node@22.14.0)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(typescript@6.0.0-dev.20251008): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.4.1 @@ -15398,7 +15426,7 @@ snapshots: semver: 7.7.1 shiki: 1.29.2 tinyexec: 0.3.2 - tsconfck: 3.1.5(typescript@6.0.0-dev.20251006) + tsconfck: 3.1.5(typescript@6.0.0-dev.20251008) unist-util-visit: 5.0.0 vfile: 6.0.3 vite: 5.4.17(@types/node@22.14.0)(sass-embedded@1.83.4)(terser@5.39.0) @@ -15408,7 +15436,7 @@ snapshots: yargs-parser: 21.1.1 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@6.0.0-dev.20251006)(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@6.0.0-dev.20251008)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -15424,7 +15452,7 @@ snapshots: - terser - typescript - astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251006)(yaml@2.7.1): + astro@5.6.0(@types/node@22.14.0)(aws4fetch@1.0.20)(jiti@2.4.2)(rollup@4.39.0)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(typescript@6.0.0-dev.20251008)(yaml@2.7.1): dependencies: '@astrojs/compiler': 2.11.0 '@astrojs/internal-helpers': 0.6.1 @@ -15470,7 +15498,7 @@ snapshots: shiki: 3.2.1 tinyexec: 0.3.2 tinyglobby: 0.2.12 - tsconfck: 3.1.5(typescript@6.0.0-dev.20251006) + tsconfck: 3.1.5(typescript@6.0.0-dev.20251008) ultrahtml: 1.5.3 unist-util-visit: 5.0.0 unstorage: 1.15.0(aws4fetch@1.0.20) @@ -15482,7 +15510,7 @@ snapshots: yocto-spinner: 0.2.1 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) - zod-to-ts: 1.2.0(typescript@6.0.0-dev.20251006)(zod@3.24.2) + zod-to-ts: 1.2.0(typescript@6.0.0-dev.20251008)(zod@3.24.2) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -15777,6 +15805,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -16234,13 +16266,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 - create-jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + create-jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -16359,6 +16391,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.3: + dependencies: + ms: 2.1.3 + decamelize@1.2.0: {} decamelize@5.0.1: {} @@ -16455,7 +16491,7 @@ snapshots: detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -16569,7 +16605,7 @@ snapshots: dependencies: semver: 7.7.1 shelljs: 0.8.5 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 dset@3.1.4: {} @@ -16760,7 +16796,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.2): dependencies: - debug: 4.4.0 + debug: 4.4.3 esbuild: 0.25.2 transitivePeerDependencies: - supports-color @@ -17066,7 +17102,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -17391,7 +17427,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -17542,12 +17578,12 @@ snapshots: v8flags: 4.0.1 yargs: 16.2.0 - gulp-postcss@9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + gulp-postcss@9.0.1(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): dependencies: fancy-log: 1.3.3 plugin-error: 1.0.1 postcss: 8.5.2 - postcss-load-config: 3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + postcss-load-config: 3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) vinyl-sourcemaps-apply: 0.2.1 transitivePeerDependencies: - ts-node @@ -17770,7 +17806,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -17804,14 +17840,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -18211,7 +18247,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -18286,16 +18322,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + jest-cli@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + create-jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest-config: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -18305,7 +18341,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + jest-config@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -18331,7 +18367,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.14.0 - ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006) + ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -18419,10 +18455,10 @@ snapshots: '@types/node': 22.14.0 jest-util: 29.7.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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))): + 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.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) jest-circus: 29.7.0 jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 @@ -18554,7 +18590,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -18576,11 +18612,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006))): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008))): dependencies: ansi-escapes: 6.2.1 chalk: 5.4.1 - jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -18611,12 +18647,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)) + jest-cli: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -18940,7 +18976,7 @@ snapshots: log4js@6.9.1: dependencies: date-format: 4.0.14 - debug: 4.4.0 + debug: 4.4.3 flatted: 3.3.3 rfdc: 1.4.1 streamroller: 3.1.5 @@ -19000,7 +19036,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.3 make-error@1.3.6: {} @@ -19421,7 +19457,7 @@ snapshots: minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -19494,7 +19530,7 @@ snapshots: node-abi@3.74.0: dependencies: - semver: 7.7.1 + semver: 7.7.3 node-fetch-native@1.6.6: {} @@ -19793,7 +19829,7 @@ snapshots: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -20042,7 +20078,7 @@ snapshots: portfinder@1.0.35: dependencies: async: 3.2.6 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -20053,13 +20089,13 @@ snapshots: csso: 5.0.5 postcss: 8.5.2 - postcss-load-config@3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006)): + postcss-load-config@3.1.4(postcss@8.5.2)(ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.2 - ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006) + ts-node: 10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008) postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.20.6)(yaml@2.7.1): dependencies: @@ -20311,7 +20347,7 @@ snapshots: proxy-agent@6.4.0: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.3.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -20324,7 +20360,7 @@ snapshots: proxy-agent@6.5.0: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -20402,9 +20438,9 @@ snapshots: - bufferutil - utf-8-validate - react-docgen-typescript@2.2.2(typescript@6.0.0-dev.20251006): + react-docgen-typescript@2.2.2(typescript@6.0.0-dev.20251008): dependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 react-docgen@7.1.1: dependencies: @@ -20997,6 +21033,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.3: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -21017,7 +21055,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -21226,7 +21264,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3 socks: 2.8.4 transitivePeerDependencies: - supports-color @@ -21374,7 +21412,7 @@ snapshots: streamroller@3.1.5: dependencies: date-format: 4.0.14 - debug: 4.4.0 + debug: 4.4.3 fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -21526,7 +21564,7 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.4.0 + debug: 4.4.3 fast-safe-stringify: 2.1.1 form-data: 4.0.2 formidable: 3.5.2 @@ -21763,9 +21801,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@6.0.0-dev.20251006): + ts-api-utils@1.4.3(typescript@6.0.0-dev.20251008): dependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 ts-dedent@2.2.0: {} @@ -21795,7 +21833,7 @@ snapshots: optionalDependencies: '@swc/core': 1.11.16 - ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251006): + ts-node@10.9.2(@swc/core@1.11.16)(@types/node@22.14.0)(typescript@6.0.0-dev.20251008): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -21809,7 +21847,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: @@ -21820,9 +21858,9 @@ snapshots: optionalDependencies: typescript: 5.8.2 - tsconfck@3.1.5(typescript@6.0.0-dev.20251006): + tsconfck@3.1.5(typescript@6.0.0-dev.20251008): optionalDependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 tsconfig-paths@4.2.0: dependencies: @@ -21967,13 +22005,13 @@ snapshots: typescript-auto-import-cache@0.3.5: dependencies: - semver: 7.7.1 + semver: 7.7.3 typescript@5.4.5: {} typescript@5.8.2: {} - typescript@6.0.0-dev.20251006: {} + typescript@6.0.0-dev.20251008: {} uc.micro@2.1.0: {} @@ -22245,18 +22283,18 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20251006)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)): + vite-plugin-dts@4.5.3(@types/node@22.14.0)(rollup@4.39.0)(typescript@6.0.0-dev.20251008)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1)): dependencies: '@microsoft/api-extractor': 7.52.2(@types/node@22.14.0) '@rollup/pluginutils': 5.1.4(rollup@4.39.0) '@volar/typescript': 2.4.12 - '@vue/language-core': 2.2.0(typescript@6.0.0-dev.20251006) + '@vue/language-core': 2.2.0(typescript@6.0.0-dev.20251008) compare-versions: 6.1.1 debug: 4.4.0 kolorist: 1.8.0 local-pkg: 1.1.1 magic-string: 0.30.17 - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 optionalDependencies: vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(sass-embedded@1.83.4)(terser@5.39.0)(tsx@4.20.6)(yaml@2.7.1) transitivePeerDependencies: @@ -22410,7 +22448,7 @@ snapshots: volar-service-typescript@0.0.62(@volar/language-service@2.4.12): dependencies: path-browserify: 1.0.1 - semver: 7.7.1 + semver: 7.7.3 typescript-auto-import-cache: 0.3.5 vscode-languageserver-textdocument: 1.0.12 vscode-nls: 5.2.0 @@ -22499,7 +22537,7 @@ snapshots: dependencies: chalk: 2.4.2 commander: 3.0.2 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -22825,9 +22863,9 @@ snapshots: dependencies: zod: 3.24.2 - zod-to-ts@1.2.0(typescript@6.0.0-dev.20251006)(zod@3.24.2): + zod-to-ts@1.2.0(typescript@6.0.0-dev.20251008)(zod@3.24.2): dependencies: - typescript: 6.0.0-dev.20251006 + typescript: 6.0.0-dev.20251008 zod: 3.24.2 zod@3.22.4: {} diff --git a/turbo.json b/turbo.json index 1e8d9761..78a466bb 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,6 @@ { "$schema": "https://turbo.build/schema.json", + "ui": "tui", "tasks": { "build": { "dependsOn": ["^build"], From 99c05ca301d3b8db65c17d3dd7e607fad0074bed Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Thu, 9 Oct 2025 21:38:11 -0500 Subject: [PATCH 34/40] Increase heap size in validation workflow and fix type errors (#23) --- .github/workflows/_validate.yml | 2 ++ e2e/package.json | 1 + infra/aws-cdk/package.json | 1 + packages/design/package.json | 2 +- packages/forms/src/blueprint.ts | 6 +++--- packages/forms/src/builder/parse-form.ts | 4 ++-- packages/forms/src/pattern.ts | 4 +++- packages/forms/src/patterns/attachment/config.ts | 2 +- packages/forms/src/patterns/attachment/index.ts | 2 +- packages/forms/src/patterns/name/name.test.ts | 2 +- packages/forms/src/patterns/package-download/submit.ts | 10 +++++----- packages/forms/src/patterns/page-set/submit.ts | 8 ++++---- packages/forms/src/patterns/repeater/submit.ts | 6 +++--- packages/forms/src/repository/add-document.ts | 6 +++--- packages/forms/src/repository/delete-form.ts | 6 +++--- packages/forms/src/repository/get-document.ts | 6 +++--- packages/forms/src/repository/get-form-list.ts | 2 +- packages/forms/src/repository/get-form-session.ts | 4 ++-- packages/forms/src/repository/upsert-form-session.ts | 4 ++-- packages/forms/src/services/submit-form.ts | 8 ++++---- packages/forms/src/submission.ts | 6 +++--- packages/forms/src/types.ts | 4 ++-- 22 files changed, 51 insertions(+), 45 deletions(-) diff --git a/.github/workflows/_validate.yml b/.github/workflows/_validate.yml index 638daf98..a7c95325 100644 --- a/.github/workflows/_validate.yml +++ b/.github/workflows/_validate.yml @@ -99,6 +99,8 @@ jobs: - name: Initialize Terraform CDK configuration shell: bash working-directory: infra/cdktf + env: + NODE_OPTIONS: --max-old-space-size=4096 run: | pnpm cdktf get pnpm build:tsc diff --git a/e2e/package.json b/e2e/package.json index b041e75d..82e617e2 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -4,6 +4,7 @@ "private": true, "scripts": { "auth": "pnpm --filter=@flexion/forms-cli cli e2e create-test-session -p ../../packages/server/src/main.db -o ../../e2e/.env", + "clean": "rimraf coverage test-results playwright-report", "dev": "tsc -w", "test:e2e:ci": "pnpm auth && pnpm playwright test --headed", "test:e2e:dev": "pnpm auth && pnpm playwright test --ui-port=8080 --ui-host=0.0.0.0" diff --git a/infra/aws-cdk/package.json b/infra/aws-cdk/package.json index 160cd385..f156ff31 100644 --- a/infra/aws-cdk/package.json +++ b/infra/aws-cdk/package.json @@ -22,6 +22,7 @@ "build:typescript": "tsc", "build:synth": "cdk synth", "cdk": "cdk", + "clean": "rimraf dist cdk.out tsconfig.tsbuildinfo coverage", "test": "echo 'no tests'", "watch": "tsc -w" }, diff --git a/packages/design/package.json b/packages/design/package.json index 223ddd2f..0386b52a 100644 --- a/packages/design/package.json +++ b/packages/design/package.json @@ -25,7 +25,7 @@ "build:storybook": "storybook build", "build:styles": "gulp update", "clean": "pnpm clean:lib && pnpm clean:styles", - "clean:lib": "rimraf dist", + "clean:lib": "rimraf dist tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo coverage storybook-static", "clean:styles": "rimraf static", "dev": "run-p dev:*", "dev:lib": "vite", diff --git a/packages/forms/src/blueprint.ts b/packages/forms/src/blueprint.ts index 5de67c96..d2d7182b 100644 --- a/packages/forms/src/blueprint.ts +++ b/packages/forms/src/blueprint.ts @@ -6,7 +6,7 @@ import { generatePatternId, getPatternMap, removeChildPattern, -} from './pattern'; +} from './pattern.js'; import { type FieldsetPattern, type FormSummaryPattern, @@ -14,8 +14,8 @@ import { type PageSetPattern, type RepeaterPattern, type SequencePattern, -} from './patterns'; -import { type Blueprint, type FormOutput, type FormSummary } from './types'; +} from './patterns/index.js'; +import { type Blueprint, type FormOutput, type FormSummary } from './types.js'; export const nullBlueprint: Blueprint = { summary: { diff --git a/packages/forms/src/builder/parse-form.ts b/packages/forms/src/builder/parse-form.ts index df0c497a..96a300d9 100644 --- a/packages/forms/src/builder/parse-form.ts +++ b/packages/forms/src/builder/parse-form.ts @@ -1,8 +1,8 @@ import * as z from 'zod'; import { failure, success, type Result } from '@flexion/forms-common'; -import type { FormConfig } from '../pattern'; -import type { Blueprint } from '../types'; +import type { FormConfig } from '../pattern.js'; +import type { Blueprint } from '../types.js'; /** * Parses and validates an object against a form schema defined by the given configuration. diff --git a/packages/forms/src/pattern.ts b/packages/forms/src/pattern.ts index 319b909c..606ee8f3 100644 --- a/packages/forms/src/pattern.ts +++ b/packages/forms/src/pattern.ts @@ -1,5 +1,4 @@ import * as r from '@flexion/forms-common'; -import set from 'set-value'; import { type CreatePrompt } from './components.js'; import { type FormError, type FormErrors } from './error.js'; @@ -249,6 +248,9 @@ export const getFirstPattern = ( ): Pattern => { if (!pattern) { pattern = form.patterns[form.root]; + if (!pattern) { + throw new Error(`Root pattern with id ${form.root} not found`); + } } const elemConfig = getPatternConfig(config, pattern.type); const children = elemConfig.getChildren(pattern, form.patterns); diff --git a/packages/forms/src/patterns/attachment/config.ts b/packages/forms/src/patterns/attachment/config.ts index 2d8486ad..29d61401 100644 --- a/packages/forms/src/patterns/attachment/config.ts +++ b/packages/forms/src/patterns/attachment/config.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; import { enLocale as message } from '@flexion/forms-common'; import { ParsePatternConfigData, type Pattern } from '../../pattern.js'; import { safeZodParseFormErrors } from '../../util/zod.js'; -import { attachmentFileTypeMimes } from './file-type-options'; +import { attachmentFileTypeMimes } from './file-type-options.js'; export type AttachmentPattern = Pattern; diff --git a/packages/forms/src/patterns/attachment/index.ts b/packages/forms/src/patterns/attachment/index.ts index 70d122e4..f1c887b6 100644 --- a/packages/forms/src/patterns/attachment/index.ts +++ b/packages/forms/src/patterns/attachment/index.ts @@ -5,7 +5,7 @@ import { type PatternConfig } from '../../pattern.js'; import { parseConfigData, type AttachmentPattern } from './config.js'; import { createPrompt } from './prompt.js'; import { type AttachmentPatternOutput, parseUserInput } from './response.js'; -import { attachmentFileTypeMimes } from './file-type-options'; +import { attachmentFileTypeMimes } from './file-type-options.js'; export const attachmentConfig: PatternConfig< AttachmentPattern, diff --git a/packages/forms/src/patterns/name/name.test.ts b/packages/forms/src/patterns/name/name.test.ts index 75ac92d2..856c62e2 100644 --- a/packages/forms/src/patterns/name/name.test.ts +++ b/packages/forms/src/patterns/name/name.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { createNameSchema, nameConfig, type NamePattern } from './index'; +import { createNameSchema, nameConfig, type NamePattern } from './index.js'; describe('NamePattern tests', () => { describe('createNameSchema', () => { diff --git a/packages/forms/src/patterns/package-download/submit.ts b/packages/forms/src/patterns/package-download/submit.ts index d17800f6..2db6040f 100644 --- a/packages/forms/src/patterns/package-download/submit.ts +++ b/packages/forms/src/patterns/package-download/submit.ts @@ -1,11 +1,11 @@ import { failure, success, type Result } from '@flexion/forms-common'; -import { type Blueprint, type FormOutput } from '../..'; -import { createFormOutputFieldData, fillPDF } from '../../documents'; -import { sessionIsComplete } from '../../session'; -import { type SubmitHandler } from '../../submission'; +import { type FormOutput } from '../../index.js'; +import { createFormOutputFieldData, fillPDF } from '../../documents/index.js'; +import { sessionIsComplete } from '../../session.js'; +import { type SubmitHandler } from '../../submission.js'; -import { type PackageDownloadPattern } from './index'; +import { type PackageDownloadPattern } from './index.js'; export const downloadPackageHandler: SubmitHandler< PackageDownloadPattern diff --git a/packages/forms/src/patterns/page-set/submit.ts b/packages/forms/src/patterns/page-set/submit.ts index 15456adc..dad1eb6d 100644 --- a/packages/forms/src/patterns/page-set/submit.ts +++ b/packages/forms/src/patterns/page-set/submit.ts @@ -5,10 +5,10 @@ import { getPatternSafely, aggregatePatternSessionValues, } from '../../pattern.js'; -import { type FormSession } from '../../session'; -import { type SubmitHandler } from '../../submission'; -import { type PagePattern } from '../page/config'; -import { type PageSetPattern } from './config'; +import { type FormSession } from '../../session.js'; +import { type SubmitHandler } from '../../submission.js'; +import { type PagePattern } from '../page/config.js'; +import { type PageSetPattern } from './config.js'; const getPage = (formSession: FormSession) => { const page = formSession.route?.params.page?.toString(); diff --git a/packages/forms/src/patterns/repeater/submit.ts b/packages/forms/src/patterns/repeater/submit.ts index b28c7b0e..18fd875a 100644 --- a/packages/forms/src/patterns/repeater/submit.ts +++ b/packages/forms/src/patterns/repeater/submit.ts @@ -1,7 +1,7 @@ import { success } from '@flexion/forms-common'; -import { type RepeaterPattern } from '../..'; -import { type SubmitHandler } from '../../submission'; +import { type RepeaterPattern } from '../../index.js'; +import { type SubmitHandler } from '../../submission.js'; export const repeaterAddRowHandler: SubmitHandler = async ( context, @@ -15,7 +15,7 @@ export const repeaterAddRowHandler: SubmitHandler = async ( : []; const initialRepeaterRowData = opts.pattern.data.patterns.reduce( - (acc, patternId: string) => { + (acc, patternId) => { // THIS requires all the patterns to have object not string input values // acc[patternId] = {}; diff --git a/packages/forms/src/repository/add-document.ts b/packages/forms/src/repository/add-document.ts index ec1af5ec..b7ad6849 100644 --- a/packages/forms/src/repository/add-document.ts +++ b/packages/forms/src/repository/add-document.ts @@ -1,8 +1,8 @@ import { type Result, failure, success } from '@flexion/forms-common'; -import type { ParsedPdf } from '../documents/pdf/parsing-api'; -import type { DocumentFieldMap } from '../documents/types'; -import type { FormRepositoryContext } from '.'; +import type { ParsedPdf } from '../documents/pdf/parsing-api.js'; +import type { DocumentFieldMap } from '../documents/types.js'; +import type { FormRepositoryContext } from './index.js'; export type AddDocument = ( ctx: FormRepositoryContext, diff --git a/packages/forms/src/repository/delete-form.ts b/packages/forms/src/repository/delete-form.ts index eb20b114..a28243ab 100644 --- a/packages/forms/src/repository/delete-form.ts +++ b/packages/forms/src/repository/delete-form.ts @@ -1,7 +1,7 @@ import { type VoidResult, failure, voidSuccess } from '@flexion/forms-common'; -import type { FormOutput } from '../types'; -import type { FormRepositoryContext } from '.'; +import type { FormOutput } from '../types.js'; +import type { FormRepositoryContext } from './index.js'; export type DeleteForm = ( ctx: FormRepositoryContext, @@ -39,7 +39,7 @@ export const deleteForm: DeleteForm = async (ctx, formId) => { .where('id', 'in', documentIds) .execute() .then(_ => voidSuccess) - .catch((error: Error) => { + .catch(error => { return failure({ message: error.message, code: 'unknown' as const }); }); }); diff --git a/packages/forms/src/repository/get-document.ts b/packages/forms/src/repository/get-document.ts index 63d199c8..f614ae9f 100644 --- a/packages/forms/src/repository/get-document.ts +++ b/packages/forms/src/repository/get-document.ts @@ -1,8 +1,8 @@ import { type Result, failure, success } from '@flexion/forms-common'; -import type { ParsedPdf } from '../documents/pdf/parsing-api'; -import type { DocumentFieldMap } from '../documents/types'; -import type { FormRepositoryContext } from '.'; +import type { ParsedPdf } from '../documents/pdf/parsing-api.js'; +import type { DocumentFieldMap } from '../documents/types.js'; +import type { FormRepositoryContext } from './index.js'; export type GetDocument = ( ctx: FormRepositoryContext, diff --git a/packages/forms/src/repository/get-form-list.ts b/packages/forms/src/repository/get-form-list.ts index 4f7d1aa5..fa95d2a4 100644 --- a/packages/forms/src/repository/get-form-list.ts +++ b/packages/forms/src/repository/get-form-list.ts @@ -1,4 +1,4 @@ -import type { FormRepositoryContext } from '.'; +import type { FormRepositoryContext } from './index.js'; import type { JobStatus } from './jobs/types.js'; export type FormListItem = { diff --git a/packages/forms/src/repository/get-form-session.ts b/packages/forms/src/repository/get-form-session.ts index b36693ba..a2dfef39 100644 --- a/packages/forms/src/repository/get-form-session.ts +++ b/packages/forms/src/repository/get-form-session.ts @@ -1,6 +1,6 @@ import { type Result, failure, success } from '@flexion/forms-common'; -import { type FormSession, type FormSessionId } from '../session'; -import type { FormRepositoryContext } from '.'; +import { type FormSession, type FormSessionId } from '../session.js'; +import type { FormRepositoryContext } from './index.js'; export type GetFormSession = ( ctx: FormRepositoryContext, diff --git a/packages/forms/src/repository/upsert-form-session.ts b/packages/forms/src/repository/upsert-form-session.ts index a99fe292..76930205 100644 --- a/packages/forms/src/repository/upsert-form-session.ts +++ b/packages/forms/src/repository/upsert-form-session.ts @@ -1,6 +1,6 @@ import { type Result, failure, success } from '@flexion/forms-common'; -import { type FormSession } from '../session'; -import type { FormRepositoryContext } from '.'; +import { type FormSession } from '../session.js'; +import type { FormRepositoryContext } from './index.js'; export type UpsertFormSession = ( ctx: FormRepositoryContext, diff --git a/packages/forms/src/services/submit-form.ts b/packages/forms/src/services/submit-form.ts index 8724ae0c..009a2cd5 100644 --- a/packages/forms/src/services/submit-form.ts +++ b/packages/forms/src/services/submit-form.ts @@ -1,14 +1,14 @@ import { failure, success, type Result } from '@flexion/forms-common'; import { type FormServiceContext } from '../context/index.js'; -import { submitPage } from '../patterns/page-set/submit'; -import { downloadPackageHandler } from '../patterns/package-download/submit'; +import { submitPage } from '../patterns/page-set/submit.js'; +import { downloadPackageHandler } from '../patterns/package-download/submit.js'; import { repeaterAddRowHandler, repeaterDeleteRowHandler, -} from '../patterns/repeater/submit'; +} from '../patterns/repeater/submit.js'; import { type FormRoute } from '../route-data.js'; -import { SubmissionRegistry } from '../submission'; +import { SubmissionRegistry } from '../submission.js'; import { createFormSession, type FormSession, diff --git a/packages/forms/src/submission.ts b/packages/forms/src/submission.ts index 8a839222..1a81f2f5 100644 --- a/packages/forms/src/submission.ts +++ b/packages/forms/src/submission.ts @@ -7,9 +7,9 @@ import { type Pattern, type PatternId, getPattern, -} from './pattern'; -import { type FormSession } from './session'; -import { type Blueprint, type DocumentFieldMap } from '.'; +} from './pattern.js'; +import { type FormSession } from './session.js'; +import { type Blueprint, type DocumentFieldMap } from './index.js'; export type SubmitHandlerContext = { config: FormConfig; diff --git a/packages/forms/src/types.ts b/packages/forms/src/types.ts index d27d6bc9..1a06bdcc 100644 --- a/packages/forms/src/types.ts +++ b/packages/forms/src/types.ts @@ -1,5 +1,5 @@ -import { type DocumentFieldMap } from './documents/types'; -import { type PatternId, type PatternMap } from './pattern'; +import { type DocumentFieldMap } from './documents/types.js'; +import { type PatternId, type PatternMap } from './pattern.js'; export type Blueprint = { summary: FormSummary; From 06176d11ee76a5f6f394e8ffd37b8754f0600b48 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Thu, 9 Oct 2025 23:00:44 -0500 Subject: [PATCH 35/40] Use ?url imports on svgs to fix production build issue with rich text component icons (#27) Fixes #24 --- .../FormManager/FormEdit/AddPatternDropdown.tsx | 14 +++++++------- .../RichTextPatternEdit/RichTextPatternEdit.tsx | 17 ++++++++--------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx index 591481b2..da232f8e 100644 --- a/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx +++ b/packages/design/src/FormManager/FormEdit/AddPatternDropdown.tsx @@ -2,13 +2,13 @@ import React, { useState, useRef, useEffect } from 'react'; import { defaultFormConfig, type PatternConfig } from '@flexion/forms-core'; import { useFormManagerStore } from '../store.js'; import styles from './formEditStyles.module.css'; -import blockIcon from './images/block-icon.svg'; -import checkboxIcon from './images/checkbox-icon.svg'; -import longAnswerIcon from './images/long-answer-icon.svg'; -import pageIcon from './images/page-icon.svg'; -import shortAnswerIcon from './images/short-answer-icon.svg'; -import multipleChoiceIcon from './images/radio-options-icon.svg'; -import templateIcon from './images/template-icon.svg'; +import blockIcon from './images/block-icon.svg?url'; +import checkboxIcon from './images/checkbox-icon.svg?url'; +import longAnswerIcon from './images/long-answer-icon.svg?url'; +import pageIcon from './images/page-icon.svg?url'; +import shortAnswerIcon from './images/short-answer-icon.svg?url'; +import multipleChoiceIcon from './images/radio-options-icon.svg?url'; +import templateIcon from './images/template-icon.svg?url'; import classNames from 'classnames'; import { enLocale as message } from '@flexion/forms-common'; diff --git a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx index 3ad41560..2aac8d57 100644 --- a/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx +++ b/packages/design/src/FormManager/FormEdit/components/RichTextPatternEdit/RichTextPatternEdit.tsx @@ -21,15 +21,14 @@ import { useFormManagerStore } from '../../../store.js'; import { PatternEditComponent } from '../../types.js'; import styles from './richTextPatternEditStyles.module.css'; -import boldSvg from './images/format_bold.svg'; -import italicSvg from './images/format_italic.svg'; -import bulletListSvg from './images/format_list_bulleted.svg'; -import orderedListSvg from './images/format_list_numbered.svg'; -import headingSvg from './images/format_h2.svg'; -import subheadingSvg from './images/format_h3.svg'; +import boldSvg from './images/format_bold.svg?url'; +import italicSvg from './images/format_italic.svg?url'; +import bulletListSvg from './images/format_list_bulleted.svg?url'; +import orderedListSvg from './images/format_list_numbered.svg?url'; +import headingSvg from './images/format_h2.svg?url'; +import subheadingSvg from './images/format_h3.svg?url'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const icons: Record = { +const icons: Record = { 'format_h2.svg': headingSvg, 'format_h3.svg': subheadingSvg, 'format_bold.svg': boldSvg, @@ -39,7 +38,7 @@ const icons: Record = { }; const getIconPath = (iconPath: string) => { - return Object.values(icons[iconPath])[0] as string; + return icons[iconPath]; }; interface MenuBarProps { From 1f4e775375be8cf56b4c5424fb7dcb03ae000ca4 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Fri, 10 Oct 2025 10:00:21 -0500 Subject: [PATCH 36/40] Add submit (next page) simulation on form preview (#28) Fixes #26. Revisit this with #29. --- packages/design/src/Form/Form.tsx | 31 +++++++++++--- .../FormManager/FormPreview/FormPreview.tsx | 40 +++++++++++++++++-- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/packages/design/src/Form/Form.tsx b/packages/design/src/Form/Form.tsx index a5ddb89b..8716a7e8 100644 --- a/packages/design/src/Form/Form.tsx +++ b/packages/design/src/Form/Form.tsx @@ -78,6 +78,16 @@ export default function Form({ const formMethods = useForm>({}); + // Reset React Hook Form when route changes (e.g., page navigation in FormPreview) + // This prevents field values from bleeding across pages + // Only reset when we have an onSubmit handler (FormPreview mode), not in FormEdit mode + const hasOnSubmit = !!onSubmit; + useEffect(() => { + if (isPreview && hasOnSubmit) { + formMethods.reset({}); + } + }, [session.route?.params.page, isPreview, hasOnSubmit]); + return (
@@ -114,6 +124,19 @@ export default function Form({ > + ) : onSubmit ? ( +
{ + event?.preventDefault(); + onSubmit(data); + })} + method="POST" + aria-label={session.form.summary.title || 'Form'} + > + + ) : (
@@ -134,10 +157,8 @@ const FormContents = ({ prompt: Prompt; }) => { return ( - <> -
- {renderPromptComponents(context, prompt.components)} -
- +
+ {renderPromptComponents(context, prompt.components)} +
); }; diff --git a/packages/design/src/FormManager/FormPreview/FormPreview.tsx b/packages/design/src/FormManager/FormPreview/FormPreview.tsx index 94c3835b..dd840805 100644 --- a/packages/design/src/FormManager/FormPreview/FormPreview.tsx +++ b/packages/design/src/FormManager/FormPreview/FormPreview.tsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; -import { mergeSession } from '@flexion/forms-core'; +import { applyPromptResponse, mergeSession } from '@flexion/forms-core'; import Form from '../../Form/Form.js'; import { useRouteParams } from '../hooks.js'; @@ -12,7 +13,8 @@ export const FormPreview = () => { setSession: state.setSession, })); const session = useFormManagerStore(state => state.session); - const { routeParams } = useRouteParams(); + const { routeParams, pathname } = useRouteParams(); + const navigate = useNavigate(); useEffect(() => { if (routeParams.page !== session.route?.params.page) { @@ -27,5 +29,37 @@ export const FormPreview = () => { } }, [routeParams.page]); - return
; + const handleSubmit = (data: Record) => { + // Validate and update session with form data + const result = applyPromptResponse(context.config, session, { + action: 'submit', + data, + }); + + if (!result.success) { + console.warn('Error applying prompt response in preview...', result.error); + return; + } + + // Update session with validated data + setSession(result.data); + + // Navigate to next page + const currentPage = Number(routeParams.page) || 0; + const nextPage = currentPage + 1; + const newParams = new URLSearchParams({ + ...routeParams, + page: nextPage.toString(), + }); + navigate(`${pathname}?${newParams.toString()}`); + }; + + return ( + + ); }; From 8e7e47d73e22f61d8ffd0ace8eecd087eb8909c5 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Fri, 10 Oct 2025 10:39:28 -0500 Subject: [PATCH 37/40] Scope form sessions to form_id to avoid conflicts (#30) --- packages/server/src/pages/forms/[id].astro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/server/src/pages/forms/[id].astro b/packages/server/src/pages/forms/[id].astro index be1f642e..16b6d971 100644 --- a/packages/server/src/pages/forms/[id].astro +++ b/packages/server/src/pages/forms/[id].astro @@ -15,13 +15,13 @@ import ContentLayout from '../../layouts/ContentLayout.astro'; const { id: formId } = getAstroRouteParams(Astro, ['id']); const ctx = await getServerContext(Astro); -const sessionId = Astro.cookies.get('form_session_id')?.value; +const sessionId = Astro.cookies.get(`form_session_id_${formId}`)?.value; const setFormSessionCookie = (sessionId?: string) => { if (sessionId) { - Astro.cookies.set('form_session_id', sessionId); + Astro.cookies.set(`form_session_id_${formId}`, sessionId); } else { - Astro.cookies.delete('form_session_id'); + Astro.cookies.delete(`form_session_id_${formId}`); } }; From 80ee713ed6ff694881fe7a6bf7210eeaf905c62f Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Fri, 10 Oct 2025 11:03:19 -0500 Subject: [PATCH 38/40] Make spotlight session caching consistent with server (#31) --- .../src/features/form-page/store/actions/initialize.ts | 2 +- .../src/features/form-page/store/actions/on-submit-form.ts | 2 +- packages/server/src/pages/forms/[id].test.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/spotlight/src/features/form-page/store/actions/initialize.ts b/apps/spotlight/src/features/form-page/store/actions/initialize.ts index 997153e2..06e26213 100644 --- a/apps/spotlight/src/features/form-page/store/actions/initialize.ts +++ b/apps/spotlight/src/features/form-page/store/actions/initialize.ts @@ -9,7 +9,7 @@ export type Initialize = ( export const initialize: Initialize = (ctx, opts) => { // Get the session ID from local storage so we can use it on page reload. - const sessionId = window.localStorage.getItem('form_session_id') || undefined; + const sessionId = window.localStorage.getItem(`form_session_id_${opts.formId}`) || undefined; getFormSession(ctx, { formId: opts.formId, route: opts.route, diff --git a/apps/spotlight/src/features/form-page/store/actions/on-submit-form.ts b/apps/spotlight/src/features/form-page/store/actions/on-submit-form.ts index 7a78214c..65d7422c 100644 --- a/apps/spotlight/src/features/form-page/store/actions/on-submit-form.ts +++ b/apps/spotlight/src/features/form-page/store/actions/on-submit-form.ts @@ -37,7 +37,7 @@ export const onSubmitForm: OnSubmitForm = async (ctx, opts) => { sessionId: submission.data.sessionId, }, }); - window.localStorage.setItem('form_session_id', submission.data.sessionId); + window.localStorage.setItem(`form_session_id_${opts.formId}`, submission.data.sessionId); } else { console.error(submission.error); } diff --git a/packages/server/src/pages/forms/[id].test.ts b/packages/server/src/pages/forms/[id].test.ts index 27680116..6c9ff8db 100644 --- a/packages/server/src/pages/forms/[id].test.ts +++ b/packages/server/src/pages/forms/[id].test.ts @@ -235,7 +235,7 @@ const submitForm = async ( request: new Request(`http://localhost/forms/${formId}`, { method: 'POST', body: formData, - headers: sessionId ? { Cookie: `form_session_id=${sessionId}` } : {}, + headers: sessionId ? { Cookie: `form_session_id_${formId}=${sessionId}` } : {}, }), }); From ecd1088b375cb45f22cf0be4e47aadf3dd394c1a Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Mon, 30 Mar 2026 13:55:49 -0500 Subject: [PATCH 39/40] Add GSA/TTS and CEQ email addresses to sandbox allowlist --- apps/sandbox/src/server.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/sandbox/src/server.ts b/apps/sandbox/src/server.ts index 38e74561..840d1c00 100644 --- a/apps/sandbox/src/server.ts +++ b/apps/sandbox/src/server.ts @@ -29,6 +29,24 @@ export const createCustomServer = async (db: DatabaseContext): Promise => { 'lauren.george@maryland.gov', 'emil.leong@maryland.gov', 'paul.roberts@maryland.gov', + + // GSA/TTS people + 'amber.vanamburg@gsa.gov', + 'bret.mogilefsky@gsa.gov', + 'chris.bisom@gsa.gov', + 'daniel.naab@gsa.gov', + 'daniela.aburto@gsa.gov', + 'elizabeth.ayer@gsa.gov', + 'john.jediny@gsa.gov', + 'nicholas.papafil@gsa.gov', + 'samantha.noor@gsa.gov', + 'tyler.burton@gsa.gov', + + // CEQ + 'david.y.yi@ceq.eop.gov', + 'Jordan.K.Eccles@ceq.eop.gov', + 'michael.r.drummond@ceq.eop.gov', + 'sophie.r.godfrey-mckee@ceq.eop.gov' ].includes(email.toLowerCase()); }, }); From c54b9095f153a84c846092ed13fd6704794a31e2 Mon Sep 17 00:00:00 2001 From: Daniel Naab Date: Tue, 28 Apr 2026 21:39:29 -0500 Subject: [PATCH 40/40] Change project license from CC0 to Apache 2.0 (#32) ## Summary This updates the project license from Creative Commons Zero (CC0) to the Apache License, Version 2.0. - Added a standard `LICENSE` file containing the full Apache 2.0 license text - Updated the `license` field from `"CC0"` to `"Apache-2.0"` across all 9 package.json files that declared it The Apache 2.0 license provides explicit patent grants and contribution terms while remaining a widely adopted, permissive open-source license. GitHub will automatically detect the new license from the `LICENSE` file. ## Test plan - [ ] Verify the `LICENSE` file renders correctly on the repository landing page - [ ] Confirm GitHub displays "Apache-2.0" as the detected license --- LICENSE | 201 +++++++++++++++++++++++++++++++++ apps/cli/package.json | 2 +- apps/sandbox/package.json | 2 +- apps/server-doj/package.json | 2 +- infra/core/package.json | 2 +- package.json | 2 +- packages/auth/package.json | 2 +- packages/common/package.json | 2 +- packages/database/package.json | 2 +- packages/forms/package.json | 2 +- 10 files changed, 210 insertions(+), 9 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/apps/cli/package.json b/apps/cli/package.json index 661bc6cb..18749786 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform command-line interface", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "src/index.ts", "publishConfig": { "registry": "https://npm.pkg.github.com" diff --git a/apps/sandbox/package.json b/apps/sandbox/package.json index c90b230f..06a7faab 100644 --- a/apps/sandbox/package.json +++ b/apps/sandbox/package.json @@ -3,7 +3,7 @@ "version": "0.2.3", "description": "Form server sandbox for evaluating functionality.", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "src/index.ts", "private": true, "publishConfig": { diff --git a/apps/server-doj/package.json b/apps/server-doj/package.json index 564cf0c4..987b08fa 100644 --- a/apps/server-doj/package.json +++ b/apps/server-doj/package.json @@ -3,7 +3,7 @@ "version": "0.2.3", "description": "Form server instance for DOJ", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "src/index.ts", "private": true, "publishConfig": { diff --git a/infra/core/package.json b/infra/core/package.json index 720d22e8..0b2f105b 100644 --- a/infra/core/package.json +++ b/infra/core/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform core infrastructure management", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.js", "publishConfig": { diff --git a/package.json b/package.json index ca1a2b4d..52d8a748 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "10x Forms Platform", "type": "module", "main": "index.js", - "license": "CC0", + "license": "Apache-2.0", "packageManager": "pnpm@9.8.0", "scripts": { "build": "turbo run build --filter=!@flexion/forms-infra-cdktf --filter=!@flexion/forms-infra-aws-cdk", diff --git a/packages/auth/package.json b/packages/auth/package.json index f8fa8e4d..23d7efc3 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform auth module", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.js", "exports": { diff --git a/packages/common/package.json b/packages/common/package.json index b8c44fdd..afd87dae 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform shared resources", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", "exports": { diff --git a/packages/database/package.json b/packages/database/package.json index 7379b76d..c98d43c8 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform database", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", "types": "dist/types/index.d.ts", diff --git a/packages/forms/package.json b/packages/forms/package.json index 4347d429..8411a4c8 100644 --- a/packages/forms/package.json +++ b/packages/forms/package.json @@ -3,7 +3,7 @@ "version": "0.2.0", "description": "10x Forms Platform form handling", "type": "module", - "license": "CC0", + "license": "Apache-2.0", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", "types": "dist/types/index.d.ts",