termcast 1.3.21 → 1.3.25
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/dist/ai.d.ts +104 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +135 -0
- package/dist/ai.js.map +1 -0
- package/dist/apis/browser-extension.d.ts +18 -0
- package/dist/apis/browser-extension.d.ts.map +1 -0
- package/dist/apis/browser-extension.js +14 -0
- package/dist/apis/browser-extension.js.map +1 -0
- package/dist/apis/localstorage.d.ts.map +1 -1
- package/dist/apis/localstorage.js +4 -7
- package/dist/apis/localstorage.js.map +1 -1
- package/dist/apis/oauth.d.ts.map +1 -1
- package/dist/apis/oauth.js +5 -1
- package/dist/apis/oauth.js.map +1 -1
- package/dist/apis/preferences.d.ts.map +1 -1
- package/dist/apis/preferences.js +38 -19
- package/dist/apis/preferences.js.map +1 -1
- package/dist/apis/toast.d.ts +5 -0
- package/dist/apis/toast.d.ts.map +1 -1
- package/dist/apis/toast.js +7 -43
- package/dist/apis/toast.js.map +1 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +3 -1
- package/dist/build.js.map +1 -1
- package/dist/cache.d.ts +32 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +205 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +87 -41
- package/dist/cli.js.map +1 -1
- package/dist/clipboard.d.ts +36 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +154 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/compile.d.ts +2 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +31 -12
- package/dist/compile.js.map +1 -1
- package/dist/components/actions.d.ts.map +1 -1
- package/dist/components/actions.js +56 -30
- package/dist/components/actions.js.map +1 -1
- package/dist/components/detail.d.ts.map +1 -1
- package/dist/components/detail.js +4 -0
- package/dist/components/detail.js.map +1 -1
- package/dist/components/dropdown.d.ts.map +1 -1
- package/dist/components/dropdown.js +38 -15
- package/dist/components/dropdown.js.map +1 -1
- package/dist/components/extension-preferences.d.ts.map +1 -1
- package/dist/components/extension-preferences.js +40 -13
- package/dist/components/extension-preferences.js.map +1 -1
- package/dist/components/form/checkbox.d.ts.map +1 -1
- package/dist/components/form/checkbox.js +5 -3
- package/dist/components/form/checkbox.js.map +1 -1
- package/dist/components/form/date-picker.d.ts.map +1 -1
- package/dist/components/form/date-picker.js +5 -3
- package/dist/components/form/date-picker.js.map +1 -1
- package/dist/components/form/description.d.ts.map +1 -1
- package/dist/components/form/description.js +2 -2
- package/dist/components/form/description.js.map +1 -1
- package/dist/components/form/dropdown.d.ts.map +1 -1
- package/dist/components/form/dropdown.js +84 -80
- package/dist/components/form/dropdown.js.map +1 -1
- package/dist/components/form/file-autocomplete.d.ts +3 -6
- package/dist/components/form/file-autocomplete.d.ts.map +1 -1
- package/dist/components/form/file-autocomplete.js +61 -66
- package/dist/components/form/file-autocomplete.js.map +1 -1
- package/dist/components/form/file-picker.d.ts.map +1 -1
- package/dist/components/form/file-picker.js +33 -30
- package/dist/components/form/file-picker.js.map +1 -1
- package/dist/components/form/form-end.d.ts.map +1 -1
- package/dist/components/form/form-end.js +21 -1
- package/dist/components/form/form-end.js.map +1 -1
- package/dist/components/form/form-type-only.d.ts +174 -0
- package/dist/components/form/form-type-only.d.ts.map +1 -0
- package/dist/components/form/form-type-only.js +2 -0
- package/dist/components/form/form-type-only.js.map +1 -0
- package/dist/components/form/index.d.ts +3 -1
- package/dist/components/form/index.d.ts.map +1 -1
- package/dist/components/form/index.js +104 -30
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/form/password-field.d.ts.map +1 -1
- package/dist/components/form/password-field.js +5 -3
- package/dist/components/form/password-field.js.map +1 -1
- package/dist/components/form/text-area.d.ts.map +1 -1
- package/dist/components/form/text-area.js +5 -3
- package/dist/components/form/text-area.js.map +1 -1
- package/dist/components/form/text-field.d.ts.map +1 -1
- package/dist/components/form/text-field.js +6 -4
- package/dist/components/form/text-field.js.map +1 -1
- package/dist/components/form/types.d.ts +5 -0
- package/dist/components/form/types.d.ts.map +1 -1
- package/dist/components/form/use-form-handling.d.ts +4 -0
- package/dist/components/form/use-form-handling.d.ts.map +1 -0
- package/dist/components/form/use-form-handling.js +37 -0
- package/dist/components/form/use-form-handling.js.map +1 -0
- package/dist/components/form/with-left-border.d.ts +2 -1
- package/dist/components/form/with-left-border.d.ts.map +1 -1
- package/dist/components/form/with-left-border.js +27 -3
- package/dist/components/form/with-left-border.js.map +1 -1
- package/dist/components/icon.d.ts +1 -0
- package/dist/components/icon.d.ts.map +1 -1
- package/dist/components/icon.js +24 -8
- package/dist/components/icon.js.map +1 -1
- package/dist/components/list.d.ts +2 -2
- package/dist/components/list.d.ts.map +1 -1
- package/dist/components/list.js +155 -70
- package/dist/components/list.js.map +1 -1
- package/dist/components/loading-bar.d.ts.map +1 -1
- package/dist/components/loading-bar.js +2 -2
- package/dist/components/loading-bar.js.map +1 -1
- package/dist/components/loading-text.d.ts +8 -0
- package/dist/components/loading-text.d.ts.map +1 -0
- package/dist/components/loading-text.js +58 -0
- package/dist/components/loading-text.js.map +1 -0
- package/dist/descendants.js +1 -1
- package/dist/descendants.js.map +1 -1
- package/dist/dev-ui.d.ts +7 -0
- package/dist/dev-ui.d.ts.map +1 -0
- package/dist/dev-ui.js +118 -0
- package/dist/dev-ui.js.map +1 -0
- package/dist/environment.d.ts +63 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +189 -0
- package/dist/environment.js.map +1 -0
- package/dist/examples/datepicker.d.ts +2 -0
- package/dist/examples/datepicker.d.ts.map +1 -0
- package/dist/examples/datepicker.js +344 -0
- package/dist/examples/datepicker.js.map +1 -0
- package/dist/examples/file-autocomplete.vitest.d.ts +2 -0
- package/dist/examples/file-autocomplete.vitest.d.ts.map +1 -0
- package/dist/examples/file-autocomplete.vitest.js +223 -0
- package/dist/examples/file-autocomplete.vitest.js.map +1 -0
- package/dist/examples/form-basic-arrow-keys.vitest.d.ts +2 -0
- package/dist/examples/form-basic-arrow-keys.vitest.d.ts.map +1 -0
- package/dist/examples/form-basic-arrow-keys.vitest.js +46 -0
- package/dist/examples/form-basic-arrow-keys.vitest.js.map +1 -0
- package/dist/examples/form-basic.vitest.d.ts +2 -0
- package/dist/examples/form-basic.vitest.d.ts.map +1 -0
- package/dist/examples/form-basic.vitest.js +630 -0
- package/dist/examples/form-basic.vitest.js.map +1 -0
- package/dist/examples/form-dropdown-with-sections.d.ts +2 -0
- package/dist/examples/form-dropdown-with-sections.d.ts.map +1 -0
- package/dist/examples/form-dropdown-with-sections.js +13 -0
- package/dist/examples/form-dropdown-with-sections.js.map +1 -0
- package/dist/examples/form-dropdown-with-sections.vitest.d.ts +2 -0
- package/dist/examples/form-dropdown-with-sections.vitest.d.ts.map +1 -0
- package/dist/examples/form-dropdown-with-sections.vitest.js +75 -0
- package/dist/examples/form-dropdown-with-sections.vitest.js.map +1 -0
- package/dist/examples/form-dropdown.vitest.d.ts +2 -0
- package/dist/examples/form-dropdown.vitest.d.ts.map +1 -0
- package/dist/examples/form-dropdown.vitest.js +854 -0
- package/dist/examples/form-dropdown.vitest.js.map +1 -0
- package/dist/examples/form-multiselect-dropdown.d.ts +2 -0
- package/dist/examples/form-multiselect-dropdown.d.ts.map +1 -0
- package/dist/examples/form-multiselect-dropdown.js +13 -0
- package/dist/examples/form-multiselect-dropdown.js.map +1 -0
- package/dist/examples/form-scroll.d.ts.map +1 -1
- package/dist/examples/form-scroll.js +7 -1
- package/dist/examples/form-scroll.js.map +1 -1
- package/dist/examples/form-scroll.vitest.d.ts +2 -0
- package/dist/examples/form-scroll.vitest.d.ts.map +1 -0
- package/dist/examples/form-scroll.vitest.js +211 -0
- package/dist/examples/form-scroll.vitest.js.map +1 -0
- package/dist/examples/form-tagpicker.vitest.d.ts +2 -0
- package/dist/examples/form-tagpicker.vitest.d.ts.map +1 -0
- package/dist/examples/form-tagpicker.vitest.js +736 -0
- package/dist/examples/form-tagpicker.vitest.js.map +1 -0
- package/dist/examples/internal/descendants-filtering.js +1 -1
- package/dist/examples/internal/descendants-filtering.js.map +1 -1
- package/dist/examples/internal/descendants.js +1 -1
- package/dist/examples/internal/descendants.js.map +1 -1
- package/dist/examples/internal/nested-boxes.d.ts +2 -0
- package/dist/examples/internal/nested-boxes.d.ts.map +1 -0
- package/dist/examples/internal/nested-boxes.js +7 -0
- package/dist/examples/internal/nested-boxes.js.map +1 -0
- package/dist/examples/internal/rhf-custom-ref.js +2 -2
- package/dist/examples/internal/rhf-custom-ref.js.map +1 -1
- package/dist/examples/internal/scrollbox-demo.js +3 -22
- package/dist/examples/internal/scrollbox-demo.js.map +1 -1
- package/dist/examples/internal/scrollbox-descendants.d.ts +2 -0
- package/dist/examples/internal/scrollbox-descendants.d.ts.map +1 -0
- package/dist/examples/internal/scrollbox-descendants.js +83 -0
- package/dist/examples/internal/scrollbox-descendants.js.map +1 -0
- package/dist/examples/internal/scrollbox-with-descendants.js +4 -8
- package/dist/examples/internal/scrollbox-with-descendants.js.map +1 -1
- package/dist/examples/internal/simple-scrollbox.vitest.d.ts +2 -0
- package/dist/examples/internal/simple-scrollbox.vitest.d.ts.map +1 -0
- package/dist/examples/internal/simple-scrollbox.vitest.js +96 -0
- package/dist/examples/internal/simple-scrollbox.vitest.js.map +1 -0
- package/dist/examples/internal/unicode-square-repro.d.ts +2 -0
- package/dist/examples/internal/unicode-square-repro.d.ts.map +1 -0
- package/dist/examples/internal/unicode-square-repro.js +7 -0
- package/dist/examples/internal/unicode-square-repro.js.map +1 -0
- package/dist/examples/list-detail-metadata.d.ts +2 -0
- package/dist/examples/list-detail-metadata.d.ts.map +1 -0
- package/dist/examples/list-detail-metadata.js +8 -0
- package/dist/examples/list-detail-metadata.js.map +1 -0
- package/dist/examples/list-dropdown-default.vitest.d.ts +2 -0
- package/dist/examples/list-dropdown-default.vitest.d.ts.map +1 -0
- package/dist/examples/list-dropdown-default.vitest.js +234 -0
- package/dist/examples/list-dropdown-default.vitest.js.map +1 -0
- package/dist/examples/list-fetch-data.vitest.d.ts +2 -0
- package/dist/examples/list-fetch-data.vitest.d.ts.map +1 -0
- package/dist/examples/list-fetch-data.vitest.js +111 -0
- package/dist/examples/list-fetch-data.vitest.js.map +1 -0
- package/dist/examples/list-filter-navigation.d.ts +2 -0
- package/dist/examples/list-filter-navigation.d.ts.map +1 -0
- package/dist/examples/list-filter-navigation.js +8 -0
- package/dist/examples/list-filter-navigation.js.map +1 -0
- package/dist/examples/list-scrollbox.vitest.d.ts +2 -0
- package/dist/examples/list-scrollbox.vitest.d.ts.map +1 -0
- package/dist/examples/list-scrollbox.vitest.js +93 -0
- package/dist/examples/list-scrollbox.vitest.js.map +1 -0
- package/dist/examples/list-with-detail-long.d.ts +2 -0
- package/dist/examples/list-with-detail-long.d.ts.map +1 -0
- package/dist/examples/list-with-detail-long.js +53 -0
- package/dist/examples/list-with-detail-long.js.map +1 -0
- package/dist/examples/list-with-detail.vitest.d.ts +2 -0
- package/dist/examples/list-with-detail.vitest.d.ts.map +1 -0
- package/dist/examples/list-with-detail.vitest.js +434 -0
- package/dist/examples/list-with-detail.vitest.js.map +1 -0
- package/dist/examples/list-with-dropdown.vitest.d.ts +2 -0
- package/dist/examples/list-with-dropdown.vitest.d.ts.map +1 -0
- package/dist/examples/list-with-dropdown.vitest.js +337 -0
- package/dist/examples/list-with-dropdown.vitest.js.map +1 -0
- package/dist/examples/list-with-sections.js +5 -1
- package/dist/examples/list-with-sections.js.map +1 -1
- package/dist/examples/list-with-sections.vitest.d.ts +2 -0
- package/dist/examples/list-with-sections.vitest.d.ts.map +1 -0
- package/dist/examples/list-with-sections.vitest.js +601 -0
- package/dist/examples/list-with-sections.vitest.js.map +1 -0
- package/dist/examples/scrollbox-vertical-centering.d.ts +6 -0
- package/dist/examples/scrollbox-vertical-centering.d.ts.map +1 -0
- package/dist/examples/scrollbox-vertical-centering.js +17 -0
- package/dist/examples/scrollbox-vertical-centering.js.map +1 -0
- package/dist/examples/simple-file-picker.vitest.d.ts +2 -0
- package/dist/examples/simple-file-picker.vitest.d.ts.map +1 -0
- package/dist/examples/simple-file-picker.vitest.js +678 -0
- package/dist/examples/simple-file-picker.vitest.js.map +1 -0
- package/dist/examples/simple-grid.vitest.d.ts +2 -0
- package/dist/examples/simple-grid.vitest.d.ts.map +1 -0
- package/dist/examples/simple-grid.vitest.js +521 -0
- package/dist/examples/simple-grid.vitest.js.map +1 -0
- package/dist/examples/simple-navigation.js +10 -4
- package/dist/examples/simple-navigation.js.map +1 -1
- package/dist/examples/simple-navigation.vitest.d.ts +2 -0
- package/dist/examples/simple-navigation.vitest.d.ts.map +1 -0
- package/dist/examples/simple-navigation.vitest.js +718 -0
- package/dist/examples/simple-navigation.vitest.js.map +1 -0
- package/dist/examples/store.vitest.d.ts +2 -0
- package/dist/examples/store.vitest.d.ts.map +1 -0
- package/dist/examples/store.vitest.js +69 -0
- package/dist/examples/store.vitest.js.map +1 -0
- package/dist/examples/toast-variations.d.ts +2 -0
- package/dist/examples/toast-variations.d.ts.map +1 -0
- package/dist/examples/toast-variations.js +122 -0
- package/dist/examples/toast-variations.js.map +1 -0
- package/dist/extensions/dev.d.ts +4 -2
- package/dist/extensions/dev.d.ts.map +1 -1
- package/dist/extensions/dev.js +61 -10
- package/dist/extensions/dev.js.map +1 -1
- package/dist/extensions/dev.vitest.d.ts +2 -0
- package/dist/extensions/dev.vitest.d.ts.map +1 -0
- package/dist/extensions/dev.vitest.js +197 -0
- package/dist/extensions/dev.vitest.js.map +1 -0
- package/dist/extensions/home.d.ts.map +1 -1
- package/dist/extensions/home.js +3 -0
- package/dist/extensions/home.js.map +1 -1
- package/dist/home-command.d.ts +8 -0
- package/dist/home-command.d.ts.map +1 -0
- package/dist/home-command.js +181 -0
- package/dist/home-command.js.map +1 -0
- package/dist/hover-repro.d.ts +2 -0
- package/dist/hover-repro.d.ts.map +1 -0
- package/dist/hover-repro.js +20 -0
- package/dist/hover-repro.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/dialog.d.ts +1 -0
- package/dist/internal/dialog.d.ts.map +1 -1
- package/dist/internal/dialog.js +27 -18
- package/dist/internal/dialog.js.map +1 -1
- package/dist/internal/navigation.d.ts +9 -1
- package/dist/internal/navigation.d.ts.map +1 -1
- package/dist/internal/navigation.js +5 -5
- package/dist/internal/navigation.js.map +1 -1
- package/dist/internal/offscreen.d.ts +6 -0
- package/dist/internal/offscreen.d.ts.map +1 -0
- package/dist/internal/offscreen.js +10 -0
- package/dist/internal/offscreen.js.map +1 -0
- package/dist/internal/providers.d.ts.map +1 -1
- package/dist/internal/providers.js +2 -2
- package/dist/internal/providers.js.map +1 -1
- package/dist/internal/scrollbox.d.ts +1 -10
- package/dist/internal/scrollbox.d.ts.map +1 -1
- package/dist/internal/scrollbox.js +2 -1
- package/dist/internal/scrollbox.js.map +1 -1
- package/dist/localstorage.d.ts +13 -0
- package/dist/localstorage.d.ts.map +1 -0
- package/dist/localstorage.js +190 -0
- package/dist/localstorage.js.map +1 -0
- package/dist/oauth.d.ts +142 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +551 -0
- package/dist/oauth.js.map +1 -0
- package/dist/preferences.d.ts +23 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +105 -0
- package/dist/preferences.js.map +1 -0
- package/dist/release.d.ts +1 -1
- package/dist/release.d.ts.map +1 -1
- package/dist/release.js +29 -33
- package/dist/release.js.map +1 -1
- package/dist/state.d.ts +2 -0
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +3 -0
- package/dist/state.js.map +1 -1
- package/dist/store.d.ts +21 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +84 -0
- package/dist/store.js.map +1 -0
- package/dist/swift-loader.d.ts +3 -0
- package/dist/swift-loader.d.ts.map +1 -0
- package/dist/swift-loader.js +193 -0
- package/dist/swift-loader.js.map +1 -0
- package/dist/swift-runtime.d.ts +2 -0
- package/dist/swift-runtime.d.ts.map +1 -0
- package/dist/swift-runtime.js +27 -0
- package/dist/swift-runtime.js.map +1 -0
- package/dist/toast.d.ts +44 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +221 -0
- package/dist/toast.js.map +1 -0
- package/dist/utils/file-system.d.ts +9 -0
- package/dist/utils/file-system.d.ts.map +1 -1
- package/dist/utils/file-system.js +49 -0
- package/dist/utils/file-system.js.map +1 -1
- package/dist/utils/run-command.d.ts +26 -1
- package/dist/utils/run-command.d.ts.map +1 -1
- package/dist/utils/run-command.js +53 -4
- package/dist/utils/run-command.js.map +1 -1
- package/dist/window.d.ts +12 -0
- package/dist/window.d.ts.map +1 -0
- package/dist/window.js +48 -0
- package/dist/window.js.map +1 -0
- package/package.json +12 -12
- package/src/apis/browser-extension.tsx +29 -0
- package/src/apis/localstorage.test.ts +14 -6
- package/src/apis/localstorage.tsx +8 -5
- package/src/apis/oauth.tsx +5 -1
- package/src/apis/preferences.tsx +48 -22
- package/src/apis/toast.tsx +37 -62
- package/src/build.test.tsx +52 -0
- package/src/build.tsx +3 -1
- package/src/cli.tsx +99 -48
- package/src/compile.tsx +32 -11
- package/src/components/actions.tsx +94 -32
- package/src/components/detail.tsx +4 -0
- package/src/components/dropdown.tsx +47 -14
- package/src/components/extension-preferences.tsx +44 -16
- package/src/components/form/checkbox.tsx +12 -6
- package/src/components/form/date-picker.tsx +12 -6
- package/src/components/form/description.tsx +7 -2
- package/src/components/form/dropdown.tsx +131 -119
- package/src/components/form/file-autocomplete.tsx +90 -108
- package/src/components/form/file-picker.tsx +54 -43
- package/src/components/form/form-end.tsx +23 -2
- package/src/components/form/index.tsx +168 -41
- package/src/components/form/password-field.tsx +12 -6
- package/src/components/form/text-area.tsx +13 -6
- package/src/components/form/text-field.tsx +13 -6
- package/src/components/form/types.tsx +6 -0
- package/src/components/form/with-left-border.tsx +41 -8
- package/src/components/icon.tsx +27 -8
- package/src/components/list.tsx +243 -101
- package/src/components/loading-bar.tsx +3 -2
- package/src/components/loading-text.tsx +79 -0
- package/src/descendants.tsx +1 -0
- package/src/examples/file-autocomplete.vitest.tsx +130 -125
- package/src/examples/form-basic.vitest.tsx +376 -176
- package/src/examples/form-dropdown.vitest.tsx +126 -126
- package/src/examples/form-scroll.tsx +2 -0
- package/src/examples/form-scroll.vitest.tsx +58 -58
- package/src/examples/form-tagpicker.vitest.tsx +99 -99
- package/src/examples/internal/descendants-filtering.tsx +1 -0
- package/src/examples/internal/descendants.tsx +1 -0
- package/src/examples/internal/rhf-custom-ref.tsx +2 -0
- package/src/examples/internal/scrollbox-demo.tsx +3 -27
- package/src/examples/internal/scrollbox-with-descendants.tsx +4 -7
- package/src/examples/internal/simple-scrollbox.vitest.tsx +7 -5
- package/src/examples/list-detail-metadata.tsx +49 -0
- package/src/examples/list-detail-metadata.vitest.tsx +88 -0
- package/src/examples/list-dropdown-default.vitest.tsx +51 -51
- package/src/examples/list-fetch-data.vitest.tsx +4 -4
- package/src/examples/list-scrollbox.vitest.tsx +73 -14
- package/src/examples/list-with-detail-long.tsx +70 -0
- package/src/examples/list-with-detail.vitest.tsx +191 -85
- package/src/examples/list-with-dropdown.vitest.tsx +53 -53
- package/src/examples/list-with-sections.tsx +1 -0
- package/src/examples/list-with-sections.vitest.tsx +221 -97
- package/src/examples/list-with-toast.vitest.tsx +16 -16
- package/src/examples/simple-file-picker.vitest.tsx +63 -469
- package/src/examples/simple-grid.vitest.tsx +238 -233
- package/src/examples/simple-navigation.tsx +15 -7
- package/src/examples/simple-navigation.vitest.tsx +130 -219
- package/src/examples/store.vitest.tsx +1 -1
- package/src/examples/swift-extension.vitest.tsx +148 -0
- package/src/examples/synonyms.vitest.tsx +159 -0
- package/src/examples/toast-variations.tsx +150 -0
- package/src/examples/toast-variations.vitest.tsx +370 -0
- package/src/extensions/dev.tsx +74 -7
- package/src/extensions/dev.vitest.tsx +102 -34
- package/src/extensions/home.tsx +6 -0
- package/src/index.tsx +3 -0
- package/src/internal/dialog.tsx +43 -30
- package/src/internal/navigation.tsx +3 -1
- package/src/internal/offscreen.tsx +15 -0
- package/src/internal/providers.tsx +4 -2
- package/src/internal/scrollbox.tsx +4 -8
- package/src/keyboard.test.tsx +69 -0
- package/src/release.tsx +32 -38
- package/src/state.tsx +7 -0
- package/src/swift-loader.tsx +239 -0
- package/src/swift-runtime.tsx +36 -0
- package/src/utils/file-system.ts +61 -0
- package/src/utils/run-command.tsx +82 -6
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { test, expect, beforeEach, afterEach } from 'vitest'
|
|
2
|
+
import { launchTerminal, Session } from 'tuistory/src'
|
|
3
|
+
import { execSync } from 'node:child_process'
|
|
4
|
+
import fs from 'node:fs'
|
|
5
|
+
import path from 'node:path'
|
|
6
|
+
|
|
7
|
+
const fixtureDir = path.resolve(__dirname, '../../fixtures/swift-extension')
|
|
8
|
+
|
|
9
|
+
// Find binary - check debug first, then release
|
|
10
|
+
function findSwiftBinary(): string {
|
|
11
|
+
const debugPath = path.join(fixtureDir, 'swift/.build/debug/SwiftAPI')
|
|
12
|
+
const releasePath = path.join(fixtureDir, 'swift/.build/release/SwiftAPI')
|
|
13
|
+
if (fs.existsSync(debugPath)) {
|
|
14
|
+
return debugPath
|
|
15
|
+
}
|
|
16
|
+
if (fs.existsSync(releasePath)) {
|
|
17
|
+
return releasePath
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`Swift binary not found at ${debugPath} or ${releasePath}`)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const swiftBinary = findSwiftBinary()
|
|
23
|
+
|
|
24
|
+
test('swift binary returns items correctly', () => {
|
|
25
|
+
const stdout = execSync(`${swiftBinary} getItems`, { encoding: 'utf-8' })
|
|
26
|
+
expect(JSON.parse(stdout)).toMatchInlineSnapshot(`
|
|
27
|
+
[
|
|
28
|
+
{
|
|
29
|
+
"id": "1",
|
|
30
|
+
"subtitle": "Generated by Swift",
|
|
31
|
+
"title": "Swift Item One",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "2",
|
|
35
|
+
"subtitle": "From native code",
|
|
36
|
+
"title": "Swift Item Two",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "3",
|
|
40
|
+
"subtitle": "Fast and safe",
|
|
41
|
+
"title": "Swift Item Three",
|
|
42
|
+
},
|
|
43
|
+
]
|
|
44
|
+
`)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
test('swift binary greet function works', () => {
|
|
48
|
+
const stdout = execSync(`${swiftBinary} greet '"World"'`, { encoding: 'utf-8' })
|
|
49
|
+
expect(JSON.parse(stdout)).toMatchInlineSnapshot(`"Hello, World! Greetings from Swift."`)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
let session: Session
|
|
53
|
+
|
|
54
|
+
beforeEach(async () => {
|
|
55
|
+
session = await launchTerminal({
|
|
56
|
+
command: 'bun',
|
|
57
|
+
args: ['src/cli.tsx', 'dev', fixtureDir],
|
|
58
|
+
cwd: path.resolve(__dirname, '../..'),
|
|
59
|
+
cols: 70,
|
|
60
|
+
rows: 25,
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
afterEach(() => {
|
|
65
|
+
session?.close()
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
test('swift extension dev mode shows command list', async () => {
|
|
69
|
+
// Wait for command list to appear
|
|
70
|
+
const commandList = await session.text({
|
|
71
|
+
waitFor: (text) => /Swift List/i.test(text),
|
|
72
|
+
timeout: 30000,
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
expect(commandList).toMatchInlineSnapshot(`
|
|
76
|
+
"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
Swift Test Extension ───────────────────────────────────────────
|
|
80
|
+
|
|
81
|
+
Search commands...
|
|
82
|
+
|
|
83
|
+
Commands
|
|
84
|
+
›List Items Displays a simple list with some items view
|
|
85
|
+
Swift List Displays a list of items returned by a Swift fu view
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
↵ run command ↑↓ navigate ^k actions"
|
|
100
|
+
`)
|
|
101
|
+
}, 60000)
|
|
102
|
+
|
|
103
|
+
test('swift extension runs Swift List command and shows items', async () => {
|
|
104
|
+
// Wait for command list to appear
|
|
105
|
+
await session.text({
|
|
106
|
+
waitFor: (text) => /Swift List/i.test(text),
|
|
107
|
+
timeout: 30000,
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
// Navigate down to Swift List (it's the second item)
|
|
111
|
+
await session.press('down')
|
|
112
|
+
|
|
113
|
+
// Select the Swift List command
|
|
114
|
+
await session.press('return')
|
|
115
|
+
|
|
116
|
+
// Wait for Swift items to load and display
|
|
117
|
+
const swiftListOutput = await session.text({
|
|
118
|
+
waitFor: (text) => text.includes('Swift Item One'),
|
|
119
|
+
timeout: 30000,
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
expect(swiftListOutput).toMatchInlineSnapshot(`
|
|
123
|
+
"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
Swift Items ────────────────────────────────────────────────────
|
|
127
|
+
|
|
128
|
+
Search...
|
|
129
|
+
|
|
130
|
+
Items from Swift
|
|
131
|
+
›Swift Item One Generated by Swift
|
|
132
|
+
Swift Item Two From native code
|
|
133
|
+
Swift Item Three Fast and safe
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
↑↓ navigate ^k actions"
|
|
147
|
+
`)
|
|
148
|
+
}, 60000)
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { test, expect, beforeEach, afterEach, beforeAll } from 'vitest'
|
|
2
|
+
import { launchTerminal, Session } from 'tuistory/src'
|
|
3
|
+
import { execSync } from 'node:child_process'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
|
|
6
|
+
const extensionDir = path.resolve(__dirname, '../../extensions/synonyms')
|
|
7
|
+
|
|
8
|
+
// Install dependencies before running tests
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
execSync('bun install', { cwd: extensionDir, stdio: 'inherit' })
|
|
11
|
+
}, 60000)
|
|
12
|
+
|
|
13
|
+
let session: Session
|
|
14
|
+
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
session = await launchTerminal({
|
|
17
|
+
command: 'bun',
|
|
18
|
+
args: ['src/cli.tsx', 'dev', extensionDir],
|
|
19
|
+
cwd: path.resolve(__dirname, '../..'),
|
|
20
|
+
cols: 80,
|
|
21
|
+
rows: 30,
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
session?.close()
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('synonyms extension shows preferences form on first launch', async () => {
|
|
30
|
+
// Wait for preferences form to appear (extension requires LLM provider setup)
|
|
31
|
+
await session.text({
|
|
32
|
+
waitFor: (text) => /LLM Provider/i.test(text),
|
|
33
|
+
timeout: 30000,
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// Wait for auto-focus to settle
|
|
37
|
+
await session.waitIdle()
|
|
38
|
+
|
|
39
|
+
const preferencesForm = await session.text()
|
|
40
|
+
|
|
41
|
+
expect(preferencesForm).toMatchInlineSnapshot(`
|
|
42
|
+
"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
◇ LLM Provider ▀
|
|
46
|
+
│ Select...
|
|
47
|
+
│
|
|
48
|
+
│ ○ Raycast AI
|
|
49
|
+
│ ○ OpenAI
|
|
50
|
+
│ ○ OpenAI Compatible
|
|
51
|
+
│ ○ Anthropic
|
|
52
|
+
│ ○ Fireworks.ai
|
|
53
|
+
│
|
|
54
|
+
│ Select the LLM provider you want to use
|
|
55
|
+
│
|
|
56
|
+
◇ OpenAI API Key
|
|
57
|
+
│
|
|
58
|
+
│ API Key for OpenAI
|
|
59
|
+
│
|
|
60
|
+
◇ OpenAI Model
|
|
61
|
+
│ gpt-4.1-mini
|
|
62
|
+
│
|
|
63
|
+
│ Model name for OpenAI
|
|
64
|
+
│
|
|
65
|
+
◇ OpenAI Compatible URL
|
|
66
|
+
│
|
|
67
|
+
│
|
|
68
|
+
│ Base URL for OpenAI compatible provider
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
ctrl ↵ submit tab navigate ^k actions"
|
|
72
|
+
`)
|
|
73
|
+
}, 60000)
|
|
74
|
+
|
|
75
|
+
test('synonyms extension preferences form can be navigated', async () => {
|
|
76
|
+
// Wait for preferences form to appear
|
|
77
|
+
await session.text({
|
|
78
|
+
waitFor: (text) => /LLM Provider/i.test(text),
|
|
79
|
+
timeout: 30000,
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// Wait for auto-focus to settle
|
|
83
|
+
await session.waitIdle()
|
|
84
|
+
|
|
85
|
+
// Navigate down in the dropdown
|
|
86
|
+
await session.press('down')
|
|
87
|
+
await session.press('down')
|
|
88
|
+
|
|
89
|
+
const afterNavigate = await session.text()
|
|
90
|
+
expect(afterNavigate).toMatchInlineSnapshot(`
|
|
91
|
+
"
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
◇ LLM Provider ▀
|
|
95
|
+
│ Select...
|
|
96
|
+
│
|
|
97
|
+
│ ○ Raycast AI
|
|
98
|
+
│ ○ OpenAI
|
|
99
|
+
│ ○ OpenAI Compatible
|
|
100
|
+
│ ○ Anthropic
|
|
101
|
+
│ ○ Fireworks.ai
|
|
102
|
+
│
|
|
103
|
+
│ Select the LLM provider you want to use
|
|
104
|
+
│
|
|
105
|
+
◇ OpenAI API Key
|
|
106
|
+
│
|
|
107
|
+
│ API Key for OpenAI
|
|
108
|
+
│
|
|
109
|
+
◇ OpenAI Model
|
|
110
|
+
│ gpt-4.1-mini
|
|
111
|
+
│
|
|
112
|
+
│ Model name for OpenAI
|
|
113
|
+
│
|
|
114
|
+
◇ OpenAI Compatible URL
|
|
115
|
+
│
|
|
116
|
+
│
|
|
117
|
+
│ Base URL for OpenAI compatible provider
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
ctrl ↵ submit tab navigate ^k actions"
|
|
121
|
+
`)
|
|
122
|
+
|
|
123
|
+
// Press tab to move to next field
|
|
124
|
+
await session.press('tab')
|
|
125
|
+
|
|
126
|
+
const afterTab = await session.text()
|
|
127
|
+
expect(afterTab).toMatchInlineSnapshot(`
|
|
128
|
+
"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
◆ LLM Provider ▀
|
|
132
|
+
│ Select...
|
|
133
|
+
│
|
|
134
|
+
│› ○ Raycast AI
|
|
135
|
+
│ ○ OpenAI
|
|
136
|
+
│ ○ OpenAI Compatible
|
|
137
|
+
│ ○ Anthropic
|
|
138
|
+
│ ○ Fireworks.ai
|
|
139
|
+
│
|
|
140
|
+
│ Select the LLM provider you want to use
|
|
141
|
+
│
|
|
142
|
+
◇ OpenAI API Key
|
|
143
|
+
│
|
|
144
|
+
│ API Key for OpenAI
|
|
145
|
+
│
|
|
146
|
+
◇ OpenAI Model
|
|
147
|
+
│ gpt-4.1-mini
|
|
148
|
+
│
|
|
149
|
+
│ Model name for OpenAI
|
|
150
|
+
│
|
|
151
|
+
◇ OpenAI Compatible URL
|
|
152
|
+
│
|
|
153
|
+
│
|
|
154
|
+
│ Base URL for OpenAI compatible provider
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
ctrl ↵ submit tab navigate ^k actions"
|
|
158
|
+
`)
|
|
159
|
+
}, 60000)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import React, { useState } from 'react'
|
|
2
|
+
import { List, ActionPanel, Action, renderWithProviders } from 'termcast'
|
|
3
|
+
import { Toast, ToastContent } from 'termcast/src/apis/toast'
|
|
4
|
+
|
|
5
|
+
const toastVariations = [
|
|
6
|
+
{
|
|
7
|
+
name: 'Simple Success',
|
|
8
|
+
toast: new Toast({
|
|
9
|
+
title: 'Success',
|
|
10
|
+
style: Toast.Style.Success,
|
|
11
|
+
}),
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'Simple Failure',
|
|
15
|
+
toast: new Toast({
|
|
16
|
+
title: 'Error',
|
|
17
|
+
style: Toast.Style.Failure,
|
|
18
|
+
}),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'With Short Message',
|
|
22
|
+
toast: new Toast({
|
|
23
|
+
title: 'Copied',
|
|
24
|
+
message: 'Text copied to clipboard',
|
|
25
|
+
style: Toast.Style.Success,
|
|
26
|
+
}),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'With Long Message',
|
|
30
|
+
toast: new Toast({
|
|
31
|
+
title: 'Error',
|
|
32
|
+
message:
|
|
33
|
+
'This is a very long error message that should wrap to multiple lines when displayed in the toast component. It contains detailed information about what went wrong during the operation.',
|
|
34
|
+
style: Toast.Style.Failure,
|
|
35
|
+
}),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'With Super Long Message',
|
|
39
|
+
toast: new Toast({
|
|
40
|
+
title: 'Warning',
|
|
41
|
+
message:
|
|
42
|
+
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.',
|
|
43
|
+
style: Toast.Style.Failure,
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'With Primary Action',
|
|
48
|
+
toast: new Toast({
|
|
49
|
+
title: 'File Deleted',
|
|
50
|
+
message: 'document.pdf was moved to trash',
|
|
51
|
+
style: Toast.Style.Success,
|
|
52
|
+
primaryAction: {
|
|
53
|
+
title: 'Undo',
|
|
54
|
+
onAction: () => {},
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'With Both Actions',
|
|
60
|
+
toast: new Toast({
|
|
61
|
+
title: 'Update Available',
|
|
62
|
+
message: 'Version 2.0 is ready to install',
|
|
63
|
+
style: Toast.Style.Success,
|
|
64
|
+
primaryAction: {
|
|
65
|
+
title: 'Install',
|
|
66
|
+
onAction: () => {},
|
|
67
|
+
},
|
|
68
|
+
secondaryAction: {
|
|
69
|
+
title: 'Later',
|
|
70
|
+
onAction: () => {},
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'Long Title with Actions',
|
|
76
|
+
toast: new Toast({
|
|
77
|
+
title: 'Operation Completed Successfully',
|
|
78
|
+
message: 'All files have been processed',
|
|
79
|
+
style: Toast.Style.Success,
|
|
80
|
+
primaryAction: {
|
|
81
|
+
title: 'View Results',
|
|
82
|
+
onAction: () => {},
|
|
83
|
+
},
|
|
84
|
+
secondaryAction: {
|
|
85
|
+
title: 'Dismiss',
|
|
86
|
+
onAction: () => {},
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'Animated Loading',
|
|
92
|
+
toast: new Toast({
|
|
93
|
+
title: 'Processing',
|
|
94
|
+
message: 'Please wait while we process your request...',
|
|
95
|
+
style: Toast.Style.Animated,
|
|
96
|
+
}),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: 'Error with Retry',
|
|
100
|
+
toast: new Toast({
|
|
101
|
+
title: 'Connection Failed',
|
|
102
|
+
message:
|
|
103
|
+
'Unable to connect to the server. Please check your internet connection and try again.',
|
|
104
|
+
style: Toast.Style.Failure,
|
|
105
|
+
primaryAction: {
|
|
106
|
+
title: 'Retry',
|
|
107
|
+
onAction: () => {},
|
|
108
|
+
},
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
function ToastVariationsExample(): any {
|
|
114
|
+
const [selectedIndex, setSelectedIndex] = useState(0)
|
|
115
|
+
const selectedToast = toastVariations[selectedIndex]
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<box flexDirection="column" width="100%" height="100%">
|
|
119
|
+
<List
|
|
120
|
+
navigationTitle="Toast Variations"
|
|
121
|
+
onSelectionChange={(id) => {
|
|
122
|
+
if (id) {
|
|
123
|
+
const index = toastVariations.findIndex((v) => v.name === id)
|
|
124
|
+
if (index !== -1) {
|
|
125
|
+
setSelectedIndex(index)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}}
|
|
129
|
+
>
|
|
130
|
+
{toastVariations.map((variation) => (
|
|
131
|
+
<List.Item
|
|
132
|
+
key={variation.name}
|
|
133
|
+
id={variation.name}
|
|
134
|
+
title={variation.name}
|
|
135
|
+
actions={
|
|
136
|
+
<ActionPanel>
|
|
137
|
+
<Action title="Select" onAction={() => {}} />
|
|
138
|
+
</ActionPanel>
|
|
139
|
+
}
|
|
140
|
+
/>
|
|
141
|
+
))}
|
|
142
|
+
</List>
|
|
143
|
+
<box position="absolute" bottom={0} left={0} width="100%">
|
|
144
|
+
<ToastContent toast={selectedToast.toast} onHide={() => {}} />
|
|
145
|
+
</box>
|
|
146
|
+
</box>
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
renderWithProviders(<ToastVariationsExample />)
|