From 4f3604b27356bb6ee828a37b5cca19aa40a22446 Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 20:26:47 +0100 Subject: [PATCH 01/32] chore() added changeset package to root --- package.json | 1 + pnpm-lock.yaml | 718 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 719 insertions(+) diff --git a/package.json b/package.json index f034ec4..950fbae 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "format:check": "oxfmt --check ." }, "devDependencies": { + "@changesets/cli": "^2.30.0", "@types/node": "^25.3.0", "@typescript/native-preview": "7.0.0-dev.20260306.1", "eslint": "^10.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0253c68..5babaab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: devDependencies: + '@changesets/cli': + specifier: ^2.30.0 + version: 2.30.0(@types/node@25.3.0) '@types/node': specifier: ^25.3.0 version: 25.3.0 @@ -69,6 +72,65 @@ importers: packages: + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.1.0': + resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.30.0': + resolution: {integrity: sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==} + hasBin: true + + '@changesets/config@3.1.3': + resolution: {integrity: sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.15': + resolution: {integrity: sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@esbuild/aix-ppc64@0.27.3': resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} @@ -271,6 +333,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -278,6 +349,24 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@oxfmt/binding-android-arm-eabi@0.34.0': resolution: {integrity: sha512-sqkqjh/Z38l+duOb1HtVqJTAj1grt2ttkobCopC/72+a4Xxz4xUgZPFyQ4HxrYMvyqO/YA0tvM1QbfOu70Gk1Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -529,6 +618,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@25.3.0': resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} @@ -584,14 +676,36 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + ansis@4.2.0: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + balanced-match@4.0.2: resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} engines: {node: 20 || >=22} + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -599,10 +713,17 @@ packages: resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} engines: {node: 20 || >=22} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -631,6 +752,18 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -669,6 +802,11 @@ packages: resolution: {integrity: sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -685,15 +823,25 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -707,6 +855,14 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -718,15 +874,42 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true + + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -753,6 +936,18 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@3.1.1: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} @@ -764,6 +959,14 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -773,6 +976,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -780,17 +986,36 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + minimatch@10.2.1: resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} engines: {node: 20 || >=22} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -817,19 +1042,45 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + oxfmt@0.34.0: resolution: {integrity: sha512-t+zTE4XGpzPTK+Zk9gSwcJcFi4pqjl6PwO/ZxPBJiJQ2XCKMucwjPlHxvPHyVKJtkMSyrDGfQ7Ntg/hUr4OgHQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -838,6 +1089,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} @@ -847,10 +1102,18 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -859,10 +1122,33 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rollup@4.57.1: resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -872,6 +1158,17 @@ packages: resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -880,14 +1177,40 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -896,6 +1219,10 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -912,6 +1239,10 @@ packages: undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + unplugin-utils@0.3.1: resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} engines: {node: '>=20.19.0'} @@ -998,6 +1329,151 @@ packages: snapshots: + '@babel/runtime@7.28.6': {} + + '@changesets/apply-release-plan@7.1.0': + dependencies: + '@changesets/config': 3.1.3 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.4 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.4 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.30.0(@types/node@25.3.0)': + dependencies: + '@changesets/apply-release-plan': 7.1.0 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.3 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.15 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@25.3.0) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.4 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.3': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.4 + + '@changesets/get-release-plan@4.0.15': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.3 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.3': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.7': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.3 + prettier: 2.8.8 + '@esbuild/aix-ppc64@0.27.3': optional: true @@ -1117,10 +1593,45 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@inquirer/external-editor@1.0.3(@types/node@25.3.0)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.3.0 + '@isaacs/cliui@9.0.0': {} '@jridgewell/sourcemap-codec@1.5.5': {} + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + '@oxfmt/binding-android-arm-eabi@0.34.0': optional: true @@ -1261,6 +1772,8 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/node@12.20.55': {} + '@types/node@25.3.0': dependencies: undici-types: 7.18.2 @@ -1309,22 +1822,44 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + ansis@4.2.0: {} + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + balanced-match@4.0.2: dependencies: jackspeak: 4.2.3 + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + birpc@2.9.0: {} brace-expansion@5.0.2: dependencies: balanced-match: 4.0.2 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 + chardet@2.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -1346,6 +1881,17 @@ snapshots: define-lazy-prop@3.0.0: {} + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + error-stack-parser-es@1.0.5: {} esbuild@0.27.3: @@ -1431,6 +1977,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 5.0.0 + esprima@4.0.1: {} + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -1443,12 +1991,26 @@ snapshots: esutils@2.0.3: {} + extendable-error@0.1.7: {} + fast-deep-equal@3.1.3: {} + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -1457,6 +2019,15 @@ snapshots: dependencies: flat-cache: 4.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -1469,13 +2040,46 @@ snapshots: flatted@3.3.3: {} + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fsevents@2.3.3: optional: true + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@4.1.3: {} + + iconv-lite@0.7.2: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} imurmurhash@0.1.4: {} @@ -1492,6 +2096,14 @@ snapshots: dependencies: is-docker: 3.0.0 + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -1502,12 +2114,25 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + js-yaml@3.14.2: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -1517,18 +2142,33 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 + lodash.startcase@4.4.0: {} + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + minimatch@10.2.1: dependencies: brace-expansion: 5.0.2 + mri@1.2.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -1555,6 +2195,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + outdent@0.5.0: {} + oxfmt@0.34.0: dependencies: tinypool: 2.1.0 @@ -1579,26 +2221,52 @@ snapshots: '@oxfmt/binding-win32-ia32-msvc': 0.34.0 '@oxfmt/binding-win32-x64-msvc': 0.34.0 + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + path-exists@4.0.0: {} path-key@3.1.1: {} + path-type@4.0.0: {} + pathe@2.0.3: {} perfect-debounce@2.1.0: {} picocolors@1.1.1: {} + picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@4.0.1: {} + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -1607,8 +2275,25 @@ snapshots: prelude-ls@1.2.1: {} + prettier@2.8.8: {} + punycode@2.3.1: {} + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.2 + pify: 4.0.1 + strip-bom: 3.0.0 + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 @@ -1642,20 +2327,47 @@ snapshots: run-applescript@7.1.0: {} + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.7.4: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + signal-exit@4.1.0: {} + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 + slash@3.0.0: {} + source-map-js@1.2.1: {} + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + term-size@2.2.1: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -1663,6 +2375,10 @@ snapshots: tinypool@2.1.0: {} + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + totalist@3.0.1: {} type-check@0.4.0: @@ -1673,6 +2389,8 @@ snapshots: undici-types@7.18.2: {} + universalify@0.1.2: {} + unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 From 0356ad87300bf4886e0351557f914423a08faad2 Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 20:29:39 +0100 Subject: [PATCH 02/32] chore() setup changeset --- .changeset/README.md | 8 ++++++++ .changeset/config.json | 11 +++++++++++ package.json | 5 ++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..654c6d4 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets). + +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). diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..ba0f177 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.3/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/package.json b/package.json index 950fbae..8a5fbbe 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,10 @@ "check": "tsgo -b --noEmit", "build": "tsgo -b", "format": "oxfmt .", - "format:check": "oxfmt --check ." + "format:check": "oxfmt --check .", + "changeset": "changeset", + "version": "changeset version", + "release": "changeset publish" }, "devDependencies": { "@changesets/cli": "^2.30.0", From 3570fc5fbb3e415e1955c35f1029f68f65c0db06 Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 20:42:19 +0100 Subject: [PATCH 03/32] chore() added files to changeset --- .changeset/odd-bikes-pay.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .changeset/odd-bikes-pay.md diff --git a/.changeset/odd-bikes-pay.md b/.changeset/odd-bikes-pay.md new file mode 100644 index 0000000..843189a --- /dev/null +++ b/.changeset/odd-bikes-pay.md @@ -0,0 +1,26 @@ +--- +"@michthemaker/vanjs": minor +"@michthemaker/vite-plugin-vanjs": minor +--- + +Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. + +- Fine-grained reactivity via van.state() and van.derive() +- Real DOM element creation via van.tags proxy +- Reactive list bindings with efficient DOM diffing using start/end comment markers +- van.add() for mounting children to existing DOM elements +- Automatic GC — disconnected nodes stop tracking state changes automatically +- Reactive lists support +- Strong types for attributes and event handlers +- No virtual DOM, no compiler, no lifecycle hooks, no build step required + +Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. + +- Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases +- State preservation across hot reloads using van.state() identity tracking +- Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically +- van.derive() always re-runs fresh on every HMR update +- Supports async arrow functions, TypeScript return type annotations, and generic components +- Error overlay with DOM preservation when a component throws during HMR +- Automatic GC for disconnected render slots +- Entry file and submodule transforms handled separately From 6e1a22052cacc55882c28deb41e8e3f2da053b8b Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 20:45:40 +0100 Subject: [PATCH 04/32] chore(.changeset/config.json) added ignore pattern to changeset config --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index ba0f177..fd6449c 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": [] + "ignore": ["app/*"] } From 24c9d03b8dfef7b4bffc4b9e9294376edb2ac33c Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 20:58:03 +0100 Subject: [PATCH 05/32] chore(.github/workflows/release.yml) added release workflow --- .changeset/config.json | 2 +- .github/workflows/release.yml | 48 +++++++++++++++++++ apps/examples/plugin-test-manual/package.json | 2 +- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.changeset/config.json b/.changeset/config.json index fd6449c..a173979 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["app/*"] + "ignore": ["basic-reactivity", "plugin-test", "plugin-test-manual"] } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..dc93a76 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: Release + +on: + push: + branches: + - release + +jobs: + release: + name: Release + runs-on: blacksmith-4vcpu-ubuntu-2404 + permissions: + contents: write + pull-requests: write + id-token: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: pnpm + registry-url: https://registry.npmjs.org + + - name: Install dependencies + run: pnpm install --filter "./packages/**" + + - name: Build packages + run: pnpm --filter "./packages/**" build + + - name: Create release PR or publish + uses: changesets/action@v1 + with: + publish: pnpm release + title: "chore: version packages" + commit: "chore: version packages" + createGithubReleases: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/apps/examples/plugin-test-manual/package.json b/apps/examples/plugin-test-manual/package.json index 3946c39..ae917fc 100644 --- a/apps/examples/plugin-test-manual/package.json +++ b/apps/examples/plugin-test-manual/package.json @@ -1,5 +1,5 @@ { - "name": "plugin-test", + "name": "plugin-test-manual", "version": "1.0.0", "description": "", "keywords": [], From 7c2ad1f690fa30814231cf8a59a091d67dac93d9 Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 22:07:46 +0100 Subject: [PATCH 06/32] chore(vanjs vite-plugin-vanjs) setup tsup for bundling --- packages/vanjs/package.json | 7 +- packages/vanjs/tsconfig.json | 12 +- packages/vanjs/tsup.config.ts | 10 + packages/vite-plugin-vanjs/package.json | 5 +- packages/vite-plugin-vanjs/src/index.ts | 6 +- packages/vite-plugin-vanjs/tsconfig.json | 8 +- packages/vite-plugin-vanjs/tsup.config.ts | 10 + pnpm-lock.yaml | 291 +++++++++++++++++++++- 8 files changed, 334 insertions(+), 15 deletions(-) create mode 100644 packages/vanjs/tsup.config.ts create mode 100644 packages/vite-plugin-vanjs/tsup.config.ts diff --git a/packages/vanjs/package.json b/packages/vanjs/package.json index 8bd971d..787072a 100644 --- a/packages/vanjs/package.json +++ b/packages/vanjs/package.json @@ -47,6 +47,11 @@ } } }, - "scripts": {}, + "scripts": { + "build": "tsup" + }, + "devDependencies": { + "tsup": "^8.5.1" + }, "packageManager": "pnpm@10.28.0" } diff --git a/packages/vanjs/tsconfig.json b/packages/vanjs/tsconfig.json index 457551a..5074ca3 100644 --- a/packages/vanjs/tsconfig.json +++ b/packages/vanjs/tsconfig.json @@ -5,7 +5,7 @@ "target": "ES2022", "useDefineForClassFields": true, "lib": ["ES2022", "DOM", "DOM.Iterable"], - "module": "Node16", + "module": "ESNext", "skipLibCheck": true, "paths": { "@src/*": ["./src/*"] @@ -13,7 +13,8 @@ "declaration": true, /* Bundler mode */ - "moduleResolution": "node16", + "moduleResolution": "bundler", + "rewriteRelativeImportExtensions": true, "verbatimModuleSyntax": true, "moduleDetection": "force", @@ -23,9 +24,8 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true, - - "outDir": "dist" + "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["node_modules"] } diff --git a/packages/vanjs/tsup.config.ts b/packages/vanjs/tsup.config.ts new file mode 100644 index 0000000..d534346 --- /dev/null +++ b/packages/vanjs/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm'], + dts: true, + outDir: 'dist', + clean: true, + skipNodeModulesBundle: true, +}) diff --git a/packages/vite-plugin-vanjs/package.json b/packages/vite-plugin-vanjs/package.json index 8797489..32958f7 100644 --- a/packages/vite-plugin-vanjs/package.json +++ b/packages/vite-plugin-vanjs/package.json @@ -35,9 +35,12 @@ } } }, - "scripts": {}, + "scripts": { + "build": "tsup" + }, "devDependencies": { "magic-string": "^0.30.21", + "tsup": "^8.5.1", "vite": "^7.3.1" }, "packageManager": "pnpm@10.28.0" diff --git a/packages/vite-plugin-vanjs/src/index.ts b/packages/vite-plugin-vanjs/src/index.ts index 2d21cc4..07366f3 100644 --- a/packages/vite-plugin-vanjs/src/index.ts +++ b/packages/vite-plugin-vanjs/src/index.ts @@ -1,11 +1,13 @@ import type { PluginOption } from "vite"; -import { vanjsRefresh, type VanJSHMROptions } from "./plugin.ts"; +import { vanjsRefresh, type VanJSHMROptions } from "./plugin"; type Options = { hmr?: boolean | VanJSHMROptions | undefined; }; -export default function vanjs(options: Options = { hmr: true }) { +export default function vanjs(options: Options = { hmr: { + smartStateChecking: true +} }) { const plugins: PluginOption[] = []; if (options.hmr) plugins.push( diff --git a/packages/vite-plugin-vanjs/tsconfig.json b/packages/vite-plugin-vanjs/tsconfig.json index 4d96661..2274d46 100644 --- a/packages/vite-plugin-vanjs/tsconfig.json +++ b/packages/vite-plugin-vanjs/tsconfig.json @@ -14,7 +14,7 @@ /* Bundler mode */ "moduleResolution": "bundler", - "allowImportingTsExtensions": true, + "rewriteRelativeImportExtensions": true, "verbatimModuleSyntax": true, "moduleDetection": "force", @@ -24,8 +24,8 @@ "noUnusedParameters": true, "erasableSyntaxOnly": true, "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true, - "outDir": "dist" + "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src"], + "exclude": ["node_modules"] } diff --git a/packages/vite-plugin-vanjs/tsup.config.ts b/packages/vite-plugin-vanjs/tsup.config.ts new file mode 100644 index 0000000..d534346 --- /dev/null +++ b/packages/vite-plugin-vanjs/tsup.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: ['src/index.ts'], + format: ['esm'], + dts: true, + outDir: 'dist', + clean: true, + skipNodeModulesBundle: true, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5babaab..a4a68e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,13 +59,20 @@ importers: specifier: workspace:* version: link:../../../packages/vite-plugin-vanjs - packages/vanjs: {} + packages/vanjs: + devDependencies: + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.6)(typescript@5.9.3) packages/vite-plugin-vanjs: devDependencies: magic-string: specifier: ^0.30.21 version: 0.30.21 + tsup: + specifier: ^8.5.1 + version: 8.5.1(postcss@8.5.6)(typescript@5.9.3) vite: specifier: ^7.3.1 version: 7.3.1(@types/node@25.3.0) @@ -346,9 +353,19 @@ packages: resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -673,6 +690,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -688,6 +710,9 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -721,9 +746,34 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -867,6 +917,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -959,6 +1012,10 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -986,6 +1043,17 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1012,6 +1080,9 @@ packages: resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} engines: {node: 20 || >=22} + mlly@1.8.1: + resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1023,6 +1094,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + 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} @@ -1031,6 +1105,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -1114,6 +1192,31 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -1141,6 +1244,10 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1193,6 +1300,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1207,10 +1318,25 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -1227,6 +1353,32 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1236,6 +1388,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + undici-types@7.18.2: resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} @@ -1602,8 +1757,20 @@ snapshots: '@isaacs/cliui@9.0.0': {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.6 @@ -1815,6 +1982,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.16.0: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -1828,6 +1997,8 @@ snapshots: ansis@4.2.0: {} + any-promise@1.3.0: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -1858,8 +2029,25 @@ snapshots: dependencies: run-applescript: 7.1.0 + bundle-require@5.1.0(esbuild@0.27.3): + dependencies: + esbuild: 0.27.3 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + chardet@2.1.1: {} + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + commander@4.1.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2033,6 +2221,12 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.1 + rollup: 4.57.1 + flat-cache@4.0.1: dependencies: flatted: 3.3.3 @@ -2114,6 +2308,8 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 + joycon@3.1.1: {} + js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -2142,6 +2338,12 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -2167,16 +2369,31 @@ snapshots: dependencies: brace-expansion: 5.0.2 + mlly@1.8.1: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + mri@1.2.0: {} mrmime@2.0.1: {} ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.11: {} natural-compare@1.4.0: {} + object-assign@4.1.1: {} + ohash@2.0.11: {} open@10.2.0: @@ -2267,6 +2484,20 @@ snapshots: pify@4.0.1: {} + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.1 + pathe: 2.0.3 + + postcss-load-config@6.0.1(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.6 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -2290,6 +2521,8 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readdirp@4.1.2: {} + resolve-from@5.0.0: {} reusify@1.1.0: {} @@ -2353,6 +2586,8 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.7.6: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -2366,8 +2601,28 @@ snapshots: strip-bom@3.0.0: {} + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + term-size@2.2.1: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinyexec@0.3.2: {} + tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -2381,12 +2636,46 @@ snapshots: totalist@3.0.1: {} + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsup@8.5.1(postcss@8.5.6)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.27.3) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.3 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.6) + resolve-from: 5.0.0 + rollup: 4.57.1 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 typescript@5.9.3: {} + ufo@1.6.3: {} + undici-types@7.18.2: {} universalify@0.1.2: {} From 2fec7914c402175eaa66d6e13ceea7df412da49f Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 22:13:27 +0100 Subject: [PATCH 07/32] chore(vanjs vite-plugin-vanjs) added correct main and types field in project package json --- packages/vanjs/package.json | 6 +++++- packages/vite-plugin-vanjs/package.json | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/vanjs/package.json b/packages/vanjs/package.json index 787072a..ed55ba6 100644 --- a/packages/vanjs/package.json +++ b/packages/vanjs/package.json @@ -33,6 +33,8 @@ "url": "git+https://github.com/michthemaker/vanjs.git" }, "type": "module", + "main": "./src/index.ts", + "types": "./src/van.ts", "exports": { ".": { "types": "./src/van.ts", @@ -45,7 +47,9 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js" } - } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" }, "scripts": { "build": "tsup" diff --git a/packages/vite-plugin-vanjs/package.json b/packages/vite-plugin-vanjs/package.json index 32958f7..c99100d 100644 --- a/packages/vite-plugin-vanjs/package.json +++ b/packages/vite-plugin-vanjs/package.json @@ -20,7 +20,8 @@ "url": "git+https://github.com/michthemaker/vanjs.git" }, "type": "module", - "main": "./index.ts", + "main": "./src/index.ts", + "types": "./src/index.d.ts", "exports": { ".": { "types": "./src/index.d.ts", @@ -33,7 +34,9 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js" } - } + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts" }, "scripts": { "build": "tsup" From 46b8f48e9798c40a966882226747b5193f1f706a Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 22:15:10 +0100 Subject: [PATCH 08/32] chore(package.json) updated build script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8a5fbbe..ed807aa 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "main": "index.js", "scripts": { "check": "tsgo -b --noEmit", - "build": "tsgo -b", + "build": "pnpm --filter \"./packages/**\" build", "format": "oxfmt .", "format:check": "oxfmt --check .", "changeset": "changeset", From 4445666cca703d5dd3b24cb53679dc712989ea1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 22:30:14 +0100 Subject: [PATCH 09/32] chore: version packages (#5) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/odd-bikes-pay.md | 26 ------------------------ packages/vanjs/CHANGELOG.md | 27 +++++++++++++++++++++++++ packages/vanjs/package.json | 2 +- packages/vite-plugin-vanjs/CHANGELOG.md | 27 +++++++++++++++++++++++++ packages/vite-plugin-vanjs/package.json | 2 +- 5 files changed, 56 insertions(+), 28 deletions(-) delete mode 100644 .changeset/odd-bikes-pay.md create mode 100644 packages/vanjs/CHANGELOG.md create mode 100644 packages/vite-plugin-vanjs/CHANGELOG.md diff --git a/.changeset/odd-bikes-pay.md b/.changeset/odd-bikes-pay.md deleted file mode 100644 index 843189a..0000000 --- a/.changeset/odd-bikes-pay.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -"@michthemaker/vanjs": minor -"@michthemaker/vite-plugin-vanjs": minor ---- - -Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. - -- Fine-grained reactivity via van.state() and van.derive() -- Real DOM element creation via van.tags proxy -- Reactive list bindings with efficient DOM diffing using start/end comment markers -- van.add() for mounting children to existing DOM elements -- Automatic GC — disconnected nodes stop tracking state changes automatically -- Reactive lists support -- Strong types for attributes and event handlers -- No virtual DOM, no compiler, no lifecycle hooks, no build step required - -Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. - -- Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases -- State preservation across hot reloads using van.state() identity tracking -- Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically -- van.derive() always re-runs fresh on every HMR update -- Supports async arrow functions, TypeScript return type annotations, and generic components -- Error overlay with DOM preservation when a component throws during HMR -- Automatic GC for disconnected render slots -- Entry file and submodule transforms handled separately diff --git a/packages/vanjs/CHANGELOG.md b/packages/vanjs/CHANGELOG.md new file mode 100644 index 0000000..9d42262 --- /dev/null +++ b/packages/vanjs/CHANGELOG.md @@ -0,0 +1,27 @@ +# @michthemaker/vanjs + +## 0.2.0 + +### Minor Changes + +- 3570fc5: Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. + + - Fine-grained reactivity via van.state() and van.derive() + - Real DOM element creation via van.tags proxy + - Reactive list bindings with efficient DOM diffing using start/end comment markers + - van.add() for mounting children to existing DOM elements + - Automatic GC — disconnected nodes stop tracking state changes automatically + - Reactive lists support + - Strong types for attributes and event handlers + - No virtual DOM, no compiler, no lifecycle hooks, no build step required + + Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. + + - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases + - State preservation across hot reloads using van.state() identity tracking + - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically + - van.derive() always re-runs fresh on every HMR update + - Supports async arrow functions, TypeScript return type annotations, and generic components + - Error overlay with DOM preservation when a component throws during HMR + - Automatic GC for disconnected render slots + - Entry file and submodule transforms handled separately diff --git a/packages/vanjs/package.json b/packages/vanjs/package.json index ed55ba6..3a8a0aa 100644 --- a/packages/vanjs/package.json +++ b/packages/vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vanjs", - "version": "0.1.0", + "version": "0.2.0", "description": "🍦 VanJS: The Smallest Reactive UI Framework in the World", "keywords": [ "DOM", diff --git a/packages/vite-plugin-vanjs/CHANGELOG.md b/packages/vite-plugin-vanjs/CHANGELOG.md new file mode 100644 index 0000000..e176828 --- /dev/null +++ b/packages/vite-plugin-vanjs/CHANGELOG.md @@ -0,0 +1,27 @@ +# @michthemaker/vite-plugin-vanjs + +## 0.2.0 + +### Minor Changes + +- 3570fc5: Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. + + - Fine-grained reactivity via van.state() and van.derive() + - Real DOM element creation via van.tags proxy + - Reactive list bindings with efficient DOM diffing using start/end comment markers + - van.add() for mounting children to existing DOM elements + - Automatic GC — disconnected nodes stop tracking state changes automatically + - Reactive lists support + - Strong types for attributes and event handlers + - No virtual DOM, no compiler, no lifecycle hooks, no build step required + + Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. + + - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases + - State preservation across hot reloads using van.state() identity tracking + - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically + - van.derive() always re-runs fresh on every HMR update + - Supports async arrow functions, TypeScript return type annotations, and generic components + - Error overlay with DOM preservation when a component throws during HMR + - Automatic GC for disconnected render slots + - Entry file and submodule transforms handled separately diff --git a/packages/vite-plugin-vanjs/package.json b/packages/vite-plugin-vanjs/package.json index c99100d..c6dbb32 100644 --- a/packages/vite-plugin-vanjs/package.json +++ b/packages/vite-plugin-vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vite-plugin-vanjs", - "version": "0.1.0", + "version": "0.2.0", "description": "The default Vite plugin for VanJS projects", "keywords": [ "fast refresh", From bb7c623967ae9b6a6dace9285d17022df6b10e81 Mon Sep 17 00:00:00 2001 From: themaker Date: Sun, 8 Mar 2026 22:55:40 +0100 Subject: [PATCH 10/32] updates --- apps/examples/basic-reactivity/package.json | 1 + apps/examples/plugin-test-manual/package.json | 1 + apps/examples/plugin-test/package.json | 1 + packages/vanjs/CHANGELOG.md | 2 -- packages/vanjs/package.json | 2 +- packages/vanjs/tsup.config.ts | 10 +++++----- packages/vite-plugin-vanjs/CHANGELOG.md | 2 -- packages/vite-plugin-vanjs/package.json | 2 +- packages/vite-plugin-vanjs/src/index.ts | 10 +++++++--- packages/vite-plugin-vanjs/tsup.config.ts | 10 +++++----- 10 files changed, 22 insertions(+), 19 deletions(-) diff --git a/apps/examples/basic-reactivity/package.json b/apps/examples/basic-reactivity/package.json index 0c9258c..15feddd 100644 --- a/apps/examples/basic-reactivity/package.json +++ b/apps/examples/basic-reactivity/package.json @@ -1,6 +1,7 @@ { "name": "basic-reactivity", "version": "1.0.0", + "private": true, "description": "", "keywords": [], "license": "ISC", diff --git a/apps/examples/plugin-test-manual/package.json b/apps/examples/plugin-test-manual/package.json index ae917fc..dec2da6 100644 --- a/apps/examples/plugin-test-manual/package.json +++ b/apps/examples/plugin-test-manual/package.json @@ -1,6 +1,7 @@ { "name": "plugin-test-manual", "version": "1.0.0", + "private": true, "description": "", "keywords": [], "license": "ISC", diff --git a/apps/examples/plugin-test/package.json b/apps/examples/plugin-test/package.json index 3946c39..330dfe7 100644 --- a/apps/examples/plugin-test/package.json +++ b/apps/examples/plugin-test/package.json @@ -1,6 +1,7 @@ { "name": "plugin-test", "version": "1.0.0", + "private": true, "description": "", "keywords": [], "license": "ISC", diff --git a/packages/vanjs/CHANGELOG.md b/packages/vanjs/CHANGELOG.md index 9d42262..75e4d16 100644 --- a/packages/vanjs/CHANGELOG.md +++ b/packages/vanjs/CHANGELOG.md @@ -5,7 +5,6 @@ ### Minor Changes - 3570fc5: Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. - - Fine-grained reactivity via van.state() and van.derive() - Real DOM element creation via van.tags proxy - Reactive list bindings with efficient DOM diffing using start/end comment markers @@ -16,7 +15,6 @@ - No virtual DOM, no compiler, no lifecycle hooks, no build step required Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. - - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases - State preservation across hot reloads using van.state() identity tracking - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically diff --git a/packages/vanjs/package.json b/packages/vanjs/package.json index 3a8a0aa..5ba5722 100644 --- a/packages/vanjs/package.json +++ b/packages/vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vanjs", - "version": "0.2.0", + "version": "0.0.0", "description": "🍦 VanJS: The Smallest Reactive UI Framework in the World", "keywords": [ "DOM", diff --git a/packages/vanjs/tsup.config.ts b/packages/vanjs/tsup.config.ts index d534346..7fc1319 100644 --- a/packages/vanjs/tsup.config.ts +++ b/packages/vanjs/tsup.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from 'tsup' +import { defineConfig } from "tsup"; export default defineConfig({ - entry: ['src/index.ts'], - format: ['esm'], + entry: ["src/index.ts"], + format: ["esm"], dts: true, - outDir: 'dist', + outDir: "dist", clean: true, skipNodeModulesBundle: true, -}) +}); diff --git a/packages/vite-plugin-vanjs/CHANGELOG.md b/packages/vite-plugin-vanjs/CHANGELOG.md index e176828..93c77e8 100644 --- a/packages/vite-plugin-vanjs/CHANGELOG.md +++ b/packages/vite-plugin-vanjs/CHANGELOG.md @@ -5,7 +5,6 @@ ### Minor Changes - 3570fc5: Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. - - Fine-grained reactivity via van.state() and van.derive() - Real DOM element creation via van.tags proxy - Reactive list bindings with efficient DOM diffing using start/end comment markers @@ -16,7 +15,6 @@ - No virtual DOM, no compiler, no lifecycle hooks, no build step required Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. - - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases - State preservation across hot reloads using van.state() identity tracking - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically diff --git a/packages/vite-plugin-vanjs/package.json b/packages/vite-plugin-vanjs/package.json index c6dbb32..55118d2 100644 --- a/packages/vite-plugin-vanjs/package.json +++ b/packages/vite-plugin-vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vite-plugin-vanjs", - "version": "0.2.0", + "version": "0.0.0", "description": "The default Vite plugin for VanJS projects", "keywords": [ "fast refresh", diff --git a/packages/vite-plugin-vanjs/src/index.ts b/packages/vite-plugin-vanjs/src/index.ts index 07366f3..8eba2d0 100644 --- a/packages/vite-plugin-vanjs/src/index.ts +++ b/packages/vite-plugin-vanjs/src/index.ts @@ -5,9 +5,13 @@ type Options = { hmr?: boolean | VanJSHMROptions | undefined; }; -export default function vanjs(options: Options = { hmr: { - smartStateChecking: true -} }) { +export default function vanjs( + options: Options = { + hmr: { + smartStateChecking: true, + }, + } +) { const plugins: PluginOption[] = []; if (options.hmr) plugins.push( diff --git a/packages/vite-plugin-vanjs/tsup.config.ts b/packages/vite-plugin-vanjs/tsup.config.ts index d534346..7fc1319 100644 --- a/packages/vite-plugin-vanjs/tsup.config.ts +++ b/packages/vite-plugin-vanjs/tsup.config.ts @@ -1,10 +1,10 @@ -import { defineConfig } from 'tsup' +import { defineConfig } from "tsup"; export default defineConfig({ - entry: ['src/index.ts'], - format: ['esm'], + entry: ["src/index.ts"], + format: ["esm"], dts: true, - outDir: 'dist', + outDir: "dist", clean: true, skipNodeModulesBundle: true, -}) +}); From 1d78675c159c7ef233303ac5652f9652bb453310 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 21:43:06 +0100 Subject: [PATCH 11/32] chore() update changelog to be correct --- packages/vanjs/CHANGELOG.md | 12 +----------- packages/vanjs/package.json | 2 +- packages/vite-plugin-vanjs/CHANGELOG.md | 14 ++------------ packages/vite-plugin-vanjs/package.json | 2 +- 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/packages/vanjs/CHANGELOG.md b/packages/vanjs/CHANGELOG.md index 75e4d16..8688621 100644 --- a/packages/vanjs/CHANGELOG.md +++ b/packages/vanjs/CHANGELOG.md @@ -1,6 +1,6 @@ # @michthemaker/vanjs -## 0.2.0 +## 0.1.0 ### Minor Changes @@ -13,13 +13,3 @@ - Reactive lists support - Strong types for attributes and event handlers - No virtual DOM, no compiler, no lifecycle hooks, no build step required - - Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. - - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases - - State preservation across hot reloads using van.state() identity tracking - - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically - - van.derive() always re-runs fresh on every HMR update - - Supports async arrow functions, TypeScript return type annotations, and generic components - - Error overlay with DOM preservation when a component throws during HMR - - Automatic GC for disconnected render slots - - Entry file and submodule transforms handled separately diff --git a/packages/vanjs/package.json b/packages/vanjs/package.json index 5ba5722..ed55ba6 100644 --- a/packages/vanjs/package.json +++ b/packages/vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vanjs", - "version": "0.0.0", + "version": "0.1.0", "description": "🍦 VanJS: The Smallest Reactive UI Framework in the World", "keywords": [ "DOM", diff --git a/packages/vite-plugin-vanjs/CHANGELOG.md b/packages/vite-plugin-vanjs/CHANGELOG.md index 93c77e8..1122ce9 100644 --- a/packages/vite-plugin-vanjs/CHANGELOG.md +++ b/packages/vite-plugin-vanjs/CHANGELOG.md @@ -1,20 +1,10 @@ # @michthemaker/vite-plugin-vanjs -## 0.2.0 +## 0.1.0 ### Minor Changes -- 3570fc5: Initial release of VanJS — a lightweight reactive UI framework that works directly with the real DOM. - - Fine-grained reactivity via van.state() and van.derive() - - Real DOM element creation via van.tags proxy - - Reactive list bindings with efficient DOM diffing using start/end comment markers - - van.add() for mounting children to existing DOM elements - - Automatic GC — disconnected nodes stop tracking state changes automatically - - Reactive lists support - - Strong types for attributes and event handlers - - No virtual DOM, no compiler, no lifecycle hooks, no build step required - - Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. +- 3570fc5: Initial release of the official VanJS Vite plugin providing Hot Module Replacement for VanJS components. - Automatic HMR wiring for named exports, default exports, and export { } syntax including aliases - State preservation across hot reloads using van.state() identity tracking - Shape-based state reset — when state initial value type changes across reloads, stale state is discarded automatically diff --git a/packages/vite-plugin-vanjs/package.json b/packages/vite-plugin-vanjs/package.json index 55118d2..c99100d 100644 --- a/packages/vite-plugin-vanjs/package.json +++ b/packages/vite-plugin-vanjs/package.json @@ -1,6 +1,6 @@ { "name": "@michthemaker/vite-plugin-vanjs", - "version": "0.0.0", + "version": "0.1.0", "description": "The default Vite plugin for VanJS projects", "keywords": [ "fast refresh", From 10479237c0b472e0fb3a2355534879cd4b902c7b Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 22:00:37 +0100 Subject: [PATCH 12/32] chore(./package.json) added clean script for removing dist folders --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ed807aa..ce46fc4 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "format:check": "oxfmt --check .", "changeset": "changeset", "version": "changeset version", - "release": "changeset publish" + "release": "changeset publish", + "clean": "pnpm -r exec rm -rf dist" }, "devDependencies": { "@changesets/cli": "^2.30.0", From 652199ff10660ee8d1227d596e98ee6150948a81 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 22:21:45 +0100 Subject: [PATCH 13/32] chore(./cicd.md) added a file explaining CI/CD structure --- cicd.md | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 cicd.md diff --git a/cicd.md b/cicd.md new file mode 100644 index 0000000..dd8e973 --- /dev/null +++ b/cicd.md @@ -0,0 +1,127 @@ +# CI/CD Flow + +## Branches + +``` +main ─────────────────────────────────────────► (stable, protected) + └── release ───────────────────────────────► (publish trigger) +``` + +--- + +## Pull Request Flow (main) + +``` +your feature branch + │ + │ git push origin + ▼ + open PR → main + │ + ├── ✅ Typecheck (tsgo -b --noEmit) + │ + ├── pass → PR can be merged + └── fail → PR is blocked, fix and push again +``` + +> Only admins can merge PRs. No force pushing to main. + +--- + +## Release Flow + +``` +main (up to date) + │ + │ git checkout release + │ git merge main + │ git push origin release + ▼ +release branch + │ + ├── pnpm install (packages/ only) + ├── pnpm build (packages/ only) + │ + └── changesets/action + │ + ├── finds .changeset/*.md files? + │ │ + │ ├── YES → opens "Version Packages" PR + │ │ bumps versions + │ │ generates CHANGELOG.md per package + │ │ deletes consumed .changeset files + │ │ + │ └── NO → nothing to publish, workflow exits + │ + └── "Version Packages" PR merged? + │ + └── YES → publishes to npm + creates GitHub release +``` + +--- + +## Changeset Workflow (per PR) + +``` +finish your work + │ + │ pnpm changeset + ▼ +CLI asks: + ├── which packages changed? (@michthemaker/vanjs, @michthemaker/vite-plugin-vanjs) + ├── how significant? (patch / minor / major) + └── describe what changed? (write while context is fresh) + │ + ▼ +.changeset/random-name.md created + │ + │ git add .changeset/ + │ git commit -m "chore: add changeset" + ▼ +committed alongside your code changes in the same PR +``` + +--- + +## Bump Types + +| Type | When to use | Example | +| ------- | --------------------------------- | ----------------- | +| `patch` | Bug fix, no API change | `0.1.0` → `0.1.1` | +| `minor` | New feature, backwards compatible | `0.1.0` → `0.2.0` | +| `major` | Breaking change | `0.1.0` → `1.0.0` | + +--- + +## Per-package versioning + +Packages version and publish **independently** — if only `vanjs` has changesets, only `vanjs` gets a new npm version. + +``` +.changeset/ + ├── fuzzy-lion.md → affects @michthemaker/vanjs (minor) + └── odd-bikes.md → affects @michthemaker/vite-plugin-vanjs (patch) + │ + ▼ + @michthemaker/vanjs 0.1.0 → 0.2.0 ✅ published + @michthemaker/vite-plugin-vanjs 0.1.0 → 0.1.1 ✅ published +``` + +--- + +## Full Picture + +``` +feature branch + │ + ▼ +PR → main ──── typecheck CI + │ + ▼ +merge main → release ──── build + publish CI + │ + ▼ + npm registry 📦 + GitHub release 🚀 +``` From c9e0bdba524ed943ac4df5e00ea8012e4df6f380 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 22:32:09 +0100 Subject: [PATCH 14/32] fix(https://github.com/michthemaker/vanjs/issues/7) readme in vite-plugin-vanjs --- .changeset/five-radios-taste.md | 5 + packages/vite-plugin-vanjs/README.md | 179 +++++++++++---------------- 2 files changed, 80 insertions(+), 104 deletions(-) create mode 100644 .changeset/five-radios-taste.md diff --git a/.changeset/five-radios-taste.md b/.changeset/five-radios-taste.md new file mode 100644 index 0000000..418828b --- /dev/null +++ b/.changeset/five-radios-taste.md @@ -0,0 +1,5 @@ +--- +"@michthemaker/vite-plugin-vanjs": patch +--- + +Fix README.md content to cater to @michthemaker/vite-plugin-vanjs diff --git a/packages/vite-plugin-vanjs/README.md b/packages/vite-plugin-vanjs/README.md index 27e5c88..b5e230b 100644 --- a/packages/vite-plugin-vanjs/README.md +++ b/packages/vite-plugin-vanjs/README.md @@ -1,157 +1,128 @@ -# VanJS +# @michthemaker/vite-plugin-vanjs -[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![npm version](https://img.shields.io/npm/v/@michthemaker/vanjs.svg?style=flat)](https://www.npmjs.com/package/@michthemaker/vanjs) [![bundle size](https://img.shields.io/bundlephobia/minzip/@michthemaker/vanjs)](https://bundlephobia.com/package/@michthemaker/vanjs) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md) +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![npm version](https://img.shields.io/npm/v/@michthemaker/vite-plugin-vanjs.svg?style=flat)](https://www.npmjs.com/package/@michthemaker/vite-plugin-vanjs) [![bundle size](https://img.shields.io/bundlephobia/minzip/@michthemaker/vite-plugin-vanjs)](https://bundlephobia.com/package/@michthemaker/vite-plugin-vanjs) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md) -VanJS is a lightweight reactive UI framework that works directly with the real DOM. - -- **No Virtual DOM:** VanJS binds state directly to real DOM nodes. When state changes, only the affected nodes update — no diffing, no reconciliation, no overhead. -- **No Compiler:** Write plain JavaScript or TypeScript. No JSX, no template syntax, no build-time magic. Your components are just functions that return DOM elements. -- **Reactive by Default:** `van.state()` and `van.derive()` give you fine-grained reactivity out of the box. Pass state directly to tags or derive computed values — updates propagate automatically. -- **Tiny by Design:** The entire runtime fits in a few KB. No dependencies, no framework DSL, no abstractions you didn't ask for. - -## Documentation - -- [Quick Start](#quick-start) -- [Core Primitives](#core-primitives) -- [Reactive State](#reactive-state) -- [Reactive Lists](#reactive-lists) -- [API Reference](#api-reference) -- [Contributing Guide](./CONTRIBUTING.md) +The official Vite plugin for [VanJS](https://github.com/michthemaker/vanjs) that brings **Hot Module Replacement** to your components — edit them in a running app without losing state. --- -## Quick Start +## Installation ```bash -npm create-van-app +npm install @michthemaker/vite-plugin-vanjs -D ``` ```ts -import van from "@michthemaker/vanjs"; +// vite.config.ts +import { defineConfig } from "vite"; +import vanjs from "@michthemaker/vite-plugin-vanjs"; -const { div, p, button } = van.tags; - -const App = () => { - const count = van.state(0); - return div( - p(() => `Count: ${count.val}`), - button({ onclick: () => count.val++ }, "+") - ); -}; - -van.add(document.body, App()); +export default defineConfig({ + plugins: [vanjs()], +}); ``` --- -## Core Primitives +## How it works -VanJS has four primitives. That's it. +The plugin transforms your component files at dev time to wire up HMR automatically. When you save a file, only the affected components re-render — state is preserved across updates. ```ts -import van from "@michthemaker/vanjs"; +// What you write +export const Counter = () => { + const count = van.state(0); + return div(button({ onclick: () => count.val++ }, count)); +}; -const { div, button, p } = van.tags; // create DOM elements -van.state(0); // reactive state -van.derive(() => count.val * 2); // computed values -van.add(document.body, App()); // mount to DOM +// What the plugin wires up (simplified) +export const $$__hmr__Counter = () => { ... }; +export const Counter = (props) => + __VAN_HMR__.registerRender('src/counter.ts:Counter', $$__hmr__Counter, props); + +if (import.meta.hot) { + import.meta.hot.accept((newModule) => { + if (newModule) __VAN_HMR__.rerender('src/counter.ts:Counter', newModule.$$__hmr__Counter); + }); +} ``` +None of this touches your production build — it's dev-only. + --- -## Reactive State +## Rules for HMR to work -`van.state(initialValue)` creates a reactive state object. Reading `.val` inside a binding or derive tracks it as a dependency. Writing `.val` triggers updates. +For the plugin to detect and wire up a component, follow these rules: + +**1. Components must be arrow functions** ```ts -const count = van.state(0); +// ✅ supported +export const Button = (props) => div(...); +export const Button = async (props) => div(...); -count.val; // read — tracked as dependency -count.val = 5; // write — triggers reactive updates -count.oldVal; // previous value before last update -count.rawVal; // raw value, no dependency tracking +// ❌ not supported +export function Button(props) { return div(...); } ``` -`van.derive(fn)` creates a computed value that re-runs automatically when its dependencies change. +**2. Components must use `van.tags`** ```ts -const count = van.state(0); -const doubled = van.derive(() => count.val * 2); - -count.val = 3; -doubled.val; // 6 — updated automatically -``` +const { div, button } = van.tags; ---- +// ✅ detected — uses a van tag +export const Card = () => div("hello"); -## Reactive Lists +// ❌ not detected — no van tags used +export const helper = () => ({ foo: "bar" }); +``` -Arrays returned from bindings are handled as list bindings — efficient DOM updates for dynamic lists using start/end comment markers. Only changed nodes are updated, not the whole container. +**3. Use `const`, not `let` or `var`** ```ts -const items = van.state(["apple", "banana", "cherry"]); - -van.add( - document.body, - div(() => items.val.map((item) => p(item))) -); +// ✅ +const Counter = () => div(...); -// Add an item — only the new node is inserted -items.val = [...items.val, "date"]; +// ❌ +let Counter = () => div(...); ``` ---- - -## API Reference +**4. All export styles are supported** -| API | Description | -| --------------------------- | ------------------------------- | -| `van.state(init)` | Create reactive state | -| `van.derive(fn)` | Create a computed value | -| `van.tags` | Proxy for creating DOM elements | -| `van.add(dom, ...children)` | Mount children to a DOM element | +```ts +export const Counter = () => div(...); // ✅ +export default Counter; // ✅ +export { Counter }; // ✅ +export { Counter as MyCounter }; // ✅ +export { Counter, Button }; // ✅ +``` --- -## Examples - -Here is a full counter example: +## Options ```ts -import van from "@michthemaker/vanjs"; - -const { div, h1, p, button } = van.tags; - -const Counter = () => { - const count = van.state(0); - const doubled = van.derive(() => count.val * 2); - - return div( - h1("Counter"), - p(() => `Count: ${count.val}`), - p(() => `Doubled: ${doubled.val}`), - button({ onclick: () => count.val++ }, "+"), - button({ onclick: () => count.val-- }, "-") - ); -}; - -van.add(document.body, Counter()); +vanjs({ + hmr: { + include: /\.[jt]s$/, // files to transform (default: all .js/.ts) + exclude: /node_modules/, // files to skip + entryMatch: /main\.[jt]s$/, // your app entry file(s) + }, +}); ``` --- -## Contributing - -Development happens in the open on GitHub. Bug fixes, improvements, and new ideas are welcome. Read the [contributing guide](./CONTRIBUTING.md) to learn about the development process and how to propose changes. - -### Good First Issues +## State preservation -New to the codebase? Check out the [good first issues](https://github.com/michthemaker/vanjs/labels/good%20first%20issue) label for bugs with limited scope — a great place to start. +`van.state()` are preserved across HMR updates automatically — no extra setup needed. -## License - -VanJS is [MIT licensed](./LICENSE). +```ts +const count = van.state(0); // survives hot reloads +const doubled = van.derive(() => count.val * 2); // not preserved (need to re-run) +``` -## Acknowledgments +--- -My Acknowledgments go to the original vanjs creators, I am only doing this because of their exceptional work. +> **Note:** This plugin is for development only. All transforms are stripped in production builds, leaving your original source intact and fully tree-shakeable. From ee592e793ac334fb4bca86471af8aed20efa2b29 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 23:27:03 +0100 Subject: [PATCH 15/32] feat(vanjs, vite-plugin-vanjs) optional ref solution added and changed source imports to have .ts extension in vite-plugin-vanjs --- .changeset/wet-chairs-grow.md | 5 +++++ apps/examples/plugin-test/src/main.ts | 4 +++- packages/vanjs/src/index.ts | 7 ++++--- packages/vanjs/src/van.ts | 7 ++++++- packages/vite-plugin-vanjs/src/index.ts | 2 +- packages/vite-plugin-vanjs/tsconfig.json | 3 ++- 6 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 .changeset/wet-chairs-grow.md diff --git a/.changeset/wet-chairs-grow.md b/.changeset/wet-chairs-grow.md new file mode 100644 index 0000000..20426e5 --- /dev/null +++ b/.changeset/wet-chairs-grow.md @@ -0,0 +1,5 @@ +--- +"@michthemaker/vite-plugin-vanjs": patch +--- + +Use .ts file extension for all source imports for consistency diff --git a/apps/examples/plugin-test/src/main.ts b/apps/examples/plugin-test/src/main.ts index a3d7384..d1252c9 100644 --- a/apps/examples/plugin-test/src/main.ts +++ b/apps/examples/plugin-test/src/main.ts @@ -1,4 +1,4 @@ -import van from "@michthemaker/vanjs"; +import van, { type Ref } from "@michthemaker/vanjs"; import { Counter } from "./barrel-export"; const { div, h1, button } = van.tags; @@ -6,6 +6,7 @@ const { div, h1, button } = van.tags; // Component with props - using named export const App = (props: { name: string }) => { const myName = van.state("Mich"); + const ref: Ref = { current: null }; return div( { style: @@ -15,6 +16,7 @@ const App = (props: { name: string }) => { { style: "color: #333; border-bottom: 2px solid #eee; padding-bottom: 10px;", + ref: ref }, "VanJS Multi-File HMR Test - me us ", props.name, diff --git a/packages/vanjs/src/index.ts b/packages/vanjs/src/index.ts index 78f984c..d6006ce 100644 --- a/packages/vanjs/src/index.ts +++ b/packages/vanjs/src/index.ts @@ -1,8 +1,8 @@ // This file consistently uses `let` keyword instead of `const` for reducing the bundle size. -import type { State, ChildDom, Van } from "./van.ts"; +import type { State, ChildDom, Van, Ref } from "./van.ts"; import type { ListBinding } from "./reactive-lists.ts"; -import { createListBinding, updateListBinding } from "./reactive-lists.js"; +import { createListBinding, updateListBinding } from "./reactive-lists.ts"; export type * from "./van.ts"; @@ -216,7 +216,7 @@ let tag = ( name: string, ...args: unknown[] ): Element => { - let [{ is, ...props }, ...children] = + let [{ is, ref, ...props }, ...children] = protoOf(args[0] ?? 0) === objProto ? (args as [{ is?: string } & Record, ...unknown[]]) : ([{}, ...args] as [ @@ -226,6 +226,7 @@ let tag = ( let dom = ns ? document.createElementNS(ns, name, { is }) : document.createElement(name, { is }); + if (ref) (ref as Ref).current = dom for (let [k, v] of Object.entries(props)) { let getPropDescriptor = ( proto: object | null diff --git a/packages/vanjs/src/van.ts b/packages/vanjs/src/van.ts index 56da38a..5b691ef 100644 --- a/packages/vanjs/src/van.ts +++ b/packages/vanjs/src/van.ts @@ -39,6 +39,10 @@ export type PropsWithKnownKeys = Partial<{ : K]: PropValueOrDerived; }>; +export type Ref = { current: T | null }; + +export type RefProp = { ref?: Ref }; + export type ValidChildDomValue = | Primitive | Node @@ -57,7 +61,8 @@ export type ChildDom = export type TagFunc = ( first?: | (Props & PropsWithKnownKeys & ElementEventHandlers) - | ChildDom, + | ChildDom + | RefProp, ...rest: readonly ChildDom[] ) => Result; diff --git a/packages/vite-plugin-vanjs/src/index.ts b/packages/vite-plugin-vanjs/src/index.ts index 8eba2d0..e374959 100644 --- a/packages/vite-plugin-vanjs/src/index.ts +++ b/packages/vite-plugin-vanjs/src/index.ts @@ -1,5 +1,5 @@ import type { PluginOption } from "vite"; -import { vanjsRefresh, type VanJSHMROptions } from "./plugin"; +import { vanjsRefresh, type VanJSHMROptions } from "./plugin.ts"; type Options = { hmr?: boolean | VanJSHMROptions | undefined; diff --git a/packages/vite-plugin-vanjs/tsconfig.json b/packages/vite-plugin-vanjs/tsconfig.json index 2274d46..cd0d418 100644 --- a/packages/vite-plugin-vanjs/tsconfig.json +++ b/packages/vite-plugin-vanjs/tsconfig.json @@ -14,7 +14,8 @@ /* Bundler mode */ "moduleResolution": "bundler", - "rewriteRelativeImportExtensions": true, + "noEmit": true, + "allowImportingTsExtensions": true, "verbatimModuleSyntax": true, "moduleDetection": "force", From ec3a2b010ce14eb8137a8688a502414e11cebadb Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 23:32:06 +0100 Subject: [PATCH 16/32] feat(.changeset) ref support added to changeset --- .changeset/sunny-bottles-juggle.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .changeset/sunny-bottles-juggle.md diff --git a/.changeset/sunny-bottles-juggle.md b/.changeset/sunny-bottles-juggle.md new file mode 100644 index 0000000..a54ce73 --- /dev/null +++ b/.changeset/sunny-bottles-juggle.md @@ -0,0 +1,14 @@ +--- +"@michthemaker/vanjs": minor +--- + +Tags can now be created with a **ref** prop to get a reference to the underlying DOM element. + +```ts +import { van, type Ref } from "@michthemaker/vanjs"; + +const { div } = van.tags; + +const ref: Ref = { current: null }; +return div({ ref }); +``` From c6329c506caae8fd92a024b379b32413ec518246 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 23:53:01 +0100 Subject: [PATCH 17/32] feat(.changeset) ref support documentation updated in changeset --- .changeset/sunny-bottles-juggle.md | 2 + cicd.md | 127 ----------------------------- 2 files changed, 2 insertions(+), 127 deletions(-) delete mode 100644 cicd.md diff --git a/.changeset/sunny-bottles-juggle.md b/.changeset/sunny-bottles-juggle.md index a54ce73..95d6f4e 100644 --- a/.changeset/sunny-bottles-juggle.md +++ b/.changeset/sunny-bottles-juggle.md @@ -12,3 +12,5 @@ const { div } = van.tags; const ref: Ref = { current: null }; return div({ ref }); ``` + +A ref is just a plain JavaScript object with a `current` property that holds the DOM element. diff --git a/cicd.md b/cicd.md deleted file mode 100644 index dd8e973..0000000 --- a/cicd.md +++ /dev/null @@ -1,127 +0,0 @@ -# CI/CD Flow - -## Branches - -``` -main ─────────────────────────────────────────► (stable, protected) - └── release ───────────────────────────────► (publish trigger) -``` - ---- - -## Pull Request Flow (main) - -``` -your feature branch - │ - │ git push origin - ▼ - open PR → main - │ - ├── ✅ Typecheck (tsgo -b --noEmit) - │ - ├── pass → PR can be merged - └── fail → PR is blocked, fix and push again -``` - -> Only admins can merge PRs. No force pushing to main. - ---- - -## Release Flow - -``` -main (up to date) - │ - │ git checkout release - │ git merge main - │ git push origin release - ▼ -release branch - │ - ├── pnpm install (packages/ only) - ├── pnpm build (packages/ only) - │ - └── changesets/action - │ - ├── finds .changeset/*.md files? - │ │ - │ ├── YES → opens "Version Packages" PR - │ │ bumps versions - │ │ generates CHANGELOG.md per package - │ │ deletes consumed .changeset files - │ │ - │ └── NO → nothing to publish, workflow exits - │ - └── "Version Packages" PR merged? - │ - └── YES → publishes to npm - creates GitHub release -``` - ---- - -## Changeset Workflow (per PR) - -``` -finish your work - │ - │ pnpm changeset - ▼ -CLI asks: - ├── which packages changed? (@michthemaker/vanjs, @michthemaker/vite-plugin-vanjs) - ├── how significant? (patch / minor / major) - └── describe what changed? (write while context is fresh) - │ - ▼ -.changeset/random-name.md created - │ - │ git add .changeset/ - │ git commit -m "chore: add changeset" - ▼ -committed alongside your code changes in the same PR -``` - ---- - -## Bump Types - -| Type | When to use | Example | -| ------- | --------------------------------- | ----------------- | -| `patch` | Bug fix, no API change | `0.1.0` → `0.1.1` | -| `minor` | New feature, backwards compatible | `0.1.0` → `0.2.0` | -| `major` | Breaking change | `0.1.0` → `1.0.0` | - ---- - -## Per-package versioning - -Packages version and publish **independently** — if only `vanjs` has changesets, only `vanjs` gets a new npm version. - -``` -.changeset/ - ├── fuzzy-lion.md → affects @michthemaker/vanjs (minor) - └── odd-bikes.md → affects @michthemaker/vite-plugin-vanjs (patch) - │ - ▼ - @michthemaker/vanjs 0.1.0 → 0.2.0 ✅ published - @michthemaker/vite-plugin-vanjs 0.1.0 → 0.1.1 ✅ published -``` - ---- - -## Full Picture - -``` -feature branch - │ - ▼ -PR → main ──── typecheck CI - │ - ▼ -merge main → release ──── build + publish CI - │ - ▼ - npm registry 📦 - GitHub release 🚀 -``` From 4ed901b886c3c55bf26a9ccfce845d9d6b6e2144 Mon Sep 17 00:00:00 2001 From: themaker Date: Mon, 9 Mar 2026 23:56:50 +0100 Subject: [PATCH 18/32] feat() added CICD.md file again --- CICD.md | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 CICD.md diff --git a/CICD.md b/CICD.md new file mode 100644 index 0000000..dd8e973 --- /dev/null +++ b/CICD.md @@ -0,0 +1,127 @@ +# CI/CD Flow + +## Branches + +``` +main ─────────────────────────────────────────► (stable, protected) + └── release ───────────────────────────────► (publish trigger) +``` + +--- + +## Pull Request Flow (main) + +``` +your feature branch + │ + │ git push origin + ▼ + open PR → main + │ + ├── ✅ Typecheck (tsgo -b --noEmit) + │ + ├── pass → PR can be merged + └── fail → PR is blocked, fix and push again +``` + +> Only admins can merge PRs. No force pushing to main. + +--- + +## Release Flow + +``` +main (up to date) + │ + │ git checkout release + │ git merge main + │ git push origin release + ▼ +release branch + │ + ├── pnpm install (packages/ only) + ├── pnpm build (packages/ only) + │ + └── changesets/action + │ + ├── finds .changeset/*.md files? + │ │ + │ ├── YES → opens "Version Packages" PR + │ │ bumps versions + │ │ generates CHANGELOG.md per package + │ │ deletes consumed .changeset files + │ │ + │ └── NO → nothing to publish, workflow exits + │ + └── "Version Packages" PR merged? + │ + └── YES → publishes to npm + creates GitHub release +``` + +--- + +## Changeset Workflow (per PR) + +``` +finish your work + │ + │ pnpm changeset + ▼ +CLI asks: + ├── which packages changed? (@michthemaker/vanjs, @michthemaker/vite-plugin-vanjs) + ├── how significant? (patch / minor / major) + └── describe what changed? (write while context is fresh) + │ + ▼ +.changeset/random-name.md created + │ + │ git add .changeset/ + │ git commit -m "chore: add changeset" + ▼ +committed alongside your code changes in the same PR +``` + +--- + +## Bump Types + +| Type | When to use | Example | +| ------- | --------------------------------- | ----------------- | +| `patch` | Bug fix, no API change | `0.1.0` → `0.1.1` | +| `minor` | New feature, backwards compatible | `0.1.0` → `0.2.0` | +| `major` | Breaking change | `0.1.0` → `1.0.0` | + +--- + +## Per-package versioning + +Packages version and publish **independently** — if only `vanjs` has changesets, only `vanjs` gets a new npm version. + +``` +.changeset/ + ├── fuzzy-lion.md → affects @michthemaker/vanjs (minor) + └── odd-bikes.md → affects @michthemaker/vite-plugin-vanjs (patch) + │ + ▼ + @michthemaker/vanjs 0.1.0 → 0.2.0 ✅ published + @michthemaker/vite-plugin-vanjs 0.1.0 → 0.1.1 ✅ published +``` + +--- + +## Full Picture + +``` +feature branch + │ + ▼ +PR → main ──── typecheck CI + │ + ▼ +merge main → release ──── build + publish CI + │ + ▼ + npm registry 📦 + GitHub release 🚀 +``` From d300d217cf79cc374b1524b6361c022d3313d21c Mon Sep 17 00:00:00 2001 From: themaker Date: Wed, 11 Mar 2026 14:00:40 +0100 Subject: [PATCH 19/32] feat(packages/create-van-app) cloned create-vite into packages/create-van-app --- .changeset/bold-heads-play.md | 5 + .changeset/short-monkeys-poke.md | 5 + CONTRIBUTING.md | 22 +- packages/create-van-app/.gitignore | 5 + packages/create-van-app/CONTRIBUTING.md | 158 ++++ packages/create-van-app/LICENSE | 21 + packages/create-van-app/README.md | 92 +++ packages/create-van-app/package.json | 59 ++ packages/create-van-app/src/index.ts | 909 +++++++++++++++++++++ packages/create-van-app/tsconfig.json | 30 + packages/create-van-app/tsup.config.ts | 10 + packages/vanjs/CONTRIBUTING.md | 22 +- packages/vanjs/package.json | 3 +- packages/vite-plugin-vanjs/CONTRIBUTING.md | 22 +- packages/vite-plugin-vanjs/package.json | 3 +- 15 files changed, 1349 insertions(+), 17 deletions(-) create mode 100644 .changeset/bold-heads-play.md create mode 100644 .changeset/short-monkeys-poke.md create mode 100644 packages/create-van-app/.gitignore create mode 100644 packages/create-van-app/CONTRIBUTING.md create mode 100644 packages/create-van-app/LICENSE create mode 100644 packages/create-van-app/README.md create mode 100644 packages/create-van-app/package.json create mode 100644 packages/create-van-app/src/index.ts create mode 100644 packages/create-van-app/tsconfig.json create mode 100644 packages/create-van-app/tsup.config.ts diff --git a/.changeset/bold-heads-play.md b/.changeset/bold-heads-play.md new file mode 100644 index 0000000..e2733fe --- /dev/null +++ b/.changeset/bold-heads-play.md @@ -0,0 +1,5 @@ +--- +"@michthemaker/vanjs": patch +--- + +Added repository subdirectory in package.json diff --git a/.changeset/short-monkeys-poke.md b/.changeset/short-monkeys-poke.md new file mode 100644 index 0000000..4d9e78e --- /dev/null +++ b/.changeset/short-monkeys-poke.md @@ -0,0 +1,5 @@ +--- +"@michthemaker/vite-plugin-vanjs": patch +--- + +Added repository subdirectory in package.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ce5032e..1c6d51d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,16 +34,21 @@ vanjs/ │ ├── reactive-lists.ts # list binding logic │ └── event-handlers.ts # event handler types │ - └── vite-plugin-vanjs/ # vite HMR plugin + ├── vite-plugin-vanjs/ # vite HMR plugin + │ └── src/ + │ ├── index.ts # plugin entry point + │ └── plugin.ts # HMR transformation logic + └── create-van-app/ # project scaffolding cli tool └── src/ - ├── index.ts # plugin entry point - └── plugin.ts # HMR transformation logic + ├── index.ts # binary entry point ``` If you're fixing a core reactivity bug → `packages/vanjs/src/index.ts` If you're fixing an HMR or transform bug → `packages/vite-plugin-vanjs/src/plugin.ts` +If you're fixing a Project Scaffolding bug → `packages/create-van-app/src/index.ts` + If you're adding an example → `apps/examples//` --- @@ -85,6 +90,12 @@ pnpm build pnpm dev ``` +### Working on the Project Scaffolding + +```bash +cd packages/create-van-app +``` + ### Running the example app The example app is the best way to test changes end-to-end — it uses both `packages/vanjs` and `packages/vite-plugin-vanjs` locally via workspace linking. @@ -114,7 +125,7 @@ type(scope): short description Optional longer explanation if needed. ``` -Scope should be the package name: `vanjs` or `vite-plugin-vanjs` +Scope should be the package name: `vanjs` or `vite-plugin-vanjs` or `create-van-app` Types: `fix`, `feat`, `docs`, `refactor`, `test`, `chore` @@ -125,6 +136,7 @@ fix(vanjs): handle empty array in reactive list binding feat(vanjs): add rawVal to state for non-tracking reads fix(vite-plugin-vanjs): support async arrow function components docs(vanjs): clarify van.derive vs useEffect comparison +feat(create-van-app): add vanjs-tailwind template ``` --- @@ -136,7 +148,7 @@ A good bug report includes: - A **minimal reproduction** — the smallest possible code that shows the problem - What you **expected** to happen - What **actually** happened -- Which package is affected — `vanjs` or `vite-plugin-vanjs` +- Which package is affected — `vanjs` or `vite-plugin-vanjs` or `create-van-app` - Your environment — browser, Node version, pnpm version --- diff --git a/packages/create-van-app/.gitignore b/packages/create-van-app/.gitignore new file mode 100644 index 0000000..5821d69 --- /dev/null +++ b/packages/create-van-app/.gitignore @@ -0,0 +1,5 @@ +/node_modules/ +/dist/ +/*.sh +/__tests__ +/template-* diff --git a/packages/create-van-app/CONTRIBUTING.md b/packages/create-van-app/CONTRIBUTING.md new file mode 100644 index 0000000..1c6d51d --- /dev/null +++ b/packages/create-van-app/CONTRIBUTING.md @@ -0,0 +1,158 @@ +# Contributing to VanJS + +Thanks for taking the time to contribute. VanJS is a small, focused project and every contribution matters. + +## Code of Conduct + +Be respectful. Constructive criticism is welcome, personal attacks are not. We're all here to build something good. + +--- + +## Ways to Contribute + +- **Bug reports** — found something broken? Open an issue with a minimal reproduction +- **Bug fixes** — check the [good first issues](https://github.com/michthemaker/vanjs/labels/good%20first%20issue) label to get started +- **Documentation** — typos, unclear explanations, missing examples — all fair game +- **Feature proposals** — open an issue first before writing code, so we can discuss the direction + +--- + +## Repository Structure + +This is a **pnpm monorepo**. The codebase is split into packages and apps: + +``` +vanjs/ +├── apps/ +│ └── examples/ # example app for testing & development +│ +└── packages/ + ├── vanjs/ # core framework + │ └── src/ + │ ├── van.ts # type definitions & interfaces + │ ├── index.ts # core implementation + │ ├── reactive-lists.ts # list binding logic + │ └── event-handlers.ts # event handler types + │ + ├── vite-plugin-vanjs/ # vite HMR plugin + │ └── src/ + │ ├── index.ts # plugin entry point + │ └── plugin.ts # HMR transformation logic + └── create-van-app/ # project scaffolding cli tool + └── src/ + ├── index.ts # binary entry point +``` + +If you're fixing a core reactivity bug → `packages/vanjs/src/index.ts` + +If you're fixing an HMR or transform bug → `packages/vite-plugin-vanjs/src/plugin.ts` + +If you're fixing a Project Scaffolding bug → `packages/create-van-app/src/index.ts` + +If you're adding an example → `apps/examples//` + +--- + +## Development Setup + +This repo uses **pnpm workspaces**. Make sure you have [pnpm](https://pnpm.io) installed before anything else. + +```bash +# Install pnpm if you don't have it +npm install -g pnpm + +# Clone the repo +git clone https://github.com/michthemaker/vanjs.git +cd vanjs + +# Install all workspace dependencies in one shot +pnpm install +``` + +### Working on the core framework + +```bash +cd packages/vanjs + +# Build the package +pnpm build + +# Run in watch mode while developing +pnpm dev +``` + +### Working on the Vite plugin + +```bash +cd packages/vite-plugin-vanjs + +pnpm build +pnpm dev +``` + +### Working on the Project Scaffolding + +```bash +cd packages/create-van-app +``` + +### Running the example app + +The example app is the best way to test changes end-to-end — it uses both `packages/vanjs` and `packages/vite-plugin-vanjs` locally via workspace linking. + +```bash +cd apps/examples + +pnpm dev +``` + +Any changes you make to `packages/vanjs` or `packages/vite-plugin-vanjs` will reflect immediately in the example app since pnpm workspace links them directly. + +--- + +## Pull Request Guidelines + +1. **Open an issue first** for non-trivial changes — saves everyone time +2. **Keep PRs focused** — one fix or feature per PR, not a bundle of unrelated changes +3. **Write clear commit messages** — describe what changed and why, not just what +4. **Don't break the example app** — run it and verify your changes work end-to-end + +### Commit message format + +``` +type(scope): short description + +Optional longer explanation if needed. +``` + +Scope should be the package name: `vanjs` or `vite-plugin-vanjs` or `create-van-app` + +Types: `fix`, `feat`, `docs`, `refactor`, `test`, `chore` + +Examples: + +``` +fix(vanjs): handle empty array in reactive list binding +feat(vanjs): add rawVal to state for non-tracking reads +fix(vite-plugin-vanjs): support async arrow function components +docs(vanjs): clarify van.derive vs useEffect comparison +feat(create-van-app): add vanjs-tailwind template +``` + +--- + +## Reporting Bugs + +A good bug report includes: + +- A **minimal reproduction** — the smallest possible code that shows the problem +- What you **expected** to happen +- What **actually** happened +- Which package is affected — `vanjs` or `vite-plugin-vanjs` or `create-van-app` +- Your environment — browser, Node version, pnpm version + +--- + +## License + +By contributing to VanJS, you agree that your contributions will be licensed under the [MIT License](./LICENSE). diff --git a/packages/create-van-app/LICENSE b/packages/create-van-app/LICENSE new file mode 100644 index 0000000..9487c2e --- /dev/null +++ b/packages/create-van-app/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Michthemaker + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/create-van-app/README.md b/packages/create-van-app/README.md new file mode 100644 index 0000000..f59657a --- /dev/null +++ b/packages/create-van-app/README.md @@ -0,0 +1,92 @@ +# create-vite npm package + +## Scaffolding Your First Vite Project + +> **Compatibility Note:** +> Vite requires [Node.js](https://nodejs.org/en/) version 20.19+, 22.12+. However, some templates require a higher Node.js version to work, please upgrade if your package manager warns about it. + +With NPM: + +```bash +npm create vite@latest +``` + +With Yarn: + +```bash +yarn create vite +``` + +With PNPM: + +```bash +pnpm create vite +``` + +With Bun: + +```bash +bun create vite +``` + +With Deno: + +```bash +deno init --npm vite +``` + +Then follow the prompts! + +You can also directly specify the project name and the template you want to use via additional command line options. For example, to scaffold a Vite + Vue project, run: + +```bash +# npm 7+, extra double-dash is needed: +npm create vite@latest my-vue-app -- --template vue + +# yarn +yarn create vite my-vue-app --template vue + +# pnpm +pnpm create vite my-vue-app --template vue + +# Bun +bun create vite my-vue-app --template vue + +# Deno +deno init --npm vite my-vue-app --template vue +``` + +Currently supported template presets include: + +- `vanilla` +- `vanilla-ts` +- `vue` +- `vue-ts` +- `react` +- `react-ts` +- `react-swc` +- `react-swc-ts` +- `preact` +- `preact-ts` +- `lit` +- `lit-ts` +- `svelte` +- `svelte-ts` +- `solid` +- `solid-ts` +- `qwik` +- `qwik-ts` + +You can use `.` for the project name to scaffold in the current directory. + +## Community Templates + +create-vite is a tool to quickly start a project from a basic template for popular frameworks. Check out Awesome Vite for [community maintained templates](https://github.com/vitejs/awesome-vite#templates) that include other tools or target different frameworks. You can use a tool like [tiged](https://github.com/tiged/tiged) to scaffold your project with one of the templates. + +```bash +npx tiged user/project my-project +cd my-project + +npm install +npm run dev +``` diff --git a/packages/create-van-app/package.json b/packages/create-van-app/package.json new file mode 100644 index 0000000..16b93b8 --- /dev/null +++ b/packages/create-van-app/package.json @@ -0,0 +1,59 @@ +{ + "name": "create-van-app", + "version": "0.0.0", + "description": "VanJS CLI for creating new projects", + "keywords": [ + "Minimalist", + "Reactive", + "UI", + "UI Framework", + "Ultra-lightweight", + "Van", + "Vanilla", + "Vanjs" + ], + "homepage": "https://github.com/michthemaker/vanjs/tree/main/packages/create-van-app", + "bugs": { + "url": "https://github.com/michthemaker/vanjs/issues" + }, + "license": "MIT", + "author": "Michthebrand ", + "repository": { + "type": "git", + "url": "git+https://github.com/michthemaker/vanjs.git", + "directory": "packages/create-van-app" + }, + "funding": "https://github.com/michthemaker/vanjs?sponsor=1", + "bin": { + "create-van-app": "dist/index.js" + }, + "files": [ + "template-*", + "dist" + ], + "type": "module", + "main": "./src/index.ts", + "publishConfig": { + "exports": { + ".": { + "import": "./dist/index.js" + } + }, + "main": "./dist/index.js" + }, + "scripts": { + "build": "tsup" + }, + "devDependencies": { + "@clack/prompts": "^1.1.0", + "@vercel/detect-agent": "^1.1.0", + "cross-spawn": "^7.0.6", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tsup": "^8.5.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "packageManager": "pnpm@10.28.0" +} diff --git a/packages/create-van-app/src/index.ts b/packages/create-van-app/src/index.ts new file mode 100644 index 0000000..1d30aa1 --- /dev/null +++ b/packages/create-van-app/src/index.ts @@ -0,0 +1,909 @@ +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import type { SpawnOptions } from 'node:child_process' +import spawn from 'cross-spawn' +import mri from 'mri' +import * as prompts from '@clack/prompts' +import colors from 'picocolors' +import { determineAgent } from '@vercel/detect-agent' + +const { + blue, + blueBright, + cyan, + green, + greenBright, + magenta, + red, + redBright, + reset, + underline, + yellow, +} = colors + +const argv = mri<{ + template?: string + help?: boolean + overwrite?: boolean + immediate?: boolean + interactive?: boolean +}>(process.argv.slice(2), { + boolean: ['help', 'overwrite', 'immediate', 'interactive'], + alias: { h: 'help', t: 'template', i: 'immediate' }, + string: ['template'], +}) +const cwd = process.cwd() + +// prettier-ignore +const helpMessage = `\ +Usage: create-vite [OPTION]... [DIRECTORY] + +Create a new Vite project in JavaScript or TypeScript. +When running in TTY, the CLI will start in interactive mode. + +Options: + -t, --template NAME use a specific template + -i, --immediate install dependencies and start dev + --interactive / --no-interactive force interactive / non-interactive mode + +Available templates: +${yellow ('vanilla-ts vanilla' )} +${green ('vue-ts vue' )} +${cyan ('react-ts react' )} +${cyan ('react-compiler-ts react-compiler')} +${magenta ('preact-ts preact' )} +${redBright ('lit-ts lit' )} +${red ('svelte-ts svelte' )} +${blue ('solid-ts solid' )} +${blueBright('qwik-ts qwik' )}` + +type ColorFunc = (str: string | number) => string +type Framework = { + name: string + display: string + color: ColorFunc + variants: FrameworkVariant[] +} +type FrameworkVariant = { + name: string + display: string + link?: `https://${string}` + color: ColorFunc + customCommand?: string +} + +const FRAMEWORKS: Framework[] = [ + { + name: 'vanilla', + display: 'Vanilla', + color: yellow, + variants: [ + { + name: 'vanilla-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'vanilla', + display: 'JavaScript', + color: yellow, + }, + ], + }, + { + name: 'vue', + display: 'Vue', + color: green, + variants: [ + { + name: 'vue-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'vue', + display: 'JavaScript', + color: yellow, + }, + { + name: 'custom-create-vue', + display: 'Official Vue Starter ↗', + color: green, + customCommand: 'npm create vue@latest TARGET_DIR', + }, + { + name: 'custom-nuxt', + display: 'Nuxt ↗', + link: 'https://nuxt.com', + color: greenBright, + customCommand: 'npm exec nuxi init TARGET_DIR', + }, + { + name: 'custom-vike-vue', + display: 'Vike ↗', + link: 'https://vike.dev', + color: greenBright, + customCommand: 'npm create -- vike@latest --vue TARGET_DIR', + }, + ], + }, + { + name: 'react', + display: 'React', + color: cyan, + variants: [ + { + name: 'react-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'react-compiler-ts', + display: 'TypeScript + React Compiler', + color: blue, + }, + { + name: 'react', + display: 'JavaScript', + color: yellow, + }, + { + name: 'react-compiler', + display: 'JavaScript + React Compiler', + color: yellow, + }, + { + name: 'rsc', + display: 'RSC', + color: magenta, + customCommand: + 'npm exec tiged vitejs/vite-plugin-react/packages/plugin-rsc/examples/starter TARGET_DIR', + }, + { + name: 'custom-react-router', + display: 'React Router v7 ↗', + link: 'https://reactrouter.com', + color: cyan, + customCommand: 'npm create react-router@latest TARGET_DIR', + }, + { + name: 'custom-tanstack-router-react', + display: 'TanStack Router ↗', + link: 'https://tanstack.com/router', + color: cyan, + customCommand: + 'npm exec @tanstack/cli@latest -- create TARGET_DIR --template file-router --interactive', + }, + { + name: 'redwoodsdk-standard', + display: 'RedwoodSDK ↗', + link: 'https://rwsdk.com', + color: cyan, + customCommand: 'npm create rwsdk@latest TARGET_DIR', + }, + { + name: 'custom-vike-react', + display: 'Vike ↗', + link: 'https://vike.dev', + color: cyan, + customCommand: 'npm create -- vike@latest --react TARGET_DIR', + }, + ], + }, + { + name: 'preact', + display: 'Preact', + color: magenta, + variants: [ + { + name: 'preact-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'preact', + display: 'JavaScript', + color: yellow, + }, + { + name: 'custom-create-preact', + display: 'Official Preact Starter ↗', + color: magenta, + customCommand: 'npm create preact@latest TARGET_DIR', + }, + ], + }, + { + name: 'lit', + display: 'Lit', + color: redBright, + variants: [ + { + name: 'lit-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'lit', + display: 'JavaScript', + color: yellow, + }, + ], + }, + { + name: 'svelte', + display: 'Svelte', + color: red, + variants: [ + { + name: 'svelte-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'svelte', + display: 'JavaScript', + color: yellow, + }, + { + name: 'custom-svelte-kit', + display: 'SvelteKit ↗', + color: red, + customCommand: 'npm exec sv create TARGET_DIR', + }, + ], + }, + { + name: 'solid', + display: 'Solid', + color: blue, + variants: [ + { + name: 'solid-ts', + display: 'TypeScript', + color: blue, + }, + { + name: 'solid', + display: 'JavaScript', + color: yellow, + }, + { + name: 'custom-tanstack-router-solid', + display: 'TanStack Router ↗', + link: 'https://tanstack.com/router', + color: cyan, + customCommand: + 'npm exec @tanstack/cli@latest -- create TARGET_DIR --template file-router --framework solid --interactive', + }, + { + name: 'custom-vike-solid', + display: 'Vike ↗', + link: 'https://vike.dev', + color: cyan, + customCommand: 'npm create -- vike@latest --solid TARGET_DIR', + }, + ], + }, + { + name: 'ember', + display: 'Ember', + color: redBright, + variants: [ + { + name: 'ember-app-ts', + display: 'TypeScript ↗', + color: blueBright, + customCommand: + 'npm exec -- ember-cli@latest new TARGET_DIR --typescript', + }, + { + name: 'ember-app', + display: 'JavaScript ↗', + color: redBright, + customCommand: 'npm exec -- ember-cli@latest new TARGET_DIR', + }, + ], + }, + { + name: 'qwik', + display: 'Qwik', + color: blueBright, + variants: [ + { + name: 'qwik-ts', + display: 'TypeScript', + color: blueBright, + }, + { + name: 'qwik', + display: 'JavaScript', + color: yellow, + }, + { + name: 'custom-qwik-city', + display: 'QwikCity ↗', + color: blueBright, + customCommand: 'npm create qwik@latest empty TARGET_DIR', + }, + ], + }, + { + name: 'angular', + display: 'Angular', + color: red, + variants: [ + { + name: 'custom-angular', + display: 'Angular ↗', + color: red, + customCommand: 'npm exec @angular/cli@latest new TARGET_DIR', + }, + { + name: 'custom-analog', + display: 'Analog ↗', + color: yellow, + customCommand: 'npm create analog@latest TARGET_DIR', + }, + ], + }, + { + name: 'marko', + display: 'Marko', + color: magenta, + variants: [ + { + name: 'marko-run', + display: 'Marko Run ↗', + color: magenta, + customCommand: 'npm create -- marko@latest --name TARGET_DIR', + }, + ], + }, + { + name: 'others', + display: 'Others', + color: reset, + variants: [ + { + name: 'create-vite-extra', + display: 'Extra Vite Starters ↗', + color: reset, + customCommand: 'npm create vite-extra@latest TARGET_DIR', + }, + { + name: 'create-electron-vite', + display: 'Electron ↗', + color: reset, + customCommand: 'npm create electron-vite@latest TARGET_DIR', + }, + ], + }, +] + +const TEMPLATES = FRAMEWORKS.map((f) => f.variants.map((v) => v.name)).reduce( + (a, b) => a.concat(b), + [], +) + +const renameFiles: Record = { + _gitignore: '.gitignore', +} + +const defaultTargetDir = 'vite-project' + +function run([command, ...args]: string[], options?: SpawnOptions) { + const { status, error } = spawn.sync(command, args, options) + if (status != null && status > 0) { + process.exit(status) + } + + if (error) { + console.error(`\n${command} ${args.join(' ')} error!`) + console.error(error) + process.exit(1) + } +} + +function install(root: string, agent: string) { + if (process.env._VITE_TEST_CLI) { + prompts.log.step( + `Installing dependencies with ${agent}... (skipped in test)`, + ) + return + } + prompts.log.step(`Installing dependencies with ${agent}...`) + run(getInstallCommand(agent), { + stdio: 'inherit', + cwd: root, + }) +} + +function start(root: string, agent: string) { + if (process.env._VITE_TEST_CLI) { + prompts.log.step('Starting dev server... (skipped in test)') + return + } + prompts.log.step('Starting dev server...') + run(getRunCommand(agent, 'dev'), { + stdio: 'inherit', + cwd: root, + }) +} + +async function init() { + const argTargetDir = argv._[0] + ? formatTargetDir(String(argv._[0])) + : undefined + const argTemplate = argv.template + const argOverwrite = argv.overwrite + const argImmediate = argv.immediate + const argInteractive = argv.interactive + + const help = argv.help + if (help) { + console.log(helpMessage) + return + } + + const interactive = argInteractive ?? process.stdin.isTTY + + // Detect AI agent environment for better agent experience (AX) + const { isAgent } = await determineAgent() + if (isAgent && interactive) { + console.log( + '\nTo create in one go, run: create-vite --no-interactive --template