a post-component library for building user-interfaces on the web.

build: bundle declarations with rolldown-plugin-dts

tombl.dev d6f4d98a 8e8f2cd8

verified
+532 -182
+50 -31
build.js
··· 1 - import { createBundle } from 'dts-buddy' 2 1 import MagicString from 'magic-string' 3 - import { readFile, rm, writeFile } from 'node:fs/promises' 2 + import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' 4 3 import { brotliCompressSync, gzipSync } from 'node:zlib' 4 + import { isolatedDeclaration } from 'oxc-transform' 5 5 import { build } from 'rolldown' 6 + import { dts } from 'rolldown-plugin-dts' 6 7 import { minify_sync } from 'terser' 7 8 import { walk } from 'zimmerframe' 8 9 9 10 await rm('dist', { recursive: true, force: true }) 11 + await mkdir('dist') 10 12 11 - await Promise.all([bundle_code(), generate_declarations(), write_package_json()]) 13 + await Promise.all([bundle_code(), write_package_json()]) 12 14 13 15 async function bundle_code() { 14 16 /** @type {import('rolldown').Plugin} */ ··· 51 53 52 54 /** @returns {import('rolldown').BuildOptions} */ 53 55 function define_bundle(env) { 54 - const is_dev = env === 'dev' 56 + const input = { 57 + client: './src/client.ts', 58 + server: './src/server.ts', 59 + index: './src/index.ts', 60 + } 61 + 62 + if (env === 'dts') { 63 + return { 64 + input, 65 + plugins: [ 66 + { 67 + transform(code, id) { 68 + if (id.endsWith('.ts')) { 69 + return isolatedDeclaration(id, code, { stripInternal: true, sourcemap: true }) 70 + } 71 + }, 72 + }, 73 + dts(), 74 + ], 75 + output: { 76 + dir: 'dist', 77 + entryFileNames: '[name].d.ts', 78 + chunkFileNames: '[name].d.ts', 79 + sourcemap: true, // TODO: doesn't work? 80 + }, 81 + } 82 + } 55 83 84 + const is_dev = env === 'dev' 56 85 return { 57 - input: { 58 - client: './src/client.ts', 59 - server: './src/server.ts', 60 - index: './src/index.ts', 61 - }, 86 + input, 62 87 plugins: [!is_dev && strip_asserts_plugin], 63 88 output: { 64 89 dir: 'dist', ··· 74 99 } 75 100 } 76 101 77 - const bundles = await build([define_bundle('dev'), define_bundle('prod')]) 102 + const bundles = await build([define_bundle('dev'), define_bundle('prod'), define_bundle('dts')]) 78 103 79 104 console.table( 80 105 Object.fromEntries( 81 106 bundles.flatMap(bundle => 82 - bundle.output.map(file => [ 83 - file.fileName, 84 - { 85 - normal: file.code.length, 86 - gzip: gzipSync(file.code).length, 87 - brotli: brotliCompressSync(file.code).length, 88 - }, 89 - ]), 107 + bundle.output.flatMap(file => 108 + file.code 109 + ? [ 110 + [ 111 + file.fileName, 112 + { 113 + normal: file.code.length, 114 + gzip: gzipSync(file.code).length, 115 + brotli: brotliCompressSync(file.code).length, 116 + }, 117 + ], 118 + ] 119 + : [], 120 + ), 90 121 ), 91 122 ), 92 123 ) 93 124 } 94 125 95 - async function generate_declarations() { 96 - await createBundle({ 97 - project: 'tsconfig.json', 98 - output: 'dist/types.d.ts', 99 - modules: { 100 - dhtml: './src/index.ts', 101 - 'dhtml/client': './src/client.ts', 102 - 'dhtml/server': './src/server.ts', 103 - }, 104 - }) 105 - } 106 - 107 126 async function write_package_json() { 108 127 const pkg = JSON.parse(await readFile('package.json', 'utf8')) 109 128 ··· 115 134 if (exports.startsWith('./src/')) exports = exports.slice('./src/'.length) 116 135 exports = exports.replace(/\.ts$/, '') 117 136 return { 118 - types: './types.d.ts', 137 + types: `./${exports}.d.ts`, 119 138 production: `./${exports}.min.js`, 120 139 default: `./${exports}.js`, 121 140 }
+12 -6
examples/kanban/package-lock.json
··· 7 7 "name": "kanban", 8 8 "dependencies": { 9 9 "@tombl/router": "npm:@jsr/tombl__router@^0.1.2", 10 - "dhtml": "file:../..", 10 + "dhtml": "file:../../dist", 11 11 "sqlocal": "^0.14.0" 12 12 }, 13 13 "devDependencies": { ··· 17 17 } 18 18 }, 19 19 "../..": { 20 + "hasInstallScript": true, 20 21 "devDependencies": { 21 - "@rollup/plugin-terser": "^0.4.4", 22 + "@happy-dom/global-registrator": "^17.4.4", 23 + "@types/node": "^22.13.11", 24 + "bun-types": "^1.2.5", 22 25 "dhtml": ".", 23 26 "dts-buddy": "^0.5.5", 24 - "happy-dom": "^17.4.4", 25 27 "htmlparser2": "^10.0.0", 26 28 "magic-string": "^0.30.17", 29 + "mitata": "^1.0.34", 30 + "oxc-transform": "^0.62.0", 31 + "patch-package": "^8.0.0", 27 32 "prettier": "^3.4.2", 28 33 "rolldown": "^1.0.0-beta.6", 34 + "rolldown-plugin-dts": "^0.1.0", 35 + "terser": "^5.39.0", 29 36 "typescript": "^5.7.2", 30 37 "zimmerframe": "^1.1.2" 31 38 } 32 39 }, 33 40 "../../dist": { 34 - "name": "dhtml", 35 - "extraneous": true 41 + "name": "dhtml" 36 42 }, 37 43 "node_modules/@esbuild/aix-ppc64": { 38 44 "version": "0.25.0", ··· 793 799 } 794 800 }, 795 801 "node_modules/dhtml": { 796 - "resolved": "../..", 802 + "resolved": "../../dist", 797 803 "link": true 798 804 }, 799 805 "node_modules/esbuild": {
+1 -1
examples/kanban/package.json
··· 14 14 }, 15 15 "dependencies": { 16 16 "@tombl/router": "npm:@jsr/tombl__router@^0.1.2", 17 - "dhtml": "file:../..", 17 + "dhtml": "file:../../dist", 18 18 "sqlocal": "^0.14.0" 19 19 } 20 20 }
+443 -126
package-lock.json
··· 6 6 "packages": { 7 7 "": { 8 8 "name": "dhtml", 9 + "dev": true, 9 10 "hasInstallScript": true, 10 11 "devDependencies": { 11 12 "@happy-dom/global-registrator": "^17.4.4", 12 13 "@types/node": "^22.13.11", 13 14 "bun-types": "^1.2.5", 14 15 "dhtml": ".", 15 - "dts-buddy": "^0.5.5", 16 16 "htmlparser2": "^10.0.0", 17 17 "magic-string": "^0.30.17", 18 18 "mitata": "^1.0.34", 19 + "oxc-transform": "^0.62.0", 19 20 "patch-package": "^8.0.0", 20 21 "prettier": "^3.4.2", 21 22 "rolldown": "^1.0.0-beta.6", 23 + "rolldown-plugin-dts": "^0.1.0", 22 24 "terser": "^5.39.0", 23 25 "typescript": "^5.7.2", 24 26 "zimmerframe": "^1.1.2" 25 27 } 26 28 }, 27 29 "node_modules/@emnapi/core": { 28 - "version": "1.3.1", 29 - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", 30 - "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", 30 + "version": "1.4.0", 31 + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.0.tgz", 32 + "integrity": "sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==", 31 33 "dev": true, 32 34 "license": "MIT", 33 35 "optional": true, ··· 37 39 } 38 40 }, 39 41 "node_modules/@emnapi/runtime": { 40 - "version": "1.3.1", 41 - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", 42 - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", 42 + "version": "1.4.0", 43 + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", 44 + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", 43 45 "dev": true, 44 46 "license": "MIT", 45 47 "optional": true, ··· 124 126 } 125 127 }, 126 128 "node_modules/@napi-rs/wasm-runtime": { 127 - "version": "0.2.7", 128 - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.7.tgz", 129 - "integrity": "sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==", 129 + "version": "0.2.8", 130 + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz", 131 + "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==", 130 132 "dev": true, 131 133 "license": "MIT", 132 134 "optional": true, 133 135 "dependencies": { 134 - "@emnapi/core": "^1.3.1", 135 - "@emnapi/runtime": "^1.3.1", 136 + "@emnapi/core": "^1.4.0", 137 + "@emnapi/runtime": "^1.4.0", 136 138 "@tybys/wasm-util": "^0.9.0" 137 139 } 138 140 }, 141 + "node_modules/@oxc-parser/binding-darwin-arm64": { 142 + "version": "0.62.0", 143 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.62.0.tgz", 144 + "integrity": "sha512-p9haXzG2mE0PvfITKY3bTQpwDc+T4H9bG5SC4vp8PbwikmIWGrahASpuO5c2keiahspGTCzqUnl+8PXU/saT/A==", 145 + "cpu": [ 146 + "arm64" 147 + ], 148 + "dev": true, 149 + "license": "MIT", 150 + "optional": true, 151 + "os": [ 152 + "darwin" 153 + ], 154 + "engines": { 155 + "node": ">=14.0.0" 156 + } 157 + }, 158 + "node_modules/@oxc-parser/binding-darwin-x64": { 159 + "version": "0.62.0", 160 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.62.0.tgz", 161 + "integrity": "sha512-nUFVTz0DcQCtoHL/wiZ3fNPXRIdghDlExRqiEG00J7RprD3L8CtZ1hXwcWOqUNR1I/xWHQCu1ZrRlI30Wb+NCw==", 162 + "cpu": [ 163 + "x64" 164 + ], 165 + "dev": true, 166 + "license": "MIT", 167 + "optional": true, 168 + "os": [ 169 + "darwin" 170 + ], 171 + "engines": { 172 + "node": ">=14.0.0" 173 + } 174 + }, 175 + "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { 176 + "version": "0.62.0", 177 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.62.0.tgz", 178 + "integrity": "sha512-fzL/QklCwZRBkPvdr0zBtAFBnksd42xiBMlm0GQi2dIynCDz2IKrc+hq0UZMtqMEjuvr991WOlh0iU6elZDn6g==", 179 + "cpu": [ 180 + "arm" 181 + ], 182 + "dev": true, 183 + "license": "MIT", 184 + "optional": true, 185 + "os": [ 186 + "linux" 187 + ], 188 + "engines": { 189 + "node": ">=14.0.0" 190 + } 191 + }, 192 + "node_modules/@oxc-parser/binding-linux-arm64-gnu": { 193 + "version": "0.62.0", 194 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.62.0.tgz", 195 + "integrity": "sha512-dgymg4cMO+5hfSUC4zHnNoNIKoasUiaaYZRIs3lhRPFB2ultth4uJTV+iMlBTNtGDSKSs10ennHvm7CBGJVgVg==", 196 + "cpu": [ 197 + "arm64" 198 + ], 199 + "dev": true, 200 + "license": "MIT", 201 + "optional": true, 202 + "os": [ 203 + "linux" 204 + ], 205 + "engines": { 206 + "node": ">=14.0.0" 207 + } 208 + }, 209 + "node_modules/@oxc-parser/binding-linux-arm64-musl": { 210 + "version": "0.62.0", 211 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.62.0.tgz", 212 + "integrity": "sha512-sKhAyRsP6DNeFMRevAN28HccFKEO6l3OqC8MuAV+HNzzyzUOKx2HGnYlkLxCmDZ7lyzzl7vA7YRQFBLYXgsWSA==", 213 + "cpu": [ 214 + "arm64" 215 + ], 216 + "dev": true, 217 + "license": "MIT", 218 + "optional": true, 219 + "os": [ 220 + "linux" 221 + ], 222 + "engines": { 223 + "node": ">=14.0.0" 224 + } 225 + }, 226 + "node_modules/@oxc-parser/binding-linux-x64-gnu": { 227 + "version": "0.62.0", 228 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.62.0.tgz", 229 + "integrity": "sha512-WAPgDelo20F5An0SW8X+0hWVPF7dHKhHwZo5doOt8Dn9NX6nONQCmEDUUPtp/BqISBxRFSH+rZbaENn8GGlBqg==", 230 + "cpu": [ 231 + "x64" 232 + ], 233 + "dev": true, 234 + "license": "MIT", 235 + "optional": true, 236 + "os": [ 237 + "linux" 238 + ], 239 + "engines": { 240 + "node": ">=14.0.0" 241 + } 242 + }, 243 + "node_modules/@oxc-parser/binding-linux-x64-musl": { 244 + "version": "0.62.0", 245 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.62.0.tgz", 246 + "integrity": "sha512-JJ0WIPVXiuiWmPLKL+W3/OX1O5aDWMoX47eODKdNoM46bTcxIUe+wpHou731WuqhfrwACBi3Bsljn6VsIFPe9A==", 247 + "cpu": [ 248 + "x64" 249 + ], 250 + "dev": true, 251 + "license": "MIT", 252 + "optional": true, 253 + "os": [ 254 + "linux" 255 + ], 256 + "engines": { 257 + "node": ">=14.0.0" 258 + } 259 + }, 260 + "node_modules/@oxc-parser/binding-wasm32-wasi": { 261 + "version": "0.62.0", 262 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.62.0.tgz", 263 + "integrity": "sha512-FuGOzv4FJWSBnG9jkCgZysU6ZMTKWHyHXEr40J1HjRnyw58bQ1sPfVmHZusNTSDCXmBlBz0ZuELLTJFHTI3DVQ==", 264 + "cpu": [ 265 + "wasm32" 266 + ], 267 + "dev": true, 268 + "license": "MIT", 269 + "optional": true, 270 + "dependencies": { 271 + "@napi-rs/wasm-runtime": "^0.2.8" 272 + }, 273 + "engines": { 274 + "node": ">=14.0.0" 275 + } 276 + }, 277 + "node_modules/@oxc-parser/binding-win32-arm64-msvc": { 278 + "version": "0.62.0", 279 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.62.0.tgz", 280 + "integrity": "sha512-3XEM9fgnrC2Eav/csJaAn125bQIgsdAeyksTGq2xnydnomHY9G+/nfIfgS76X/K0TZiyjOOakctwl4vsObDyGA==", 281 + "cpu": [ 282 + "arm64" 283 + ], 284 + "dev": true, 285 + "license": "MIT", 286 + "optional": true, 287 + "os": [ 288 + "win32" 289 + ], 290 + "engines": { 291 + "node": ">=14.0.0" 292 + } 293 + }, 294 + "node_modules/@oxc-parser/binding-win32-x64-msvc": { 295 + "version": "0.62.0", 296 + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.62.0.tgz", 297 + "integrity": "sha512-YbLsb6Z/FS7tNheETyvf6FYhqo/AUipHca9eF5cB4XAdGc+Yt9bcrnwG9g9RGD33nxaMDI1ead2KYAcNeDYzGA==", 298 + "cpu": [ 299 + "x64" 300 + ], 301 + "dev": true, 302 + "license": "MIT", 303 + "optional": true, 304 + "os": [ 305 + "win32" 306 + ], 307 + "engines": { 308 + "node": ">=14.0.0" 309 + } 310 + }, 139 311 "node_modules/@oxc-project/types": { 140 312 "version": "0.58.1", 141 313 "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.58.1.tgz", ··· 146 318 "url": "https://github.com/sponsors/Boshen" 147 319 } 148 320 }, 321 + "node_modules/@oxc-transform/binding-darwin-arm64": { 322 + "version": "0.62.0", 323 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.62.0.tgz", 324 + "integrity": "sha512-aUD548g1WJKk+hUPxMDPr2yfvMSGp6M0B1KjORYxdQSI70Fsi3SCmtDmmPNVWsuuugkeCDjqceFr56uYMMrBog==", 325 + "cpu": [ 326 + "arm64" 327 + ], 328 + "dev": true, 329 + "license": "MIT", 330 + "optional": true, 331 + "os": [ 332 + "darwin" 333 + ], 334 + "engines": { 335 + "node": ">=14.0.0" 336 + } 337 + }, 338 + "node_modules/@oxc-transform/binding-darwin-x64": { 339 + "version": "0.62.0", 340 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.62.0.tgz", 341 + "integrity": "sha512-Ocxqqm9a+QEgIf/AOE0MRYkgVC7ZWehAonG2YNBp/qnX8rrKGQ12oYpoQA1QJ5sVTr5kF4NgttjpTzKqJ3mKuw==", 342 + "cpu": [ 343 + "x64" 344 + ], 345 + "dev": true, 346 + "license": "MIT", 347 + "optional": true, 348 + "os": [ 349 + "darwin" 350 + ], 351 + "engines": { 352 + "node": ">=14.0.0" 353 + } 354 + }, 355 + "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { 356 + "version": "0.62.0", 357 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.62.0.tgz", 358 + "integrity": "sha512-4z8LniTGjccnJVY7hS8pmh3gswPNmeeMVmvZpIzd1gaUwL6ZVWUuDHGGAAfjsOYzHruzw73HUvRPmfTDDie0lw==", 359 + "cpu": [ 360 + "arm" 361 + ], 362 + "dev": true, 363 + "license": "MIT", 364 + "optional": true, 365 + "os": [ 366 + "linux" 367 + ], 368 + "engines": { 369 + "node": ">=14.0.0" 370 + } 371 + }, 372 + "node_modules/@oxc-transform/binding-linux-arm64-gnu": { 373 + "version": "0.62.0", 374 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.62.0.tgz", 375 + "integrity": "sha512-zdsTHhkUOSfHhyxJed1SpP8qccKODwQdQMcB8yFvVIoVX3re0qqTRy2aYxofeMTdT9HCqmX7hUXmy1bFYqAQJA==", 376 + "cpu": [ 377 + "arm64" 378 + ], 379 + "dev": true, 380 + "license": "MIT", 381 + "optional": true, 382 + "os": [ 383 + "linux" 384 + ], 385 + "engines": { 386 + "node": ">=14.0.0" 387 + } 388 + }, 389 + "node_modules/@oxc-transform/binding-linux-arm64-musl": { 390 + "version": "0.62.0", 391 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.62.0.tgz", 392 + "integrity": "sha512-NoM2Ymf0oKBlxu1DFjBQ7fAAz92JQ1MgbLT6apR2UCmOn7xIZAiyYloyXM43qDf6nTOAs3zmH6kNcEPZ8KaDrg==", 393 + "cpu": [ 394 + "arm64" 395 + ], 396 + "dev": true, 397 + "license": "MIT", 398 + "optional": true, 399 + "os": [ 400 + "linux" 401 + ], 402 + "engines": { 403 + "node": ">=14.0.0" 404 + } 405 + }, 406 + "node_modules/@oxc-transform/binding-linux-x64-gnu": { 407 + "version": "0.62.0", 408 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.62.0.tgz", 409 + "integrity": "sha512-ltHIWB0eBT5iDt9hvC6LI90JV7DVbUdXzCjuNzUl/qcXXpKKLFjuRUuAs0npg3B+bsw75N2UKdwJ+E+mGf+D9A==", 410 + "cpu": [ 411 + "x64" 412 + ], 413 + "dev": true, 414 + "license": "MIT", 415 + "optional": true, 416 + "os": [ 417 + "linux" 418 + ], 419 + "engines": { 420 + "node": ">=14.0.0" 421 + } 422 + }, 423 + "node_modules/@oxc-transform/binding-linux-x64-musl": { 424 + "version": "0.62.0", 425 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.62.0.tgz", 426 + "integrity": "sha512-PODsXb/+a/380bdoJVruJSNuRm362b2fqgoRcQyDliIYVIlyNjhuRluNnXZt3Rcn+NMJuD6bR4UNDGIQawoaEg==", 427 + "cpu": [ 428 + "x64" 429 + ], 430 + "dev": true, 431 + "license": "MIT", 432 + "optional": true, 433 + "os": [ 434 + "linux" 435 + ], 436 + "engines": { 437 + "node": ">=14.0.0" 438 + } 439 + }, 440 + "node_modules/@oxc-transform/binding-wasm32-wasi": { 441 + "version": "0.62.0", 442 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.62.0.tgz", 443 + "integrity": "sha512-1Ws06cA9bm7sNTUopUJWVhWx+fimKaazjTCIARHJDkJZZLCBuUOFOLzThqVmu0go0D8PXYA9IVe1caqSVjoHYg==", 444 + "cpu": [ 445 + "wasm32" 446 + ], 447 + "dev": true, 448 + "license": "MIT", 449 + "optional": true, 450 + "dependencies": { 451 + "@napi-rs/wasm-runtime": "^0.2.8" 452 + }, 453 + "engines": { 454 + "node": ">=14.0.0" 455 + } 456 + }, 457 + "node_modules/@oxc-transform/binding-win32-arm64-msvc": { 458 + "version": "0.62.0", 459 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.62.0.tgz", 460 + "integrity": "sha512-D1HFN2aNm/bkgBLRgvadq12/eMIRe3NgxH2sSQk+AZcorS8vqrHXv6lhiKMEyQTT1nCzr1RzvWDflHwCxoUfqg==", 461 + "cpu": [ 462 + "arm64" 463 + ], 464 + "dev": true, 465 + "license": "MIT", 466 + "optional": true, 467 + "os": [ 468 + "win32" 469 + ], 470 + "engines": { 471 + "node": ">=14.0.0" 472 + } 473 + }, 474 + "node_modules/@oxc-transform/binding-win32-x64-msvc": { 475 + "version": "0.62.0", 476 + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.62.0.tgz", 477 + "integrity": "sha512-3koMjqUz+LMRtAWBBsg50rsyNxKqpsN2Ft5NzcK+dsMN8dxq1vdMU7TaXdPSriY1buOPOAiqAEeGgdQRjoIBbQ==", 478 + "cpu": [ 479 + "x64" 480 + ], 481 + "dev": true, 482 + "license": "MIT", 483 + "optional": true, 484 + "os": [ 485 + "win32" 486 + ], 487 + "engines": { 488 + "node": ">=14.0.0" 489 + } 490 + }, 149 491 "node_modules/@rolldown/binding-darwin-arm64": { 150 492 "version": "1.0.0-beta.6", 151 493 "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.6.tgz", ··· 679 1021 "url": "https://github.com/fb55/domutils?sponsor=1" 680 1022 } 681 1023 }, 682 - "node_modules/dts-buddy": { 683 - "version": "0.5.5", 684 - "resolved": "https://registry.npmjs.org/dts-buddy/-/dts-buddy-0.5.5.tgz", 685 - "integrity": "sha512-Mu5PJuP7C+EqZIwDtW/bG1tVli1UFhRIyW/dERBVBYk28OviTkribu9S2LpDQ0HF2MbkqnjQIkbbE6HnepdNTQ==", 686 - "dev": true, 687 - "license": "MIT", 688 - "dependencies": { 689 - "@jridgewell/source-map": "^0.3.5", 690 - "@jridgewell/sourcemap-codec": "^1.4.15", 691 - "kleur": "^4.1.5", 692 - "locate-character": "^3.0.0", 693 - "magic-string": "^0.30.4", 694 - "sade": "^1.8.1", 695 - "tinyglobby": "^0.2.10", 696 - "ts-api-utils": "^1.0.3" 697 - }, 698 - "bin": { 699 - "dts-buddy": "src/cli.js" 700 - }, 701 - "peerDependencies": { 702 - "typescript": ">=5.0.4 <5.8" 703 - } 704 - }, 705 1024 "node_modules/dunder-proto": { 706 1025 "version": "1.0.1", 707 1026 "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", ··· 761 1080 }, 762 1081 "engines": { 763 1082 "node": ">= 0.4" 764 - } 765 - }, 766 - "node_modules/fdir": { 767 - "version": "6.4.3", 768 - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", 769 - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", 770 - "dev": true, 771 - "license": "MIT", 772 - "peerDependencies": { 773 - "picomatch": "^3 || ^4" 774 - }, 775 - "peerDependenciesMeta": { 776 - "picomatch": { 777 - "optional": true 778 - } 779 1083 } 780 1084 }, 781 1085 "node_modules/fill-range": { ··· 1123 1427 "graceful-fs": "^4.1.11" 1124 1428 } 1125 1429 }, 1126 - "node_modules/kleur": { 1127 - "version": "4.1.5", 1128 - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1129 - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1130 - "dev": true, 1131 - "license": "MIT", 1132 - "engines": { 1133 - "node": ">=6" 1134 - } 1135 - }, 1136 - "node_modules/locate-character": { 1137 - "version": "3.0.0", 1138 - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1139 - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1140 - "dev": true, 1141 - "license": "MIT" 1142 - }, 1143 1430 "node_modules/magic-string": { 1144 1431 "version": "0.30.17", 1145 1432 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", ··· 1150 1437 "@jridgewell/sourcemap-codec": "^1.5.0" 1151 1438 } 1152 1439 }, 1440 + "node_modules/magic-string-ast": { 1441 + "version": "0.9.1", 1442 + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.9.1.tgz", 1443 + "integrity": "sha512-18dv2ZlSSgJ/jDWlZGKfnDJx56ilNlYq9F7NnwuWTErsmYmqJ2TWE4l1o2zlUHBYUGBy3tIhPCC1gxq8M5HkMA==", 1444 + "dev": true, 1445 + "license": "MIT", 1446 + "dependencies": { 1447 + "magic-string": "^0.30.17" 1448 + }, 1449 + "engines": { 1450 + "node": ">=20.18.0" 1451 + }, 1452 + "funding": { 1453 + "url": "https://github.com/sponsors/sxzz" 1454 + } 1455 + }, 1153 1456 "node_modules/math-intrinsics": { 1154 1457 "version": "1.1.0", 1155 1458 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ··· 1217 1520 "dev": true, 1218 1521 "license": "MIT" 1219 1522 }, 1220 - "node_modules/mri": { 1221 - "version": "1.2.0", 1222 - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1223 - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1224 - "dev": true, 1225 - "license": "MIT", 1226 - "engines": { 1227 - "node": ">=4" 1228 - } 1229 - }, 1230 1523 "node_modules/object-keys": { 1231 1524 "version": "1.1.1", 1232 1525 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", ··· 1274 1567 "node": ">=0.10.0" 1275 1568 } 1276 1569 }, 1570 + "node_modules/oxc-parser": { 1571 + "version": "0.62.0", 1572 + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.62.0.tgz", 1573 + "integrity": "sha512-WwSVsS8e7KH8an4rQJJZuO2QiIxNA0ryPESmmdxy1KYRSKEscyBgbIGGv2lCWy3uTksQtAjB2s2YAohESfrfOQ==", 1574 + "dev": true, 1575 + "license": "MIT", 1576 + "dependencies": { 1577 + "@oxc-project/types": "^0.62.0" 1578 + }, 1579 + "engines": { 1580 + "node": ">=14.0.0" 1581 + }, 1582 + "funding": { 1583 + "url": "https://github.com/sponsors/Boshen" 1584 + }, 1585 + "optionalDependencies": { 1586 + "@oxc-parser/binding-darwin-arm64": "0.62.0", 1587 + "@oxc-parser/binding-darwin-x64": "0.62.0", 1588 + "@oxc-parser/binding-linux-arm-gnueabihf": "0.62.0", 1589 + "@oxc-parser/binding-linux-arm64-gnu": "0.62.0", 1590 + "@oxc-parser/binding-linux-arm64-musl": "0.62.0", 1591 + "@oxc-parser/binding-linux-x64-gnu": "0.62.0", 1592 + "@oxc-parser/binding-linux-x64-musl": "0.62.0", 1593 + "@oxc-parser/binding-wasm32-wasi": "0.62.0", 1594 + "@oxc-parser/binding-win32-arm64-msvc": "0.62.0", 1595 + "@oxc-parser/binding-win32-x64-msvc": "0.62.0" 1596 + } 1597 + }, 1598 + "node_modules/oxc-parser/node_modules/@oxc-project/types": { 1599 + "version": "0.62.0", 1600 + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.62.0.tgz", 1601 + "integrity": "sha512-rC3YQjrntGvg8vkHHKaiFqZFBCDU/F3BPfokssD02q5Sn4dSZGYzJVdojqYIEFECpEMEqKBxqIRmVex1+WXI5w==", 1602 + "dev": true, 1603 + "license": "MIT", 1604 + "funding": { 1605 + "url": "https://github.com/sponsors/Boshen" 1606 + } 1607 + }, 1608 + "node_modules/oxc-transform": { 1609 + "version": "0.62.0", 1610 + "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.62.0.tgz", 1611 + "integrity": "sha512-4aycc3KlhwtUj1DVrFWGvfvX0OI6CmSkaPfhox4eY5UNknxZ0WSvj9p3NZIw8wPZiT6uj/acV3LcdO2o8HcSHQ==", 1612 + "dev": true, 1613 + "license": "MIT", 1614 + "engines": { 1615 + "node": ">=14.0.0" 1616 + }, 1617 + "funding": { 1618 + "url": "https://github.com/sponsors/Boshen" 1619 + }, 1620 + "optionalDependencies": { 1621 + "@oxc-transform/binding-darwin-arm64": "0.62.0", 1622 + "@oxc-transform/binding-darwin-x64": "0.62.0", 1623 + "@oxc-transform/binding-linux-arm-gnueabihf": "0.62.0", 1624 + "@oxc-transform/binding-linux-arm64-gnu": "0.62.0", 1625 + "@oxc-transform/binding-linux-arm64-musl": "0.62.0", 1626 + "@oxc-transform/binding-linux-x64-gnu": "0.62.0", 1627 + "@oxc-transform/binding-linux-x64-musl": "0.62.0", 1628 + "@oxc-transform/binding-wasm32-wasi": "0.62.0", 1629 + "@oxc-transform/binding-win32-arm64-msvc": "0.62.0", 1630 + "@oxc-transform/binding-win32-x64-msvc": "0.62.0" 1631 + } 1632 + }, 1277 1633 "node_modules/patch-package": { 1278 1634 "version": "8.0.0", 1279 1635 "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", ··· 1325 1681 "node": ">=8" 1326 1682 } 1327 1683 }, 1328 - "node_modules/picomatch": { 1329 - "version": "4.0.2", 1330 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 1331 - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 1332 - "dev": true, 1333 - "license": "MIT", 1334 - "engines": { 1335 - "node": ">=12" 1336 - }, 1337 - "funding": { 1338 - "url": "https://github.com/sponsors/jonschlinkert" 1339 - } 1340 - }, 1341 1684 "node_modules/prettier": { 1342 1685 "version": "3.4.2", 1343 1686 "dev": true, ··· 1403 1746 } 1404 1747 } 1405 1748 }, 1406 - "node_modules/sade": { 1407 - "version": "1.8.1", 1408 - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1409 - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1749 + "node_modules/rolldown-plugin-dts": { 1750 + "version": "0.1.0", 1751 + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.1.0.tgz", 1752 + "integrity": "sha512-kmXQzvRJVQ+bWtZXX345S4H6tNtrqIdBsZX7mmL+M4tLj2YsgCNXuS/XKAzUKD8BCqSwK/dEkzIxZ+BjiaHLeQ==", 1410 1753 "dev": true, 1411 1754 "license": "MIT", 1412 1755 "dependencies": { 1413 - "mri": "^1.1.0" 1756 + "magic-string-ast": "^0.9.1", 1757 + "oxc-parser": "^0.62.0" 1414 1758 }, 1415 1759 "engines": { 1416 - "node": ">=6" 1760 + "node": ">=20.18.0" 1761 + }, 1762 + "funding": { 1763 + "url": "https://github.com/sponsors/sxzz" 1417 1764 } 1418 1765 }, 1419 1766 "node_modules/semver": { ··· 1533 1880 "node": ">=10" 1534 1881 } 1535 1882 }, 1536 - "node_modules/tinyglobby": { 1537 - "version": "0.2.12", 1538 - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", 1539 - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", 1540 - "dev": true, 1541 - "license": "MIT", 1542 - "dependencies": { 1543 - "fdir": "^6.4.3", 1544 - "picomatch": "^4.0.2" 1545 - }, 1546 - "engines": { 1547 - "node": ">=12.0.0" 1548 - }, 1549 - "funding": { 1550 - "url": "https://github.com/sponsors/SuperchupuDev" 1551 - } 1552 - }, 1553 1883 "node_modules/tmp": { 1554 1884 "version": "0.0.33", 1555 1885 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", ··· 1574 1904 }, 1575 1905 "engines": { 1576 1906 "node": ">=8.0" 1577 - } 1578 - }, 1579 - "node_modules/ts-api-utils": { 1580 - "version": "1.4.3", 1581 - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", 1582 - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", 1583 - "dev": true, 1584 - "license": "MIT", 1585 - "engines": { 1586 - "node": ">=16" 1587 - }, 1588 - "peerDependencies": { 1589 - "typescript": ">=4.2.0" 1590 1907 } 1591 1908 }, 1592 1909 "node_modules/tslib": {
+2 -1
package.json
··· 20 20 "@types/node": "^22.13.11", 21 21 "bun-types": "^1.2.5", 22 22 "dhtml": ".", 23 - "dts-buddy": "^0.5.5", 24 23 "htmlparser2": "^10.0.0", 25 24 "magic-string": "^0.30.17", 26 25 "mitata": "^1.0.34", 26 + "oxc-transform": "^0.62.0", 27 27 "patch-package": "^8.0.0", 28 28 "prettier": "^3.4.2", 29 29 "rolldown": "^1.0.0-beta.6", 30 + "rolldown-plugin-dts": "^0.1.0", 30 31 "terser": "^5.39.0", 31 32 "typescript": "^5.7.2", 32 33 "zimmerframe": "^1.1.2"
+1 -1
src/client/controller.ts
··· 1 - import type { Displayable, Renderable } from 'dhtml' 1 + import type { Displayable, Renderable } from '../index.ts' 2 2 import { assert, is_renderable } from '../shared.ts' 3 3 import { type Cleanup } from './util.ts' 4 4
+9 -2
src/client/parts.ts
··· 1 - import type { Displayable, Renderable } from 'dhtml' 2 - import { assert, is_html, is_iterable, is_renderable, single_part_template } from '../shared.ts' 1 + import { 2 + assert, 3 + is_html, 4 + is_iterable, 5 + is_renderable, 6 + single_part_template, 7 + type Displayable, 8 + type Renderable, 9 + } from '../shared.ts' 3 10 import { delete_controller, get_controller, get_key } from './controller.ts' 4 11 import { create_root, create_root_after, type Root } from './root.ts' 5 12 import { create_span, delete_contents, extract_contents, insert_node, type Span } from './span.ts'
+1 -2
src/client/root.ts
··· 1 - import type { Displayable } from 'dhtml' 2 - import { assert, is_html, single_part_template } from '../shared.ts' 1 + import { assert, is_html, single_part_template, type Displayable } from '../shared.ts' 3 2 import { compile_template, type CompiledTemplate } from './compiler.ts' 4 3 import type { Key } from './controller.ts' 5 4 import type { Part } from './parts.ts'
+2 -9
src/index.ts
··· 1 1 import { html_tag } from './shared.ts' 2 2 3 - interface ToString { 4 - toString(): string 5 - } 6 - 7 - export type Displayable = null | undefined | ToString | Node | Renderable | Iterable<Displayable> | HTML 8 - export interface Renderable { 9 - render(): Displayable 10 - } 11 - 12 3 export interface HTML { 13 4 [html_tag]: true 14 5 /* @internal */ _statics: TemplateStringsArray ··· 22 13 _statics: statics, 23 14 } 24 15 } 16 + 17 + export type { Displayable, Renderable } from './shared.ts'
+1 -2
src/server.ts
··· 1 - import type { Displayable } from 'dhtml' 2 1 import { Tokenizer } from 'htmlparser2' 3 - import { assert, is_html, is_iterable, is_renderable, single_part_template } from './shared.ts' 2 + import { assert, is_html, is_iterable, is_renderable, single_part_template, type Displayable } from './shared.ts' 4 3 5 4 type PartRenderer = (values: unknown[]) => string | Generator<string, void, void> 6 5
+10 -1
src/shared.ts
··· 1 - import { html, type Displayable, type HTML, type Renderable } from 'dhtml' 1 + import { html, type HTML } from './index.ts' 2 2 3 3 declare global { 4 4 var __DEV__: boolean 5 + } 6 + 7 + export interface ToString { 8 + toString(): string 9 + } 10 + 11 + export type Displayable = null | undefined | ToString | Node | Renderable | Iterable<Displayable> | HTML 12 + export interface Renderable { 13 + render(): Displayable 5 14 } 6 15 7 16 export function is_renderable(value: unknown): value is Renderable {