@ohos-ports/stacksjs-stx 0.2.287-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +1042 -0
- package/dist/a11y.d.ts +256 -0
- package/dist/a11y.js +671 -0
- package/dist/analytics.d.ts +40 -0
- package/dist/analytics.js +159 -0
- package/dist/analyzer.d.ts +68 -0
- package/dist/analyzer.js +240 -0
- package/dist/animation.d.ts +123 -0
- package/dist/animation.js +688 -0
- package/dist/app-shell.d.ts +76 -0
- package/dist/app-shell.js +209 -0
- package/dist/app.d.ts +65 -0
- package/dist/app.js +79 -0
- package/dist/appearance-bootstrap.d.ts +54 -0
- package/dist/appearance-bootstrap.js +92 -0
- package/dist/asset-roots.d.ts +32 -0
- package/dist/asset-roots.js +7 -0
- package/dist/assets.d.ts +21 -0
- package/dist/assets.js +155 -0
- package/dist/ast.d.ts +265 -0
- package/dist/ast.js +630 -0
- package/dist/async-components.d.ts +123 -0
- package/dist/async-components.js +428 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.js +12 -0
- package/dist/broadcasting.d.ts +77 -0
- package/dist/broadcasting.js +103 -0
- package/dist/browser-composables.d.ts +348 -0
- package/dist/browser-composables.js +606 -0
- package/dist/browser-core-imports.d.ts +12 -0
- package/dist/browser-core-imports.js +28 -0
- package/dist/build-assets.d.ts +32 -0
- package/dist/build-assets.js +29 -0
- package/dist/build-externalize-repeated.d.ts +34 -0
- package/dist/build-externalize-repeated.js +101 -0
- package/dist/build-externalize.d.ts +73 -0
- package/dist/build-externalize.js +80 -0
- package/dist/build-id.d.ts +57 -0
- package/dist/build-id.js +25 -0
- package/dist/build-message.d.ts +81 -0
- package/dist/build-message.js +65 -0
- package/dist/build-mode-detector.d.ts +26 -0
- package/dist/build-mode-detector.js +50 -0
- package/dist/build-optimizer.d.ts +101 -0
- package/dist/build-optimizer.js +433 -0
- package/dist/build-views.d.ts +56 -0
- package/dist/build-views.js +180 -0
- package/dist/build.d.ts +31 -0
- package/dist/build.js +34 -0
- package/dist/builtins/attrs.d.ts +49 -0
- package/dist/builtins/attrs.js +39 -0
- package/dist/builtins/drawer.d.ts +24 -0
- package/dist/builtins/drawer.js +37 -0
- package/dist/builtins/escape.d.ts +12 -0
- package/dist/builtins/escape.js +3 -0
- package/dist/builtins/icon.d.ts +45 -0
- package/dist/builtins/icon.js +100 -0
- package/dist/builtins/image-delivery.d.ts +16 -0
- package/dist/builtins/image-delivery.js +115 -0
- package/dist/builtins/image-placeholder.d.ts +78 -0
- package/dist/builtins/image-placeholder.js +137 -0
- package/dist/builtins/index.d.ts +26 -0
- package/dist/builtins/index.js +34 -0
- package/dist/builtins/modal.d.ts +26 -0
- package/dist/builtins/modal.js +38 -0
- package/dist/builtins/safe-image.d.ts +44 -0
- package/dist/builtins/safe-image.js +45 -0
- package/dist/builtins/stx-image.d.ts +29 -0
- package/dist/builtins/stx-image.js +222 -0
- package/dist/builtins/stx-link.d.ts +11 -0
- package/dist/builtins/stx-link.js +35 -0
- package/dist/builtins/stx-loading-indicator.d.ts +13 -0
- package/dist/builtins/stx-loading-indicator.js +35 -0
- package/dist/builtins/suspense.d.ts +30 -0
- package/dist/builtins/suspense.js +24 -0
- package/dist/builtins/toast.d.ts +19 -0
- package/dist/builtins/toast.js +42 -0
- package/dist/builtins/tooltip.d.ts +18 -0
- package/dist/builtins/tooltip.js +106 -0
- package/dist/builtins/transition-group.d.ts +27 -0
- package/dist/builtins/transition-group.js +22 -0
- package/dist/bun-shim.js +496 -0
- package/dist/bundle-analyzer/collector.d.ts +66 -0
- package/dist/bundle-analyzer/collector.js +233 -0
- package/dist/bundle-analyzer/index.d.ts +98 -0
- package/dist/bundle-analyzer/index.js +82 -0
- package/dist/bundle-analyzer/report.d.ts +39 -0
- package/dist/bundle-analyzer/report.js +318 -0
- package/dist/bundle-analyzer/treemap.d.ts +19 -0
- package/dist/bundle-analyzer/treemap.js +594 -0
- package/dist/bundle-analyzer.js +499 -0
- package/dist/caching.d.ts +69 -0
- package/dist/caching.js +135 -0
- package/dist/chunk-0y46fbkx.js +3 -0
- package/dist/chunk-122tyfre.js +2 -0
- package/dist/chunk-19nfvxfw.js +43 -0
- package/dist/chunk-1kah92n2.js +3 -0
- package/dist/chunk-1kms3b9d.js +2 -0
- package/dist/chunk-1q4y74mh.js +1194 -0
- package/dist/chunk-248e84r1.js +4 -0
- package/dist/chunk-24ps8kft.js +2 -0
- package/dist/chunk-2et5hxfv.js +2 -0
- package/dist/chunk-2r1rd8f0.js +2 -0
- package/dist/chunk-2tk1zkrz.js +2 -0
- package/dist/chunk-38ejahd9.js +3 -0
- package/dist/chunk-3zv4wz87.js +2 -0
- package/dist/chunk-4122k1bh.js +2 -0
- package/dist/chunk-45az9zht.js +2 -0
- package/dist/chunk-4qr85f07.js +2 -0
- package/dist/chunk-4ww3znrr.js +15 -0
- package/dist/chunk-54st8g2j.js +397 -0
- package/dist/chunk-58f0mthg.js +3 -0
- package/dist/chunk-5a19dhx5.js +2 -0
- package/dist/chunk-5kk8gsj2.js +3 -0
- package/dist/chunk-5w1e3yxs.js +499 -0
- package/dist/chunk-6gdycmxr.js +2 -0
- package/dist/chunk-6hmnaza7.js +4473 -0
- package/dist/chunk-71t0yan0.js +5 -0
- package/dist/chunk-74cv4ta1.js +3 -0
- package/dist/chunk-74v15e8z.js +2 -0
- package/dist/chunk-7b329e5v.js +3 -0
- package/dist/chunk-7q9mwh4v.js +84 -0
- package/dist/chunk-866y9d8b.js +8169 -0
- package/dist/chunk-8fwerspy.js +2 -0
- package/dist/chunk-8mjdpr94.js +147 -0
- package/dist/chunk-92mj1t26.js +60 -0
- package/dist/chunk-9b22663r.js +2 -0
- package/dist/chunk-9hjdgm4d.js +2 -0
- package/dist/chunk-9n0gvfrg.js +4 -0
- package/dist/chunk-9wr7zcad.js +18 -0
- package/dist/chunk-9y0g8kzt.js +358 -0
- package/dist/chunk-a0nfbmeh.js +3 -0
- package/dist/chunk-acn1b56m.js +1280 -0
- package/dist/chunk-awkq3xfx.js +2 -0
- package/dist/chunk-b6ej2fdf.js +1814 -0
- package/dist/chunk-b8rrnqry.js +2 -0
- package/dist/chunk-bfqfs07m.js +3022 -0
- package/dist/chunk-bs6kapy7.js +2 -0
- package/dist/chunk-btav940g.js +2 -0
- package/dist/chunk-bz820epz.js +3 -0
- package/dist/chunk-ccspd3mc.js +2 -0
- package/dist/chunk-csbgwaa5.js +2 -0
- package/dist/chunk-d8t4sjsp.js +2 -0
- package/dist/chunk-dap191q2.js +2 -0
- package/dist/chunk-de7fye10.js +4 -0
- package/dist/chunk-dgrt76d2.js +2 -0
- package/dist/chunk-dhh5q7qt.js +3 -0
- package/dist/chunk-dsffsqnt.js +2 -0
- package/dist/chunk-dtq7y5ym.js +2 -0
- package/dist/chunk-fed3xsp9.js +3 -0
- package/dist/chunk-ferav3bw.js +19 -0
- package/dist/chunk-fvhm8psm.js +3 -0
- package/dist/chunk-g4vpzv6b.js +2 -0
- package/dist/chunk-g9csmj0s.js +2 -0
- package/dist/chunk-gtcrpmz1.js +2 -0
- package/dist/chunk-h4xh8cms.js +4 -0
- package/dist/chunk-h8yqsz9m.js +2 -0
- package/dist/chunk-hcq5dw7a.js +2 -0
- package/dist/chunk-hm0xha6c.js +12 -0
- package/dist/chunk-hpybjwwf.js +8 -0
- package/dist/chunk-jegt35zh.js +2 -0
- package/dist/chunk-jr3jp3ev.js +8 -0
- package/dist/chunk-k56rjjc0.js +24 -0
- package/dist/chunk-kdh37tp8.js +194 -0
- package/dist/chunk-kxzb4et3.js +29 -0
- package/dist/chunk-mf4n3x1j.js +14 -0
- package/dist/chunk-mkd9kjgb.js +3 -0
- package/dist/chunk-mxfh1nxg.js +2 -0
- package/dist/chunk-n3ggrhb3.js +3 -0
- package/dist/chunk-nkb3scg6.js +8 -0
- package/dist/chunk-nnd4wq8j.js +231 -0
- package/dist/chunk-nsp1cw38.js +11 -0
- package/dist/chunk-nx5qkm8k.js +30 -0
- package/dist/chunk-p3242nck.js +2 -0
- package/dist/chunk-p98kfh94.js +2 -0
- package/dist/chunk-pkaabd8h.js +3 -0
- package/dist/chunk-pzm13sdc.js +3 -0
- package/dist/chunk-q4p5k2p3.js +2 -0
- package/dist/chunk-q9n5swx7.js +3 -0
- package/dist/chunk-qc1f74ek.js +3 -0
- package/dist/chunk-qpyjak7z.js +2 -0
- package/dist/chunk-qr82je1m.js +22 -0
- package/dist/chunk-qy73j6m4.js +288 -0
- package/dist/chunk-qzkhpsam.js +505 -0
- package/dist/chunk-r3ayvdz3.js +2 -0
- package/dist/chunk-r7r66978.js +2 -0
- package/dist/chunk-rbb7dvja.js +30 -0
- package/dist/chunk-refwkt87.js +71 -0
- package/dist/chunk-rj4kajww.js +2 -0
- package/dist/chunk-rp4rjjmf.js +2 -0
- package/dist/chunk-se0p17c2.js +898 -0
- package/dist/chunk-sj9pmene.js +2 -0
- package/dist/chunk-sscwkffs.js +2 -0
- package/dist/chunk-svpqxn2c.js +2 -0
- package/dist/chunk-t6nseeb9.js +351 -0
- package/dist/chunk-t8y1ggdy.js +2 -0
- package/dist/chunk-tndhnk9e.js +2 -0
- package/dist/chunk-v5e1gxwm.js +3 -0
- package/dist/chunk-vqxmxgaj.js +4 -0
- package/dist/chunk-vrrax298.js +2 -0
- package/dist/chunk-w3ycm4na.js +3 -0
- package/dist/chunk-wcm80anz.js +321 -0
- package/dist/chunk-wrzwgkbx.js +22 -0
- package/dist/chunk-x650vjcp.js +302 -0
- package/dist/chunk-xgnc1wy6.js +116 -0
- package/dist/chunk-xpp135ad.js +11 -0
- package/dist/chunk-xttsqmkm.js +216 -0
- package/dist/chunk-y11cxbxd.js +3757 -0
- package/dist/chunk-y7m2dpd3.js +341 -0
- package/dist/chunk-y98jsjqq.js +2 -0
- package/dist/chunk-ya386h70.js +2 -0
- package/dist/chunk-ydrz60kr.js +2 -0
- package/dist/chunk-ypmqf7tm.js +4 -0
- package/dist/chunk-z4jhj5e5.js +28 -0
- package/dist/chunk-zg75gjns.js +2 -0
- package/dist/chunk-zqqx1qaj.js +2 -0
- package/dist/cli-flags.d.ts +34 -0
- package/dist/cli-flags.js +20 -0
- package/dist/cli.js +174 -0
- package/dist/client/directive.d.ts +17 -0
- package/dist/client/directive.js +14 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.js +2 -0
- package/dist/client-helpers.d.ts +317 -0
- package/dist/client-helpers.js +312 -0
- package/dist/client-script-bundler.d.ts +103 -0
- package/dist/client-script-bundler.js +390 -0
- package/dist/client-script.d.ts +215 -0
- package/dist/client-script.js +865 -0
- package/dist/client.d.ts +21 -0
- package/dist/client.js +73 -0
- package/dist/codemod.d.ts +33 -0
- package/dist/codemod.js +244 -0
- package/dist/color-mode-boot.d.ts +92 -0
- package/dist/color-mode-boot.js +72 -0
- package/dist/component-client-factories.d.ts +33 -0
- package/dist/component-client-factories.js +77 -0
- package/dist/component-hmr.d.ts +107 -0
- package/dist/component-hmr.js +585 -0
- package/dist/component-library.d.ts +38 -0
- package/dist/component-library.js +994 -0
- package/dist/component-processing.d.ts +198 -0
- package/dist/component-processing.js +677 -0
- package/dist/component-registry.d.ts +127 -0
- package/dist/component-registry.js +90 -0
- package/dist/component-renderer.d.ts +52 -0
- package/dist/component-renderer.js +790 -0
- package/dist/components/StxImage.stx +12 -0
- package/dist/components/StxLink.stx +18 -0
- package/dist/components.d.ts +28 -0
- package/dist/components.js +213 -0
- package/dist/composable-loader.d.ts +62 -0
- package/dist/composable-loader.js +190 -0
- package/dist/composables/index.d.ts +417 -0
- package/dist/composables/index.js +222 -0
- package/dist/composables/use-battery.d.ts +46 -0
- package/dist/composables/use-battery.js +101 -0
- package/dist/composables/use-broadcast-channel.d.ts +59 -0
- package/dist/composables/use-broadcast-channel.js +80 -0
- package/dist/composables/use-channel.d.ts +67 -0
- package/dist/composables/use-channel.js +124 -0
- package/dist/composables/use-clipboard.d.ts +30 -0
- package/dist/composables/use-clipboard.js +90 -0
- package/dist/composables/use-color-mode.d.ts +67 -0
- package/dist/composables/use-color-mode.js +152 -0
- package/dist/composables/use-cookie.d.ts +59 -0
- package/dist/composables/use-cookie.js +86 -0
- package/dist/composables/use-device-orientation.d.ts +116 -0
- package/dist/composables/use-device-orientation.js +181 -0
- package/dist/composables/use-event-listener.d.ts +35 -0
- package/dist/composables/use-event-listener.js +27 -0
- package/dist/composables/use-event-source.d.ts +90 -0
- package/dist/composables/use-event-source.js +166 -0
- package/dist/composables/use-eye-dropper.d.ts +117 -0
- package/dist/composables/use-eye-dropper.js +142 -0
- package/dist/composables/use-fetch.d.ts +59 -0
- package/dist/composables/use-fetch.js +273 -0
- package/dist/composables/use-form.d.ts +91 -0
- package/dist/composables/use-form.js +112 -0
- package/dist/composables/use-fullscreen.d.ts +47 -0
- package/dist/composables/use-fullscreen.js +110 -0
- package/dist/composables/use-geolocation.d.ts +62 -0
- package/dist/composables/use-geolocation.js +101 -0
- package/dist/composables/use-idle.d.ts +102 -0
- package/dist/composables/use-idle.js +182 -0
- package/dist/composables/use-intersection-observer.d.ts +83 -0
- package/dist/composables/use-intersection-observer.js +168 -0
- package/dist/composables/use-keyboard.d.ts +100 -0
- package/dist/composables/use-keyboard.js +224 -0
- package/dist/composables/use-media-query.d.ts +56 -0
- package/dist/composables/use-media-query.js +62 -0
- package/dist/composables/use-meta.d.ts +35 -0
- package/dist/composables/use-meta.js +48 -0
- package/dist/composables/use-mouse.d.ts +65 -0
- package/dist/composables/use-mouse.js +286 -0
- package/dist/composables/use-mutation-observer.d.ts +101 -0
- package/dist/composables/use-mutation-observer.js +129 -0
- package/dist/composables/use-network.d.ts +40 -0
- package/dist/composables/use-network.js +85 -0
- package/dist/composables/use-notification.d.ts +98 -0
- package/dist/composables/use-notification.js +94 -0
- package/dist/composables/use-permissions.d.ts +119 -0
- package/dist/composables/use-permissions.js +132 -0
- package/dist/composables/use-query.d.ts +48 -0
- package/dist/composables/use-query.js +0 -0
- package/dist/composables/use-resize-observer.d.ts +60 -0
- package/dist/composables/use-resize-observer.js +157 -0
- package/dist/composables/use-router.d.ts +80 -0
- package/dist/composables/use-router.js +105 -0
- package/dist/composables/use-scroll-lock.d.ts +13 -0
- package/dist/composables/use-scroll-lock.js +55 -0
- package/dist/composables/use-share.d.ts +74 -0
- package/dist/composables/use-share.js +104 -0
- package/dist/composables/use-speech.d.ts +117 -0
- package/dist/composables/use-speech.js +294 -0
- package/dist/composables/use-storage.d.ts +69 -0
- package/dist/composables/use-storage.js +196 -0
- package/dist/composables/use-text-selection.d.ts +121 -0
- package/dist/composables/use-text-selection.js +205 -0
- package/dist/composables/use-timer.d.ts +92 -0
- package/dist/composables/use-timer.js +193 -0
- package/dist/composables/use-utilities.d.ts +103 -0
- package/dist/composables/use-utilities.js +176 -0
- package/dist/composables/use-wake-lock.d.ts +85 -0
- package/dist/composables/use-wake-lock.js +122 -0
- package/dist/composables/use-websocket.d.ts +70 -0
- package/dist/composables/use-websocket.js +165 -0
- package/dist/composables/use-window.d.ts +84 -0
- package/dist/composables/use-window.js +163 -0
- package/dist/composables.d.ts +287 -0
- package/dist/composables.js +562 -0
- package/dist/composition-api.d.ts +197 -0
- package/dist/composition-api.js +199 -0
- package/dist/compression.d.ts +30 -0
- package/dist/compression.js +107 -0
- package/dist/computed.d.ts +138 -0
- package/dist/computed.js +382 -0
- package/dist/conditionals.d.ts +48 -0
- package/dist/conditionals.js +626 -0
- package/dist/config.d.ts +77 -0
- package/dist/config.js +828 -0
- package/dist/cookie-serialize.d.ts +40 -0
- package/dist/cookie-serialize.js +18 -0
- package/dist/craft-bridge.d.ts +525 -0
- package/dist/craft-bridge.js +511 -0
- package/dist/craft-compiler.d.ts +245 -0
- package/dist/craft-compiler.js +810 -0
- package/dist/craft-components.d.ts +739 -0
- package/dist/craft-components.js +1074 -0
- package/dist/craft-entry.d.ts +6 -0
- package/dist/craft-entry.js +9 -0
- package/dist/craft-ssr.d.ts +147 -0
- package/dist/craft-ssr.js +559 -0
- package/dist/craft.js +9 -0
- package/dist/csp.d.ts +295 -0
- package/dist/csp.js +220 -0
- package/dist/csrf.d.ts +38 -0
- package/dist/csrf.js +38 -0
- package/dist/custom-directives.d.ts +5 -0
- package/dist/custom-directives.js +136 -0
- package/dist/database.d.ts +391 -0
- package/dist/database.js +5 -0
- package/dist/defer.d.ts +28 -0
- package/dist/defer.js +156 -0
- package/dist/deploy/config-generators.d.ts +75 -0
- package/dist/deploy/config-generators.js +214 -0
- package/dist/deploy/index.d.ts +88 -0
- package/dist/deploy/index.js +203 -0
- package/dist/deploy/netlify.d.ts +109 -0
- package/dist/deploy/netlify.js +167 -0
- package/dist/desktop.d.ts +16 -0
- package/dist/desktop.js +1 -0
- package/dist/dev-server/index.d.ts +22 -0
- package/dist/dev-server/index.js +7 -0
- package/dist/dev-server/keyboard-shortcuts.d.ts +34 -0
- package/dist/dev-server/keyboard-shortcuts.js +81 -0
- package/dist/dev-server/native-window.d.ts +59 -0
- package/dist/dev-server/native-window.js +91 -0
- package/dist/dev-server/port-utils.d.ts +27 -0
- package/dist/dev-server/port-utils.js +40 -0
- package/dist/dev-server/serve-app.d.ts +15 -0
- package/dist/dev-server/serve-app.js +727 -0
- package/dist/dev-server/serve-file.d.ts +3 -0
- package/dist/dev-server/serve-file.js +443 -0
- package/dist/dev-server/serve-markdown.d.ts +3 -0
- package/dist/dev-server/serve-markdown.js +284 -0
- package/dist/dev-server/serve-multi.d.ts +5 -0
- package/dist/dev-server/serve-multi.js +596 -0
- package/dist/dev-server/terminal-colors.d.ts +56 -0
- package/dist/dev-server/terminal-colors.js +45 -0
- package/dist/dev-server/theme-selector.d.ts +32 -0
- package/dist/dev-server/theme-selector.js +111 -0
- package/dist/dev-server/ts-css.d.ts +108 -0
- package/dist/dev-server/ts-css.js +438 -0
- package/dist/dev-server/types.d.ts +99 -0
- package/dist/dev-server/types.js +43 -0
- package/dist/dev-server.d.ts +6 -0
- package/dist/dev-server.js +4 -0
- package/dist/devtools.d.ts +182 -0
- package/dist/devtools.js +593 -0
- package/dist/directive-api.d.ts +154 -0
- package/dist/directive-api.js +355 -0
- package/dist/docs.d.ts +56 -0
- package/dist/docs.js +567 -0
- package/dist/doctor.d.ts +29 -0
- package/dist/doctor.js +123 -0
- package/dist/document-shell.d.ts +218 -0
- package/dist/document-shell.js +338 -0
- package/dist/dynamic-components.d.ts +23 -0
- package/dist/dynamic-components.js +197 -0
- package/dist/edge-runtime.d.ts +193 -0
- package/dist/edge-runtime.js +525 -0
- package/dist/env.d.ts +3 -0
- package/dist/env.js +9 -0
- package/dist/error-boundaries.d.ts +78 -0
- package/dist/error-boundaries.js +281 -0
- package/dist/error-handling.d.ts +14 -0
- package/dist/error-handling.js +1 -0
- package/dist/errors/codes.d.ts +92 -0
- package/dist/errors/codes.js +97 -0
- package/dist/errors/formatter.d.ts +84 -0
- package/dist/errors/formatter.js +196 -0
- package/dist/errors/index.d.ts +12 -0
- package/dist/errors/index.js +44 -0
- package/dist/errors/logger.d.ts +135 -0
- package/dist/errors/logger.js +250 -0
- package/dist/errors/sanitizer.d.ts +73 -0
- package/dist/errors/sanitizer.js +181 -0
- package/dist/errors/types.d.ts +92 -0
- package/dist/errors/types.js +86 -0
- package/dist/events.d.ts +145 -0
- package/dist/events.js +396 -0
- package/dist/expressions.d.ts +180 -0
- package/dist/expressions.js +719 -0
- package/dist/find-body-tag.d.ts +50 -0
- package/dist/find-body-tag.js +57 -0
- package/dist/formatter.d.ts +19 -0
- package/dist/formatter.js +265 -0
- package/dist/forms-validation.d.ts +189 -0
- package/dist/forms-validation.js +421 -0
- package/dist/forms.d.ts +224 -0
- package/dist/forms.js +729 -0
- package/dist/fragment-container.d.ts +57 -0
- package/dist/fragment-container.js +123 -0
- package/dist/framework-composables.d.ts +73 -0
- package/dist/framework-composables.js +126 -0
- package/dist/head-injection.d.ts +61 -0
- package/dist/head-injection.js +28 -0
- package/dist/head.d.ts +282 -0
- package/dist/head.js +231 -0
- package/dist/heatmap.d.ts +206 -0
- package/dist/heatmap.js +566 -0
- package/dist/hot-reload.d.ts +87 -0
- package/dist/hot-reload.js +373 -0
- package/dist/html-masking.d.ts +125 -0
- package/dist/html-masking.js +196 -0
- package/dist/hydration-runtime.d.ts +44 -0
- package/dist/hydration-runtime.js +195 -0
- package/dist/hydration.d.ts +135 -0
- package/dist/hydration.js +654 -0
- package/dist/i18n.d.ts +342 -0
- package/dist/i18n.js +678 -0
- package/dist/image-optimization/auto-sibling.d.ts +42 -0
- package/dist/image-optimization/auto-sibling.js +88 -0
- package/dist/image-optimization/build-plugin.d.ts +54 -0
- package/dist/image-optimization/build-plugin.js +241 -0
- package/dist/image-optimization/component.d.ts +46 -0
- package/dist/image-optimization/component.js +244 -0
- package/dist/image-optimization/directive.d.ts +30 -0
- package/dist/image-optimization/directive.js +203 -0
- package/dist/image-optimization/index.d.ts +156 -0
- package/dist/image-optimization/index.js +54 -0
- package/dist/image-optimization/processor.d.ts +140 -0
- package/dist/image-optimization/processor.js +262 -0
- package/dist/image-optimization/serve.d.ts +54 -0
- package/dist/image-optimization/serve.js +102 -0
- package/dist/import-rebase.d.ts +16 -0
- package/dist/import-rebase.js +16 -0
- package/dist/imported-signals.d.ts +43 -0
- package/dist/imported-signals.js +35 -0
- package/dist/includes.d.ts +171 -0
- package/dist/includes.js +764 -0
- package/dist/index.d.ts +365 -0
- package/dist/index.js +202 -0
- package/dist/init.d.ts +39 -0
- package/dist/init.js +505 -0
- package/dist/inline-assets.d.ts +28 -0
- package/dist/inline-assets.js +82 -0
- package/dist/interactive.d.ts +14 -0
- package/dist/interactive.js +383 -0
- package/dist/internal-markdown.d.ts +22 -0
- package/dist/internal-markdown.js +141 -0
- package/dist/island-chunking.d.ts +48 -0
- package/dist/island-chunking.js +52 -0
- package/dist/isolated-build.d.ts +12 -0
- package/dist/isolated-build.js +18 -0
- package/dist/js-ts.d.ts +10 -0
- package/dist/js-ts.js +60 -0
- package/dist/jsx-runtime.d.ts +92 -0
- package/dist/jsx-runtime.js +289 -0
- package/dist/keep-alive.d.ts +108 -0
- package/dist/keep-alive.js +421 -0
- package/dist/layout-types.d.ts +45 -0
- package/dist/layout-types.js +56 -0
- package/dist/lazy-loader.d.ts +90 -0
- package/dist/lazy-loader.js +245 -0
- package/dist/lazy-module.d.ts +11 -0
- package/dist/lazy-module.js +18 -0
- package/dist/loading-indicator.d.ts +50 -0
- package/dist/loading-indicator.js +322 -0
- package/dist/loops.d.ts +91 -0
- package/dist/loops.js +690 -0
- package/dist/manifest.d.ts +41 -0
- package/dist/manifest.js +31 -0
- package/dist/markdown-view.d.ts +25 -0
- package/dist/markdown-view.js +39 -0
- package/dist/markdown.d.ts +10 -0
- package/dist/markdown.js +68 -0
- package/dist/media/client/blur-up.d.ts +66 -0
- package/dist/media/client/blur-up.js +217 -0
- package/dist/media/client/index.d.ts +93 -0
- package/dist/media/client/index.js +53 -0
- package/dist/media/client/lazy-load.d.ts +74 -0
- package/dist/media/client/lazy-load.js +283 -0
- package/dist/media/client/upload-handler.d.ts +80 -0
- package/dist/media/client/upload-handler.js +354 -0
- package/dist/media/image/component.d.ts +60 -0
- package/dist/media/image/component.js +574 -0
- package/dist/media/image/directive.d.ts +23 -0
- package/dist/media/image/directive.js +160 -0
- package/dist/media/image/editing.d.ts +212 -0
- package/dist/media/image/editing.js +193 -0
- package/dist/media/image/index.d.ts +142 -0
- package/dist/media/image/index.js +80 -0
- package/dist/media/image/placeholder.d.ts +89 -0
- package/dist/media/image/placeholder.js +188 -0
- package/dist/media/image/processor/cache.d.ts +53 -0
- package/dist/media/image/processor/cache.js +51 -0
- package/dist/media/image/processor/index.d.ts +11 -0
- package/dist/media/image/processor/index.js +3 -0
- package/dist/media/image/processor/optimizer.d.ts +24 -0
- package/dist/media/image/processor/optimizer.js +202 -0
- package/dist/media/image/processor/responsive.d.ts +28 -0
- package/dist/media/image/processor/responsive.js +162 -0
- package/dist/media/image/srcset.d.ts +157 -0
- package/dist/media/image/srcset.js +194 -0
- package/dist/media/index.d.ts +331 -0
- package/dist/media/index.js +198 -0
- package/dist/media/manager/embed.d.ts +25 -0
- package/dist/media/manager/embed.js +253 -0
- package/dist/media/protected/component.d.ts +33 -0
- package/dist/media/protected/component.js +235 -0
- package/dist/media/protected/index.d.ts +47 -0
- package/dist/media/protected/index.js +20 -0
- package/dist/media/protected/signature.d.ts +72 -0
- package/dist/media/protected/signature.js +205 -0
- package/dist/media/shared/cache.d.ts +76 -0
- package/dist/media/shared/cache.js +132 -0
- package/dist/media/shared/hash.d.ts +31 -0
- package/dist/media/shared/hash.js +35 -0
- package/dist/media/shared/index.d.ts +7 -0
- package/dist/media/shared/index.js +2 -0
- package/dist/media/types.d.ts +1477 -0
- package/dist/media/types.js +0 -0
- package/dist/media/upload/component.d.ts +9 -0
- package/dist/media/upload/component.js +320 -0
- package/dist/media/upload/index.d.ts +8 -0
- package/dist/media/upload/index.js +1 -0
- package/dist/media/video/directive.d.ts +23 -0
- package/dist/media/video/directive.js +142 -0
- package/dist/media/video/index.d.ts +76 -0
- package/dist/media/video/index.js +583 -0
- package/dist/media/video/processor/cache.d.ts +55 -0
- package/dist/media/video/processor/cache.js +52 -0
- package/dist/media/video/processor/index.d.ts +12 -0
- package/dist/media/video/processor/index.js +4 -0
- package/dist/media/video/processor/streaming.d.ts +26 -0
- package/dist/media/video/processor/streaming.js +197 -0
- package/dist/media/video/processor/thumbnail.d.ts +35 -0
- package/dist/media/video/processor/thumbnail.js +134 -0
- package/dist/media/video/processor/transcoder.d.ts +19 -0
- package/dist/media/video/processor/transcoder.js +283 -0
- package/dist/menubar.d.ts +65 -0
- package/dist/menubar.js +99 -0
- package/dist/method-spoofing.d.ts +20 -0
- package/dist/method-spoofing.js +17 -0
- package/dist/middleware.d.ts +112 -0
- package/dist/middleware.js +40 -0
- package/dist/misc-directives.d.ts +55 -0
- package/dist/misc-directives.js +328 -0
- package/dist/native-build.d.ts +88 -0
- package/dist/native-build.js +575 -0
- package/dist/owned-routes.d.ts +42 -0
- package/dist/owned-routes.js +26 -0
- package/dist/page-action.d.ts +73 -0
- package/dist/page-action.js +91 -0
- package/dist/page-meta.d.ts +38 -0
- package/dist/page-meta.js +16 -0
- package/dist/page-response.d.ts +120 -0
- package/dist/page-response.js +117 -0
- package/dist/parser/directive-parser.d.ts +119 -0
- package/dist/parser/directive-parser.js +249 -0
- package/dist/parser/expression-parser.d.ts +58 -0
- package/dist/parser/expression-parser.js +358 -0
- package/dist/parser/index.d.ts +13 -0
- package/dist/parser/index.js +23 -0
- package/dist/parser/tokenizer.d.ts +77 -0
- package/dist/parser/tokenizer.js +534 -0
- package/dist/partial-hydration.d.ts +123 -0
- package/dist/partial-hydration.js +427 -0
- package/dist/performance-utils.d.ts +318 -0
- package/dist/performance-utils.js +466 -0
- package/dist/placeholder.d.ts +54 -0
- package/dist/placeholder.js +35 -0
- package/dist/plugin-system.d.ts +301 -0
- package/dist/plugin-system.js +214 -0
- package/dist/plugin.d.ts +3 -0
- package/dist/plugin.js +174 -0
- package/dist/precompiler.d.ts +43 -0
- package/dist/precompiler.js +670 -0
- package/dist/process.d.ts +16 -0
- package/dist/process.js +879 -0
- package/dist/production-build.d.ts +163 -0
- package/dist/production-build.js +596 -0
- package/dist/production-builder.d.ts +42 -0
- package/dist/production-builder.js +146 -0
- package/dist/production-server.d.ts +19 -0
- package/dist/production-server.js +208 -0
- package/dist/prop-sentinels.d.ts +31 -0
- package/dist/prop-sentinels.js +7 -0
- package/dist/props.d.ts +216 -0
- package/dist/props.js +224 -0
- package/dist/public-env.d.ts +29 -0
- package/dist/public-env.js +19 -0
- package/dist/pwa/audit.d.ts +42 -0
- package/dist/pwa/audit.js +255 -0
- package/dist/pwa/directives.d.ts +38 -0
- package/dist/pwa/directives.js +332 -0
- package/dist/pwa/icons.d.ts +42 -0
- package/dist/pwa/icons.js +109 -0
- package/dist/pwa/index.d.ts +104 -0
- package/dist/pwa/index.js +47 -0
- package/dist/pwa/inject.d.ts +32 -0
- package/dist/pwa/inject.js +102 -0
- package/dist/pwa/manifest.d.ts +104 -0
- package/dist/pwa/manifest.js +186 -0
- package/dist/pwa/offline.d.ts +8 -0
- package/dist/pwa/offline.js +259 -0
- package/dist/pwa/precache.d.ts +35 -0
- package/dist/pwa/precache.js +116 -0
- package/dist/pwa/service-worker.d.ts +33 -0
- package/dist/pwa/service-worker.js +860 -0
- package/dist/pwa/workbox-strategies.d.ts +100 -0
- package/dist/pwa/workbox-strategies.js +167 -0
- package/dist/pwa/workbox.d.ts +51 -0
- package/dist/pwa/workbox.js +382 -0
- package/dist/pwa.d.ts +52 -0
- package/dist/pwa.js +236 -0
- package/dist/reactive-bindings.d.ts +47 -0
- package/dist/reactive-bindings.js +268 -0
- package/dist/reactive-tracking.d.ts +81 -0
- package/dist/reactive-tracking.js +49 -0
- package/dist/reactive.d.ts +117 -0
- package/dist/reactive.js +593 -0
- package/dist/reactivity.d.ts +206 -0
- package/dist/reactivity.js +574 -0
- package/dist/release.d.ts +1 -0
- package/dist/release.js +1 -0
- package/dist/render-memo.d.ts +40 -0
- package/dist/render-memo.js +33 -0
- package/dist/render.d.ts +54 -0
- package/dist/render.js +153 -0
- package/dist/resolve-stx-targets.d.ts +49 -0
- package/dist/resolve-stx-targets.js +38 -0
- package/dist/route-middleware.d.ts +2 -0
- package/dist/route-middleware.js +17 -0
- package/dist/route-types.d.ts +134 -0
- package/dist/route-types.js +24 -0
- package/dist/router.d.ts +9 -0
- package/dist/router.js +9 -0
- package/dist/routes.d.ts +6 -0
- package/dist/routes.js +14 -0
- package/dist/runtime-globals.d.ts +236 -0
- package/dist/runtime-globals.js +230 -0
- package/dist/runtime-injection.d.ts +113 -0
- package/dist/runtime-injection.js +156 -0
- package/dist/runtime.d.ts +140 -0
- package/dist/runtime.js +94 -0
- package/dist/safe-evaluator.d.ts +165 -0
- package/dist/safe-evaluator.js +461 -0
- package/dist/scaffolding.d.ts +113 -0
- package/dist/scaffolding.js +897 -0
- package/dist/screenshot.d.ts +22 -0
- package/dist/screenshot.js +100 -0
- package/dist/script-classifier.d.ts +41 -0
- package/dist/script-classifier.js +51 -0
- package/dist/script-emit.d.ts +50 -0
- package/dist/script-emit.js +11 -0
- package/dist/script-json.d.ts +36 -0
- package/dist/script-json.js +6 -0
- package/dist/script-validation.d.ts +26 -0
- package/dist/script-validation.js +179 -0
- package/dist/seo.d.ts +225 -0
- package/dist/seo.js +486 -0
- package/dist/serve.d.ts +44 -0
- package/dist/serve.js +233 -0
- package/dist/server-bindings.d.ts +39 -0
- package/dist/server-bindings.js +171 -0
- package/dist/server-components.d.ts +138 -0
- package/dist/server-components.js +427 -0
- package/dist/sfc-template.d.ts +17 -0
- package/dist/sfc-template.js +32 -0
- package/dist/signal-processing.d.ts +222 -0
- package/dist/signal-processing.js +1081 -0
- package/dist/signals-api.d.ts +459 -0
- package/dist/signals-api.js +172 -0
- package/dist/signals.d.ts +41 -0
- package/dist/signals.js +8233 -0
- package/dist/site-builder/build.d.ts +18 -0
- package/dist/site-builder/build.js +252 -0
- package/dist/site-builder/i18n.d.ts +104 -0
- package/dist/site-builder/i18n.js +150 -0
- package/dist/site-builder/index.d.ts +27 -0
- package/dist/site-builder/index.js +16 -0
- package/dist/site-builder/robots.d.ts +2 -0
- package/dist/site-builder/robots.js +26 -0
- package/dist/site-builder/router.d.ts +10 -0
- package/dist/site-builder/router.js +27 -0
- package/dist/site-builder/seo.d.ts +8 -0
- package/dist/site-builder/seo.js +67 -0
- package/dist/site-builder/sitemap.d.ts +10 -0
- package/dist/site-builder/sitemap.js +26 -0
- package/dist/site-builder/theme.d.ts +12 -0
- package/dist/site-builder/theme.js +38 -0
- package/dist/site-builder/types.d.ts +74 -0
- package/dist/site-builder/types.js +0 -0
- package/dist/site-url.d.ts +46 -0
- package/dist/site-url.js +70 -0
- package/dist/slots.d.ts +129 -0
- package/dist/slots.js +286 -0
- package/dist/source-maps.d.ts +98 -0
- package/dist/source-maps.js +350 -0
- package/dist/source-signature.d.ts +45 -0
- package/dist/source-signature.js +20 -0
- package/dist/spa-nav.d.ts +49 -0
- package/dist/spa-nav.js +12 -0
- package/dist/spa-shell.d.ts +21 -0
- package/dist/spa-shell.js +34 -0
- package/dist/ssg.d.ts +357 -0
- package/dist/ssg.js +94 -0
- package/dist/ssr.d.ts +116 -0
- package/dist/ssr.js +339 -0
- package/dist/state-dir.d.ts +36 -0
- package/dist/state-dir.js +22 -0
- package/dist/state-management.d.ts +299 -0
- package/dist/state-management.js +519 -0
- package/dist/store-imports.d.ts +47 -0
- package/dist/store-imports.js +16 -0
- package/dist/store-loader.d.ts +15 -0
- package/dist/store-loader.js +111 -0
- package/dist/stores-client.d.ts +70 -0
- package/dist/stores-client.js +132 -0
- package/dist/story/addons.d.ts +123 -0
- package/dist/story/addons.js +261 -0
- package/dist/story/analytics.d.ts +163 -0
- package/dist/story/analytics.js +235 -0
- package/dist/story/auto-stories.d.ts +38 -0
- package/dist/story/auto-stories.js +158 -0
- package/dist/story/bookmarks.d.ts +102 -0
- package/dist/story/bookmarks.js +277 -0
- package/dist/story/bun-test.d.ts +45 -0
- package/dist/story/bun-test.js +102 -0
- package/dist/story/cli.d.ts +132 -0
- package/dist/story/cli.js +155 -0
- package/dist/story/collect/analyzer.d.ts +33 -0
- package/dist/story/collect/analyzer.js +305 -0
- package/dist/story/collect/index.d.ts +31 -0
- package/dist/story/collect/index.js +27 -0
- package/dist/story/collect/parser.d.ts +17 -0
- package/dist/story/collect/parser.js +129 -0
- package/dist/story/collect/scanner.d.ts +17 -0
- package/dist/story/collect/scanner.js +101 -0
- package/dist/story/collect/tree.d.ts +24 -0
- package/dist/story/collect/tree.js +110 -0
- package/dist/story/commands/build.d.ts +19 -0
- package/dist/story/commands/build.js +172 -0
- package/dist/story/commands/dev.d.ts +23 -0
- package/dist/story/commands/dev.js +78 -0
- package/dist/story/commands/index.d.ts +9 -0
- package/dist/story/commands/index.js +3 -0
- package/dist/story/commands/preview.d.ts +21 -0
- package/dist/story/commands/preview.js +56 -0
- package/dist/story/compiled-output.d.ts +27 -0
- package/dist/story/compiled-output.js +151 -0
- package/dist/story/composition.d.ts +47 -0
- package/dist/story/composition.js +261 -0
- package/dist/story/config-watcher.d.ts +33 -0
- package/dist/story/config-watcher.js +67 -0
- package/dist/story/config.d.ts +29 -0
- package/dist/story/config.js +64 -0
- package/dist/story/context.d.ts +27 -0
- package/dist/story/context.js +27 -0
- package/dist/story/controls/index.d.ts +54 -0
- package/dist/story/controls/index.js +320 -0
- package/dist/story/desktop-preview.d.ts +34 -0
- package/dist/story/desktop-preview.js +105 -0
- package/dist/story/docs-generator.d.ts +30 -0
- package/dist/story/docs-generator.js +187 -0
- package/dist/story/errors.d.ts +47 -0
- package/dist/story/errors.js +239 -0
- package/dist/story/figma-export.d.ts +169 -0
- package/dist/story/figma-export.js +224 -0
- package/dist/story/generator.d.ts +21 -0
- package/dist/story/generator.js +165 -0
- package/dist/story/hmr.d.ts +62 -0
- package/dist/story/hmr.js +131 -0
- package/dist/story/hot-swap.d.ts +46 -0
- package/dist/story/hot-swap.js +207 -0
- package/dist/story/index.d.ts +99 -0
- package/dist/story/index.js +49 -0
- package/dist/story/interactions.d.ts +53 -0
- package/dist/story/interactions.js +225 -0
- package/dist/story/keyboard-shortcuts.d.ts +39 -0
- package/dist/story/keyboard-shortcuts.js +345 -0
- package/dist/story/output.d.ts +115 -0
- package/dist/story/output.js +153 -0
- package/dist/story/performance.d.ts +129 -0
- package/dist/story/performance.js +252 -0
- package/dist/story/presets.d.ts +123 -0
- package/dist/story/presets.js +289 -0
- package/dist/story/props-validation.d.ts +45 -0
- package/dist/story/props-validation.js +215 -0
- package/dist/story/renderer.d.ts +69 -0
- package/dist/story/renderer.js +209 -0
- package/dist/story/search-index.d.ts +47 -0
- package/dist/story/search-index.js +106 -0
- package/dist/story/search.d.ts +56 -0
- package/dist/story/search.js +140 -0
- package/dist/story/server.d.ts +31 -0
- package/dist/story/server.js +965 -0
- package/dist/story/setup.d.ts +56 -0
- package/dist/story/setup.js +78 -0
- package/dist/story/snapshots.d.ts +65 -0
- package/dist/story/snapshots.js +171 -0
- package/dist/story/testing.d.ts +83 -0
- package/dist/story/testing.js +164 -0
- package/dist/story/theme.d.ts +68 -0
- package/dist/story/theme.js +170 -0
- package/dist/story/ts-css.d.ts +29 -0
- package/dist/story/ts-css.js +189 -0
- package/dist/story/types.d.ts +342 -0
- package/dist/story/types.js +0 -0
- package/dist/story/ui/code-panel.d.ts +43 -0
- package/dist/story/ui/code-panel.js +175 -0
- package/dist/story/ui/controls-panel.d.ts +25 -0
- package/dist/story/ui/controls-panel.js +168 -0
- package/dist/story/ui/index.d.ts +8 -0
- package/dist/story/ui/index.js +4 -0
- package/dist/story/ui/navigation.d.ts +55 -0
- package/dist/story/ui/navigation.js +250 -0
- package/dist/story/ui/preview.d.ts +46 -0
- package/dist/story/ui/preview.js +251 -0
- package/dist/story/visual-testing.d.ts +45 -0
- package/dist/story/visual-testing.js +248 -0
- package/dist/streaming.d.ts +238 -0
- package/dist/streaming.js +537 -0
- package/dist/strict-lint.d.ts +52 -0
- package/dist/strict-lint.js +269 -0
- package/dist/strip-literals.d.ts +40 -0
- package/dist/strip-literals.js +149 -0
- package/dist/stx-virtual-ts.d.ts +358 -0
- package/dist/stx-virtual-ts.js +670 -0
- package/dist/stx.d.ts +924 -0
- package/dist/style-scoping.d.ts +42 -0
- package/dist/style-scoping.js +82 -0
- package/dist/suspense.d.ts +98 -0
- package/dist/suspense.js +398 -0
- package/dist/teleport.d.ts +31 -0
- package/dist/teleport.js +109 -0
- package/dist/template-compiler.d.ts +33 -0
- package/dist/template-compiler.js +68 -0
- package/dist/template-hydrator.d.ts +28 -0
- package/dist/template-hydrator.js +95 -0
- package/dist/template-tag-balance.d.ts +32 -0
- package/dist/template-tag-balance.js +93 -0
- package/dist/testing.d.ts +330 -0
- package/dist/testing.js +588 -0
- package/dist/theme-tokens.d.ts +88 -0
- package/dist/theme-tokens.js +71 -0
- package/dist/transitions.d.ts +99 -0
- package/dist/transitions.js +443 -0
- package/dist/ts-css-config.d.ts +71 -0
- package/dist/ts-css-config.js +44 -0
- package/dist/type-checker.d.ts +85 -0
- package/dist/type-checker.js +581 -0
- package/dist/typecheck.d.ts +70 -0
- package/dist/typecheck.js +365 -0
- package/dist/types/component-types.d.ts +248 -0
- package/dist/types/component-types.js +0 -0
- package/dist/types/config-types.d.ts +938 -0
- package/dist/types/config-types.js +0 -0
- package/dist/types/context-types.d.ts +122 -0
- package/dist/types/context-types.js +0 -0
- package/dist/types/csp-types.d.ts +83 -0
- package/dist/types/csp-types.js +0 -0
- package/dist/types/directive-types.d.ts +315 -0
- package/dist/types/directive-types.js +3 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.js +1 -0
- package/dist/types/pwa-types.d.ts +338 -0
- package/dist/types/pwa-types.js +0 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.js +1 -0
- package/dist/typescript-templates.d.ts +156 -0
- package/dist/typescript-templates.js +386 -0
- package/dist/unresolved-identifiers.d.ts +52 -0
- package/dist/unresolved-identifiers.js +148 -0
- package/dist/utils.d.ts +112 -0
- package/dist/utils.js +1170 -0
- package/dist/validator.d.ts +80 -0
- package/dist/validator.js +171 -0
- package/dist/variable-extractor.d.ts +142 -0
- package/dist/variable-extractor.js +1306 -0
- package/dist/view-composers.d.ts +171 -0
- package/dist/view-composers.js +29 -0
- package/dist/virtual-scrolling.d.ts +127 -0
- package/dist/virtual-scrolling.js +454 -0
- package/dist/visual-editor.d.ts +185 -0
- package/dist/visual-editor.js +735 -0
- package/dist/visual-testing.d.ts +135 -0
- package/dist/visual-testing.js +126 -0
- package/dist/vue-template.d.ts +39 -0
- package/dist/vue-template.js +476 -0
- package/dist/web-components/css-scoping.d.ts +64 -0
- package/dist/web-components/css-scoping.js +210 -0
- package/dist/web-components/index.d.ts +29 -0
- package/dist/web-components/index.js +13 -0
- package/dist/web-components/reactive-generator.d.ts +72 -0
- package/dist/web-components/reactive-generator.js +484 -0
- package/dist/web-components.d.ts +253 -0
- package/dist/web-components.js +1466 -0
- package/dist/x-element.d.ts +42 -0
- package/dist/x-element.js +301 -0
- package/package.json +107 -0
- package/stx.d.ts +924 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Check if sharp is available (returns true only if sharp is installed).
|
|
4
|
+
*
|
|
5
|
+
* Note: image processing always works now via `ts-images`; this only reports
|
|
6
|
+
* whether the optional sharp fast-path is present. Use {@link isImageBackendAvailable}
|
|
7
|
+
* to gate "can we optimize at all" — the answer is always yes.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isSharpAvailable(): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Whether any image-processing backend is available. Always true now that
|
|
12
|
+
* `ts-images` is bundled as a hard dependency — kept as a function for
|
|
13
|
+
* symmetry with `isSharpAvailable` and so callers can future-proof against
|
|
14
|
+
* a hypothetical "headless" build that strips ts-images.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isImageBackendAvailable(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Process an image and generate responsive variants
|
|
19
|
+
*/
|
|
20
|
+
export declare function processImage(input: string | Buffer, options?: ImageOptions): Promise<ProcessedImage>;
|
|
21
|
+
/**
|
|
22
|
+
* Get image metadata
|
|
23
|
+
*/
|
|
24
|
+
export declare function getImageMetadata(input: Buffer | string): Promise<ImageMetadata>;
|
|
25
|
+
/**
|
|
26
|
+
* Resize and convert image.
|
|
27
|
+
*
|
|
28
|
+
* Tries sharp first if installed (faster on large images), falls back to
|
|
29
|
+
* `ts-images` (pure-TS codecs, always available). `ts-images` is file-
|
|
30
|
+
* oriented so we route the output through a temp file and read it back.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resizeAndConvert(buffer: Buffer, options: {
|
|
33
|
+
width: number
|
|
34
|
+
height: number
|
|
35
|
+
format: ImageFormat
|
|
36
|
+
quality: number
|
|
37
|
+
fit: string
|
|
38
|
+
}): Promise<Buffer>;
|
|
39
|
+
/**
|
|
40
|
+
* Generate srcset attribute from variants
|
|
41
|
+
*/
|
|
42
|
+
export declare function generateSrcSet(variants: ImageVariant[], format?: ImageFormat): string;
|
|
43
|
+
/**
|
|
44
|
+
* Generate sizes attribute
|
|
45
|
+
*/
|
|
46
|
+
export declare function generateSizes(breakpoints?: Record<string, string>): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get best fallback variant (middle resolution JPEG)
|
|
49
|
+
*/
|
|
50
|
+
export declare function getFallbackVariant(variants: ImageVariant[]): ImageVariant | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Group variants by format
|
|
53
|
+
*/
|
|
54
|
+
export declare function groupVariantsByFormat(variants: ImageVariant[]): Map<ImageFormat, ImageVariant[]>;
|
|
55
|
+
/**
|
|
56
|
+
* Check if file is an image
|
|
57
|
+
*/
|
|
58
|
+
export declare function isImageFile(filePath: string): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get MIME type for format
|
|
61
|
+
*/
|
|
62
|
+
export declare function getMimeType(format: ImageFormat): string;
|
|
63
|
+
/**
|
|
64
|
+
* Calculate total size of variants
|
|
65
|
+
*/
|
|
66
|
+
export declare function getTotalSize(variants: ImageVariant[]): number;
|
|
67
|
+
/**
|
|
68
|
+
* Format file size for display
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatSize(bytes: number): string;
|
|
71
|
+
/**
|
|
72
|
+
* ============================================================================
|
|
73
|
+
// Constants
|
|
74
|
+
// ============================================================================
|
|
75
|
+
* @defaultValue `[320, 640, 768, 1024, 1280, 1536, 1920]`
|
|
76
|
+
*/
|
|
77
|
+
export declare const DEFAULT_WIDTHS: number[];
|
|
78
|
+
export declare const DEFAULT_FORMATS: ImageFormat[];
|
|
79
|
+
export declare const DEFAULT_QUALITY: 80;
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Types
|
|
82
|
+
// ============================================================================
|
|
83
|
+
export declare interface ImageOptions {
|
|
84
|
+
widths?: number[]
|
|
85
|
+
formats?: ImageFormat[]
|
|
86
|
+
quality?: number
|
|
87
|
+
fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
|
|
88
|
+
placeholder?: 'blur' | 'dominant-color' | 'thumbhash' | 'none'
|
|
89
|
+
outputDir?: string
|
|
90
|
+
baseUrl?: string
|
|
91
|
+
}
|
|
92
|
+
export declare interface ProcessedImage {
|
|
93
|
+
src: string
|
|
94
|
+
variants: ImageVariant[]
|
|
95
|
+
placeholder?: string
|
|
96
|
+
width: number
|
|
97
|
+
height: number
|
|
98
|
+
aspectRatio: number
|
|
99
|
+
hash: string
|
|
100
|
+
}
|
|
101
|
+
export declare interface ImageVariant {
|
|
102
|
+
path: string
|
|
103
|
+
url: string
|
|
104
|
+
width: number
|
|
105
|
+
height: number
|
|
106
|
+
format: ImageFormat
|
|
107
|
+
size: number
|
|
108
|
+
}
|
|
109
|
+
export declare interface ImageMetadata {
|
|
110
|
+
width: number
|
|
111
|
+
height: number
|
|
112
|
+
format: string
|
|
113
|
+
hasAlpha?: boolean
|
|
114
|
+
}
|
|
115
|
+
export type ImageFormat = 'webp' | 'avif' | 'jpeg' | 'png';
|
|
116
|
+
// ============================================================================
|
|
117
|
+
// Sharp Integration
|
|
118
|
+
// ============================================================================
|
|
119
|
+
declare type SharpInstance = {
|
|
120
|
+
metadata(): Promise<ImageMetadata>
|
|
121
|
+
resize(width: number, height?: number, options?: { fit?: string }): SharpInstance
|
|
122
|
+
webp(options?: { quality?: number }): SharpInstance
|
|
123
|
+
avif(options?: { quality?: number }): SharpInstance
|
|
124
|
+
jpeg(options?: { quality?: number }): SharpInstance
|
|
125
|
+
png(options?: { quality?: number }): SharpInstance
|
|
126
|
+
toBuffer(): Promise<Buffer>
|
|
127
|
+
blur(sigma: number): SharpInstance
|
|
128
|
+
toFormat(format: string, options?: { quality?: number }): SharpInstance
|
|
129
|
+
}
|
|
130
|
+
declare type SharpModule = {
|
|
131
|
+
(input: Buffer | string): SharpInstance
|
|
132
|
+
default?: (input: Buffer | string) => SharpInstance
|
|
133
|
+
}
|
|
134
|
+
// ============================================================================
|
|
135
|
+
// Error Handling
|
|
136
|
+
// ============================================================================
|
|
137
|
+
export declare class ImageProcessingError extends Error {
|
|
138
|
+
code: string;
|
|
139
|
+
constructor(message: string, code: string);
|
|
140
|
+
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import crypto from "node:crypto";
|
|
5
|
+
import { generatePlaceholder as tsGeneratePlaceholder, processImage as tsProcessImage } from "ts-images";
|
|
6
|
+
export const DEFAULT_WIDTHS = [320, 640, 768, 1024, 1280, 1536, 1920], DEFAULT_FORMATS = ["webp", "jpeg"], DEFAULT_QUALITY = 80;
|
|
7
|
+
const IMAGE_EXTENSIONS = [".jpg", ".jpeg", ".png", ".webp", ".avif", ".gif", ".svg"], MIME_TYPES = {
|
|
8
|
+
webp: "image/webp",
|
|
9
|
+
avif: "image/avif",
|
|
10
|
+
jpeg: "image/jpeg",
|
|
11
|
+
png: "image/png"
|
|
12
|
+
};
|
|
13
|
+
let sharp = null, sharpLoadAttempted = !1;
|
|
14
|
+
async function loadSharp() {
|
|
15
|
+
if (sharpLoadAttempted)
|
|
16
|
+
return sharp;
|
|
17
|
+
sharpLoadAttempted = !0;
|
|
18
|
+
try {
|
|
19
|
+
const sharpModule = await import("sharp");
|
|
20
|
+
sharp = sharpModule.default || sharpModule;
|
|
21
|
+
return sharp;
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function isSharpAvailable() {
|
|
27
|
+
return await loadSharp() !== null;
|
|
28
|
+
}
|
|
29
|
+
export async function isImageBackendAvailable() {
|
|
30
|
+
return !0;
|
|
31
|
+
}
|
|
32
|
+
export async function processImage(input, options = {}) {
|
|
33
|
+
const {
|
|
34
|
+
widths = DEFAULT_WIDTHS,
|
|
35
|
+
formats = DEFAULT_FORMATS,
|
|
36
|
+
quality = DEFAULT_QUALITY,
|
|
37
|
+
fit = "cover",
|
|
38
|
+
placeholder = "none",
|
|
39
|
+
outputDir = ".stx/images",
|
|
40
|
+
baseUrl = "/images"
|
|
41
|
+
} = options;
|
|
42
|
+
let buffer, srcPath;
|
|
43
|
+
if (typeof input === "string") {
|
|
44
|
+
srcPath = input;
|
|
45
|
+
if (!await Bun.file(input).exists())
|
|
46
|
+
throw new ImageProcessingError(`Image not found: ${input}`, "NOT_FOUND");
|
|
47
|
+
buffer = await Bun.file(input).arrayBuffer().then((ab) => Buffer.from(ab));
|
|
48
|
+
} else {
|
|
49
|
+
srcPath = "buffer-input";
|
|
50
|
+
buffer = input;
|
|
51
|
+
}
|
|
52
|
+
const hash = crypto.createHash("sha256").update(buffer).digest("hex").slice(0, 12), metadata = await getImageMetadata(buffer), { width: originalWidth, height: originalHeight } = metadata, aspectRatio = originalWidth / originalHeight;
|
|
53
|
+
await fs.promises.mkdir(outputDir, { recursive: !0 });
|
|
54
|
+
const variants = [], baseName = path.basename(srcPath, path.extname(srcPath)), validWidths = widths.filter((w) => w <= originalWidth);
|
|
55
|
+
if (!validWidths.includes(originalWidth) && originalWidth <= Math.max(...widths))
|
|
56
|
+
validWidths.push(originalWidth);
|
|
57
|
+
validWidths.sort((a, b) => a - b);
|
|
58
|
+
for (const targetWidth of validWidths) {
|
|
59
|
+
const targetHeight = Math.round(targetWidth / aspectRatio);
|
|
60
|
+
for (const format of formats) {
|
|
61
|
+
const fileName = `${baseName}-${targetWidth}w-${hash}.${format}`, outputPath = path.join(outputDir, fileName), urlPath = `${baseUrl}/${fileName}`, processedBuffer = await resizeAndConvert(buffer, {
|
|
62
|
+
width: targetWidth,
|
|
63
|
+
height: targetHeight,
|
|
64
|
+
format,
|
|
65
|
+
quality,
|
|
66
|
+
fit
|
|
67
|
+
});
|
|
68
|
+
await Bun.write(outputPath, processedBuffer);
|
|
69
|
+
variants.push({
|
|
70
|
+
path: outputPath,
|
|
71
|
+
url: urlPath,
|
|
72
|
+
width: targetWidth,
|
|
73
|
+
height: targetHeight,
|
|
74
|
+
format,
|
|
75
|
+
size: processedBuffer.length
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let placeholderData;
|
|
80
|
+
if (placeholder !== "none")
|
|
81
|
+
placeholderData = await generatePlaceholder(buffer, placeholder);
|
|
82
|
+
return {
|
|
83
|
+
src: srcPath,
|
|
84
|
+
variants,
|
|
85
|
+
placeholder: placeholderData,
|
|
86
|
+
width: originalWidth,
|
|
87
|
+
height: originalHeight,
|
|
88
|
+
aspectRatio,
|
|
89
|
+
hash
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
export async function getImageMetadata(input) {
|
|
93
|
+
const buffer = typeof input === "string" ? Buffer.from(await Bun.file(input).arrayBuffer()) : input, s = await loadSharp();
|
|
94
|
+
if (s) {
|
|
95
|
+
const meta = await s(buffer).metadata();
|
|
96
|
+
return {
|
|
97
|
+
width: meta.width || 0,
|
|
98
|
+
height: meta.height || 0,
|
|
99
|
+
format: meta.format || "unknown",
|
|
100
|
+
hasAlpha: meta.hasAlpha
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return parseImageHeaders(buffer);
|
|
104
|
+
}
|
|
105
|
+
function parseImageHeaders(buffer) {
|
|
106
|
+
if (buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71) {
|
|
107
|
+
const width = buffer.readUInt32BE(16), height = buffer.readUInt32BE(20);
|
|
108
|
+
return { width, height, format: "png", hasAlpha: !0 };
|
|
109
|
+
}
|
|
110
|
+
if (buffer[0] === 255 && buffer[1] === 216) {
|
|
111
|
+
let offset = 2;
|
|
112
|
+
while (offset < buffer.length) {
|
|
113
|
+
if (buffer[offset] !== 255)
|
|
114
|
+
break;
|
|
115
|
+
const marker = buffer[offset + 1];
|
|
116
|
+
if (marker >= 192 && marker <= 207 && marker !== 196 && marker !== 200 && marker !== 204) {
|
|
117
|
+
const height = buffer.readUInt16BE(offset + 5);
|
|
118
|
+
return { width: buffer.readUInt16BE(offset + 7), height, format: "jpeg", hasAlpha: !1 };
|
|
119
|
+
}
|
|
120
|
+
const length = buffer.readUInt16BE(offset + 2);
|
|
121
|
+
offset += 2 + length;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (buffer.toString("utf8", 0, 4) === "RIFF" && buffer.toString("utf8", 8, 12) === "WEBP") {
|
|
125
|
+
const chunk = buffer.toString("utf8", 12, 16);
|
|
126
|
+
if (chunk === "VP8 ") {
|
|
127
|
+
const width = buffer.readUInt16LE(26) & 16383, height = buffer.readUInt16LE(28) & 16383;
|
|
128
|
+
return { width, height, format: "webp", hasAlpha: !1 };
|
|
129
|
+
}
|
|
130
|
+
if (chunk === "VP8L") {
|
|
131
|
+
const bits = buffer.readUInt32LE(21), width = (bits & 16383) + 1, height = (bits >> 14 & 16383) + 1;
|
|
132
|
+
return { width, height, format: "webp", hasAlpha: !0 };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (buffer.toString("utf8", 0, 3) === "GIF") {
|
|
136
|
+
const width = buffer.readUInt16LE(6), height = buffer.readUInt16LE(8);
|
|
137
|
+
return { width, height, format: "gif", hasAlpha: !0 };
|
|
138
|
+
}
|
|
139
|
+
throw new ImageProcessingError("Unable to parse image dimensions", "PARSE_ERROR");
|
|
140
|
+
}
|
|
141
|
+
export async function resizeAndConvert(buffer, options) {
|
|
142
|
+
const s = await loadSharp();
|
|
143
|
+
if (s) {
|
|
144
|
+
let instance = s(buffer).resize(options.width, options.height, { fit: options.fit });
|
|
145
|
+
switch (options.format) {
|
|
146
|
+
case "webp":
|
|
147
|
+
instance = instance.webp({ quality: options.quality });
|
|
148
|
+
break;
|
|
149
|
+
case "avif":
|
|
150
|
+
instance = instance.avif({ quality: options.quality });
|
|
151
|
+
break;
|
|
152
|
+
case "jpeg":
|
|
153
|
+
instance = instance.jpeg({ quality: options.quality });
|
|
154
|
+
break;
|
|
155
|
+
case "png":
|
|
156
|
+
instance = instance.png({ quality: options.quality });
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
return instance.toBuffer();
|
|
160
|
+
}
|
|
161
|
+
const tempOut = path.join(os.tmpdir(), `stx-img-${crypto.randomBytes(8).toString("hex")}.${options.format}`);
|
|
162
|
+
try {
|
|
163
|
+
await tsProcessImage({
|
|
164
|
+
input: buffer,
|
|
165
|
+
output: tempOut,
|
|
166
|
+
format: options.format,
|
|
167
|
+
quality: options.quality,
|
|
168
|
+
resize: {
|
|
169
|
+
width: options.width,
|
|
170
|
+
height: options.height,
|
|
171
|
+
fit: options.fit
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
return Buffer.from(await Bun.file(tempOut).arrayBuffer());
|
|
175
|
+
} finally {
|
|
176
|
+
await fs.promises.unlink(tempOut).catch(() => {});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function generatePlaceholder(buffer, type) {
|
|
180
|
+
const s = await loadSharp();
|
|
181
|
+
if (type === "blur" && s) {
|
|
182
|
+
const base64 = (await s(buffer).resize(20).blur(10).toBuffer()).toString("base64"), meta = await getImageMetadata(buffer);
|
|
183
|
+
return `data:${MIME_TYPES[meta.format] || "image/jpeg"};base64,${base64}`;
|
|
184
|
+
}
|
|
185
|
+
if (type === "dominant-color" && s) {
|
|
186
|
+
const { dominant } = await s(buffer).resize(1, 1).toBuffer().then(async (b) => {
|
|
187
|
+
const meta = await s(b).metadata();
|
|
188
|
+
return { dominant: { r: 128, g: 128, b: 128 } };
|
|
189
|
+
}).catch(() => ({ dominant: { r: 128, g: 128, b: 128 } }));
|
|
190
|
+
return `rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`;
|
|
191
|
+
}
|
|
192
|
+
const meta = await getImageMetadata(buffer), tempIn = path.join(os.tmpdir(), `stx-ph-${crypto.randomBytes(8).toString("hex")}.${meta.format === "unknown" ? "bin" : meta.format}`);
|
|
193
|
+
try {
|
|
194
|
+
await Bun.write(tempIn, buffer);
|
|
195
|
+
const tsStrategy = type === "blur" ? "blur" : type === "thumbhash" ? "thumbhash" : "dominant-color", ph = await tsGeneratePlaceholder(tempIn, {
|
|
196
|
+
strategy: tsStrategy,
|
|
197
|
+
width: tsStrategy === "thumbhash" ? void 0 : 32
|
|
198
|
+
});
|
|
199
|
+
if (type === "dominant-color" && ph.dominantColor)
|
|
200
|
+
return ph.dominantColor;
|
|
201
|
+
if (ph.dataURL)
|
|
202
|
+
return ph.dataURL;
|
|
203
|
+
return "rgb(128, 128, 128)";
|
|
204
|
+
} catch {
|
|
205
|
+
return "rgb(128, 128, 128)";
|
|
206
|
+
} finally {
|
|
207
|
+
await fs.promises.unlink(tempIn).catch(() => {});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
export function generateSrcSet(variants, format) {
|
|
211
|
+
return (format ? variants.filter((v) => v.format === format) : variants).sort((a, b) => a.width - b.width).map((v) => `${v.url} ${v.width}w`).join(", ");
|
|
212
|
+
}
|
|
213
|
+
export function generateSizes(breakpoints) {
|
|
214
|
+
if (!breakpoints || Object.keys(breakpoints).length === 0)
|
|
215
|
+
return "100vw";
|
|
216
|
+
return Object.entries(breakpoints).sort((a, b) => {
|
|
217
|
+
const aVal = Number.parseInt(a[0].replace(/\D/g, "")) || 0;
|
|
218
|
+
return (Number.parseInt(b[0].replace(/\D/g, "")) || 0) - aVal;
|
|
219
|
+
}).map(([bp, size]) => `(max-width: ${bp}) ${size}`).join(", ") + ", 100vw";
|
|
220
|
+
}
|
|
221
|
+
export function getFallbackVariant(variants) {
|
|
222
|
+
const jpegs = variants.filter((v) => v.format === "jpeg");
|
|
223
|
+
if (jpegs.length === 0)
|
|
224
|
+
return variants[Math.floor(variants.length / 2)];
|
|
225
|
+
const sorted = jpegs.sort((a, b) => a.width - b.width);
|
|
226
|
+
return sorted[Math.floor(sorted.length / 2)];
|
|
227
|
+
}
|
|
228
|
+
export function groupVariantsByFormat(variants) {
|
|
229
|
+
const grouped = new Map;
|
|
230
|
+
for (const variant of variants) {
|
|
231
|
+
const existing = grouped.get(variant.format) || [];
|
|
232
|
+
existing.push(variant);
|
|
233
|
+
grouped.set(variant.format, existing);
|
|
234
|
+
}
|
|
235
|
+
return grouped;
|
|
236
|
+
}
|
|
237
|
+
export function isImageFile(filePath) {
|
|
238
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
239
|
+
return IMAGE_EXTENSIONS.includes(ext);
|
|
240
|
+
}
|
|
241
|
+
export function getMimeType(format) {
|
|
242
|
+
return MIME_TYPES[format] || "application/octet-stream";
|
|
243
|
+
}
|
|
244
|
+
export function getTotalSize(variants) {
|
|
245
|
+
return variants.reduce((sum, v) => sum + v.size, 0);
|
|
246
|
+
}
|
|
247
|
+
export function formatSize(bytes) {
|
|
248
|
+
if (bytes < 1024)
|
|
249
|
+
return `${bytes} B`;
|
|
250
|
+
if (bytes < 1048576)
|
|
251
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
252
|
+
return `${(bytes / 1048576).toFixed(2)} MB`;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export class ImageProcessingError extends Error {
|
|
256
|
+
code;
|
|
257
|
+
constructor(message, code) {
|
|
258
|
+
super(message);
|
|
259
|
+
this.name = "ImageProcessingError";
|
|
260
|
+
this.code = code;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type ImageFormat } from './processor';
|
|
2
|
+
/**
|
|
3
|
+
* Probe the request URL and return a Response if it matches the image
|
|
4
|
+
* route, or `null` if the caller should keep trying other handlers.
|
|
5
|
+
*
|
|
6
|
+
* Designed to be a drop-in inside any Bun/fetch-style server:
|
|
7
|
+
*
|
|
8
|
+
* const imgResponse = await handleImageRequest(request, { publicDir })
|
|
9
|
+
* if (imgResponse) return imgResponse
|
|
10
|
+
* // …other routes
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleImageRequest(request: Request, options: ImageServeOptions): Promise<Response | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Wrap {@link handleImageRequest} into a self-contained route handler.
|
|
15
|
+
*
|
|
16
|
+
* Most router slots type their handlers as `(req: Request) => Promise<Response>`
|
|
17
|
+
* — they don't accept `null` inside the Promise the way the chainable
|
|
18
|
+
* `handleImageRequest` returns it. Use this factory when plugging into a
|
|
19
|
+
* router slot of that shape:
|
|
20
|
+
*
|
|
21
|
+
* const handler = createImageHandler({ publicDir: 'public' })
|
|
22
|
+
* router.get('/_stx/img', handler)
|
|
23
|
+
*
|
|
24
|
+
* When the request URL doesn't match the configured route path, the
|
|
25
|
+
* returned handler responds with `404 Not Found`. Use the lower-level
|
|
26
|
+
* `handleImageRequest` directly if you want to chain to a fallback.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createImageHandler(options: ImageServeOptions): (request: Request) => Promise<Response>;
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Public types
|
|
31
|
+
// ============================================================================
|
|
32
|
+
export declare interface ImageServeOptions {
|
|
33
|
+
publicDir: string
|
|
34
|
+
cacheDir?: string
|
|
35
|
+
maxWidth?: number
|
|
36
|
+
maxHeight?: number
|
|
37
|
+
defaultQuality?: number
|
|
38
|
+
defaultFit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
|
|
39
|
+
routePath?: string
|
|
40
|
+
}
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Parsing & validation
|
|
43
|
+
// ============================================================================
|
|
44
|
+
declare type ParseResult = | {
|
|
45
|
+
ok: true
|
|
46
|
+
srcFsPath: string
|
|
47
|
+
srcUrl: string
|
|
48
|
+
width: number
|
|
49
|
+
height: number
|
|
50
|
+
format: ImageFormat
|
|
51
|
+
quality: number
|
|
52
|
+
fit: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
|
|
53
|
+
}
|
|
54
|
+
| { ok: false, error: string, status: number }
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
import { getMimeType } from "./processor.js";
|
|
5
|
+
const VALID_FORMATS = new Set(["webp", "avif", "jpeg", "png"]), VALID_FITS = new Set(["cover", "contain", "fill", "inside", "outside"]), SOURCE_EXTS = new Set([".jpg", ".jpeg", ".png", ".webp", ".avif", ".gif"]), DEFAULT_MAX_DIMENSION = 4096, DEFAULT_QUALITY = 80, DEFAULT_FIT = "cover";
|
|
6
|
+
export async function handleImageRequest(request, options) {
|
|
7
|
+
const routePath = options.routePath ?? "/_stx/img", url = new URL(request.url);
|
|
8
|
+
if (url.pathname !== routePath)
|
|
9
|
+
return null;
|
|
10
|
+
const parsed = parseRequest(url, options);
|
|
11
|
+
if (!parsed.ok)
|
|
12
|
+
return new Response(parsed.error, { status: parsed.status, headers: { "Content-Type": "text/plain" } });
|
|
13
|
+
const { srcFsPath, srcUrl, width, height, format, quality, fit } = parsed;
|
|
14
|
+
let srcStat;
|
|
15
|
+
try {
|
|
16
|
+
srcStat = fs.statSync(srcFsPath);
|
|
17
|
+
} catch {
|
|
18
|
+
return new Response(`Source image not found: ${srcUrl}`, {
|
|
19
|
+
status: 404,
|
|
20
|
+
headers: { "Content-Type": "text/plain" }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (!srcStat.isFile())
|
|
24
|
+
return new Response("Not a file", { status: 404, headers: { "Content-Type": "text/plain" } });
|
|
25
|
+
const cacheDir = options.cacheDir ?? ".stx/cache/img";
|
|
26
|
+
await fs.promises.mkdir(cacheDir, { recursive: !0 });
|
|
27
|
+
const fingerprint = `${srcFsPath}:${srcStat.mtimeMs}:${srcStat.size}`, paramKey = `${width}x${height}:${format}:${quality}:${fit}`, cacheKey = crypto.createHash("sha256").update(`${fingerprint}|${paramKey}`).digest("hex").slice(0, 16), cachePath = path.join(cacheDir, `${cacheKey}.${format}`), headers = {
|
|
28
|
+
"Content-Type": getMimeType(format),
|
|
29
|
+
"Cache-Control": "public, max-age=31536000, immutable",
|
|
30
|
+
ETag: `"${cacheKey}"`,
|
|
31
|
+
"X-Stx-Image-Cache": "HIT"
|
|
32
|
+
};
|
|
33
|
+
if (request.headers.get("if-none-match") === `"${cacheKey}"`)
|
|
34
|
+
return new Response(null, { status: 304, headers });
|
|
35
|
+
const cached = Bun.file(cachePath);
|
|
36
|
+
if (await cached.exists())
|
|
37
|
+
return new Response(cached, { headers });
|
|
38
|
+
try {
|
|
39
|
+
const sourceBuffer = Buffer.from(await Bun.file(srcFsPath).arrayBuffer()), { resizeAndConvert } = await loadResize(), outputBuffer = await resizeAndConvert(sourceBuffer, { width, height, format, quality, fit });
|
|
40
|
+
await Bun.write(cachePath, outputBuffer);
|
|
41
|
+
headers["X-Stx-Image-Cache"] = "MISS";
|
|
42
|
+
return new Response(new Uint8Array(outputBuffer), { headers });
|
|
43
|
+
} catch (err) {
|
|
44
|
+
const msg = err.message;
|
|
45
|
+
return new Response(`Image processing failed: ${msg}`, {
|
|
46
|
+
status: 500,
|
|
47
|
+
headers: { "Content-Type": "text/plain" }
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function createImageHandler(options) {
|
|
52
|
+
return async (request) => {
|
|
53
|
+
return await handleImageRequest(request, options) ?? new Response("Not Found", {
|
|
54
|
+
status: 404,
|
|
55
|
+
headers: { "Content-Type": "text/plain" }
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function parseRequest(url, options) {
|
|
60
|
+
const srcUrl = url.searchParams.get("src");
|
|
61
|
+
if (!srcUrl)
|
|
62
|
+
return { ok: !1, error: "Missing required param: src", status: 400 };
|
|
63
|
+
if (!srcUrl.startsWith("/"))
|
|
64
|
+
return { ok: !1, error: "src must be an absolute URL path (start with /)", status: 400 };
|
|
65
|
+
if (srcUrl.startsWith("//"))
|
|
66
|
+
return { ok: !1, error: "src must be a local path", status: 400 };
|
|
67
|
+
const srcExt = path.extname(srcUrl).toLowerCase();
|
|
68
|
+
if (!SOURCE_EXTS.has(srcExt))
|
|
69
|
+
return { ok: !1, error: `Unsupported source extension: ${srcExt}`, status: 400 };
|
|
70
|
+
const publicDir = path.resolve(options.publicDir), candidate = path.resolve(publicDir, srcUrl.slice(1));
|
|
71
|
+
if (!candidate.startsWith(`${publicDir}${path.sep}`) && candidate !== publicDir)
|
|
72
|
+
return { ok: !1, error: "src is outside publicDir", status: 400 };
|
|
73
|
+
const maxWidth = options.maxWidth ?? DEFAULT_MAX_DIMENSION, maxHeight = options.maxHeight ?? DEFAULT_MAX_DIMENSION, widthParam = url.searchParams.get("w"), heightParam = url.searchParams.get("h"), width = widthParam ? Number.parseInt(widthParam, 10) : 0, height = heightParam ? Number.parseInt(heightParam, 10) : 0;
|
|
74
|
+
if (widthParam && (!Number.isFinite(width) || width <= 0))
|
|
75
|
+
return { ok: !1, error: "Invalid w (must be positive integer)", status: 400 };
|
|
76
|
+
if (heightParam && (!Number.isFinite(height) || height <= 0))
|
|
77
|
+
return { ok: !1, error: "Invalid h (must be positive integer)", status: 400 };
|
|
78
|
+
if (!widthParam && !heightParam)
|
|
79
|
+
return { ok: !1, error: "At least one of w or h is required", status: 400 };
|
|
80
|
+
const clampedWidth = Math.min(width || maxWidth, maxWidth), clampedHeight = Math.min(height || maxHeight, maxHeight), formatParam = url.searchParams.get("f") || "webp";
|
|
81
|
+
if (!VALID_FORMATS.has(formatParam))
|
|
82
|
+
return { ok: !1, error: `Invalid f (must be one of: ${[...VALID_FORMATS].join(", ")})`, status: 400 };
|
|
83
|
+
const format = formatParam, qualityParam = url.searchParams.get("q"), quality = qualityParam ? Number.parseInt(qualityParam, 10) : options.defaultQuality ?? DEFAULT_QUALITY;
|
|
84
|
+
if (!Number.isFinite(quality) || quality < 1 || quality > 100)
|
|
85
|
+
return { ok: !1, error: "Invalid q (must be 1-100)", status: 400 };
|
|
86
|
+
const fitParam = url.searchParams.get("fit") || options.defaultFit || DEFAULT_FIT;
|
|
87
|
+
if (!VALID_FITS.has(fitParam))
|
|
88
|
+
return { ok: !1, error: `Invalid fit (must be one of: ${[...VALID_FITS].join(", ")})`, status: 400 };
|
|
89
|
+
return {
|
|
90
|
+
ok: !0,
|
|
91
|
+
srcFsPath: candidate,
|
|
92
|
+
srcUrl,
|
|
93
|
+
width: clampedWidth,
|
|
94
|
+
height: clampedHeight,
|
|
95
|
+
format,
|
|
96
|
+
quality,
|
|
97
|
+
fit: fitParam
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function loadResize() {
|
|
101
|
+
return await import("./processor.js");
|
|
102
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Absolutise the relative import specifiers in `code`, as written in
|
|
3
|
+
* `sourceFile`.
|
|
4
|
+
*
|
|
5
|
+
* The path is emitted with forward slashes on every platform: it goes into
|
|
6
|
+
* JavaScript source, where a Windows backslash would be an escape character.
|
|
7
|
+
*/
|
|
8
|
+
export declare function absolutizeRelativeImports(code: string, sourceFile: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* The same, applied only inside `<script>` blocks of a template.
|
|
11
|
+
*
|
|
12
|
+
* A template is markup as well as code, and a string like `'../foo'` in an
|
|
13
|
+
* attribute or in prose is not an import. Scoping to script blocks keeps the
|
|
14
|
+
* rewrite to the only place an import specifier can appear.
|
|
15
|
+
*/
|
|
16
|
+
export declare function absolutizeTemplateImports(template: string, sourceFile: string): string;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
const SPECIFIER = /(\bfrom\s*|\bimport\s*\(\s*|\bimport\s+)(['"])(\.\.?\/[^'"]*)\2/g, SCRIPT_BLOCK = /(<script\b[^>]*>)([\s\S]*?)(<\/script>)/gi;
|
|
3
|
+
export function absolutizeRelativeImports(code, sourceFile) {
|
|
4
|
+
if (!sourceFile || !code.includes("/"))
|
|
5
|
+
return code;
|
|
6
|
+
const dir = path.dirname(sourceFile);
|
|
7
|
+
return code.replace(SPECIFIER, (match, lead, quote, request) => {
|
|
8
|
+
const resolved = path.resolve(dir, request);
|
|
9
|
+
return `${lead}${quote}${resolved.split(path.sep).join("/")}${quote}`;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export function absolutizeTemplateImports(template, sourceFile) {
|
|
13
|
+
if (!sourceFile || !template.includes("<script"))
|
|
14
|
+
return template;
|
|
15
|
+
return template.replace(SCRIPT_BLOCK, (_match, open, body, close) => `${open}${absolutizeRelativeImports(body, sourceFile)}${close}`);
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Does a client script reach signal APIs through a module it imports?
|
|
3
|
+
*
|
|
4
|
+
* Every signal decision in the pipeline is a syntactic scan for `state(`,
|
|
5
|
+
* `derived(`, `effect(` and friends in the script's own text. That is exact
|
|
6
|
+
* for a script that declares its own signals and blind to one that factors
|
|
7
|
+
* them out:
|
|
8
|
+
*
|
|
9
|
+
* ```stx
|
|
10
|
+
* <script client>
|
|
11
|
+
* import { makeProbe } from '../functions/probe-factory'
|
|
12
|
+
* const { signal } = makeProbe() // <- names no signal API
|
|
13
|
+
* </script>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* With no match, the page is treated as static: `{{ signal() }}` is evaluated
|
|
17
|
+
* server-side (undefined, so empty), no setup function is generated, and
|
|
18
|
+
* `<body>` gets no `data-stx` for the runtime to invoke. Nothing logs. The
|
|
19
|
+
* page renders its static half and every binding is inert, which reads as a
|
|
20
|
+
* data problem rather than a hydration one. stacksjs/stacks#2394.
|
|
21
|
+
*
|
|
22
|
+
* The bundler resolves this authoritatively, but it is async and expensive,
|
|
23
|
+
* and the gate that decides whether to preserve `{{ }}` for the client is
|
|
24
|
+
* synchronous and runs once per template, partial and component. So this walks
|
|
25
|
+
* the same edges the bundler would, cheaply: read the imported file, look for
|
|
26
|
+
* the same API calls, recurse a bounded distance.
|
|
27
|
+
*
|
|
28
|
+
* Deliberately a subset of what bundling sees - relative specifiers only, a
|
|
29
|
+
* few levels deep. Anything it misses is caught later by the async
|
|
30
|
+
* bundle-and-retest in signal-processing.ts, which can only ever be MORE
|
|
31
|
+
* permissive. The reverse (a gate that says signals where the setup pass finds
|
|
32
|
+
* none) would leave a literal mustache on the page, so the two must lean this
|
|
33
|
+
* way round.
|
|
34
|
+
*
|
|
35
|
+
* @module imported-signals
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* Whether `script` declares signals somewhere in the modules it imports.
|
|
39
|
+
*
|
|
40
|
+
* `fromFile` is the file the script lives in; without it nothing can be
|
|
41
|
+
* resolved and this returns false, which is the pre-existing behaviour.
|
|
42
|
+
*/
|
|
43
|
+
export declare function importsSignalDeclarations(script: string, fromFile: string | undefined, depth?: number, seen?: Set<string>): boolean;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const SIGNAL_API_CALL = /\b(?:state|derived|effect|ref|reactive|computed|watch|watchEffect)\s*(?:<[^<>()]*>)?\s*\(/, RELATIVE_IMPORT = /(?:^|\n)\s*(?:import|export)\s+(?:[^'"]*?\sfrom\s+)?['"](\.[^'"]*)['"]/g, EXTENSIONS = ["", ".ts", ".tsx", ".js", ".jsx", ".mts", ".mjs", "/index.ts", "/index.js"], MAX_DEPTH = 3;
|
|
4
|
+
function resolveImport(specifier, fromFile) {
|
|
5
|
+
const base = path.resolve(path.dirname(fromFile), specifier);
|
|
6
|
+
for (const extension of EXTENSIONS) {
|
|
7
|
+
const candidate = base + extension;
|
|
8
|
+
try {
|
|
9
|
+
if (fs.statSync(candidate).isFile())
|
|
10
|
+
return candidate;
|
|
11
|
+
} catch {}
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
export function importsSignalDeclarations(script, fromFile, depth = 0, seen = new Set) {
|
|
16
|
+
if (!fromFile || depth >= MAX_DEPTH)
|
|
17
|
+
return !1;
|
|
18
|
+
for (const match of script.matchAll(RELATIVE_IMPORT)) {
|
|
19
|
+
const resolved = resolveImport(match[1], fromFile);
|
|
20
|
+
if (!resolved || seen.has(resolved))
|
|
21
|
+
continue;
|
|
22
|
+
seen.add(resolved);
|
|
23
|
+
let source;
|
|
24
|
+
try {
|
|
25
|
+
source = fs.readFileSync(resolved, "utf8");
|
|
26
|
+
} catch {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (SIGNAL_API_CALL.test(source))
|
|
30
|
+
return !0;
|
|
31
|
+
if (importsSignalDeclarations(source, resolved, depth + 1, seen))
|
|
32
|
+
return !0;
|
|
33
|
+
}
|
|
34
|
+
return !1;
|
|
35
|
+
}
|