Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
bef0b45
feat: implement default HTML5 fallback renderers and CI build optimiz…
vannt-dev Aug 4, 2026
d91c737
feat: form state hooks, schema adapters, wizard, DevTools + CI harden…
vannt-dev Aug 5, 2026
c3faa51
docs+example: package READMEs, vue/angular demo parity, source panels…
vannt-dev Aug 5, 2026
4bee6eb
fix(ci): run the angular demo build through npm so prebuild fires
vannt-dev Aug 5, 2026
75447a6
Fix a red-on-next-run CI gate, a blind CI gate, and adapter tree-shak…
vannt-dev Aug 14, 2026
5577177
Upgrade ng-packagr, vitest, and eslint where each was actually causin…
vannt-dev Aug 14, 2026
93b2593
chore: remove config that lies about how this repo works (#35)
vannt-dev Aug 30, 2026
e4f8dbd
chore: the eight tooling upgrades that never reached develop (#44)
vannt-dev Aug 30, 2026
187c870
fix: drop a .git-blame-ignore-revs entry that points at nothing (#45)
vannt-dev Aug 30, 2026
9b47222
docs: the enterprise feature set ships as v1.5, not v1.4
vannt-dev Aug 30, 2026
f970162
chore(release): put all four packages on one version line
vannt-dev Aug 30, 2026
a5b4482
docs(angular): fix the install pin and the nine exports the README ne…
vannt-dev Aug 30, 2026
e8c6901
docs(example): describe the demos as they are now, not as they were t…
vannt-dev Aug 30, 2026
34a6012
chore: add the MIT license text every package has always claimed
vannt-dev Aug 30, 2026
244c3d4
fix(angular): stop claiming the package is side-effect free
vannt-dev Aug 30, 2026
c7e304a
fix(build): make the published type declarations resolve under node16
vannt-dev Aug 30, 2026
e10044b
chore(release): give the packages the npm metadata and provenance the…
vannt-dev Aug 30, 2026
8a204d0
chore(release): version packages
github-actions[bot] Aug 30, 2026
940ba40
chore(ci): carry a release on one tag instead of four
vannt-dev Aug 30, 2026
064f6d9
fix(ci): stop demanding a changeset on release syncs into master
vannt-dev Aug 30, 2026
b22a6a1
chore(npm): make the packages findable, and land visitors on the demo
vannt-dev Aug 30, 2026
504ccb4
chore(release): version packages
github-actions[bot] Aug 30, 2026
7c5b6d2
feat(core): own the renderer prop contract instead of merely declarin…
vannt-dev Sep 3, 2026
d141ea3
fix(react): give touched one owner and every field a unique id
vannt-dev Sep 3, 2026
bff3238
fix(vue): give touched one owner, unique ids, and the full prop set
vannt-dev Sep 3, 2026
585b44b
fix(angular): let renderers see touched, dirty and id at all
vannt-dev Sep 3, 2026
57924c7
test(ci): fail the build when an adapter stops forwarding a contract …
vannt-dev Sep 3, 2026
67e4eec
docs: document the enforced prop contract, id namespacing and touched…
vannt-dev Sep 3, 2026
5d7bb39
feat: complete live and async form validation (#54)
vannt-dev Sep 3, 2026
9b65abb
chore(deps): upgrade to Angular 21 and TypeScript 5.9
vannt-dev Sep 3, 2026
5e0b08f
feat(validation): make async validation cancellable and status-aware
vannt-dev Sep 3, 2026
9055971
docs: bring the READMEs in line with the validation API
vannt-dev Sep 3, 2026
7140be8
fix: declare the peer ranges the packages can actually satisfy
vannt-dev Sep 3, 2026
eec9386
feat: re-export the new core helpers from every adapter
vannt-dev Sep 3, 2026
274fb2c
test(ci): link the published bundle with the floor Angular's own linker
vannt-dev Sep 3, 2026
5ae6f70
test(ci): fail the build when the docs import something that does not…
vannt-dev Sep 3, 2026
4be4584
chore(release): version packages
github-actions[bot] Sep 3, 2026
dbbd26f
ci(release): create the GitHub Release, not just the tag
vannt-dev Sep 3, 2026
7196338
feat(react): expose baselineValues and getDirtyValues from useDynamic…
vannt-dev Sep 4, 2026
17cca19
fix(react): re-base per-field dirty on reset and late-arriving values
vannt-dev Sep 4, 2026
ad850e9
perf(react): stop validating the same data twice per change
vannt-dev Sep 4, 2026
20858e7
feat(vue): expose baselineValues and getDirtyValues from useDynamicForm
vannt-dev Sep 4, 2026
f0979f2
fix(vue): re-base per-field dirty on reset and late-arriving values
vannt-dev Sep 4, 2026
78b0025
feat(angular): expose baselineValues and getDirtyValues from the form…
vannt-dev Sep 4, 2026
32f646c
fix(angular): let the dirty baseline be re-based after a reset
vannt-dev Sep 4, 2026
a7358f9
docs: add migration guide and changeset for the 1.7.0 form-state fixes
vannt-dev Sep 4, 2026
97b35a7
fix(core): make ariaDescribedBy point at a real error node id
vannt-dev Sep 4, 2026
a382170
feat(core): warn in dev when props shadows a renderer contract key
vannt-dev Sep 4, 2026
c863594
feat(react): render a validation message for default renderers
vannt-dev Sep 4, 2026
ee7e656
feat(vue): render a validation message for default renderers
vannt-dev Sep 4, 2026
fb0ec48
feat(angular): render a validation message for default renderers
vannt-dev Sep 4, 2026
e35e876
docs: aria wiring recipe and 1.7.0 renderer-contract migration notes
vannt-dev Sep 4, 2026
86b7723
feat(core): add a message catalog and resolver
vannt-dev Sep 4, 2026
7cbc05f
feat(core): resolve validator messages at validate time, add matches
vannt-dev Sep 4, 2026
cc81588
feat(core): thread the message context through validation
vannt-dev Sep 4, 2026
6dc5a06
feat(react): accept a messages catalog in useDynamicForm
vannt-dev Sep 4, 2026
c17dbfa
feat(vue): accept a messages catalog in useDynamicForm
vannt-dev Sep 4, 2026
213a8b9
feat(angular): accept a messages catalog in the form store
vannt-dev Sep 4, 2026
9b06e3f
docs: message catalog reference and 1.7.0 i18n migration notes
vannt-dev Sep 4, 2026
4b2ddc3
feat(core): add createOptionsLoader for async, debounced field options
vannt-dev Sep 4, 2026
992b550
feat(core): carry options loading state in the renderer prop bag
vannt-dev Sep 4, 2026
d941cec
feat(react): load async field options with debounce and abort
vannt-dev Sep 4, 2026
ee339ef
feat(vue): load async field options with debounce and abort
vannt-dev Sep 4, 2026
69ef742
feat(angular): load async field options with debounce and abort
vannt-dev Sep 4, 2026
53ed45a
docs: async options reference and 1.7.0 migration notes
vannt-dev Sep 4, 2026
23d2e1a
style: format the angular store spec
vannt-dev Sep 4, 2026
8871bd2
docs: bring the four package READMEs up to date with 1.7.0
vannt-dev Sep 4, 2026
2fd36d5
fix: address the code review findings on the 1.7.0 work
vannt-dev Sep 4, 2026
b367bfb
test: characterise the options loader's binding to its field description
vannt-dev Sep 4, 2026
30bf38c
chore(release): version packages
github-actions[bot] Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,23 @@ find the full documentation for it [in our repository](https://github.com/change

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md).

## How this repo is configured

`config.json` cannot carry comments, so the two non-default settings are
explained here.

**`linked`** holds all four published packages. They are one product released
together — `release.yml` writes a changeset for every package unless its
`packages` input names a subset — but `core` had fewer releases early on and
ended up a whole minor behind the three adapters (core 1.3.0 against adapter
1.4.0). `linked` makes every package that is released in the same pass take the
same version, which closes that gap once and keeps it closed. It is deliberately
not `fixed`: a patch that only touches angular still must not bump and republish
three packages whose tarballs did not change.

**`onlyUpdatePeerDependentsWhenOutOfRange`** stops a core release from
rewriting each adapter's `@dynamic-field-kit/core` peer range. The adapters use
only core APIs that have existed since 1.3.0, so `^1.3.0` is the honest range —
tightening it on every core release would force consumers to upgrade core for
features their adapter does not call.
11 changes: 9 additions & 2 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,16 @@
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"linked": [],
"linked": [
[
"@dynamic-field-kit/core",
"@dynamic-field-kit/react",
"@dynamic-field-kit/vue",
"@dynamic-field-kit/angular"
]
],
"access": "public",
"baseBranch": "master",
"baseBranch": "develop",
"updateInternalDependencies": "patch",
"___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": {
"onlyUpdatePeerDependentsWhenOutOfRange": true
Expand Down
6 changes: 0 additions & 6 deletions .eslintignore

This file was deleted.

67 changes: 0 additions & 67 deletions .eslintrc.cjs

This file was deleted.

14 changes: 14 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Revisions that only reformat. `git blame --ignore-revs-file .git-blame-ignore-revs`
# skips them, and `git config blame.ignoreRevsFile .git-blame-ignore-revs` makes
# that the default for this clone. GitHub reads this file automatically.
#
# Add a commit here only when it changes formatting and nothing else.
#
# Currently empty, deliberately. The prettier 2 -> 3 reformat (105 files, pure
# formatting) was written as its own commit precisely so it could be listed
# here, but #44 was squash-merged, so that commit does not exist on develop -
# its changes are inside e4f8dbd alongside the vitest 4 and eslint 10
# migrations. Listing e4f8dbd would hide the authorship of real changes, which
# is the opposite of what this file is for, so the reformat stays visible in
# blame. A future formatting-only commit should be merged without squashing and
# added here.
10 changes: 10 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Branch protection on master enables require_code_owner_reviews, which does
# nothing without this file. Every path needs an owner for that rule to bite.
* @vannt-dev

# Anything that decides what ships, or what a release does.
/.github/ @vannt-dev
/.changeset/ @vannt-dev
/scripts/ @vannt-dev
package.json @vannt-dev
package-lock.json @vannt-dev
25 changes: 25 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
## What

<!-- What changed, in one or two sentences. -->

## Why

<!-- The problem this solves. Link the issue if there is one. -->

## How to test

<!-- Commands or steps a reviewer can actually run. -->

---

- [ ] Added a changeset (`npx changeset`) if any package under `packages/` changed
- [ ] Tests cover the change — a bug fix has a test that failed before it
- [ ] Public API changes are reflected in the README / package README
- [ ] Behaviour is consistent across react, vue and angular, or the difference is explained above

<!--
CI runs: lint, format, prod audit, build x4, typecheck, type tests,
per-package tests with coverage floors, the three example apps, the built
package smoke test, and the cross-framework verify scripts.
Run locally with: npm run lint && npm run typecheck && npm test
-->
148 changes: 27 additions & 121 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,136 +10,42 @@ concurrency:
cancel-in-progress: true

jobs:
lint-and-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Lint & Format
run: npm run lint && npm run format-check

- name: Build packages
run: |
npm run build --workspace=@dynamic-field-kit/core
npm run build --workspace=@dynamic-field-kit/react
npm run build --workspace=@dynamic-field-kit/vue
npm run build --workspace=@dynamic-field-kit/angular

# Share the built dist with the verify job so it doesn't rebuild all four
# packages (ng-packagr's Angular build especially). Common ancestor of the
# four paths is `packages`, so the artifact stores `<pkg>/dist/...`.
- name: Upload built dist
uses: actions/upload-artifact@v4
with:
name: package-dist
path: |
packages/core/dist
packages/react/dist
packages/vue/dist
packages/angular/dist
retention-days: 1
if-no-files-found: error

- name: Typecheck
run: npm run typecheck

- name: Type tests
run: npm run test:types --workspace=@dynamic-field-kit/core

- name: Show bundle sizes
run: node scripts/show-sizes.js
gates:
uses: ./.github/workflows/quality-gates.yml

test:
name: Test ${{ matrix.package }}
changeset:
name: Changeset present
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- package: core
test-cmd: npm run test --workspace=@dynamic-field-kit/core -- --coverage
coverage-file: packages/core/coverage/lcov.info
coverage-name: core
- package: react
build-cmd: npm run build --workspace=@dynamic-field-kit/core
test-cmd: npm run test --workspace=@dynamic-field-kit/react -- --coverage
coverage-file: packages/react/coverage/lcov.info
coverage-name: react
- package: vue
build-cmd: npm run build --workspace=@dynamic-field-kit/core
test-cmd: npm run test --workspace=@dynamic-field-kit/vue -- --coverage
coverage-file: packages/vue/coverage/lcov.info
coverage-name: vue
- package: angular
build-cmd: npm run build --workspace=@dynamic-field-kit/core
test-cmd: npm run test --workspace=@dynamic-field-kit/angular -- --coverage
coverage-file: packages/angular/coverage/lcov.info
coverage-name: angular
# Only PRs into develop can be missing a changeset, because develop is where
# unreleased work accumulates. Skipped elsewhere:
#
# - the release PR changesets itself opens, which consumes the changesets
# and bumps versions, so it changes packages while legitimately having
# none left;
# - any PR into master, which carries changes that were already released
# from develop - their changesets are gone by definition, and demanding a
# new one would mean releasing the same work twice.
if: >-
github.event_name == 'pull_request' &&
github.base_ref == 'develop' &&
!startsWith(github.head_ref, 'changeset-release/')
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build core
if: matrix.build-cmd != ''
run: ${{ matrix.build-cmd }}

- name: Run tests
run: ${{ matrix.test-cmd }}

- name: Upload coverage
if: matrix.coverage-file != '' && success()
uses: codecov/codecov-action@v4
- uses: actions/checkout@v7
with:
files: ${{ matrix.coverage-file }}
flags: unittests
name: ${{ matrix.coverage-name }}
fail_ci_if_error: false

verify:
runs-on: ubuntu-latest
needs: [lint-and-build, test]
steps:
- uses: actions/checkout@v4
# changeset status diffs against the base branch, so it needs history.
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v7
with:
node-version: '20'
node-version-file: '.nvmrc'
cache: 'npm'

- name: Install dependencies
run: npm ci

# Reuse the dist built by lint-and-build instead of rebuilding all four
# packages. Extract into `packages/` so paths become packages/<pkg>/dist.
- name: Download built dist
uses: actions/download-artifact@v4
with:
name: package-dist
path: packages

- name: Smoke test built packages
run: npm run test --workspace=@dynamic-field-kit/smoke

- name: Run verification scripts
run: |
node scripts/verify-framework-deps.js
node scripts/check-cross-framework-imports.js
node scripts/integration-cross-registry.js
# Fails when a PR changes a publishable package without adding a
# changeset, which would otherwise merge and silently never be released.
# Add one with `npx changeset`.
- name: Check for a changeset
run: npx changeset status --since=origin/${{ github.base_ref }}
Loading