diff --git a/.github/actions/setup-pnpm/action.yml b/.github/actions/setup-pnpm/action.yml new file mode 100644 index 0000000..ee6d7b8 --- /dev/null +++ b/.github/actions/setup-pnpm/action.yml @@ -0,0 +1,29 @@ +name: Setup pnpm +description: Install pnpm, Node.js, and dependencies + +runs: + using: composite + steps: + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - name: Install dependencies + shell: bash + run: pnpm install \ No newline at end of file diff --git a/.github/workflows/pr-run-tests.yml b/.github/workflows/pr-run-tests.yml deleted file mode 100644 index cd3505f..0000000 --- a/.github/workflows/pr-run-tests.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Validate tests for pull request - -on: - pull_request: - types: [ opened, synchronize, reopened ] - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - version: 10 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'pnpm' - - name: Get pnpm store directory - shell: bash - run: | - echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV - - name: Setup pnpm cache - uses: actions/cache@v4 - with: - path: ${{ env.STORE_PATH }} - key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-pnpm-store- - - name: Install dependencies - run: pnpm install - - name: Run tests - run: pnpm run test \ No newline at end of file diff --git a/.github/workflows/pr-validate.yml b/.github/workflows/pr-validate.yml new file mode 100644 index 0000000..3d79b46 --- /dev/null +++ b/.github/workflows/pr-validate.yml @@ -0,0 +1,28 @@ +name: Validate pull request + +on: + pull_request: + types: [ opened, synchronize, reopened ] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-pnpm + - name: Run linter + run: pnpm run lint + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-pnpm + - name: Run tests + run: pnpm run test + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup-pnpm + - name: Build + run: pnpm run build diff --git a/apps/playground/App.vue b/apps/playground/App.vue index 21634b7..14fcefe 100644 --- a/apps/playground/App.vue +++ b/apps/playground/App.vue @@ -4,9 +4,7 @@ import schema from './schema.js' export default { name: 'App', data () { - return { - ...schema - } + return { schema } } } @@ -23,11 +21,13 @@ export default {
- +
diff --git a/apps/playground/schema.example.js b/apps/playground/schema.example.js index de4e5ca..5d159be 100644 --- a/apps/playground/schema.example.js +++ b/apps/playground/schema.example.js @@ -1,40 +1,9 @@ -export default { - form: { - model: { - name: '', - surname: '', - terms: false - }, - schema: { - fields: [ - { - name: 'name', - label: 'Name', - type: 'input', - inputType: 'text', - model: 'name', - placeholder: 'Write name...', - readonly: false, - required: true - }, - { - name: 'surname', - label: 'Surname', - type: 'input', - inputType: 'text', - model: 'surname', - placeholder: 'Write surname...', - readonly: false, - required: true - }, - { - name: 'terms', - label: 'Accept terms and conditions', - type: 'input', - inputType: 'checkbox', - model: 'terms' - } - ] - } +import { f } from '@/index.ts' + +export default f.schema( + { + name: f.text('Name').label('Name').placeholder('Write name....').readonly(false).required(), + surname: f.text('Surname').label('Surname').placeholder('Write surname....').required(), + terms: f.checkbox('Terms').label('I accept terms and conditions') } -} \ No newline at end of file +).toRef() \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js index 020c11b..4570b38 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -10,7 +10,7 @@ export default [ ...pluginVue.configs['flat/recommended'], ...typescriptEslint.configs['recommended'], { - ignores: [ 'dist' ] + ignores: [ 'dist', 'apps' ] }, { languageOptions: { diff --git a/package.json b/package.json index 795eef2..d6cb2be 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "dev:sass": "sass --watch src/scss/themes:apps/playground/css/", "test": "vitest", "test:ui": "vitest --ui", - "build": "vite build && sass src/scss/themes/:dist/themes/", + "lint": "eslint", + "build": "tsc --noEmit && vite build && sass src/scss/themes/:dist/themes/", "preview": "vite preview", "docs:dev": "vitepress dev apps/docs", "docs:build": "vitepress build apps/docs", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6924092..e96b4ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,11 @@ overrides: '@octokit/request@>=9.0.0-beta.1 <9.2.1': '>=9.2.1' esbuild@<=0.24.2: '>=0.25.0' form-data@>=4.0.0 <4.0.4: '>=4.0.4' + glob@>=10.2.0 <10.5.0: '>=10.5.0' + js-yaml@>=4.0.0 <4.1.1: '>=4.1.1' + mdast-util-to-hast@>=13.0.0 <13.2.1: '>=13.2.1' + vite@<=5.4.19: '>=5.4.20' + vite@>=5.2.6 <=5.4.20: '>=5.4.21' vitest@>=2.0.0 <2.1.9: '>=2.1.9' importers: @@ -39,7 +44,7 @@ importers: version: 8.18.0(eslint@9.16.0)(typescript@5.7.2) '@vitejs/plugin-vue': specifier: ^5.1.3 - version: 5.2.1(vite@5.4.19(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + version: 5.2.1(vite@7.3.0(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) '@vitest/ui': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -77,20 +82,20 @@ importers: specifier: ^8.13.0 version: 8.18.0(eslint@9.16.0)(typescript@5.7.2) vite: - specifier: ^5.4.19 - version: 5.4.19(sass@1.82.0)(terser@5.37.0) + specifier: '>=5.4.21' + version: 7.3.0(sass@1.82.0)(terser@5.37.0) vite-plugin-dts: specifier: ^4.3.0 - version: 4.3.0(rollup@4.28.1)(typescript@5.7.2)(vite@5.4.19(sass@1.82.0)(terser@5.37.0)) + version: 4.3.0(rollup@4.53.5)(typescript@5.7.2)(vite@7.3.0(sass@1.82.0)(terser@5.37.0)) vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.25.0)(postcss@8.4.49)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2) + version: 1.6.3(@algolia/client-search@5.25.0)(postcss@8.5.6)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2) vitepress-plugin-group-icons: specifier: ^1.5.5 - version: 1.5.5(markdown-it@14.1.0)(vite@5.4.19(sass@1.82.0)(terser@5.37.0)) + version: 1.5.5(markdown-it@14.1.0)(vite@7.3.0(sass@1.82.0)(terser@5.37.0)) vitepress-plugin-tabs: specifier: ^0.7.1 - version: 0.7.1(vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.4.49)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2))(vue@3.5.13(typescript@5.7.2)) + version: 0.7.1(vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.5.6)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2))(vue@3.5.13(typescript@5.7.2)) vitest: specifier: ^3.2.4 version: 3.2.4(@vitest/ui@3.2.4)(jsdom@25.0.1)(sass@1.82.0)(terser@5.37.0) @@ -232,152 +237,158 @@ packages: search-insights: optional: true - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + '@esbuild/aix-ppc64@0.27.1': + resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + '@esbuild/android-arm64@0.27.1': + resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + '@esbuild/android-arm@0.27.1': + resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + '@esbuild/android-x64@0.27.1': + resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + '@esbuild/darwin-arm64@0.27.1': + resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + '@esbuild/darwin-x64@0.27.1': + resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + '@esbuild/freebsd-arm64@0.27.1': + resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + '@esbuild/freebsd-x64@0.27.1': + resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + '@esbuild/linux-arm64@0.27.1': + resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + '@esbuild/linux-arm@0.27.1': + resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + '@esbuild/linux-ia32@0.27.1': + resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + '@esbuild/linux-loong64@0.27.1': + resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + '@esbuild/linux-mips64el@0.27.1': + resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + '@esbuild/linux-ppc64@0.27.1': + resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + '@esbuild/linux-riscv64@0.27.1': + resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + '@esbuild/linux-s390x@0.27.1': + resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + '@esbuild/linux-x64@0.27.1': + resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + '@esbuild/netbsd-arm64@0.27.1': + resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + '@esbuild/netbsd-x64@0.27.1': + resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + '@esbuild/openbsd-arm64@0.27.1': + resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + '@esbuild/openbsd-x64@0.27.1': + resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + '@esbuild/openharmony-arm64@0.27.1': + resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.1': + resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + '@esbuild/win32-arm64@0.27.1': + resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + '@esbuild/win32-ia32@0.27.1': + resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + '@esbuild/win32-x64@0.27.1': + resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -455,9 +466,13 @@ packages: '@iconify/utils@2.3.0': resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} @@ -644,10 +659,6 @@ packages: resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} engines: {node: '>= 10.0.0'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -672,98 +683,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.53.5': + resolution: {integrity: sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.53.5': + resolution: {integrity: sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.53.5': + resolution: {integrity: sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.53.5': + resolution: {integrity: sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.53.5': + resolution: {integrity: sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.53.5': + resolution: {integrity: sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': + resolution: {integrity: sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.53.5': + resolution: {integrity: sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.53.5': + resolution: {integrity: sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.53.5': + resolution: {integrity: sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loong64-gnu@4.53.5': + resolution: {integrity: sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-ppc64-gnu@4.53.5': + resolution: {integrity: sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.53.5': + resolution: {integrity: sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-riscv64-musl@4.53.5': + resolution: {integrity: sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.5': + resolution: {integrity: sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.53.5': + resolution: {integrity: sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.53.5': + resolution: {integrity: sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-openharmony-arm64@4.53.5': + resolution: {integrity: sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.5': + resolution: {integrity: sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.53.5': + resolution: {integrity: sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-gnu@4.53.5': + resolution: {integrity: sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.5': + resolution: {integrity: sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==} cpu: [x64] os: [win32] @@ -874,6 +900,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -958,7 +987,7 @@ packages: resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 + vite: '>=5.4.21' vue: ^3.2.25 '@vitest/expect@3.2.4': @@ -968,7 +997,7 @@ packages: resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: '>=5.4.21' peerDependenciesMeta: msw: optional: true @@ -1190,10 +1219,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -1495,9 +1520,6 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - editorconfig@1.0.4: resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} engines: {node: '>=14'} @@ -1509,9 +1531,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} @@ -1553,8 +1572,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + esbuild@0.27.1: + resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} engines: {node: '>=18'} hasBin: true @@ -1681,6 +1700,15 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -1729,10 +1757,6 @@ packages: focus-trap@7.6.4: resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} @@ -1799,9 +1823,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + glob@13.0.0: + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -2019,9 +2043,6 @@ packages: resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} engines: {node: ^18.17 || >=20.6.1} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - java-properties@1.0.2: resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} engines: {node: '>= 0.6.0'} @@ -2044,8 +2065,8 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsdom@25.0.1: @@ -2147,6 +2168,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2182,8 +2207,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -2235,6 +2260,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -2281,6 +2310,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.8: resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2458,9 +2492,6 @@ packages: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} @@ -2518,9 +2549,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2554,6 +2585,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -2579,6 +2614,10 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + preact@10.26.6: resolution: {integrity: sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==} @@ -2672,8 +2711,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.53.5: + resolution: {integrity: sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2817,10 +2856,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -2831,10 +2866,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -2935,6 +2966,10 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3102,27 +3137,32 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' - vite: '*' + vite: '>=5.4.21' peerDependenciesMeta: vite: optional: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.3.0: + resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -3137,12 +3177,16 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vitepress-plugin-group-icons@1.5.5: resolution: {integrity: sha512-eVnBL3lVOYxByQg5xo44QZtGPv41JyxWI7YxuwrGcNUU+W8MMIjb9XlivBXb3W8CosFllJlLGiqNCBTnFZHFTA==} peerDependencies: markdown-it: '>=14' - vite: '>=3' + vite: '>=5.4.21' vitepress-plugin-tabs@0.7.1: resolution: {integrity: sha512-jxJvsicxnMSIYX9b8mAFLD2nwyKUcMO10dEt4nDSbinZhM8cGvAmMFOHPdf6TBX6gYZRl+/++/iYHtoM14fERQ==} @@ -3256,10 +3300,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -3481,79 +3521,82 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@esbuild/aix-ppc64@0.25.4': + '@esbuild/aix-ppc64@0.27.1': optional: true - '@esbuild/android-arm64@0.25.4': + '@esbuild/android-arm64@0.27.1': optional: true - '@esbuild/android-arm@0.25.4': + '@esbuild/android-arm@0.27.1': optional: true - '@esbuild/android-x64@0.25.4': + '@esbuild/android-x64@0.27.1': optional: true - '@esbuild/darwin-arm64@0.25.4': + '@esbuild/darwin-arm64@0.27.1': optional: true - '@esbuild/darwin-x64@0.25.4': + '@esbuild/darwin-x64@0.27.1': optional: true - '@esbuild/freebsd-arm64@0.25.4': + '@esbuild/freebsd-arm64@0.27.1': optional: true - '@esbuild/freebsd-x64@0.25.4': + '@esbuild/freebsd-x64@0.27.1': optional: true - '@esbuild/linux-arm64@0.25.4': + '@esbuild/linux-arm64@0.27.1': optional: true - '@esbuild/linux-arm@0.25.4': + '@esbuild/linux-arm@0.27.1': optional: true - '@esbuild/linux-ia32@0.25.4': + '@esbuild/linux-ia32@0.27.1': optional: true - '@esbuild/linux-loong64@0.25.4': + '@esbuild/linux-loong64@0.27.1': optional: true - '@esbuild/linux-mips64el@0.25.4': + '@esbuild/linux-mips64el@0.27.1': optional: true - '@esbuild/linux-ppc64@0.25.4': + '@esbuild/linux-ppc64@0.27.1': optional: true - '@esbuild/linux-riscv64@0.25.4': + '@esbuild/linux-riscv64@0.27.1': optional: true - '@esbuild/linux-s390x@0.25.4': + '@esbuild/linux-s390x@0.27.1': optional: true - '@esbuild/linux-x64@0.25.4': + '@esbuild/linux-x64@0.27.1': optional: true - '@esbuild/netbsd-arm64@0.25.4': + '@esbuild/netbsd-arm64@0.27.1': optional: true - '@esbuild/netbsd-x64@0.25.4': + '@esbuild/netbsd-x64@0.27.1': optional: true - '@esbuild/openbsd-arm64@0.25.4': + '@esbuild/openbsd-arm64@0.27.1': optional: true - '@esbuild/openbsd-x64@0.25.4': + '@esbuild/openbsd-x64@0.27.1': optional: true - '@esbuild/sunos-x64@0.25.4': + '@esbuild/openharmony-arm64@0.27.1': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/sunos-x64@0.27.1': optional: true - '@esbuild/win32-ia32@0.25.4': + '@esbuild/win32-arm64@0.27.1': optional: true - '@esbuild/win32-x64@0.25.4': + '@esbuild/win32-ia32@0.27.1': + optional: true + + '@esbuild/win32-x64@0.27.1': optional: true '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0)': @@ -3587,7 +3630,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -3642,14 +3685,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@isaacs/cliui@8.0.2': + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/balanced-match': 4.0.1 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -3848,9 +3888,6 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.0 optional: true - '@pkgjs/parseargs@0.11.0': - optional: true - '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -3865,69 +3902,78 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@rollup/pluginutils@5.1.3(rollup@4.28.1)': + '@rollup/pluginutils@5.1.3(rollup@4.53.5)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.53.5 + + '@rollup/rollup-android-arm-eabi@4.53.5': + optional: true + + '@rollup/rollup-android-arm64@4.53.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.5': + optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-darwin-x64@4.53.5': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.53.5': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-freebsd-x64@4.53.5': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.53.5': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.53.5': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.53.5': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-loong64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-ppc64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-musl@4.53.5': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.53.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.53.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-x64-musl@4.53.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-openharmony-arm64@4.53.5': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.53.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.53.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-x64-gnu@4.53.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.53.5': optional: true '@rushstack/node-core-library@5.10.0': @@ -4101,6 +4147,8 @@ snapshots: '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -4207,9 +4255,9 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.19(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue@5.2.1(vite@7.3.0(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2))': dependencies: - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) vue: 3.5.13(typescript@5.7.2) '@vitest/expect@3.2.4': @@ -4220,13 +4268,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.19(sass@1.82.0)(terser@5.37.0))': + '@vitest/mocker@3.2.4(vite@7.3.0(sass@1.82.0)(terser@5.37.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -4488,8 +4536,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} argparse@1.0.10: @@ -4684,7 +4730,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: typescript: 5.7.2 @@ -4761,8 +4807,6 @@ snapshots: dependencies: readable-stream: 2.3.8 - eastasianwidth@0.2.0: {} - editorconfig@1.0.4: dependencies: '@one-ini/wasm': 0.1.1 @@ -4774,8 +4818,6 @@ snapshots: emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - emojilib@2.4.0: {} entities@4.5.0: {} @@ -4810,33 +4852,34 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - esbuild@0.25.4: + esbuild@0.27.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 + '@esbuild/aix-ppc64': 0.27.1 + '@esbuild/android-arm': 0.27.1 + '@esbuild/android-arm64': 0.27.1 + '@esbuild/android-x64': 0.27.1 + '@esbuild/darwin-arm64': 0.27.1 + '@esbuild/darwin-x64': 0.27.1 + '@esbuild/freebsd-arm64': 0.27.1 + '@esbuild/freebsd-x64': 0.27.1 + '@esbuild/linux-arm': 0.27.1 + '@esbuild/linux-arm64': 0.27.1 + '@esbuild/linux-ia32': 0.27.1 + '@esbuild/linux-loong64': 0.27.1 + '@esbuild/linux-mips64el': 0.27.1 + '@esbuild/linux-ppc64': 0.27.1 + '@esbuild/linux-riscv64': 0.27.1 + '@esbuild/linux-s390x': 0.27.1 + '@esbuild/linux-x64': 0.27.1 + '@esbuild/netbsd-arm64': 0.27.1 + '@esbuild/netbsd-x64': 0.27.1 + '@esbuild/openbsd-arm64': 0.27.1 + '@esbuild/openbsd-x64': 0.27.1 + '@esbuild/openharmony-arm64': 0.27.1 + '@esbuild/sunos-x64': 0.27.1 + '@esbuild/win32-arm64': 0.27.1 + '@esbuild/win32-ia32': 0.27.1 + '@esbuild/win32-x64': 0.27.1 escalade@3.2.0: {} @@ -5000,6 +5043,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + fflate@0.8.2: {} figures@2.0.0: @@ -5047,11 +5094,6 @@ snapshots: dependencies: tabbable: 6.2.0 - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - form-data@4.0.4: dependencies: asynckit: 0.4.0 @@ -5132,14 +5174,11 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@13.0.0: dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 + minimatch: 10.1.1 minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 + path-scurry: 2.0.1 globals@13.24.0: dependencies: @@ -5201,7 +5240,7 @@ snapshots: comma-separated-tokens: 2.0.3 hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 @@ -5332,12 +5371,6 @@ snapshots: lodash.isstring: 4.0.1 lodash.uniqby: 4.7.0 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - java-properties@1.0.2: {} jju@1.4.0: {} @@ -5346,7 +5379,7 @@ snapshots: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.4.5 + glob: 13.0.0 js-cookie: 3.0.5 nopt: 7.2.1 @@ -5356,7 +5389,7 @@ snapshots: js-tokens@9.0.1: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -5474,6 +5507,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.2.4: {} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -5514,7 +5549,7 @@ snapshots: math-intrinsics@1.1.0: {} - mdast-util-to-hast@13.2.0: + mdast-util-to-hast@13.2.1: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -5566,6 +5601,10 @@ snapshots: mimic-fn@4.0.0: {} + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.0.8: dependencies: brace-expansion: 1.1.12 @@ -5616,6 +5655,8 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 + nanoid@3.3.11: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -5714,8 +5755,6 @@ snapshots: p-try@1.0.0: {} - package-json-from-dist@1.0.1: {} - package-manager-detector@1.3.0: {} parent-module@1.0.1: @@ -5766,9 +5805,9 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: + path-scurry@2.0.1: dependencies: - lru-cache: 10.4.3 + lru-cache: 11.2.4 minipass: 7.1.2 path-type@4.0.0: {} @@ -5789,6 +5828,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@3.0.0: {} pkg-conf@2.1.0: @@ -5825,6 +5866,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + preact@10.26.6: {} prelude-ls@1.2.1: {} @@ -5912,29 +5959,32 @@ snapshots: rfdc@1.4.1: {} - rollup@4.28.1: + rollup@4.53.5: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.53.5 + '@rollup/rollup-android-arm64': 4.53.5 + '@rollup/rollup-darwin-arm64': 4.53.5 + '@rollup/rollup-darwin-x64': 4.53.5 + '@rollup/rollup-freebsd-arm64': 4.53.5 + '@rollup/rollup-freebsd-x64': 4.53.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.5 + '@rollup/rollup-linux-arm-musleabihf': 4.53.5 + '@rollup/rollup-linux-arm64-gnu': 4.53.5 + '@rollup/rollup-linux-arm64-musl': 4.53.5 + '@rollup/rollup-linux-loong64-gnu': 4.53.5 + '@rollup/rollup-linux-ppc64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-gnu': 4.53.5 + '@rollup/rollup-linux-riscv64-musl': 4.53.5 + '@rollup/rollup-linux-s390x-gnu': 4.53.5 + '@rollup/rollup-linux-x64-gnu': 4.53.5 + '@rollup/rollup-linux-x64-musl': 4.53.5 + '@rollup/rollup-openharmony-arm64': 4.53.5 + '@rollup/rollup-win32-arm64-msvc': 4.53.5 + '@rollup/rollup-win32-ia32-msvc': 4.53.5 + '@rollup/rollup-win32-x64-gnu': 4.53.5 + '@rollup/rollup-win32-x64-msvc': 4.53.5 fsevents: 2.3.3 rrweb-cssom@0.7.1: {} @@ -6101,12 +6151,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -6120,10 +6164,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-bom@3.0.0: {} strip-final-newline@3.0.0: {} @@ -6216,6 +6256,11 @@ snapshots: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} @@ -6351,9 +6396,10 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -6362,11 +6408,13 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite-plugin-dts@4.3.0(rollup@4.28.1)(typescript@5.7.2)(vite@5.4.19(sass@1.82.0)(terser@5.37.0)): + vite-plugin-dts@4.3.0(rollup@4.53.5)(typescript@5.7.2)(vite@7.3.0(sass@1.82.0)(terser@5.37.0)): dependencies: '@microsoft/api-extractor': 7.48.0 - '@rollup/pluginutils': 5.1.3(rollup@4.28.1) + '@rollup/pluginutils': 5.1.3(rollup@4.53.5) '@volar/typescript': 2.4.10 '@vue/language-core': 2.1.6(typescript@5.7.2) compare-versions: 6.1.1 @@ -6376,38 +6424,41 @@ snapshots: magic-string: 0.30.15 typescript: 5.7.2 optionalDependencies: - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite@5.4.19(sass@1.82.0)(terser@5.37.0): + vite@7.3.0(sass@1.82.0)(terser@5.37.0): dependencies: - esbuild: 0.25.4 - postcss: 8.4.49 - rollup: 4.28.1 + esbuild: 0.27.1 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.5 + tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 sass: 1.82.0 terser: 5.37.0 - vitepress-plugin-group-icons@1.5.5(markdown-it@14.1.0)(vite@5.4.19(sass@1.82.0)(terser@5.37.0)): + vitepress-plugin-group-icons@1.5.5(markdown-it@14.1.0)(vite@7.3.0(sass@1.82.0)(terser@5.37.0)): dependencies: '@iconify-json/logos': 1.2.4 '@iconify-json/vscode-icons': 1.2.21 '@iconify/utils': 2.3.0 markdown-it: 14.1.0 - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) transitivePeerDependencies: - supports-color - vitepress-plugin-tabs@0.7.1(vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.4.49)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2))(vue@3.5.13(typescript@5.7.2)): + vitepress-plugin-tabs@0.7.1(vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.5.6)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2))(vue@3.5.13(typescript@5.7.2)): dependencies: - vitepress: 1.6.3(@algolia/client-search@5.25.0)(postcss@8.4.49)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2) + vitepress: 1.6.3(@algolia/client-search@5.25.0)(postcss@8.5.6)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2) vue: 3.5.13(typescript@5.7.2) - vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.4.49)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2): + vitepress@1.6.3(@algolia/client-search@5.25.0)(postcss@8.5.6)(sass@1.82.0)(search-insights@2.17.3)(terser@5.37.0)(typescript@5.7.2): dependencies: '@docsearch/css': 3.8.2 '@docsearch/js': 3.8.2(@algolia/client-search@5.25.0)(search-insights@2.17.3) @@ -6416,7 +6467,7 @@ snapshots: '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.1(vite@5.4.19(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) + '@vitejs/plugin-vue': 5.2.1(vite@7.3.0(sass@1.82.0)(terser@5.37.0))(vue@3.5.13(typescript@5.7.2)) '@vue/devtools-api': 7.7.6 '@vue/shared': 3.5.13 '@vueuse/core': 12.8.2(typescript@5.7.2) @@ -6425,10 +6476,10 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) vue: 3.5.13(typescript@5.7.2) optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -6439,6 +6490,7 @@ snapshots: - drauu - fuse.js - idb-keyval + - jiti - jwt-decode - less - lightningcss @@ -6453,14 +6505,16 @@ snapshots: - stylus - sugarss - terser + - tsx - typescript - universal-cookie + - yaml vitest@3.2.4(@vitest/ui@3.2.4)(jsdom@25.0.1)(sass@1.82.0)(terser@5.37.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.19(sass@1.82.0)(terser@5.37.0)) + '@vitest/mocker': 3.2.4(vite@7.3.0(sass@1.82.0)(terser@5.37.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -6478,13 +6532,14 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.19(sass@1.82.0)(terser@5.37.0) + vite: 7.3.0(sass@1.82.0)(terser@5.37.0) vite-node: 3.2.4(sass@1.82.0)(terser@5.37.0) why-is-node-running: 2.3.0 optionalDependencies: '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 25.0.1 transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -6494,6 +6549,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml vscode-uri@3.0.8: {} @@ -6563,12 +6620,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - ws@8.18.0: {} xml-name-validator@4.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 556e458..6ec88f5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -6,4 +6,9 @@ overrides: '@octokit/request@>=9.0.0-beta.1 <9.2.1': '>=9.2.1' esbuild@<=0.24.2: '>=0.25.0' form-data@>=4.0.0 <4.0.4: '>=4.0.4' + glob@>=10.2.0 <10.5.0: '>=10.5.0' + js-yaml@>=4.0.0 <4.1.1: '>=4.1.1' + mdast-util-to-hast@>=13.0.0 <13.2.1: '>=13.2.1' + vite@<=5.4.19: '>=5.4.20' + vite@>=5.2.6 <=5.4.20: '>=5.4.21' vitest@>=2.0.0 <2.1.9: '>=2.1.9' diff --git a/src/builders/base/BaseInput.ts b/src/builders/base/BaseInput.ts new file mode 100644 index 0000000..cb08d27 --- /dev/null +++ b/src/builders/base/BaseInput.ts @@ -0,0 +1,18 @@ +import type { Field } from '@/resources/types/field/fields' +import { BaseFieldBuilder } from '@/builders/base' + + +/** + * Base class for all input field builders e.g., TextFieldBuilder or CheckboxFieldBuilder. + */ +export default class BaseInputBuilder extends BaseFieldBuilder { + + constructor(name: string) { + super('input', name) + } + + getRequiredKeys(): (keyof T)[] { + return [ ...super.getRequiredKeys(), 'inputType' ] as (keyof T)[] + } + +} \ No newline at end of file diff --git a/src/builders/base/BaseOption.ts b/src/builders/base/BaseOption.ts new file mode 100644 index 0000000..971e49f --- /dev/null +++ b/src/builders/base/BaseOption.ts @@ -0,0 +1,46 @@ +import { BaseFieldBuilder, IBaseFieldBuilder } from '@/builders/base/index' +import type { FieldOption } from '@/resources/types/fieldAttributes' +import { Field } from '@/resources/types/field/fields' +import type { OptionField } from '@/resources/types/field/base' + +interface IBaseOptionFieldBuilder extends IBaseFieldBuilder { + option (name: FieldOption['name'], value: FieldOption['value']): this + options(options: FieldOption[]): this +} + +/** + * Base class for all option field builders e.g., SelectFieldBuilder or RadioFieldBuilder. + */ +export default class BaseOptionFieldBuilder + extends BaseFieldBuilder implements IBaseOptionFieldBuilder +{ + + constructor(type:string, name: string) { + super(type, name) + this.data.options = [] + } + + protected addOption (option: FieldOption): void { + this.data.options!.push(option) + } + + /** + * Adds an option to the field. + * @param name - Name/label of the option. + * @param value - Value/key of the option. + */ + option (name: FieldOption['name'], value: FieldOption['value']): this { + this.addOption({ name, value }) + return this + } + + /** + * Add multiple options to the field, replaces all previously defined options. + * @param options - An array of options. + */ + options(options: FieldOption[]): this { + this.data.options = options + return this + } + +} \ No newline at end of file diff --git a/src/builders/base/index.ts b/src/builders/base/index.ts new file mode 100644 index 0000000..bf324e2 --- /dev/null +++ b/src/builders/base/index.ts @@ -0,0 +1,226 @@ +import type { Field } from '@/resources/types/field/fields' +import type { FieldBase } from '@/resources/types/field/base' + +export interface IAbstractBaseBuilder { + __default__: V + __data__ (): Partial + extend (properties: Record): this + build (): F + model (key: string): this + default (value: any): this + getDefaultValue (): this['__default__'] +} + +/** + * The base class for every builder. Contains the absolute basics for every field builder. + */ +export abstract class AbstractBaseBuilder implements IAbstractBaseBuilder { + __default__!: V + + protected data: Partial = {} + + protected constructor (type: string, name: string) { + this.data = { + type, name + } as Partial + } + + __data__ (): Partial { return this.data } + + /** + * Gets the keys required for this field. + * Should be overridden by child classes if they have additional required keys. + * + * @protected + */ + protected getRequiredKeys (): (keyof F)[] { + return [ 'type', 'model' ] as (keyof F)[] + } + + /** + * Explicitly set the model key of the field. + * @param key + */ + model (key: string): this { + this.data.model = key + return this + } + + /** + * Get the default value of the field. + */ + getDefaultValue (): this['__default__'] { + return this.__default__ + } + + /** + * Set the initial value of the field. + */ + default (value: any): this { + this.__default__ = value + return this + } + + /** + * Extend the current field with additional properties. + * @param properties + */ + extend (properties: Record): this { + Object.assign(this.data, properties) + return this + } + + /** + * Build and validate the field object. + * Ensures all required properties are present. + */ + build (): F { + const requiredKeys: (keyof F)[] = this.getRequiredKeys() + const missingKeys: (keyof F)[] = requiredKeys.filter((key: keyof F) => { + return !(key in this.data) && (this.data[key] === undefined || this.data[key] === null || this.data[key] === '') + }) + + if (missingKeys.length) { + throw new Error(`Failed to build field. Missing required keys: ${missingKeys.join(', ')}`) + } + + return this.data as F + } + +} + +export interface IBaseFieldBuilder extends IAbstractBaseBuilder { + id (value: NonNullable): this + label(value: NonNullable): this + labelIcon (value: NonNullable): this + noLabel (value?: FieldBase['noLabel']): this + hint (value: NonNullable): this + required (value?: NonNullable): this + visible (value?: FieldBase['visible']): this + readonly (value?: FieldBase['readonly']): this + disabled (value?: FieldBase['disabled']): this + validator (value?: NonNullable): this + onValidated (value: NonNullable): this + validateOn (value: NonNullable): this +} + +/** + * Base class for most FieldBuilder classes. + */ +export abstract class BaseFieldBuilder extends AbstractBaseBuilder implements IBaseFieldBuilder { + + /** + * Set the id property of the field. + * @param value + */ + id (value: NonNullable): this { + this.data.id = value + return this + } + + /** + * Set the label property of the field. + * @param value + */ + label(value: NonNullable): this { + this.data.label = value + return this + } + + /** + * Set the labelIcon property of the field. + * @param value + */ + labelIcon (value: NonNullable): this { + this.data.labelIcon = value + return this + } + + /** + * Set the noLabel property of the field. + * @param value + */ + noLabel (value?: FieldBase['noLabel']): this { + if (value === undefined) value = true + this.data.noLabel = value + return this + } + + /** + * Set the hint property of the field. + * @param value + */ + hint (value: NonNullable): this { + this.data.hint = value + return this + } + + /** + * Set the required property of the field. + * @param value + */ + required (value?: NonNullable): this { + if (value === undefined) value = true + this.data.required = value + return this + } + + /** + * Set the visible property of the field. + * @param value + */ + visible (value?: FieldBase['visible']): this { + if (value === undefined) value = true + this.data.visible = value + return this + } + + /** + * Set the readonly property of the field. + * @param value + */ + readonly (value?: FieldBase['readonly']): this { + if (value === undefined) value = true + this.data.readonly = value + return this + } + + /** + * Set the disabled property of the field. + * @param value + */ + disabled (value?: FieldBase['disabled']): this { + if (value === undefined) value = true + this.data.disabled = value + return this + } + + /** + * Set the validator property of the field. + * @param value + */ + validator(value: NonNullable): this { + this.data.validator = value + return this + } + + /** + * Set the `validate` property of the field. This determines when the validation will take place. + * Defaults to `onBlur`. + * @param value + */ + validateOn (value: NonNullable): this { + this.data.validate = value + return this + } + + /** + * Set the onValidated property of the field. + * @param value + */ + onValidated (value: NonNullable) : this { + this.data.onValidated = value + return this + } + +} diff --git a/src/builders/fields/ButtonFieldBuilder.ts b/src/builders/fields/ButtonFieldBuilder.ts new file mode 100644 index 0000000..be58a5e --- /dev/null +++ b/src/builders/fields/ButtonFieldBuilder.ts @@ -0,0 +1,43 @@ +import { AbstractBaseBuilder, type IAbstractBaseBuilder } from '@/builders/base' +import type { ButtonField, Field } from '@/resources/types/field/fields' +import { NoValueError } from '@/exceptions' + +export interface IButtonFieldBuilder extends IAbstractBaseBuilder { + buttonText (text: string): this + onClick (callback: ButtonField['onClick']): this +} + +export default class ButtonFieldBuilder extends AbstractBaseBuilder implements IButtonFieldBuilder { + + constructor(name: string) { + super('button', name) + } + + getDefaultValue (): this['__default__'] { + throw new NoValueError() + } + + protected getRequiredKeys(): (keyof ButtonField)[] { + return [ 'type', 'buttonText', 'onClick' ] + } + + /** + * Set the text for the button. + * @param text - Text to set. + */ + buttonText (text: string): this { + this.data.buttonText = text + return this + } + + /** + * Set the onClick handler for the button. + * @param callback - Callback function. + */ + onClick (callback: ButtonField['onClick']): this { + this.data.onClick = callback + return this + } + +} + diff --git a/src/builders/fields/CheckboxFieldBuilder.ts b/src/builders/fields/CheckboxFieldBuilder.ts new file mode 100644 index 0000000..b34e0e2 --- /dev/null +++ b/src/builders/fields/CheckboxFieldBuilder.ts @@ -0,0 +1,12 @@ +import type { CheckboxField } from '@/resources/types/field/fields' +import BaseInputBuilder from '@/builders/base/BaseInput' + +export default class CheckboxFieldBuilder extends BaseInputBuilder { + __default__: boolean = false + + constructor(name: string) { + super(name) + this.data.inputType = 'checkbox' + } + +} diff --git a/src/builders/fields/ChecklistFieldBuilder.ts b/src/builders/fields/ChecklistFieldBuilder.ts new file mode 100644 index 0000000..24597e1 --- /dev/null +++ b/src/builders/fields/ChecklistFieldBuilder.ts @@ -0,0 +1,12 @@ +import BaseOptionFieldBuilder from '@/builders/base/BaseOption' +import { ChecklistField } from '@/resources/types/field/fields' + +export default class ChecklistFieldBuilder extends BaseOptionFieldBuilder { + __default__: string[] = [] + + constructor(name: string) { + super('checklist', name) + } + + +} \ No newline at end of file diff --git a/src/builders/fields/TextFieldBuilder.ts b/src/builders/fields/TextFieldBuilder.ts new file mode 100644 index 0000000..91c7197 --- /dev/null +++ b/src/builders/fields/TextFieldBuilder.ts @@ -0,0 +1,40 @@ +import { IBaseFieldBuilder } from '@/builders/base' +import type { TextField } from '@/resources/types/field/fields' +import BaseInputBuilder from '@/builders/base/BaseInput' + +export interface ITextFieldBuilder extends IBaseFieldBuilder { + placeholder (value: string): this + autoComplete (value?: boolean): this +} + +/** + * Field builder for the text field. + */ +export default class TextFieldBuilder extends BaseInputBuilder implements ITextFieldBuilder { + __default__: string = '' + + constructor(name: string) { + super(name) + this.data.inputType = 'text' + } + + /** + * Sets the `placeholder` property. + * @param value + */ + placeholder (value: string): this { + this.data.placeholder = value + return this + } + + /** + * Sets the `autocomplete` property. + * @param value + */ + autoComplete (value?: boolean): this { + if (value === undefined) value = true + this.data.autocomplete = value + return this + } + +} diff --git a/src/builders/group.ts b/src/builders/group.ts new file mode 100644 index 0000000..5faa7cd --- /dev/null +++ b/src/builders/group.ts @@ -0,0 +1,24 @@ +import { BaseFieldBuilder } from '@/builders/base' +import { FormGeneratorGroup } from '@/resources/types/generic' + +export interface IGroupBuilder { + build (): FormGeneratorGroup +} + +export default class GroupBuilder implements IGroupBuilder { + protected legend?: string = undefined + protected fields: BaseFieldBuilder[] = [] + + constructor(fields: BaseFieldBuilder[], legend?: string) { + this.fields = fields + if (this.legend) this.legend = legend + } + + build (): FormGeneratorGroup { + return { + legend: this.legend, + fields: this.fields.map(field => field.build()) + } + } + +} diff --git a/src/builders/index.ts b/src/builders/index.ts new file mode 100644 index 0000000..0fb0bb6 --- /dev/null +++ b/src/builders/index.ts @@ -0,0 +1,89 @@ +import { SchemaBuilder, SchemaModel } from '@/builders/schema' +import { BaseFieldBuilder } from '@/builders/base' + +import TextFieldBuilder from '@/builders/fields/TextFieldBuilder' +import CheckboxFieldBuilder from '@/builders/fields/CheckboxFieldBuilder' +import ChecklistFieldBuilder from '@/builders/fields/ChecklistFieldBuilder' +import ButtonFieldBuilder from '@/builders/fields/ButtonFieldBuilder' +import NumberFieldBuilder from '@/builders/fields/NumberFieldBuilder' + + +export const f = { + /** + * Returns a form schema builder instance. + * Takes a model object as the first argument. Takes field builders and group builders as the rest of the arguments. + * + * @example + * // Input + * f.schema({ + * name: f.text('Name').placeholder('Enter your name') + * }) + * // Output + * { + * model: { name: '' }, + * schema: { + * fields: [ + * { + * type: 'input', + * inputType: 'text', + * name: 'Name', + * model: 'name', + * placeholder: 'Enter your name' + * } + * ] + * } + * } + */ + schema: >>( + schema: S, + defaults?: Partial> + ): SchemaBuilder => new SchemaBuilder(schema, defaults), + /** + * Create a text field builder instance. + * + * @example + * // Inside a schema + * f.schema({ + * fieldModel: f.text('fieldName').placeholder('Field placeholder') + * }) + * @param name - Name of the field. + * @returns A text field builder instance. + */ + text: (name: string): TextFieldBuilder => { + return new TextFieldBuilder(name) + }, + /** + * Create a button field builder instance. + * @param name - Name of the button. + */ + button: (name: string): ButtonFieldBuilder => { + return new ButtonFieldBuilder(name) + }, + /** + * Create a checkbox field builder instance. + * @example + * // Inside a schema + * f.schema({ + * fieldModel: f.checkbox('fieldName').label('Checkbox label') + * }) + * @param name + * @returns A checkbox field builder instance. + */ + checkbox: (name: string): CheckboxFieldBuilder => new CheckboxFieldBuilder(name), + /** + * Create a checklist field builder instance. + * @example + * f.schema({ + * fieldModel: f.checklist('fieldName').options([ + * { name: 'All', value: 'all' }, + * { name: 'Supervisor', value: 'supervisor' } + * ]), + * // Or... + * fieldModel2: f.checklist('fieldName').option('All', 'all').option('Supervisor', 'supervisor') + * }) + * @param name + * @returns A checkbox field builder instance. + */ + checklist: (name: string): ChecklistFieldBuilder => new ChecklistFieldBuilder(name), + number: (name: string): NumberFieldBuilder => new NumberFieldBuilder(name) +} diff --git a/src/builders/schema.ts b/src/builders/schema.ts new file mode 100644 index 0000000..0cba80c --- /dev/null +++ b/src/builders/schema.ts @@ -0,0 +1,132 @@ +import { BaseFieldBuilder } from '@/builders/base' +import { FormGeneratorSchema } from '@/resources/types/generic' +import { type Ref, ref } from 'vue' +import { NoValueError } from '@/exceptions' + +/** + * Type representing the model of a schema. + */ +export type SchemaModel< + S extends Record> +> = { + [K in keyof S]: ReturnType +} + +/** + * Type representing the `field` type of a built schema. + */ +export type BuiltSchemaField< + S extends Record> +> = + S[keyof S] extends BaseFieldBuilder + ? F + : never + + +/** + * Form schema builder + * @param schema - An object containing field builders. The key of the object is the model key of the field, + * the value is the field builder instance. + */ +export class SchemaBuilder < + S extends Record> +> { + protected model: SchemaModel = {} as SchemaModel + protected fields: BaseFieldBuilder[] = [] + + constructor(schema: S, defaults?: Partial>) { + this.initialize(schema, defaults) + } + + /** + * Initialize the model and associated fields. + * @param schema - Schema object of field builders. + * @param defaults - Default values for the fields. + * @private + */ + private initialize (schema: S, defaults?: Partial>): void { + for (const [ modelKey, field ] of Object.entries(schema) ) { + try { + this.initializeField(modelKey as keyof S, field, defaults) + } catch (e) { + if (typeof field.getDefaultValue !== 'function') { + throw new Error(`Error initializing field ${modelKey}: Field might not be a field builder instance.`) + } + throw new Error(`Error initializing field ${modelKey}: ${e}`) + } + } + } + + /** + * Initialize a single field. + * @param modelKey - Key for the model. + * @param field - Field builder instance associated with the key. + * @param defaults - Default values for fields. + * @private + */ + private initializeField ( + modelKey: keyof S, + field: BaseFieldBuilder, + defaults?: Partial> + ): void { + try { + this.model[modelKey] = field.getDefaultValue() + const addField = field.model(modelKey as string) + if (defaults?.[modelKey]) { + addField.default(defaults[modelKey]) + } + this.addField(addField) + } catch (e) { + // Thrown whenever a field builder does not emit values, such as with FieldButton. + if (e instanceof NoValueError) { + this.addField(field) + } else { + throw e + } + } + } + + /** + * Get an array of all fields. + * @returns An array of fields. + */ + getFields (): BaseFieldBuilder[] { + return this.fields + } + + /** + * Add a field to the schema. + * @param field - Field builder instance of the field that needs to be added. + */ + private addField > (field: F): SchemaBuilder { + this.fields.push(field) + return this + } + + /** + * Build the schema and return as a Ref. + * @returns Built JSON schema wrapped in a Ref. + */ + toRef (): Ref< + FormGeneratorSchema, BuiltSchemaField> + > { + return ref(this.build()) as Ref, BuiltSchemaField>> + } + + /** + * Build the schema. Converts all builders to JSON. + * @returns A JSON object representing the schema. + */ + build (): FormGeneratorSchema< + SchemaModel, + BuiltSchemaField + > { + return { + model: this.model, + schema: { + fields: this.fields?.map(field => field.build()) ?? undefined + } + } + } + +} \ No newline at end of file diff --git a/src/components/FormLabel.vue b/src/components/FormLabel.vue index 6095de4..0c48348 100644 --- a/src/components/FormLabel.vue +++ b/src/components/FormLabel.vue @@ -13,11 +13,11 @@