@asymmetric-effort/specifyjs 0.2.97 → 0.2.100
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/specifyjs-build.cjs.js +160 -1
- package/dist/specifyjs-build.cjs.js.map +7 -1
- package/dist/specifyjs-build.d.ts +1 -110
- package/dist/specifyjs-build.esm.js +160 -1
- package/dist/specifyjs-build.esm.js.map +7 -1
- package/dist/specifyjs-client.cjs.js +2 -1
- package/dist/specifyjs-client.cjs.js.map +7 -1
- package/dist/specifyjs-client.d.ts +1 -159
- package/dist/specifyjs-client.esm.js +2 -1
- package/dist/specifyjs-client.esm.js.map +7 -1
- package/dist/specifyjs-components.cjs.js +8 -1
- package/dist/specifyjs-components.cjs.js.map +7 -1
- package/dist/specifyjs-components.d.ts +1 -3334
- package/dist/specifyjs-components.esm.js +8 -1
- package/dist/specifyjs-components.esm.js.map +7 -1
- package/dist/specifyjs-dom.cjs.js +2 -1
- package/dist/specifyjs-dom.cjs.js.map +7 -1
- package/dist/specifyjs-dom.d.ts +1 -107
- package/dist/specifyjs-dom.esm.js +2 -1
- package/dist/specifyjs-dom.esm.js.map +7 -1
- package/dist/specifyjs-jsx-dev-runtime.cjs.js +2 -1
- package/dist/specifyjs-jsx-dev-runtime.cjs.js.map +7 -1
- package/dist/specifyjs-jsx-dev-runtime.esm.js +2 -1
- package/dist/specifyjs-jsx-dev-runtime.esm.js.map +7 -1
- package/dist/specifyjs-jsx-runtime.cjs.js +2 -1
- package/dist/specifyjs-jsx-runtime.cjs.js.map +7 -1
- package/dist/specifyjs-jsx-runtime.esm.js +2 -1
- package/dist/specifyjs-jsx-runtime.esm.js.map +7 -1
- package/dist/specifyjs-server.cjs.js +2 -1
- package/dist/specifyjs-server.cjs.js.map +7 -1
- package/dist/specifyjs-server.d.ts +1 -136
- package/dist/specifyjs-server.esm.js +2 -1
- package/dist/specifyjs-server.esm.js.map +7 -1
- package/dist/specifyjs-telemetry.cjs.js +2 -1
- package/dist/specifyjs-telemetry.cjs.js.map +7 -1
- package/dist/specifyjs-telemetry.d.ts +1 -165
- package/dist/specifyjs-telemetry.esm.js +2 -1
- package/dist/specifyjs-telemetry.esm.js.map +7 -1
- package/dist/specifyjs.cjs.js +2 -1
- package/dist/specifyjs.cjs.js.map +7 -1
- package/dist/specifyjs.d.ts +1 -581
- package/dist/specifyjs.esm.js +2 -1
- package/dist/specifyjs.esm.js.map +7 -1
- package/dist/types/build/index.d.ts +5 -0
- package/dist/types/build/index.d.ts.map +1 -0
- package/dist/types/build/noscript-plugin.d.ts +63 -0
- package/dist/types/build/noscript-plugin.d.ts.map +1 -0
- package/dist/types/build/seo-plugin.d.ts +43 -0
- package/dist/types/build/seo-plugin.d.ts.map +1 -0
- package/dist/types/client/graphql.d.ts +64 -0
- package/dist/types/client/graphql.d.ts.map +1 -0
- package/dist/types/client/index.d.ts +4 -0
- package/dist/types/client/index.d.ts.map +1 -0
- package/dist/types/client/protobuf.d.ts +40 -0
- package/dist/types/client/protobuf.d.ts.map +1 -0
- package/dist/types/client/rest.d.ts +61 -0
- package/dist/types/client/rest.d.ts.map +1 -0
- package/dist/types/components/ad/adsense/src/AdSense.d.ts +19 -0
- package/dist/types/components/ad/adsense/src/index.d.ts +2 -0
- package/dist/types/components/analytics/google-analytics/src/GoogleAnalytics.d.ts +13 -0
- package/dist/types/components/analytics/google-analytics/src/index.d.ts +2 -0
- package/dist/types/components/component.d.ts +39 -0
- package/dist/types/components/component.d.ts.map +1 -0
- package/dist/types/components/data/analog-clock/src/AnalogClock.d.ts +17 -0
- package/dist/types/components/data/analog-clock/src/index.d.ts +2 -0
- package/dist/types/components/data/avatar/src/Avatar.d.ts +19 -0
- package/dist/types/components/data/avatar/src/index.d.ts +2 -0
- package/dist/types/components/data/badge/src/Badge.d.ts +17 -0
- package/dist/types/components/data/badge/src/index.d.ts +2 -0
- package/dist/types/components/data/data-grid/src/DataGrid.d.ts +47 -0
- package/dist/types/components/data/data-grid/src/index.d.ts +2 -0
- package/dist/types/components/data/digital-clock/src/DigitalClock.d.ts +15 -0
- package/dist/types/components/data/digital-clock/src/index.d.ts +2 -0
- package/dist/types/components/data/list-view/src/ListView.d.ts +23 -0
- package/dist/types/components/data/list-view/src/index.d.ts +2 -0
- package/dist/types/components/data/tag/src/Tag.d.ts +21 -0
- package/dist/types/components/data/tag/src/index.d.ts +2 -0
- package/dist/types/components/data/virtual-scroll/src/VirtualScroll.d.ts +13 -0
- package/dist/types/components/data/virtual-scroll/src/index.d.ts +2 -0
- package/dist/types/components/error-boundary.d.ts +23 -0
- package/dist/types/components/error-boundary.d.ts.map +1 -0
- package/dist/types/components/errors/_shared/src/HttpErrorPage.d.ts +15 -0
- package/dist/types/components/errors/_shared/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-400/src/Http400.d.ts +9 -0
- package/dist/types/components/errors/http-400/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-401/src/Http401.d.ts +9 -0
- package/dist/types/components/errors/http-401/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-403/src/Http403.d.ts +9 -0
- package/dist/types/components/errors/http-403/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-404/src/Http404.d.ts +9 -0
- package/dist/types/components/errors/http-404/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-405/src/Http405.d.ts +9 -0
- package/dist/types/components/errors/http-405/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-408/src/Http408.d.ts +9 -0
- package/dist/types/components/errors/http-408/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-429/src/Http429.d.ts +9 -0
- package/dist/types/components/errors/http-429/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-500/src/Http500.d.ts +9 -0
- package/dist/types/components/errors/http-500/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-502/src/Http502.d.ts +9 -0
- package/dist/types/components/errors/http-502/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-503/src/Http503.d.ts +9 -0
- package/dist/types/components/errors/http-503/src/index.d.ts +2 -0
- package/dist/types/components/errors/http-504/src/Http504.d.ts +9 -0
- package/dist/types/components/errors/http-504/src/index.d.ts +2 -0
- package/dist/types/components/feedback/alert/src/Alert.d.ts +25 -0
- package/dist/types/components/feedback/alert/src/index.d.ts +2 -0
- package/dist/types/components/feedback/empty-state/src/EmptyState.d.ts +17 -0
- package/dist/types/components/feedback/empty-state/src/index.d.ts +2 -0
- package/dist/types/components/feedback/progress-bar/src/ProgressBar.d.ts +23 -0
- package/dist/types/components/feedback/progress-bar/src/index.d.ts +2 -0
- package/dist/types/components/feedback/skeleton/src/Skeleton.d.ts +15 -0
- package/dist/types/components/feedback/skeleton/src/index.d.ts +2 -0
- package/dist/types/components/feedback/spinner/src/Spinner.d.ts +13 -0
- package/dist/types/components/feedback/spinner/src/index.d.ts +2 -0
- package/dist/types/components/form/button/src/Button.d.ts +25 -0
- package/dist/types/components/form/button/src/index.d.ts +2 -0
- package/dist/types/components/form/checkbox/src/Checkbox.d.ts +19 -0
- package/dist/types/components/form/checkbox/src/index.d.ts +2 -0
- package/dist/types/components/form/color-picker/src/ColorPicker.d.ts +19 -0
- package/dist/types/components/form/color-picker/src/index.d.ts +2 -0
- package/dist/types/components/form/color-wheel/src/ColorWheel.d.ts +17 -0
- package/dist/types/components/form/color-wheel/src/index.d.ts +2 -0
- package/dist/types/components/form/datepicker/src/DatePicker.d.ts +23 -0
- package/dist/types/components/form/datepicker/src/index.d.ts +2 -0
- package/dist/types/components/form/file-upload/src/FileUpload.d.ts +19 -0
- package/dist/types/components/form/file-upload/src/index.d.ts +2 -0
- package/dist/types/components/form/multiline/src/MultilineField.d.ts +41 -0
- package/dist/types/components/form/multiline/src/index.d.ts +2 -0
- package/dist/types/components/form/number-spinner/src/NumberSpinner.d.ts +25 -0
- package/dist/types/components/form/number-spinner/src/index.d.ts +2 -0
- package/dist/types/components/form/radio/src/RadioGroup.d.ts +26 -0
- package/dist/types/components/form/radio/src/index.d.ts +2 -0
- package/dist/types/components/form/select/src/Select.d.ts +33 -0
- package/dist/types/components/form/select/src/index.d.ts +2 -0
- package/dist/types/components/form/slider/src/Slider.d.ts +33 -0
- package/dist/types/components/form/slider/src/index.d.ts +2 -0
- package/dist/types/components/form/texteditor/src/TextEditor.d.ts +46 -0
- package/dist/types/components/form/texteditor/src/index.d.ts +2 -0
- package/dist/types/components/form/textfield/src/TextField.d.ts +48 -0
- package/dist/types/components/form/textfield/src/index.d.ts +2 -0
- package/dist/types/components/form/timepicker/src/TimePicker.d.ts +29 -0
- package/dist/types/components/form/timepicker/src/index.d.ts +2 -0
- package/dist/types/components/form/toggle/src/Toggle.d.ts +19 -0
- package/dist/types/components/form/toggle/src/index.d.ts +2 -0
- package/dist/types/components/form/wrapper/src/FormFieldWrapper.d.ts +67 -0
- package/dist/types/components/form/wrapper/src/index.d.ts +2 -0
- package/dist/types/components/layout/card/src/Card.d.ts +31 -0
- package/dist/types/components/layout/card/src/index.d.ts +2 -0
- package/dist/types/components/layout/desktop-background/src/DesktopBackground.d.ts +23 -0
- package/dist/types/components/layout/desktop-background/src/index.d.ts +2 -0
- package/dist/types/components/layout/draggable-window/src/DraggableWindow.d.ts +59 -0
- package/dist/types/components/layout/draggable-window/src/index.d.ts +2 -0
- package/dist/types/components/layout/flex-container/src/FlexContainer.d.ts +42 -0
- package/dist/types/components/layout/flex-container/src/index.d.ts +2 -0
- package/dist/types/components/layout/footer/src/Footer.d.ts +25 -0
- package/dist/types/components/layout/footer/src/index.d.ts +2 -0
- package/dist/types/components/layout/grid/src/Grid.d.ts +54 -0
- package/dist/types/components/layout/grid/src/index.d.ts +2 -0
- package/dist/types/components/layout/panel/src/Panel.d.ts +23 -0
- package/dist/types/components/layout/panel/src/index.d.ts +2 -0
- package/dist/types/components/layout/scroll-container/src/ScrollContainer.d.ts +21 -0
- package/dist/types/components/layout/scroll-container/src/index.d.ts +2 -0
- package/dist/types/components/layout/splitter/src/Splitter.d.ts +19 -0
- package/dist/types/components/layout/splitter/src/index.d.ts +2 -0
- package/dist/types/components/layout/tabs/src/Tabs.d.ts +29 -0
- package/dist/types/components/layout/tabs/src/index.d.ts +2 -0
- package/dist/types/components/layout/window-manager/src/WindowManager.d.ts +106 -0
- package/dist/types/components/layout/window-manager/src/index.d.ts +2 -0
- package/dist/types/components/math/src/index.d.ts +5 -0
- package/dist/types/components/math/src/mat.d.ts +71 -0
- package/dist/types/components/math/src/mat4.d.ts +101 -0
- package/dist/types/components/math/src/quaternion.d.ts +62 -0
- package/dist/types/components/math/src/solver.d.ts +55 -0
- package/dist/types/components/math/src/vec.d.ts +54 -0
- package/dist/types/components/media/carousel/src/Carousel.d.ts +23 -0
- package/dist/types/components/media/carousel/src/index.d.ts +2 -0
- package/dist/types/components/media/image/src/Image.d.ts +23 -0
- package/dist/types/components/media/image/src/index.d.ts +2 -0
- package/dist/types/components/media/video-player/src/VideoPlayer.d.ts +27 -0
- package/dist/types/components/media/video-player/src/index.d.ts +2 -0
- package/dist/types/components/nav/accordion/src/Accordion.d.ts +52 -0
- package/dist/types/components/nav/accordion/src/index.d.ts +2 -0
- package/dist/types/components/nav/breadcrumb/src/Breadcrumb.d.ts +20 -0
- package/dist/types/components/nav/breadcrumb/src/index.d.ts +2 -0
- package/dist/types/components/nav/dock/src/Dock.d.ts +46 -0
- package/dist/types/components/nav/dock/src/index.d.ts +2 -0
- package/dist/types/components/nav/dropdown/src/Dropdown.d.ts +36 -0
- package/dist/types/components/nav/dropdown/src/index.d.ts +2 -0
- package/dist/types/components/nav/menubar/src/Menubar.d.ts +27 -0
- package/dist/types/components/nav/menubar/src/index.d.ts +2 -0
- package/dist/types/components/nav/pagination/src/Pagination.d.ts +19 -0
- package/dist/types/components/nav/pagination/src/index.d.ts +2 -0
- package/dist/types/components/nav/sidebar/src/Sidebar.d.ts +29 -0
- package/dist/types/components/nav/sidebar/src/index.d.ts +2 -0
- package/dist/types/components/nav/stepper/src/Stepper.d.ts +25 -0
- package/dist/types/components/nav/stepper/src/index.d.ts +2 -0
- package/dist/types/components/nav/system-tray/src/SystemTray.d.ts +47 -0
- package/dist/types/components/nav/system-tray/src/index.d.ts +2 -0
- package/dist/types/components/nav/toolbar/src/Toolbar.d.ts +27 -0
- package/dist/types/components/nav/toolbar/src/index.d.ts +2 -0
- package/dist/types/components/nav/treenav/src/TreeNav.d.ts +34 -0
- package/dist/types/components/nav/treenav/src/TreeNode.d.ts +74 -0
- package/dist/types/components/nav/treenav/src/index.d.ts +4 -0
- package/dist/types/components/nav/wrapper/src/NavWrapper.d.ts +73 -0
- package/dist/types/components/nav/wrapper/src/index.d.ts +2 -0
- package/dist/types/components/overlay/context-menu/src/ContextMenu.d.ts +21 -0
- package/dist/types/components/overlay/context-menu/src/index.d.ts +2 -0
- package/dist/types/components/overlay/drawer/src/Drawer.d.ts +22 -0
- package/dist/types/components/overlay/drawer/src/index.d.ts +2 -0
- package/dist/types/components/overlay/modal/src/Modal.d.ts +22 -0
- package/dist/types/components/overlay/modal/src/index.d.ts +2 -0
- package/dist/types/components/overlay/popover/src/Popover.d.ts +20 -0
- package/dist/types/components/overlay/popover/src/index.d.ts +2 -0
- package/dist/types/components/overlay/toast/src/Toast.d.ts +59 -0
- package/dist/types/components/overlay/toast/src/index.d.ts +2 -0
- package/dist/types/components/overlay/tooltip/src/Tooltip.d.ts +14 -0
- package/dist/types/components/overlay/tooltip/src/index.d.ts +2 -0
- package/dist/types/components/page/ide/src/IDE.d.ts +5 -0
- package/dist/types/components/page/ide/src/index.d.ts +2 -0
- package/dist/types/components/page/trading-dashboard/src/TradingDashboard.d.ts +5 -0
- package/dist/types/components/page/trading-dashboard/src/index.d.ts +2 -0
- package/dist/types/components/page/unity-desktop/src/UnityApp.d.ts +30 -0
- package/dist/types/components/page/unity-desktop/src/UnityDesktop.d.ts +30 -0
- package/dist/types/components/page/unity-desktop/src/index.d.ts +4 -0
- package/dist/types/components/page/word-processor/src/WordProcessor.d.ts +7 -0
- package/dist/types/components/page/word-processor/src/index.d.ts +2 -0
- package/dist/types/components/profiler.d.ts +6 -0
- package/dist/types/components/profiler.d.ts.map +1 -0
- package/dist/types/components/strict-mode.d.ts +6 -0
- package/dist/types/components/strict-mode.d.ts.map +1 -0
- package/dist/types/components/suspense.d.ts +6 -0
- package/dist/types/components/suspense.d.ts.map +1 -0
- package/dist/types/components/viz/2D-bar-graph/src/BarGraph.d.ts +61 -0
- package/dist/types/components/viz/2D-bar-graph/src/index.d.ts +2 -0
- package/dist/types/components/viz/2D-cartesian-raw/src/CartesianGraph2D.d.ts +40 -0
- package/dist/types/components/viz/2D-cartesian-raw/src/index.d.ts +2 -0
- package/dist/types/components/viz/2D-complex-graph/src/ComplexGraph2D.d.ts +33 -0
- package/dist/types/components/viz/2D-complex-graph/src/index.d.ts +2 -0
- package/dist/types/components/viz/2D-discrete-cartesian/src/DiscreteCartesian2D.d.ts +31 -0
- package/dist/types/components/viz/2D-discrete-cartesian/src/index.d.ts +2 -0
- package/dist/types/components/viz/2D-line-graph/src/LineGraph.d.ts +53 -0
- package/dist/types/components/viz/2D-line-graph/src/index.d.ts +2 -0
- package/dist/types/components/viz/2D-pie-graph/src/PieGraph.d.ts +49 -0
- package/dist/types/components/viz/2D-pie-graph/src/index.d.ts +3 -0
- package/dist/types/components/viz/2D-polar-graph/src/PolarGraph2D.d.ts +35 -0
- package/dist/types/components/viz/2D-polar-graph/src/index.d.ts +2 -0
- package/dist/types/components/viz/3d-layers/src/ThreeDLayers.d.ts +35 -0
- package/dist/types/components/viz/3d-layers/src/index.d.ts +2 -0
- package/dist/types/components/viz/3dSpace/src/Space3D.d.ts +63 -0
- package/dist/types/components/viz/3dSpace/src/animation.d.ts +75 -0
- package/dist/types/components/viz/3dSpace/src/bounds.d.ts +36 -0
- package/dist/types/components/viz/3dSpace/src/camera-controller.d.ts +59 -0
- package/dist/types/components/viz/3dSpace/src/camera.d.ts +43 -0
- package/dist/types/components/viz/3dSpace/src/collision.d.ts +54 -0
- package/dist/types/components/viz/3dSpace/src/cpu-pipeline.d.ts +47 -0
- package/dist/types/components/viz/3dSpace/src/index.d.ts +32 -0
- package/dist/types/components/viz/3dSpace/src/light.d.ts +23 -0
- package/dist/types/components/viz/3dSpace/src/lighting-model.d.ts +34 -0
- package/dist/types/components/viz/3dSpace/src/material.d.ts +12 -0
- package/dist/types/components/viz/3dSpace/src/mesh.d.ts +35 -0
- package/dist/types/components/viz/3dSpace/src/picking.d.ts +51 -0
- package/dist/types/components/viz/3dSpace/src/render-pipeline.d.ts +12 -0
- package/dist/types/components/viz/3dSpace/src/scene-graph.d.ts +20 -0
- package/dist/types/components/viz/3dSpace/src/scene-object.d.ts +31 -0
- package/dist/types/components/viz/3dSpace/src/terrain.d.ts +34 -0
- package/dist/types/components/viz/3dSpace/src/texture.d.ts +22 -0
- package/dist/types/components/viz/3dSpace/src/types.d.ts +42 -0
- package/dist/types/components/viz/3dSpace/src/viewport.d.ts +19 -0
- package/dist/types/components/viz/3dSpace/src/webgl-pipeline.d.ts +54 -0
- package/dist/types/components/viz/big-number/src/BigNumber.d.ts +29 -0
- package/dist/types/components/viz/big-number/src/index.d.ts +2 -0
- package/dist/types/components/viz/bloch-sphere/src/BlochSphere.d.ts +73 -0
- package/dist/types/components/viz/bloch-sphere/src/index.d.ts +2 -0
- package/dist/types/components/viz/box-plot/src/BoxPlot.d.ts +47 -0
- package/dist/types/components/viz/box-plot/src/index.d.ts +2 -0
- package/dist/types/components/viz/bubble-chart/src/BubbleChart.d.ts +38 -0
- package/dist/types/components/viz/bubble-chart/src/index.d.ts +2 -0
- package/dist/types/components/viz/calendar-heat-map/src/CalendarHeatMap.d.ts +29 -0
- package/dist/types/components/viz/calendar-heat-map/src/index.d.ts +2 -0
- package/dist/types/components/viz/chord/src/ChordDiagram.d.ts +25 -0
- package/dist/types/components/viz/chord/src/index.d.ts +2 -0
- package/dist/types/components/viz/decomposition-tree/src/DecompositionTree.d.ts +33 -0
- package/dist/types/components/viz/decomposition-tree/src/index.d.ts +2 -0
- package/dist/types/components/viz/earth-globe/src/EarthGlobe.d.ts +62 -0
- package/dist/types/components/viz/earth-globe/src/globe-data.d.ts +23 -0
- package/dist/types/components/viz/earth-globe/src/index.d.ts +5 -0
- package/dist/types/components/viz/force-graph/src/ForceGraph.d.ts +99 -0
- package/dist/types/components/viz/force-graph/src/index.d.ts +2 -0
- package/dist/types/components/viz/funnel/src/FunnelChart.d.ts +28 -0
- package/dist/types/components/viz/funnel/src/index.d.ts +2 -0
- package/dist/types/components/viz/gantt-chart/src/GanttChart.d.ts +33 -0
- package/dist/types/components/viz/gantt-chart/src/index.d.ts +2 -0
- package/dist/types/components/viz/gauge/src/Gauge.d.ts +37 -0
- package/dist/types/components/viz/gauge/src/index.d.ts +2 -0
- package/dist/types/components/viz/graph/src/HypercubeGraph.d.ts +43 -0
- package/dist/types/components/viz/graph/src/hypercube.d.ts +78 -0
- package/dist/types/components/viz/graph/src/index.d.ts +4 -0
- package/dist/types/components/viz/heat-map/src/HeatMap.d.ts +29 -0
- package/dist/types/components/viz/heat-map/src/index.d.ts +2 -0
- package/dist/types/components/viz/histogram/src/Histogram.d.ts +27 -0
- package/dist/types/components/viz/histogram/src/index.d.ts +2 -0
- package/dist/types/components/viz/lollipop/src/LollipopChart.d.ts +32 -0
- package/dist/types/components/viz/lollipop/src/index.d.ts +2 -0
- package/dist/types/components/viz/matrix/src/Matrix.d.ts +29 -0
- package/dist/types/components/viz/matrix/src/index.d.ts +2 -0
- package/dist/types/components/viz/partition/src/Partition.d.ts +31 -0
- package/dist/types/components/viz/partition/src/index.d.ts +2 -0
- package/dist/types/components/viz/pivot-table/src/PivotTable.d.ts +25 -0
- package/dist/types/components/viz/pivot-table/src/index.d.ts +2 -0
- package/dist/types/components/viz/radar-chart/src/RadarChart.d.ts +35 -0
- package/dist/types/components/viz/radar-chart/src/index.d.ts +2 -0
- package/dist/types/components/viz/sankey/src/SankeyDiagram.d.ts +38 -0
- package/dist/types/components/viz/sankey/src/index.d.ts +2 -0
- package/dist/types/components/viz/sunburst/src/Sunburst.d.ts +27 -0
- package/dist/types/components/viz/sunburst/src/index.d.ts +2 -0
- package/dist/types/components/viz/tree-map/src/TreeMap.d.ts +29 -0
- package/dist/types/components/viz/tree-map/src/index.d.ts +2 -0
- package/dist/types/components/viz/us-state-map/src/USStateMap.d.ts +23 -0
- package/dist/types/components/viz/us-state-map/src/index.d.ts +4 -0
- package/dist/types/components/viz/us-state-map/src/us-state-paths.d.ts +10 -0
- package/dist/types/components/viz/vector-field/src/VectorField.d.ts +61 -0
- package/dist/types/components/viz/vector-field/src/index.d.ts +2 -0
- package/dist/types/components/viz/waterfall/src/WaterfallChart.d.ts +32 -0
- package/dist/types/components/viz/waterfall/src/index.d.ts +2 -0
- package/dist/types/components/viz/word-cloud/src/WordCloud.d.ts +30 -0
- package/dist/types/components/viz/word-cloud/src/index.d.ts +2 -0
- package/dist/types/components/viz/wrapper/src/VizWrapper.d.ts +60 -0
- package/dist/types/components/viz/wrapper/src/index.d.ts +2 -0
- package/dist/types/compute/context.d.ts +20 -0
- package/dist/types/compute/context.d.ts.map +1 -0
- package/dist/types/compute/cpu-backend.d.ts +15 -0
- package/dist/types/compute/cpu-backend.d.ts.map +1 -0
- package/dist/types/compute/index.d.ts +3 -0
- package/dist/types/compute/index.d.ts.map +1 -0
- package/dist/types/compute/types.d.ts +57 -0
- package/dist/types/compute/types.d.ts.map +1 -0
- package/dist/types/compute/webgl-backend.d.ts +33 -0
- package/dist/types/compute/webgl-backend.d.ts.map +1 -0
- package/dist/types/compute/webgpu-backend.d.ts +50 -0
- package/dist/types/compute/webgpu-backend.d.ts.map +1 -0
- package/dist/types/context/create-context.d.ts +15 -0
- package/dist/types/context/create-context.d.ts.map +1 -0
- package/dist/types/core/children.d.ts +15 -0
- package/dist/types/core/children.d.ts.map +1 -0
- package/dist/types/core/clone-element.d.ts +10 -0
- package/dist/types/core/clone-element.d.ts.map +1 -0
- package/dist/types/core/create-element.d.ts +20 -0
- package/dist/types/core/create-element.d.ts.map +1 -0
- package/dist/types/core/create-ref.d.ts +7 -0
- package/dist/types/core/create-ref.d.ts.map +1 -0
- package/dist/types/core/fiber.d.ts +30 -0
- package/dist/types/core/fiber.d.ts.map +1 -0
- package/dist/types/core/forward-ref.d.ts +16 -0
- package/dist/types/core/forward-ref.d.ts.map +1 -0
- package/dist/types/core/fragment.d.ts +6 -0
- package/dist/types/core/fragment.d.ts.map +1 -0
- package/dist/types/core/is-valid-element.d.ts +7 -0
- package/dist/types/core/is-valid-element.d.ts.map +1 -0
- package/dist/types/core/lanes.d.ts +47 -0
- package/dist/types/core/lanes.d.ts.map +1 -0
- package/dist/types/core/lazy.d.ts +20 -0
- package/dist/types/core/lazy.d.ts.map +1 -0
- package/dist/types/core/memo.d.ts +13 -0
- package/dist/types/core/memo.d.ts.map +1 -0
- package/dist/types/core/reconciler.d.ts +12 -0
- package/dist/types/core/reconciler.d.ts.map +1 -0
- package/dist/types/core/scheduler-host-config.d.ts +37 -0
- package/dist/types/core/scheduler-host-config.d.ts.map +1 -0
- package/dist/types/core/scheduler.d.ts +29 -0
- package/dist/types/core/scheduler.d.ts.map +1 -0
- package/dist/types/core/src/build/index.d.ts +4 -0
- package/dist/types/core/src/build/noscript-plugin.d.ts +62 -0
- package/dist/types/core/src/build/seo-plugin.d.ts +42 -0
- package/dist/types/core/src/client/graphql.d.ts +63 -0
- package/dist/types/core/src/client/index.d.ts +3 -0
- package/dist/types/core/src/client/protobuf.d.ts +39 -0
- package/dist/types/core/src/client/rest.d.ts +60 -0
- package/dist/types/core/src/components/component.d.ts +38 -0
- package/dist/types/core/src/components/error-boundary.d.ts +22 -0
- package/dist/types/core/src/components/profiler.d.ts +5 -0
- package/dist/types/core/src/components/strict-mode.d.ts +5 -0
- package/dist/types/core/src/components/suspense.d.ts +5 -0
- package/dist/types/core/src/components-barrel.d.ts +100 -0
- package/dist/types/core/src/compute/context.d.ts +19 -0
- package/dist/types/core/src/compute/cpu-backend.d.ts +14 -0
- package/dist/types/core/src/compute/index.d.ts +2 -0
- package/dist/types/core/src/compute/types.d.ts +56 -0
- package/dist/types/core/src/compute/webgl-backend.d.ts +32 -0
- package/dist/types/core/src/compute/webgpu-backend.d.ts +49 -0
- package/dist/types/core/src/context/create-context.d.ts +14 -0
- package/dist/types/core/src/core/children.d.ts +14 -0
- package/dist/types/core/src/core/clone-element.d.ts +9 -0
- package/dist/types/core/src/core/create-element.d.ts +19 -0
- package/dist/types/core/src/core/create-ref.d.ts +6 -0
- package/dist/types/core/src/core/fiber.d.ts +29 -0
- package/dist/types/core/src/core/forward-ref.d.ts +15 -0
- package/dist/types/core/src/core/fragment.d.ts +5 -0
- package/dist/types/core/src/core/is-valid-element.d.ts +6 -0
- package/dist/types/core/src/core/lanes.d.ts +46 -0
- package/dist/types/core/src/core/lazy.d.ts +19 -0
- package/dist/types/core/src/core/memo.d.ts +12 -0
- package/dist/types/core/src/core/reconciler.d.ts +11 -0
- package/dist/types/core/src/core/scheduler-host-config.d.ts +36 -0
- package/dist/types/core/src/core/scheduler.d.ts +28 -0
- package/dist/types/core/src/core/transitions.d.ts +31 -0
- package/dist/types/core/src/devtools/index.d.ts +21 -0
- package/dist/types/core/src/dom/create-portal.d.ts +6 -0
- package/dist/types/core/src/dom/create-root.d.ts +23 -0
- package/dist/types/core/src/dom/flush-sync.d.ts +1 -0
- package/dist/types/core/src/dom/index.d.ts +4 -0
- package/dist/types/core/src/dom/legacy.d.ts +16 -0
- package/dist/types/core/src/dom/synthetic-event.d.ts +90 -0
- package/dist/types/core/src/dom/work-loop.d.ts +34 -0
- package/dist/types/core/src/features/feature-flags.d.ts +38 -0
- package/dist/types/core/src/features/index.d.ts +27 -0
- package/dist/types/core/src/hooks/dispatcher.d.ts +26 -0
- package/dist/types/core/src/hooks/hook-state.d.ts +46 -0
- package/dist/types/core/src/hooks/index.d.ts +47 -0
- package/dist/types/core/src/hooks/install-dispatcher.d.ts +2 -0
- package/dist/types/core/src/hooks/use-head.d.ts +54 -0
- package/dist/types/core/src/index.d.ts +23 -0
- package/dist/types/core/src/jsx-dev-runtime.d.ts +1 -0
- package/dist/types/core/src/jsx-runtime.d.ts +7 -0
- package/dist/types/core/src/router/index.d.ts +12 -0
- package/dist/types/core/src/router/link-component.d.ts +16 -0
- package/dist/types/core/src/router/match-path.d.ts +28 -0
- package/dist/types/core/src/router/route-component.d.ts +12 -0
- package/dist/types/core/src/router/router-component.d.ts +5 -0
- package/dist/types/core/src/router/router-context.d.ts +13 -0
- package/dist/types/core/src/router/router-store.d.ts +22 -0
- package/dist/types/core/src/router/use-navigate.d.ts +4 -0
- package/dist/types/core/src/router/use-params.d.ts +2 -0
- package/dist/types/core/src/router/use-router.d.ts +3 -0
- package/dist/types/core/src/server/index.d.ts +3 -0
- package/dist/types/core/src/server/render-to-pipeable-stream.d.ts +31 -0
- package/dist/types/core/src/server/render-to-readable-stream.d.ts +19 -0
- package/dist/types/core/src/server/render-to-string.d.ts +25 -0
- package/dist/types/core/src/shared/act.d.ts +1 -0
- package/dist/types/core/src/shared/aria-warnings.d.ts +1 -0
- package/dist/types/core/src/shared/async-compute.d.ts +63 -0
- package/dist/types/core/src/shared/component-registry.d.ts +53 -0
- package/dist/types/core/src/shared/render-guard.d.ts +47 -0
- package/dist/types/core/src/shared/secure-fetch.d.ts +21 -0
- package/dist/types/core/src/shared/types.d.ts +127 -0
- package/dist/types/core/src/shared/warnings.d.ts +19 -0
- package/dist/types/core/src/telemetry/index.d.ts +2 -0
- package/dist/types/core/src/telemetry/metrics.d.ts +67 -0
- package/dist/types/core/src/telemetry/tracing.d.ts +95 -0
- package/dist/types/core/transitions.d.ts +32 -0
- package/dist/types/core/transitions.d.ts.map +1 -0
- package/dist/types/devtools/index.d.ts +22 -0
- package/dist/types/devtools/index.d.ts.map +1 -0
- package/dist/types/dom/create-portal.d.ts +7 -0
- package/dist/types/dom/create-portal.d.ts.map +1 -0
- package/dist/types/dom/create-root.d.ts +24 -0
- package/dist/types/dom/create-root.d.ts.map +1 -0
- package/dist/types/dom/flush-sync.d.ts +2 -0
- package/dist/types/dom/flush-sync.d.ts.map +1 -0
- package/dist/types/dom/index.d.ts +5 -0
- package/dist/types/dom/index.d.ts.map +1 -0
- package/dist/types/dom/legacy.d.ts +17 -0
- package/dist/types/dom/legacy.d.ts.map +1 -0
- package/dist/types/dom/synthetic-event.d.ts +91 -0
- package/dist/types/dom/synthetic-event.d.ts.map +1 -0
- package/dist/types/dom/work-loop.d.ts +35 -0
- package/dist/types/dom/work-loop.d.ts.map +1 -0
- package/dist/types/features/feature-flags.d.ts +39 -0
- package/dist/types/features/feature-flags.d.ts.map +1 -0
- package/dist/types/features/index.d.ts +28 -0
- package/dist/types/features/index.d.ts.map +1 -0
- package/dist/types/hooks/dispatcher.d.ts +27 -0
- package/dist/types/hooks/dispatcher.d.ts.map +1 -0
- package/dist/types/hooks/hook-state.d.ts +47 -0
- package/dist/types/hooks/hook-state.d.ts.map +1 -0
- package/dist/types/hooks/index.d.ts +48 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/install-dispatcher.d.ts +3 -0
- package/dist/types/hooks/install-dispatcher.d.ts.map +1 -0
- package/dist/types/hooks/use-head.d.ts +55 -0
- package/dist/types/hooks/use-head.d.ts.map +1 -0
- package/dist/types/index.d.ts +24 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/jsx-dev-runtime.d.ts +2 -0
- package/dist/types/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/types/jsx-runtime.d.ts +8 -0
- package/dist/types/jsx-runtime.d.ts.map +1 -0
- package/dist/types/router/index.d.ts +13 -0
- package/dist/types/router/index.d.ts.map +1 -0
- package/dist/types/router/link-component.d.ts +17 -0
- package/dist/types/router/link-component.d.ts.map +1 -0
- package/dist/types/router/match-path.d.ts +29 -0
- package/dist/types/router/match-path.d.ts.map +1 -0
- package/dist/types/router/route-component.d.ts +13 -0
- package/dist/types/router/route-component.d.ts.map +1 -0
- package/dist/types/router/router-component.d.ts +6 -0
- package/dist/types/router/router-component.d.ts.map +1 -0
- package/dist/types/router/router-context.d.ts +14 -0
- package/dist/types/router/router-context.d.ts.map +1 -0
- package/dist/types/router/router-store.d.ts +23 -0
- package/dist/types/router/router-store.d.ts.map +1 -0
- package/dist/types/router/use-navigate.d.ts +5 -0
- package/dist/types/router/use-navigate.d.ts.map +1 -0
- package/dist/types/router/use-params.d.ts +3 -0
- package/dist/types/router/use-params.d.ts.map +1 -0
- package/dist/types/router/use-router.d.ts +4 -0
- package/dist/types/router/use-router.d.ts.map +1 -0
- package/dist/types/server/index.d.ts +4 -0
- package/dist/types/server/index.d.ts.map +1 -0
- package/dist/types/server/render-to-pipeable-stream.d.ts +32 -0
- package/dist/types/server/render-to-pipeable-stream.d.ts.map +1 -0
- package/dist/types/server/render-to-readable-stream.d.ts +20 -0
- package/dist/types/server/render-to-readable-stream.d.ts.map +1 -0
- package/dist/types/server/render-to-string.d.ts +26 -0
- package/dist/types/server/render-to-string.d.ts.map +1 -0
- package/dist/types/shared/act.d.ts +2 -0
- package/dist/types/shared/act.d.ts.map +1 -0
- package/dist/types/shared/aria-warnings.d.ts +2 -0
- package/dist/types/shared/aria-warnings.d.ts.map +1 -0
- package/dist/types/shared/async-compute.d.ts +64 -0
- package/dist/types/shared/async-compute.d.ts.map +1 -0
- package/dist/types/shared/component-registry.d.ts +54 -0
- package/dist/types/shared/component-registry.d.ts.map +1 -0
- package/dist/types/shared/render-guard.d.ts +48 -0
- package/dist/types/shared/render-guard.d.ts.map +1 -0
- package/dist/types/shared/secure-fetch.d.ts +22 -0
- package/dist/types/shared/secure-fetch.d.ts.map +1 -0
- package/dist/types/shared/types.d.ts +128 -0
- package/dist/types/shared/types.d.ts.map +1 -0
- package/dist/types/shared/warnings.d.ts +20 -0
- package/dist/types/shared/warnings.d.ts.map +1 -0
- package/dist/types/telemetry/index.d.ts +3 -0
- package/dist/types/telemetry/index.d.ts.map +1 -0
- package/dist/types/telemetry/metrics.d.ts +68 -0
- package/dist/types/telemetry/metrics.d.ts.map +1 -0
- package/dist/types/telemetry/tracing.d.ts +96 -0
- package/dist/types/telemetry/tracing.d.ts.map +1 -0
- package/package.json +8 -17
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/build/seo-plugin.ts", "../src/build/noscript-plugin.ts"],
|
|
4
|
+
"sourcesContent": ["// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\n/**\n * SpecifyJS SEO Plugin for Vite\n * Auto-generates sitemap.xml, robots.txt, and llms.txt at build time.\n *\n * Usage in vite.config.ts:\n * import { specifyJsSeoPlugin } from '@asymmetric-effort/specifyjs/build';\n * export default defineConfig({ plugins: [specifyJsSeoPlugin({ ... })] });\n */\n\nimport type { Plugin } from 'vite';\nimport fs from 'fs';\nimport path from 'path';\n\nexport interface SeoPluginConfig {\n /** Base URL of the site (e.g., 'https://example.com') */\n siteUrl: string;\n /** Site title for llms.txt */\n title?: string;\n /** Site description for llms.txt */\n description?: string;\n /** Hash-based routes to include in sitemap */\n routes?: string[];\n /** Path to docs directory (generates doc routes in sitemap) */\n docsDir?: string;\n /** npm package name for llms.txt install instructions */\n npmPackage?: string;\n /** Author name for llms.txt */\n author?: string;\n /** License for llms.txt */\n license?: string;\n /** Additional robots.txt rules */\n robotsRules?: string[];\n /** Repository URL for llms.txt */\n repository?: string;\n /** Schema.org structured data (JSON-LD). When provided, a\n * `<script type=\"application/ld+json\">` block is injected into index.html.\n * Can be a plain object or an array of objects for multiple schemas. */\n jsonLd?: Record<string, unknown> | Record<string, unknown>[];\n}\n\n/**\n * Iteratively walk a directory and collect markdown file paths (without .md extension).\n * Uses an explicit stack instead of recursion per project coding standards.\n */\nfunction walkDocs(rootDir: string, results: string[]): void {\n const stack: Array<{ dir: string; prefix: string }> = [{ dir: rootDir, prefix: '' }];\n while (stack.length > 0) {\n const { dir, prefix } = stack.pop()!;\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n stack.push({ dir: path.join(dir, entry.name), prefix: prefix + entry.name + '/' });\n } else if (entry.name.endsWith('.md')) {\n results.push(prefix + entry.name.replace('.md', ''));\n }\n }\n }\n}\n\n/**\n * Generate sitemap.xml content from a list of routes.\n */\nfunction generateSitemap(siteUrl: string, routes: string[], today: string): string {\n const sitemapEntries = routes.map(\n (r) => ` <url><loc>${siteUrl}${r}</loc><lastmod>${today}</lastmod></url>`,\n );\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n ...sitemapEntries,\n '</urlset>',\n ].join('\\n');\n}\n\n/**\n * Generate robots.txt content.\n */\nfunction generateRobots(siteUrl: string, extraRules?: string[]): string {\n const lines = ['User-agent: *', 'Allow: /'];\n if (extraRules) {\n lines.push(...extraRules);\n }\n lines.push('', `Sitemap: ${siteUrl}/sitemap.xml`);\n return lines.join('\\n');\n}\n\n/**\n * Generate llms.txt content with project metadata and doc links.\n */\nfunction generateLlmsTxt(config: SeoPluginConfig, docPaths: string[]): string {\n const title = config.title ?? 'Site';\n const lines: string[] = [`# ${title}`];\n\n if (config.description) {\n lines.push('');\n const descLines = config.description.split('\\n');\n for (const dl of descLines) {\n lines.push(`> ${dl}`);\n }\n }\n\n lines.push('');\n lines.push(`## Website: ${config.siteUrl}`);\n if (config.repository) {\n lines.push(`## Repository: ${config.repository}`);\n }\n if (config.npmPackage) {\n lines.push(`## npm: https://www.npmjs.com/package/${config.npmPackage}`);\n }\n\n // Documentation section\n const guideNames = docPaths\n .filter((p) => p.startsWith('guides/'))\n .map((p) => p.replace('guides/', ''));\n const apiNames = docPaths.filter((p) => p.startsWith('api/')).map((p) => p.replace('api/', ''));\n\n if (guideNames.length > 0) {\n lines.push('', '## Documentation', '');\n for (const g of guideNames) {\n lines.push(`- ${g}: ${config.siteUrl}/#/docs/guides/${g}`);\n }\n }\n\n if (apiNames.length > 0) {\n lines.push('', '## API Reference', '');\n for (const a of apiNames) {\n lines.push(`- ${a}: ${config.siteUrl}/#/docs/api/${a}`);\n }\n }\n\n if (config.npmPackage) {\n lines.push('', '## Install', '', '```', `npm install ${config.npmPackage}`, '```');\n }\n\n if (config.license) {\n lines.push('', `## License: ${config.license}`);\n }\n if (config.author) {\n lines.push(`## Author: ${config.author}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Create the SpecifyJS SEO Vite plugin.\n *\n * Generates sitemap.xml, robots.txt, and llms.txt in the build output directory\n * during the closeBundle hook.\n */\nexport function specifyJsSeoPlugin(config: SeoPluginConfig): Plugin {\n return {\n name: 'specifyjs-seo',\n closeBundle() {\n const distDir = path.resolve(process.cwd(), 'dist');\n const today = new Date().toISOString().split('T')[0] ?? '';\n\n // Collect routes\n const routes = [...(config.routes ?? ['/'])];\n\n // Collect doc routes from docsDir\n const docPaths: string[] = [];\n if (config.docsDir && fs.existsSync(config.docsDir)) {\n walkDocs(config.docsDir, docPaths);\n for (const dp of docPaths) {\n routes.push(`/#/docs/${dp}`);\n }\n }\n\n // Generate and write sitemap.xml\n const sitemap = generateSitemap(config.siteUrl, routes, today);\n fs.writeFileSync(path.join(distDir, 'sitemap.xml'), sitemap);\n\n // Generate and write robots.txt\n const robots = generateRobots(config.siteUrl, config.robotsRules);\n fs.writeFileSync(path.join(distDir, 'robots.txt'), robots);\n\n // Generate and write llms.txt\n const llmsTxt = generateLlmsTxt(config, docPaths);\n fs.writeFileSync(path.join(distDir, 'llms.txt'), llmsTxt);\n\n /* v8 ignore start -- JSON-LD injection uses fs in Vite closeBundle */\n // Inject JSON-LD structured data into index.html\n if (config.jsonLd) {\n const indexPath = path.join(distDir, 'index.html');\n if (fs.existsSync(indexPath)) {\n let html = fs.readFileSync(indexPath, 'utf-8');\n const schemas = Array.isArray(config.jsonLd) ? config.jsonLd : [config.jsonLd];\n const ldBlocks = schemas\n .map((s) => `<script type=\"application/ld+json\">${JSON.stringify(s)}</script>`)\n .join('\\n ');\n html = html.replace('</head>', ` ${ldBlocks}\\n </head>`);\n fs.writeFileSync(indexPath, html, 'utf-8');\n }\n }\n\n /* v8 ignore stop */\n const extras = config.jsonLd ? ', JSON-LD' : '';\n console.log(`Generated: sitemap.xml (${routes.length} URLs), robots.txt, llms.txt${extras}`);\n },\n };\n}\n", "// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\n/**\n * SpecifyJS Noscript Plugin for Vite\n *\n * Generates a `<noscript>` fallback block inside the built index.html,\n * providing a fully navigable static HTML document for environments\n * where JavaScript is disabled (accessibility) or not executed\n * (search engine crawlers).\n *\n * The noscript content is a single long-form document with:\n * - A navigation bar with anchor links to each section\n * - Each section rendered as semantic HTML (headings, paragraphs, lists)\n * - Internal links mapped to `#section-id` anchors\n *\n * Usage in vite.config.ts:\n * import { specifyJsNoscriptPlugin } from 'specifyjs/build';\n * export default defineConfig({\n * plugins: [\n * specifyJsNoscriptPlugin({\n * title: 'My App',\n * sections: [\n * { id: 'home', title: 'Home', html: '<h1>Welcome</h1><p>...</p>' },\n * { id: 'docs', title: 'Docs', html: '<h2>Getting Started</h2>...' },\n * ],\n * }),\n * ],\n * });\n */\n\nimport type { Plugin } from 'vite';\nimport fs from 'fs';\nimport path from 'path';\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface NoscriptSection {\n /** Anchor ID (used in href=\"#id\" links) */\n id: string;\n /** Display title in the navigation bar */\n title: string;\n /** Static HTML content for this section.\n * Can include headings, paragraphs, lists, tables, code blocks, images.\n * Interactive elements (buttons, inputs) are stripped automatically. */\n html: string;\n}\n\nexport interface NoscriptPluginConfig {\n /** Page title shown at the top of the noscript document */\n title?: string;\n /** Subtitle / description shown below the title */\n description?: string;\n /** Sections to render in the noscript block */\n sections: NoscriptSection[];\n /** Copyright notice shown at the bottom */\n copyright?: string;\n /** CSS class prefix for noscript elements (default: 'ns') */\n classPrefix?: string;\n /** Maximum content length in bytes before truncation warning (default: 512KB) */\n maxContentSize?: number;\n}\n\n// ---------------------------------------------------------------------------\n// HTML sanitization\n// ---------------------------------------------------------------------------\n\n/**\n * Allowed HTML tags for noscript content.\n * Only these tags are preserved \u2014 everything else is stripped.\n * This whitelist approach avoids the inherent insecurity of\n * regex-based blocklist sanitization (no bypasses possible).\n */\nconst ALLOWED_TAGS = new Set([\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'p',\n 'br',\n 'hr',\n 'blockquote',\n 'ul',\n 'ol',\n 'li',\n 'dl',\n 'dt',\n 'dd',\n 'table',\n 'thead',\n 'tbody',\n 'tfoot',\n 'tr',\n 'th',\n 'td',\n 'caption',\n 'a',\n 'strong',\n 'em',\n 'b',\n 'i',\n 'u',\n 's',\n 'code',\n 'pre',\n 'kbd',\n 'samp',\n 'span',\n 'div',\n 'section',\n 'article',\n 'aside',\n 'header',\n 'footer',\n 'nav',\n 'img',\n 'figure',\n 'figcaption',\n 'picture',\n 'source',\n 'details',\n 'summary',\n 'mark',\n 'small',\n 'sub',\n 'sup',\n 'abbr',\n 'time',\n]);\n\n/** Tags whose content is removed entirely (not just the tag itself) */\nconst CONTENT_BLOCK_TAGS = new Set([\n 'script',\n 'style',\n 'textarea',\n 'select',\n 'noscript',\n 'iframe',\n 'object',\n 'embed',\n 'applet',\n]);\n\n/** Allowed attributes (no event handlers, no javascript: URIs) */\nconst ALLOWED_ATTRS = new Set([\n 'href',\n 'src',\n 'alt',\n 'title',\n 'width',\n 'height',\n 'class',\n 'id',\n 'name',\n 'colspan',\n 'rowspan',\n 'scope',\n 'rel',\n 'target',\n 'lang',\n 'dir',\n 'role',\n 'aria-label',\n 'aria-describedby',\n 'aria-hidden',\n 'style', // style is allowed but javascript: URIs within it are stripped\n]);\n\n/**\n * Strip interactive elements from HTML using a whitelist approach.\n * Only allowed tags with allowed attributes are kept. All other\n * tags are removed (their text content is preserved). This is\n * immune to regex bypass attacks because unknown tags are never\n * emitted \u2014 they're simply not in the whitelist.\n */\nexport function stripInteractiveElements(html: string): string {\n // Parse tags iteratively \u2014 no regex on untrusted HTML structure\n const out: string[] = [];\n let i = 0;\n const len = html.length;\n\n while (i < len) {\n const ltIdx = html.indexOf('<', i);\n if (ltIdx === -1) {\n // No more tags \u2014 emit remaining text\n out.push(html.slice(i));\n break;\n }\n\n // Emit text before the tag\n if (ltIdx > i) out.push(html.slice(i, ltIdx));\n\n // Find end of tag\n const gtIdx = html.indexOf('>', ltIdx);\n if (gtIdx === -1) {\n // Unclosed tag \u2014 emit as text\n out.push(html.slice(ltIdx));\n break;\n }\n\n const tagContent = html.slice(ltIdx + 1, gtIdx);\n const isClosing = tagContent.startsWith('/');\n const tagBody = isClosing ? tagContent.slice(1).trim() : tagContent.trim();\n\n // Extract tag name (first word)\n const spaceIdx = tagBody.search(/[\\s/]/);\n const tagName = (spaceIdx === -1 ? tagBody : tagBody.slice(0, spaceIdx)).toLowerCase();\n\n if (ALLOWED_TAGS.has(tagName)) {\n if (isClosing) {\n out.push(`</${tagName}>`);\n } else {\n // Rebuild tag with only allowed attributes\n const attrStr = spaceIdx === -1 ? '' : tagBody.slice(spaceIdx);\n const safeAttrs = filterAttributes(attrStr);\n const selfClose = tagContent.trimEnd().endsWith('/') ? ' /' : '';\n out.push(`<${tagName}${safeAttrs}${selfClose}>`);\n }\n } else if (!isClosing && CONTENT_BLOCK_TAGS.has(tagName)) {\n // Blocked tags whose CONTENT must also be removed (script, textarea, select, style)\n // Skip everything until the matching closing tag\n const closeTag = `</${tagName}`;\n const closeIdx = html.toLowerCase().indexOf(closeTag, gtIdx + 1);\n if (closeIdx !== -1) {\n const closeGt = html.indexOf('>', closeIdx);\n i = closeGt !== -1 ? closeGt + 1 : gtIdx + 1;\n continue;\n }\n }\n // else: tag not in whitelist \u2014 silently dropped (text content preserved)\n\n i = gtIdx + 1;\n }\n\n return out.join('');\n}\n\n/** Filter attributes: keep only whitelisted, strip javascript: URIs */\nfunction filterAttributes(attrString: string): string {\n const result: string[] = [];\n // Match attr=\"value\" or attr='value' or attr=value or standalone attr\n const attrRegex = /([a-z][a-z0-9-]*)\\s*(?:=\\s*(?:\"([^\"]*)\"|'([^']*)'|(\\S+)))?/gi;\n let match: RegExpExecArray | null;\n while ((match = attrRegex.exec(attrString)) !== null) {\n const name = match[1]!.toLowerCase();\n const value = match[2] ?? match[3] ?? match[4] ?? '';\n if (!ALLOWED_ATTRS.has(name)) continue;\n // Block javascript: URIs in href/src/style\n if (/javascript\\s*:/i.test(value)) continue;\n result.push(` ${name}=\"${escapeAttrValue(value)}\"`);\n }\n return result.join('');\n}\n\nfunction escapeAttrValue(val: string): string {\n return val\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n// ---------------------------------------------------------------------------\n// Noscript HTML generation\n// ---------------------------------------------------------------------------\n\nexport function generateNoscriptHtml(config: NoscriptPluginConfig): string {\n const prefix = config.classPrefix ?? 'ns';\n const sections = config.sections;\n\n if (sections.length === 0) return '';\n\n // Navigation bar\n const navLinks = sections\n .map((s) => `<a href=\"#${s.id}\" class=\"${prefix}-nav-link\">${escapeHtml(s.title)}</a>`)\n .join('\\n ');\n\n // Section blocks\n const sectionBlocks = sections\n .map((s) => {\n const cleanHtml = stripInteractiveElements(s.html);\n return `\n <section id=\"${s.id}\" class=\"${prefix}-section\">\n <h2 class=\"${prefix}-section-title\">${escapeHtml(s.title)}</h2>\n <div class=\"${prefix}-section-content\">\n ${cleanHtml}\n </div>\n <p class=\"${prefix}-back-to-top\"><a href=\"#${prefix}-top\">Back to top</a></p>\n </section>`;\n })\n .join('\\n');\n\n const title = config.title ? `<h1 class=\"${prefix}-title\">${escapeHtml(config.title)}</h1>` : '';\n const desc = config.description\n ? `<p class=\"${prefix}-desc\">${escapeHtml(config.description)}</p>`\n : '';\n const copyright = config.copyright\n ? `<footer class=\"${prefix}-footer\"><p>${escapeHtml(config.copyright)}</p></footer>`\n : '';\n\n return `\n <noscript>\n <style>\n .${prefix}-container {\n max-width: 900px;\n margin: 0 auto;\n padding: 20px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n line-height: 1.6;\n color: #1f2937;\n }\n .${prefix}-title {\n font-size: 2rem;\n margin-bottom: 0.5rem;\n color: #0f172a;\n }\n .${prefix}-desc {\n font-size: 1.1rem;\n color: #64748b;\n margin-bottom: 1.5rem;\n }\n .${prefix}-nav {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 0;\n border-bottom: 1px solid #e2e8f0;\n margin-bottom: 2rem;\n position: sticky;\n top: 0;\n background: white;\n z-index: 10;\n }\n .${prefix}-nav-link {\n padding: 6px 14px;\n border-radius: 6px;\n background: #f1f5f9;\n color: #3b82f6;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n }\n .${prefix}-nav-link:hover {\n background: #3b82f6;\n color: white;\n }\n .${prefix}-section {\n margin-bottom: 3rem;\n padding-bottom: 2rem;\n border-bottom: 1px solid #f1f5f9;\n }\n .${prefix}-section-title {\n font-size: 1.5rem;\n color: #1e293b;\n margin-bottom: 1rem;\n padding-top: 1rem;\n }\n .${prefix}-section-content h3 {\n font-size: 1.2rem;\n margin-top: 1.5rem;\n color: #334155;\n }\n .${prefix}-section-content p {\n margin: 0.5rem 0;\n }\n .${prefix}-section-content pre {\n background: #1e293b;\n color: #e2e8f0;\n padding: 12px 16px;\n border-radius: 6px;\n overflow-x: auto;\n font-size: 13px;\n line-height: 1.5;\n }\n .${prefix}-section-content code {\n background: #f1f5f9;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 0.9em;\n }\n .${prefix}-section-content pre code {\n background: none;\n padding: 0;\n }\n .${prefix}-section-content table {\n width: 100%;\n border-collapse: collapse;\n margin: 1rem 0;\n }\n .${prefix}-section-content th,\n .${prefix}-section-content td {\n padding: 8px 12px;\n border: 1px solid #e2e8f0;\n text-align: left;\n }\n .${prefix}-section-content th {\n background: #f8fafc;\n font-weight: 600;\n }\n .${prefix}-section-content img {\n max-width: 100%;\n height: auto;\n }\n .${prefix}-back-to-top {\n font-size: 13px;\n margin-top: 1.5rem;\n }\n .${prefix}-back-to-top a {\n color: #3b82f6;\n text-decoration: none;\n }\n .${prefix}-footer {\n margin-top: 3rem;\n padding-top: 1rem;\n border-top: 1px solid #e2e8f0;\n color: #94a3b8;\n font-size: 13px;\n text-align: center;\n }\n .${prefix}-js-notice {\n background: #fef3c7;\n border: 1px solid #f59e0b;\n border-radius: 6px;\n padding: 12px 16px;\n margin-bottom: 1.5rem;\n font-size: 14px;\n color: #92400e;\n }\n </style>\n <div id=\"${prefix}-top\" class=\"${prefix}-container\">\n ${title}\n ${desc}\n <div class=\"${prefix}-js-notice\">\n This page works best with JavaScript enabled. You are viewing a\n static version of the content.\n </div>\n <nav class=\"${prefix}-nav\" aria-label=\"Section navigation\">\n ${navLinks}\n </nav>\n ${sectionBlocks}\n ${copyright}\n </div>\n </noscript>`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n// ---------------------------------------------------------------------------\n// Vite Plugin\n// ---------------------------------------------------------------------------\n\nexport function specifyJsNoscriptPlugin(config: NoscriptPluginConfig): Plugin {\n return {\n name: 'specifyjs-noscript',\n /* v8 ignore start -- Vite closeBundle hook runs at build time, not in jsdom tests */\n closeBundle() {\n const distDir = path.resolve(process.cwd(), 'dist');\n const indexPath = path.join(distDir, 'index.html');\n\n if (!fs.existsSync(indexPath)) {\n console.warn('[specifyjs-noscript] index.html not found in dist/');\n return;\n }\n\n const noscriptHtml = generateNoscriptHtml(config);\n\n if (!noscriptHtml) {\n console.warn('[specifyjs-noscript] No sections provided, skipping.');\n return;\n }\n\n // Check content size\n const maxSize = config.maxContentSize ?? 512 * 1024;\n const noscriptSize = Buffer.byteLength(noscriptHtml, 'utf-8');\n if (noscriptSize > maxSize) {\n console.warn(\n `[specifyjs-noscript] Noscript content is ${(noscriptSize / 1024).toFixed(0)}KB ` +\n `(limit: ${(maxSize / 1024).toFixed(0)}KB). Consider reducing section content.`,\n );\n }\n\n // Inject before </body>\n let html = fs.readFileSync(indexPath, 'utf-8');\n html = html.replace('</body>', `${noscriptHtml}\\n</body>`);\n fs.writeFileSync(indexPath, html, 'utf-8');\n\n console.log(\n `Generated: noscript fallback (${config.sections.length} sections, ` +\n `${(noscriptSize / 1024).toFixed(1)}KB)`,\n );\n },\n /* v8 ignore stop */\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "path", "walkDocs", "rootDir", "results", "stack", "dir", "prefix", "entries", "entry", "generateSitemap", "siteUrl", "routes", "today", "r", "generateRobots", "extraRules", "lines", "generateLlmsTxt", "config", "docPaths", "descLines", "dl", "guideNames", "p", "apiNames", "g", "a", "specifyJsSeoPlugin", "distDir", "dp", "sitemap", "robots", "llmsTxt", "indexPath", "html", "ldBlocks", "s", "extras", "fs", "path", "ALLOWED_TAGS", "CONTENT_BLOCK_TAGS", "ALLOWED_ATTRS", "stripInteractiveElements", "html", "out", "i", "len", "ltIdx", "gtIdx", "tagContent", "isClosing", "tagBody", "spaceIdx", "tagName", "attrStr", "safeAttrs", "filterAttributes", "selfClose", "closeTag", "closeIdx", "closeGt", "attrString", "result", "attrRegex", "match", "name", "value", "escapeAttrValue", "val", "generateNoscriptHtml", "config", "prefix", "sections", "navLinks", "s", "escapeHtml", "sectionBlocks", "cleanHtml", "title", "desc", "copyright", "str", "specifyJsNoscriptPlugin", "distDir", "indexPath", "noscriptHtml", "maxSize", "noscriptSize"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
/* (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE */
|
|
2
|
+
"use strict";var O=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var ne=(e,t)=>{for(var n in t)O(e,n,{get:t[n],enumerable:!0})},re=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ee(t))!te.call(e,r)&&r!==n&&O(e,r,{get:()=>t[r],enumerable:!(o=Y(t,r))||o.enumerable});return e};var oe=e=>re(O({},"__esModule",{value:!0}),e);var fe={};ne(fe,{RestError:()=>v,createGraphQLClient:()=>B,createGrpcWebClient:()=>j,createRestClient:()=>W,defineMessage:()=>N,gql:()=>_,useMutation:()=>K,useProto:()=>J,useQuery:()=>X,useRest:()=>F});module.exports=oe(fe);var H=null;function G(){if(H===null)throw new Error("Invalid hook call. Hooks can only be called inside the body of a function component.");return H}function w(e){return G().useState(e)}function q(e,t){return G().useEffect(e,t)}function k(e,t){return G().useCallback(e,t)}function x(e){return G().useRef(e)}function S(e){if(e.startsWith("//"))throw new Error(`[SpecifyJS] Protocol-relative URL rejected: "${e}". Use an explicit https:// prefix.`);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("data:"))return;let t;try{t=new URL(e,typeof window<"u"?window.location.href:void 0)}catch{return}if(t.protocol!=="https:"&&!(t.hostname==="localhost"||t.hostname==="127.0.0.1"))throw new Error(`[SpecifyJS] Insecure URL rejected: "${e}". SpecifyJS enforces HTTPS-only for all network requests. Use https:// or a relative URL. Localhost URLs are allowed for development.`)}var v=class extends Error{constructor(t,n,o,r,u){super(t),this.name="RestError",this.status=n,this.statusText=o,this.data=r,this.config=u}};function se(e){let t={};return e.forEach((n,o)=>{t[o]=n}),t}function ie(e,t){let n=e.endsWith("/")?e.slice(0,-1):e,o=t.startsWith("/")?t:"/"+t;return n+o}function W(e){let{baseURL:t,headers:n={},timeout:o,interceptors:r={}}=e,u=r.request??[],c=r.response??[],f=r.error??[];async function h(l,a,s,p){let i={url:ie(t,a),method:l,headers:{...n,...p?.headers??{}},body:s,signal:p?.signal,timeout:p?.timeout??o};s!=null&&!i.headers["Content-Type"]&&(i.headers["Content-Type"]="application/json");for(let R of u)i=await R(i);let g,d;if(i.timeout&&i.timeout>0&&(d=new AbortController,g=setTimeout(()=>{d.abort()},i.timeout),i.signal)){let R=i.signal;R.aborted?d.abort():R.addEventListener("abort",()=>{d.abort()})}let T=d?d.signal:i.signal,y={method:i.method,headers:i.headers,signal:T};s!=null&&(y.body=JSON.stringify(s));let m;try{S(i.url),m=await fetch(i.url,y)}catch(R){g!==void 0&&clearTimeout(g);let z=R instanceof DOMException&&R.name==="AbortError"?`Request timeout after ${i.timeout}ms`:R instanceof Error?R.message:"Network error",P=new v(z,0,"",null,i);for(let Z of f)P=await Z(P);throw P}g!==void 0&&clearTimeout(g);let E=m.headers.get("content-type")??"",b;if(E.includes("application/json"))b=await m.json();else{let R=await m.text();try{b=JSON.parse(R)}catch{b=R}}let C=se(m.headers);if(!m.ok){let R=new v(`Request failed with status ${m.status}`,m.status,m.statusText,b,i);for(let M of f)R=await M(R);throw R}let A={data:b,status:m.status,headers:C,ok:m.ok};for(let R of c)A=R(A);return A}return{get(l,a){return h("GET",l,void 0,a)},post(l,a,s){return h("POST",l,a,s)},put(l,a,s){return h("PUT",l,a,s)},patch(l,a,s){return h("PATCH",l,a,s)},delete(l,a){return h("DELETE",l,void 0,a)}}}function F(e,t,n){let o=n?.method??"GET",r=n?.body,u=n?.deps??[],c=n?.enabled??!0,[f,h]=w(null),[l,a]=w(c),[s,p]=w(null),i=x(null),g=x(!0),d=k(()=>{if(!c){a(!1);return}i.current&&i.current.abort();let y=new AbortController;i.current=y,a(!0),p(null);let m={signal:y.signal},E,b=o.toUpperCase();b==="POST"?E=e.post(t,r,m):b==="PUT"?E=e.put(t,r,m):b==="PATCH"?E=e.patch(t,r,m):b==="DELETE"?E=e.delete(t,m):E=e.get(t,m),E.then(C=>{g.current&&!y.signal.aborted&&(h(C.data),a(!1))}).catch(C=>{g.current&&!y.signal.aborted&&(p(C instanceof v?C:new v(C instanceof Error?C.message:"Unknown error",0,"",null,{url:t,method:b,headers:{}})),a(!1))})},[e,t,o,r,c,...u]);q(()=>(g.current=!0,d(),()=>{g.current=!1,i.current&&i.current.abort()}),[d]);let T=k(()=>{d()},[d]);return{data:f,loading:l,error:s,refetch:T}}function L(e){let t=[],n=e>>>0;for(;n>127;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function U(e,t){let n=0,o=0,r=t;for(;r<e.length;){let u=e[r];if(n|=(u&127)<<o,r++,(u&128)===0)return[n>>>0,r];if(o+=7,o>=35)throw new Error("Varint too long")}throw new Error("Unexpected end of data while decoding varint")}var Q=0,I=1,D=2;function ae(e){switch(e){case"int32":case"uint32":case"bool":case"enum":return Q;case"float64":return I;case"string":case"bytes":return D}}function V(e,t){return L(e<<3|t)}function $(e,t){switch(e){case"int32":return L(t|0);case"uint32":return L(t>>>0);case"bool":return L(t?1:0);case"enum":return L(t>>>0);case"float64":{let n=new ArrayBuffer(8);return new DataView(n).setFloat64(0,t,!0),Array.from(new Uint8Array(n))}case"string":{let n=new TextEncoder().encode(t);return[...L(n.length),...n]}case"bytes":{let n=t;return[...L(n.length),...n]}}}function ue(e,t,n,o){switch(t){case Q:{let[r,u]=U(n,o);switch(e){case"bool":return[r!==0,u];case"int32":return[r|0,u];case"uint32":case"enum":return[r>>>0,u];default:return[r,u]}}case I:{if(o+8>n.length)throw new Error("Unexpected end of data while decoding 64-bit value");let r=new ArrayBuffer(8),u=new Uint8Array(r);for(let f=0;f<8;f++)u[f]=n[o+f]??0;return[new DataView(r).getFloat64(0,!0),o+8]}case D:{let[r,u]=U(n,o);if(u+r>n.length)throw new Error("Unexpected end of data while decoding length-delimited value");let c=n.slice(u,u+r);return e==="string"?[new TextDecoder().decode(c),u+r]:[c,u+r]}default:throw new Error(`Unknown wire type: ${t}`)}}function N(e,t){let n=new Map;for(let[u,c]of Object.entries(t))n.set(c.tag,{fieldName:u,descriptor:c});function o(u){let c=[],f=u;for(let[h,l]of Object.entries(t)){let a=f[h];if(a==null)continue;let s=ae(l.type);if(l.repeated){let p=a;for(let i of p)c.push(...V(l.tag,s)),c.push(...$(l.type,i))}else c.push(...V(l.tag,s)),c.push(...$(l.type,a))}return new Uint8Array(c)}function r(u){let c={};for(let[h,l]of Object.entries(t))l.repeated&&(c[h]=[]);let f=0;for(;f<u.length;){let[h,l]=U(u,f),a=h>>>3,s=h&7;f=l;let p=n.get(a);if(!p){f=ce(s,u,f);continue}let[i,g]=ue(p.descriptor.type,s,u,f);f=g,p.descriptor.repeated?c[p.fieldName].push(i):c[p.fieldName]=i}return c}return{name:e,fields:t,encode:o,decode:r}}function ce(e,t,n){switch(e){case Q:{let[,o]=U(t,n);return o}case I:return n+8;case D:{let[o,r]=U(t,n);return r+o}default:throw new Error(`Cannot skip unknown wire type: ${e}`)}}function le(e,t=0){let n=new Uint8Array(5+e.length);return n[0]=t,new DataView(n.buffer,n.byteOffset,n.byteLength).setUint32(1,e.length,!1),n.set(e,5),n}function pe(e){if(e.length<5)throw new Error("gRPC-Web frame too short");let t=e[0]??0,o=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(1,!1);if(e.length<5+o)throw new Error("gRPC-Web frame data incomplete");let r=e.slice(5,5+o);return[t,r,5+o]}function j(e){let{baseURL:t,headers:n}=e;async function o(r,u,c,f,h){let l=c.encode(h),a=le(l),s=`${t.replace(/\/+$/,"")}/${r}/${u}`,p={"Content-Type":"application/grpc-web+proto",Accept:"application/grpc-web+proto","X-Grpc-Web":"1",...n};S(s);let i=await fetch(s,{method:"POST",headers:p,body:a.buffer});if(!i.ok)throw new Error(`gRPC-Web request failed: ${i.status} ${i.statusText}`);let g=new Uint8Array(await i.arrayBuffer()),d=0;for(;d<g.length;){let[T,y,m]=pe(g.subarray(d));if(d+=m,(T&128)===0)return f.decode(y)}throw new Error("No data frame found in gRPC-Web response")}return{unary:o}}function J(e,t,n,o,r,u,c){let[f,h]=w(null),[l,a]=w(!1),[s,p]=w(null),i=x(!0),g=x(u);g.current=u;let d=c?.enabled!==!1,T=k(()=>{d&&(a(!0),p(null),e.unary(t,n,o,r,g.current).then(y=>{i.current&&(h(y),a(!1))}).catch(y=>{i.current&&(p(y instanceof Error?y:new Error(String(y))),a(!1))}))},[e,t,n,o,r,d]);return q(()=>(i.current=!0,T(),()=>{i.current=!1}),[T]),{data:f,loading:l,error:s,refetch:T}}function _(e,...t){let n="";for(let o=0;o<e.length;o++)if(n+=e[o],o<t.length){let r=String(t[o]);/[{}():]/.test(r)&&typeof console<"u"&&console.warn("[SpecifyJS] gql: Interpolated value contains GraphQL metacharacters. Use variables parameter instead of string interpolation to prevent injection."),n+=r}return n.replace(/\s+/g," ").trim()}function B(e){let{url:t,headers:n,credentials:o,cache:r=!1}=e,u=100,c=new Map;function f(a,s){return JSON.stringify({query:a,variables:s})}async function h(a,s){let p={"Content-Type":"application/json",...n},i=JSON.stringify({query:a,variables:s});S(t);let g=await fetch(t,{method:"POST",headers:p,credentials:o,body:i});if(!g.ok)throw new Error(`GraphQL request failed with status ${g.status}`);let d=await g.json();return{data:d.data??null,errors:d.errors??null,...d.extensions!==void 0?{extensions:d.extensions}:{}}}return{async query(a,s){if(r){let p=f(a,s),i=c.get(p);if(i)return i;let g=await h(a,s);if(c.size>=u){let d=c.keys().next().value;d!==void 0&&c.delete(d)}return c.set(p,g),g}return h(a,s)},async mutate(a,s){return h(a,s)},clearCache(){c.clear()},invalidate(a){for(let s of c.keys())try{JSON.parse(s).query===a&&c.delete(s)}catch{}}}}function X(e,t,n){let o=n?.variables,r=n?.deps,u=n?.enabled??!0,[c,f]=w(null),[h,l]=w(u),[a,s]=w(null),p=x(0),i=k(()=>{if(!u)return;let d=++p.current;l(!0),s(null),e.query(t,o).then(T=>{p.current===d&&(f(T.data),s(T.errors),l(!1))}).catch(T=>{p.current===d&&(s([{message:T instanceof Error?T.message:String(T)}]),l(!1))})},[e,t,o,u]),g=r?[i,...r]:[i];return q(()=>{i()},g),{data:c,loading:h,error:a,refetch:i}}function K(e,t){let[n,o]=w(null),[r,u]=w(!1),[c,f]=w(null),h=async a=>{u(!0),f(null);try{let s=await e.mutate(t,a);return o(s.data),f(s.errors),u(!1),s}catch(s){let p=[{message:s instanceof Error?s.message:String(s)}];return f(p),u(!1),{data:null,errors:p,extensions:void 0}}};return[k(((...a)=>h(a[0])),[e,t]),{data:n,loading:r,error:c}]}
|
|
2
3
|
//# sourceMappingURL=specifyjs-client.cjs.js.map
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"specifyjs-client.cjs.js","sources":["../../src/hooks/index.ts","../../src/shared/secure-fetch.ts","../../src/client/rest.ts","../../src/client/protobuf.ts","../../src/client/graphql.ts"],"sourcesContent":[null,null,null,null,null],"names":["resolveDispatcher","Error","useState","initialState","useEffect","create","deps","useCallback","callback","useRef","initialValue","assertSecureUrl","url","startsWith","parsed","URL","window","location","href","undefined","protocol","hostname","RestError","constructor","message","status","statusText","data","config","super","this","name","buildURL","baseURL","path","endsWith","slice","encodeVarint","value","bytes","v","push","decodeVarint","offset","result","shift","pos","length","b","wireTypeFor","type","encodeFieldKey","tag","wireType","encodeFieldValue","buf","ArrayBuffer","DataView","setFloat64","Array","from","Uint8Array","encoded","TextEncoder","encode","decodeFieldValue","val","newOffset","view","i","getFloat64","len","dataStart","TextDecoder","decode","skipField","next","decodeGrpcWebFrame","flags","buffer","byteOffset","byteLength","getUint32","headers","configHeaders","credentials","cache","cacheEnabled","responseCache","Map","async","execute","query","variables","reqHeaders","body","JSON","stringify","response","fetch","method","ok","json","errors","extensions","key","buildCacheKey","cached","get","size","oldest","keys","delete","set","mutation","clearCache","clear","invalidate","parse","extraHeaders","unary","service","reqType","resType","request","frame","setUint32","encodeGrpcWebFrame","replace","hdrs","Accept","responseBytes","arrayBuffer","consumed","subarray","defaultHeaders","timeout","defaultTimeout","interceptors","requestInterceptors","responseInterceptors","errorInterceptors","error","opts","timeoutId","controller","reqConfig","signal","interceptor","AbortController","setTimeout","abort","externalSignal","aborted","addEventListener","fetchSignal","fetchInit","err","clearTimeout","DOMException","restError","includes","text","parsedHeaders","forEach","parseResponseHeaders","restResponse","post","put","patch","fields","tagToField","fieldName","descriptor","Object","entries","obj","out","record","wt","repeated","arr","item","keyVarint","entry","nextOffset","strings","values","String","test","console","warn","trim","client","setData","loading","setLoading","setError","args","mutate","mutateFn","mountedRef","requestRef","current","enabled","refetch","then","res","catch","fetchIdRef","fetchData","id","controllerRef","requestOpts","promise","upperMethod","toUpperCase"],"mappings":"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"}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/client/index.ts", "../src/hooks/index.ts", "../src/shared/secure-fetch.ts", "../src/client/rest.ts", "../src/client/protobuf.ts", "../src/client/graphql.ts"],
|
|
4
|
+
"sourcesContent": ["// ============================================================================\n// SpecifyJS Client \u2014 Native API client modules\n// ============================================================================\n// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\nexport {\n createRestClient,\n useRest,\n RestError,\n type RestClientConfig,\n type RestClient,\n type RestResponse,\n type RequestConfig,\n type RequestInterceptor,\n type ResponseInterceptor,\n} from './rest';\n\nexport {\n defineMessage,\n createGrpcWebClient,\n useProto,\n type MessageType,\n type GrpcWebClient,\n} from './protobuf';\n\nexport {\n createGraphQLClient,\n gql,\n useQuery,\n useMutation,\n type GraphQLClient,\n type GraphQLClientConfig,\n type GraphQLResponse,\n type GraphQLError,\n} from './graphql';\n", "// ============================================================================\n// SpecifyJS Hooks\n// ============================================================================\n// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\nimport type { SpecContext } from '../shared/types';\n\n// Internal: the currently rendering fiber sets these\ntype Dispatcher = {\n useState: typeof useState;\n useEffect: typeof useEffect;\n useContext: typeof useContext;\n useReducer: typeof useReducer;\n useCallback: typeof useCallback;\n useMemo: typeof useMemo;\n useRef: typeof useRef;\n useImperativeHandle: typeof useImperativeHandle;\n useLayoutEffect: typeof useLayoutEffect;\n useDebugValue: typeof useDebugValue;\n useId: typeof useId;\n useDeferredValue: typeof useDeferredValue;\n useTransition: typeof useTransition;\n useSyncExternalStore: typeof useSyncExternalStore;\n useInsertionEffect: typeof useInsertionEffect;\n};\n\nlet currentDispatcher: Dispatcher | null = null;\n\nexport function __setDispatcher(dispatcher: Dispatcher | null): void {\n currentDispatcher = dispatcher;\n}\n\nexport function __getDispatcher(): Dispatcher | null {\n return currentDispatcher;\n}\n\nfunction resolveDispatcher(): Dispatcher {\n if (currentDispatcher === null) {\n throw new Error(\n 'Invalid hook call. Hooks can only be called inside the body of a function component.',\n );\n }\n return currentDispatcher;\n}\n\nexport function useState<T>(\n initialState: T | (() => T),\n): [T, (action: T | ((prev: T) => T)) => void] {\n return resolveDispatcher().useState(initialState);\n}\n\nexport function useEffect(create: () => void | (() => void), deps?: readonly unknown[]): void {\n return resolveDispatcher().useEffect(create, deps);\n}\n\nexport function useContext<T>(context: SpecContext<T>): T {\n return resolveDispatcher().useContext(context);\n}\n\nexport function useReducer<S, A>(\n reducer: (state: S, action: A) => S,\n initialArg: S,\n init?: (arg: S) => S,\n): [S, (action: A) => void] {\n return resolveDispatcher().useReducer(reducer, initialArg, init);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function useCallback<T extends (...args: any[]) => any>(\n callback: T,\n deps: readonly unknown[],\n): T {\n return resolveDispatcher().useCallback(callback, deps);\n}\n\nexport function useMemo<T>(factory: () => T, deps: readonly unknown[]): T {\n return resolveDispatcher().useMemo(factory, deps);\n}\n\nexport function useRef<T>(initialValue: T): { current: T };\nexport function useRef<T>(initialValue: T | null): { current: T | null };\nexport function useRef<T>(): { current: T | undefined };\nexport function useRef<T>(initialValue?: T): { current: T | undefined } {\n return resolveDispatcher().useRef(initialValue);\n}\n\nexport function useImperativeHandle<T>(\n ref: { current: T | null } | ((instance: T | null) => void) | null,\n createHandle: () => T,\n deps?: readonly unknown[],\n): void {\n return resolveDispatcher().useImperativeHandle(ref, createHandle, deps);\n}\n\nexport function useLayoutEffect(\n create: () => void | (() => void),\n deps?: readonly unknown[],\n): void {\n return resolveDispatcher().useLayoutEffect(create, deps);\n}\n\nexport function useDebugValue<T>(value: T, format?: (value: T) => unknown): void {\n return resolveDispatcher().useDebugValue(value, format);\n}\n\nexport function useId(): string {\n return resolveDispatcher().useId();\n}\n\nexport function useDeferredValue<T>(value: T): T {\n return resolveDispatcher().useDeferredValue(value);\n}\n\nexport function useTransition(): [boolean, (callback: () => void) => void] {\n return resolveDispatcher().useTransition();\n}\n\nexport function useSyncExternalStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n getServerSnapshot?: () => T,\n): T {\n return resolveDispatcher().useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n\nexport function useInsertionEffect(\n create: () => void | (() => void),\n deps?: readonly unknown[],\n): void {\n return resolveDispatcher().useInsertionEffect(create, deps);\n}\n\n// Custom hooks (not dispatcher-based)\nexport { useHead } from './use-head';\nexport type { HeadMeta, HeadHttpEquiv } from './use-head';\n", "// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\n/**\n * Secure fetch wrapper \u2014 enforces HTTPS-only policy.\n *\n * SpecifyJS prohibits HTTP connections. All network requests must use\n * HTTPS or be relative URLs. This prevents data from being transmitted\n * in plaintext, protecting against eavesdropping and MITM attacks.\n *\n * Exceptions:\n * - Relative URLs (./path, /path) \u2014 resolved by the browser\n * - localhost and 127.0.0.1 \u2014 development only\n */\n\n/**\n * Validate that a URL uses HTTPS or is a relative/localhost URL.\n * Throws if the URL uses plaintext HTTP.\n */\nexport function assertSecureUrl(url: string): void {\n // Block protocol-relative URLs (//evil.com) \u2014 they inherit the page's protocol\n if (url.startsWith('//')) {\n throw new Error(\n `[SpecifyJS] Protocol-relative URL rejected: \"${url}\". ` + `Use an explicit https:// prefix.`,\n );\n }\n\n // Relative URLs are always allowed\n if (url.startsWith('/') || url.startsWith('./') || url.startsWith('../')) {\n return;\n }\n\n // Data URLs are allowed\n if (url.startsWith('data:')) {\n return;\n }\n\n // Parse absolute URLs\n let parsed: URL;\n try {\n parsed = new URL(url, typeof window !== 'undefined' ? window.location.href : undefined);\n } catch {\n /* v8 ignore next 2 -- URL parse failure is environment-specific; jsdom always provides a base */\n return;\n }\n\n // Allow HTTPS\n if (parsed.protocol === 'https:') {\n return;\n }\n\n // Allow localhost/127.0.0.1 for development (any protocol)\n if (parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1') {\n return;\n }\n\n // Reject HTTP and other insecure protocols\n throw new Error(\n `[SpecifyJS] Insecure URL rejected: \"${url}\". ` +\n `SpecifyJS enforces HTTPS-only for all network requests. ` +\n `Use https:// or a relative URL. ` +\n `Localhost URLs are allowed for development.`,\n );\n}\n\n/**\n * Secure fetch \u2014 drop-in replacement for window.fetch that enforces HTTPS.\n * Use this instead of fetch() directly to comply with the HTTPS-only policy.\n */\nexport function secureFetch(input: string | URL | Request, init?: RequestInit): Promise<Response> {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n assertSecureUrl(url);\n return fetch(input, init);\n}\n", "// ============================================================================\n// SpecifyJS REST Client\n// Zero-dependency REST client built on the browser Fetch API\n// ============================================================================\n// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\nimport { useState, useEffect, useCallback, useRef } from '../hooks/index';\nimport { assertSecureUrl } from '../shared/secure-fetch';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface RestClientConfig {\n baseURL: string;\n headers?: Record<string, string>;\n timeout?: number;\n interceptors?: {\n request?: RequestInterceptor[];\n response?: ResponseInterceptor[];\n error?: ErrorInterceptor[];\n };\n}\n\nexport interface RequestConfig {\n url: string;\n method: string;\n headers: Record<string, string>;\n body?: unknown;\n signal?: AbortSignal;\n timeout?: number;\n}\n\nexport interface RestResponse<T> {\n data: T;\n status: number;\n headers: Record<string, string>;\n ok: boolean;\n}\n\nexport type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;\nexport type ResponseInterceptor = (response: RestResponse<unknown>) => RestResponse<unknown>;\nexport type ErrorInterceptor = (error: RestError) => RestError | Promise<RestError>;\n\nexport interface RequestOptions {\n headers?: Record<string, string>;\n signal?: AbortSignal;\n timeout?: number;\n}\n\nexport interface RestClient {\n get<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>>;\n post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;\n put<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;\n patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;\n delete<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>>;\n}\n\n// ---------------------------------------------------------------------------\n// RestError\n// ---------------------------------------------------------------------------\n\nexport class RestError extends Error {\n public readonly status: number;\n public readonly statusText: string;\n public readonly data: unknown;\n public readonly config: RequestConfig;\n\n constructor(\n message: string,\n status: number,\n statusText: string,\n data: unknown,\n config: RequestConfig,\n ) {\n super(message);\n this.name = 'RestError';\n this.status = status;\n this.statusText = statusText;\n this.data = data;\n this.config = config;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction parseResponseHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n}\n\nfunction buildURL(baseURL: string, path: string): string {\n const base = baseURL.endsWith('/') ? baseURL.slice(0, -1) : baseURL;\n const rel = path.startsWith('/') ? path : '/' + path;\n return base + rel;\n}\n\n// ---------------------------------------------------------------------------\n// createRestClient\n// ---------------------------------------------------------------------------\n\nexport function createRestClient(config: RestClientConfig): RestClient {\n const {\n baseURL,\n headers: defaultHeaders = {},\n timeout: defaultTimeout,\n interceptors = {},\n } = config;\n\n const requestInterceptors = interceptors.request ?? [];\n const responseInterceptors = interceptors.response ?? [];\n const errorInterceptors = interceptors.error ?? [];\n\n async function request<T>(\n method: string,\n path: string,\n body?: unknown,\n opts?: RequestOptions,\n ): Promise<RestResponse<T>> {\n // Build initial request config\n let reqConfig: RequestConfig = {\n url: buildURL(baseURL, path),\n method,\n headers: {\n ...defaultHeaders,\n ...(opts?.headers ?? {}),\n },\n body,\n signal: opts?.signal,\n timeout: opts?.timeout ?? defaultTimeout,\n };\n\n // Add Content-Type for requests with a body\n if (body !== undefined && body !== null && !reqConfig.headers['Content-Type']) {\n reqConfig.headers['Content-Type'] = 'application/json';\n }\n\n // Run request interceptors\n for (const interceptor of requestInterceptors) {\n reqConfig = await interceptor(reqConfig);\n }\n\n // Set up timeout via AbortController\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let controller: AbortController | undefined;\n\n if (reqConfig.timeout && reqConfig.timeout > 0) {\n controller = new AbortController();\n timeoutId = setTimeout(() => {\n controller!.abort();\n }, reqConfig.timeout);\n\n // If the caller already provided a signal, listen for its abort too\n if (reqConfig.signal) {\n const externalSignal = reqConfig.signal;\n if (externalSignal.aborted) {\n controller.abort();\n } else {\n externalSignal.addEventListener('abort', () => {\n controller!.abort();\n });\n }\n }\n }\n\n const fetchSignal = controller ? controller.signal : reqConfig.signal;\n\n // Build fetch init\n const fetchInit: RequestInit = {\n method: reqConfig.method,\n headers: reqConfig.headers,\n signal: fetchSignal,\n };\n\n if (body !== undefined && body !== null) {\n fetchInit.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n assertSecureUrl(reqConfig.url);\n response = await fetch(reqConfig.url, fetchInit);\n } catch (err: unknown) {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n const isAbort = err instanceof DOMException && err.name === 'AbortError';\n const message = isAbort\n ? `Request timeout after ${reqConfig.timeout}ms`\n : err instanceof Error\n ? err.message\n : 'Network error';\n\n let restError = new RestError(message, 0, '', null, reqConfig);\n for (const interceptor of errorInterceptors) {\n restError = await interceptor(restError);\n }\n throw restError;\n }\n\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n // Parse response body\n const contentType = response.headers.get('content-type') ?? '';\n let data: T;\n if (contentType.includes('application/json')) {\n data = (await response.json()) as T;\n } else {\n const text = await response.text();\n // Attempt JSON parse for responses without explicit content-type\n try {\n data = JSON.parse(text) as T;\n } catch {\n data = text as unknown as T;\n }\n }\n\n const parsedHeaders = parseResponseHeaders(response.headers);\n\n if (!response.ok) {\n let restError = new RestError(\n `Request failed with status ${response.status}`,\n response.status,\n response.statusText,\n data,\n reqConfig,\n );\n for (const interceptor of errorInterceptors) {\n restError = await interceptor(restError);\n }\n throw restError;\n }\n\n let restResponse: RestResponse<T> = {\n data,\n status: response.status,\n headers: parsedHeaders,\n ok: response.ok,\n };\n\n // Run response interceptors\n for (const interceptor of responseInterceptors) {\n restResponse = interceptor(restResponse as RestResponse<unknown>) as RestResponse<T>;\n }\n\n return restResponse;\n }\n\n return {\n get<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>> {\n return request<T>('GET', path, undefined, opts);\n },\n post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>> {\n return request<T>('POST', path, body, opts);\n },\n put<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>> {\n return request<T>('PUT', path, body, opts);\n },\n patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>> {\n return request<T>('PATCH', path, body, opts);\n },\n delete<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>> {\n return request<T>('DELETE', path, undefined, opts);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// useRest hook\n// ---------------------------------------------------------------------------\n\nexport interface UseRestOptions {\n method?: string;\n body?: unknown;\n deps?: readonly unknown[];\n enabled?: boolean;\n}\n\nexport interface UseRestResult<T> {\n data: T | null;\n loading: boolean;\n error: RestError | null;\n refetch: () => void;\n}\n\nexport function useRest<T>(\n client: RestClient,\n path: string,\n opts?: UseRestOptions,\n): UseRestResult<T> {\n const method = opts?.method ?? 'GET';\n const body = opts?.body;\n const deps = opts?.deps ?? [];\n const enabled = opts?.enabled ?? true;\n\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState<boolean>(enabled);\n const [error, setError] = useState<RestError | null>(null);\n const controllerRef = useRef<AbortController | null>(null);\n const mountedRef = useRef<boolean>(true);\n\n const fetchData = useCallback(() => {\n if (!enabled) {\n setLoading(false);\n return;\n }\n\n // Cancel any previous in-flight request\n if (controllerRef.current) {\n controllerRef.current.abort();\n }\n\n const controller = new AbortController();\n controllerRef.current = controller;\n\n setLoading(true);\n setError(null);\n\n const requestOpts: RequestOptions = { signal: controller.signal };\n\n let promise: Promise<RestResponse<T>>;\n const upperMethod = method.toUpperCase();\n if (upperMethod === 'POST') {\n promise = client.post<T>(path, body, requestOpts);\n } else if (upperMethod === 'PUT') {\n promise = client.put<T>(path, body, requestOpts);\n } else if (upperMethod === 'PATCH') {\n promise = client.patch<T>(path, body, requestOpts);\n } else if (upperMethod === 'DELETE') {\n promise = client.delete<T>(path, requestOpts);\n } else {\n promise = client.get<T>(path, requestOpts);\n }\n\n promise\n .then((response) => {\n if (mountedRef.current && !controller.signal.aborted) {\n setData(response.data);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (mountedRef.current && !controller.signal.aborted) {\n setError(\n err instanceof RestError\n ? err\n : new RestError(err instanceof Error ? err.message : 'Unknown error', 0, '', null, {\n url: path,\n method: upperMethod,\n headers: {},\n }),\n );\n setLoading(false);\n }\n });\n }, [client, path, method, body, enabled, ...deps]);\n\n useEffect(() => {\n mountedRef.current = true;\n fetchData();\n\n return () => {\n mountedRef.current = false;\n if (controllerRef.current) {\n controllerRef.current.abort();\n }\n };\n }, [fetchData]);\n\n const refetch = useCallback(() => {\n fetchData();\n }, [fetchData]);\n\n return { data, loading, error, refetch };\n}\n", "// ============================================================================\n// SpecifyJS Protobuf / gRPC-Web Client\n// Zero third-party dependencies \u2014 wire format implemented from scratch.\n// ============================================================================\n// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\nimport { useState, useEffect, useCallback, useRef } from '../hooks/index';\nimport { assertSecureUrl } from '../shared/secure-fetch';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type FieldType = 'int32' | 'uint32' | 'string' | 'bool' | 'bytes' | 'float64' | 'enum';\n\nexport interface FieldDescriptor {\n tag: number;\n type: FieldType;\n repeated?: boolean;\n}\n\nexport type FieldMap = Record<string, FieldDescriptor>;\n\nexport interface MessageType<T> {\n name: string;\n fields: FieldMap;\n encode(obj: T): Uint8Array;\n decode(bytes: Uint8Array): T;\n}\n\nexport interface GrpcWebClientConfig {\n baseURL: string;\n headers?: Record<string, string>;\n}\n\nexport interface GrpcWebClient {\n unary<Req, Res>(\n service: string,\n method: string,\n reqType: MessageType<Req>,\n resType: MessageType<Res>,\n request: Req,\n ): Promise<Res>;\n}\n\nexport interface UseProtoResult<T> {\n data: T | null;\n loading: boolean;\n error: Error | null;\n refetch: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Varint helpers\n// ---------------------------------------------------------------------------\n\n/** Encode an unsigned 32-bit integer as a varint into an array of bytes. */\nexport function encodeVarint(value: number): number[] {\n const bytes: number[] = [];\n // Treat as unsigned 32-bit\n let v = value >>> 0;\n while (v > 0x7f) {\n bytes.push((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n bytes.push(v & 0x7f);\n return bytes;\n}\n\n/** Decode a varint from a Uint8Array starting at `offset`. Returns [value, newOffset]. */\nexport function decodeVarint(bytes: Uint8Array, offset: number): [number, number] {\n let result = 0;\n let shift = 0;\n let pos = offset;\n while (pos < bytes.length) {\n const b = bytes[pos]!;\n result |= (b & 0x7f) << shift;\n pos++;\n if ((b & 0x80) === 0) {\n return [result >>> 0, pos];\n }\n shift += 7;\n if (shift >= 35) {\n throw new Error('Varint too long');\n }\n }\n throw new Error('Unexpected end of data while decoding varint');\n}\n\n// ---------------------------------------------------------------------------\n// Wire-type helpers\n// ---------------------------------------------------------------------------\n\nconst WIRE_VARINT = 0;\nconst WIRE_64BIT = 1;\nconst WIRE_LENGTH_DELIMITED = 2;\n\nfunction wireTypeFor(type: FieldType): number {\n switch (type) {\n case 'int32':\n case 'uint32':\n case 'bool':\n case 'enum':\n return WIRE_VARINT;\n case 'float64':\n return WIRE_64BIT;\n case 'string':\n case 'bytes':\n return WIRE_LENGTH_DELIMITED;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Field encoding\n// ---------------------------------------------------------------------------\n\nfunction encodeFieldKey(tag: number, wireType: number): number[] {\n return encodeVarint((tag << 3) | wireType);\n}\n\nfunction encodeFieldValue(type: FieldType, value: unknown): number[] {\n switch (type) {\n case 'int32': {\n const n = value as number;\n // Signed int32 \u2014 use zig-zag? No, standard protobuf int32 just uses varint.\n // Negative int32 in proto uses 10-byte two's complement, but for simplicity\n // we treat as unsigned 32-bit (matching proto3 behavior for small negatives).\n return encodeVarint(n | 0);\n }\n case 'uint32':\n return encodeVarint((value as number) >>> 0);\n case 'bool':\n return encodeVarint(value ? 1 : 0);\n case 'enum':\n return encodeVarint((value as number) >>> 0);\n case 'float64': {\n const buf = new ArrayBuffer(8);\n new DataView(buf).setFloat64(0, value as number, true); // little-endian\n return Array.from(new Uint8Array(buf));\n }\n case 'string': {\n const encoded = new TextEncoder().encode(value as string);\n return [...encodeVarint(encoded.length), ...encoded];\n }\n case 'bytes': {\n const data = value as Uint8Array;\n return [...encodeVarint(data.length), ...data];\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Field decoding\n// ---------------------------------------------------------------------------\n\nfunction decodeFieldValue(\n type: FieldType,\n wireType: number,\n bytes: Uint8Array,\n offset: number,\n): [unknown, number] {\n switch (wireType) {\n case WIRE_VARINT: {\n const [val, newOffset] = decodeVarint(bytes, offset);\n switch (type) {\n case 'bool':\n return [val !== 0, newOffset];\n case 'int32':\n return [val | 0, newOffset]; // sign-extend\n case 'uint32':\n case 'enum':\n return [val >>> 0, newOffset];\n default:\n return [val, newOffset];\n }\n }\n case WIRE_64BIT: {\n if (offset + 8 > bytes.length) {\n throw new Error('Unexpected end of data while decoding 64-bit value');\n }\n const buf = new ArrayBuffer(8);\n const view = new Uint8Array(buf);\n for (let i = 0; i < 8; i++) {\n view[i] = bytes[offset + i] ?? 0;\n }\n const dv = new DataView(buf);\n return [dv.getFloat64(0, true), offset + 8];\n }\n case WIRE_LENGTH_DELIMITED: {\n const [len, dataStart] = decodeVarint(bytes, offset);\n if (dataStart + len > bytes.length) {\n throw new Error('Unexpected end of data while decoding length-delimited value');\n }\n const slice = bytes.slice(dataStart, dataStart + len);\n if (type === 'string') {\n return [new TextDecoder().decode(slice), dataStart + len];\n }\n // bytes\n return [slice, dataStart + len];\n }\n default:\n throw new Error(`Unknown wire type: ${wireType}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// defineMessage\n// ---------------------------------------------------------------------------\n\nexport function defineMessage<T>(name: string, fields: FieldMap): MessageType<T> {\n // Build lookup: tag -> { fieldName, descriptor }\n const tagToField = new Map<number, { fieldName: string; descriptor: FieldDescriptor }>();\n for (const [fieldName, descriptor] of Object.entries(fields)) {\n tagToField.set(descriptor.tag, { fieldName, descriptor });\n }\n\n function encode(obj: T): Uint8Array {\n const out: number[] = [];\n const record = obj as Record<string, unknown>;\n\n for (const [fieldName, descriptor] of Object.entries(fields)) {\n const value = record[fieldName];\n if (value === undefined || value === null) continue;\n\n const wt = wireTypeFor(descriptor.type);\n\n if (descriptor.repeated) {\n const arr = value as unknown[];\n for (const item of arr) {\n out.push(...encodeFieldKey(descriptor.tag, wt));\n out.push(...encodeFieldValue(descriptor.type, item));\n }\n } else {\n out.push(...encodeFieldKey(descriptor.tag, wt));\n out.push(...encodeFieldValue(descriptor.type, value));\n }\n }\n\n return new Uint8Array(out);\n }\n\n function decode(bytes: Uint8Array): T {\n const result: Record<string, unknown> = {};\n\n // Initialize repeated fields as empty arrays\n for (const [fieldName, descriptor] of Object.entries(fields)) {\n if (descriptor.repeated) {\n result[fieldName] = [];\n }\n }\n\n let offset = 0;\n while (offset < bytes.length) {\n const [keyVarint, newOffset] = decodeVarint(bytes, offset);\n const tag = keyVarint >>> 3;\n const wireType = keyVarint & 0x07;\n offset = newOffset;\n\n const entry = tagToField.get(tag);\n if (!entry) {\n // Skip unknown field\n offset = skipField(wireType, bytes, offset);\n continue;\n }\n\n const [value, nextOffset] = decodeFieldValue(entry.descriptor.type, wireType, bytes, offset);\n offset = nextOffset;\n\n if (entry.descriptor.repeated) {\n (result[entry.fieldName] as unknown[]).push(value);\n } else {\n result[entry.fieldName] = value;\n }\n }\n\n return result as T;\n }\n\n return { name, fields, encode, decode };\n}\n\n/** Skip an unknown field so parsing can continue. */\nfunction skipField(wireType: number, bytes: Uint8Array, offset: number): number {\n switch (wireType) {\n case WIRE_VARINT: {\n const [, next] = decodeVarint(bytes, offset);\n return next;\n }\n case WIRE_64BIT:\n return offset + 8;\n case WIRE_LENGTH_DELIMITED: {\n const [len, dataStart] = decodeVarint(bytes, offset);\n return dataStart + len;\n }\n default:\n throw new Error(`Cannot skip unknown wire type: ${wireType}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// gRPC-Web framing helpers\n// ---------------------------------------------------------------------------\n\n/** Encode a message into a gRPC-Web frame: [flags:1][length:4][data:N] */\nexport function encodeGrpcWebFrame(data: Uint8Array, flags: number = 0): Uint8Array {\n const frame = new Uint8Array(5 + data.length);\n frame[0] = flags;\n // Big-endian 4-byte length\n const dv = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);\n dv.setUint32(1, data.length, false);\n frame.set(data, 5);\n return frame;\n}\n\n/** Decode the first gRPC-Web frame from bytes. Returns [flags, data, bytesConsumed]. */\nexport function decodeGrpcWebFrame(bytes: Uint8Array): [number, Uint8Array, number] {\n if (bytes.length < 5) {\n throw new Error('gRPC-Web frame too short');\n }\n const flags = bytes[0] ?? 0;\n const dv = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const length = dv.getUint32(1, false);\n if (bytes.length < 5 + length) {\n throw new Error('gRPC-Web frame data incomplete');\n }\n const data = bytes.slice(5, 5 + length);\n return [flags, data, 5 + length] as [number, Uint8Array, number];\n}\n\n// ---------------------------------------------------------------------------\n// gRPC-Web client\n// ---------------------------------------------------------------------------\n\nexport function createGrpcWebClient(config: GrpcWebClientConfig): GrpcWebClient {\n const { baseURL, headers: extraHeaders } = config;\n\n async function unary<Req, Res>(\n service: string,\n method: string,\n reqType: MessageType<Req>,\n resType: MessageType<Res>,\n request: Req,\n ): Promise<Res> {\n const reqBytes = reqType.encode(request);\n const frame = encodeGrpcWebFrame(reqBytes);\n\n const url = `${baseURL.replace(/\\/+$/, '')}/${service}/${method}`;\n\n const hdrs: Record<string, string> = {\n 'Content-Type': 'application/grpc-web+proto',\n Accept: 'application/grpc-web+proto',\n 'X-Grpc-Web': '1',\n ...extraHeaders,\n };\n\n assertSecureUrl(url);\n const response = await fetch(url, {\n method: 'POST',\n headers: hdrs,\n body: frame.buffer as ArrayBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`gRPC-Web request failed: ${response.status} ${response.statusText}`);\n }\n\n const responseBytes = new Uint8Array(await response.arrayBuffer());\n\n // The response contains one or more gRPC-Web frames.\n // The first frame with flags === 0 contains the data.\n let offset = 0;\n while (offset < responseBytes.length) {\n const [flags, data, consumed] = decodeGrpcWebFrame(responseBytes.subarray(offset));\n offset += consumed;\n\n // flags === 0 means data frame, flags & 0x80 means trailers\n if ((flags & 0x80) === 0) {\n return resType.decode(data);\n }\n }\n\n throw new Error('No data frame found in gRPC-Web response');\n }\n\n return { unary };\n}\n\n// ---------------------------------------------------------------------------\n// useProto hook\n// ---------------------------------------------------------------------------\n\nexport function useProto<Req, Res>(\n client: GrpcWebClient,\n service: string,\n method: string,\n reqType: MessageType<Req>,\n resType: MessageType<Res>,\n request: Req,\n opts?: { enabled?: boolean },\n): UseProtoResult<Res> {\n const [data, setData] = useState<Res | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n const requestRef = useRef(request);\n requestRef.current = request;\n\n const enabled = opts?.enabled !== false;\n\n const refetch = useCallback(() => {\n if (!enabled) return;\n\n setLoading(true);\n setError(null);\n\n client\n .unary(service, method, reqType, resType, requestRef.current)\n .then((res) => {\n if (mountedRef.current) {\n setData(res);\n setLoading(false);\n }\n })\n .catch((err: unknown) => {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n setLoading(false);\n }\n });\n }, [client, service, method, reqType, resType, enabled]);\n\n useEffect(() => {\n mountedRef.current = true;\n refetch();\n return () => {\n mountedRef.current = false;\n };\n }, [refetch]);\n\n return { data, loading, error, refetch };\n}\n", "// ============================================================================\n// SpecifyJS GraphQL Client \u2014 Zero-dependency native GraphQL client\n// ============================================================================\n// (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE\n// SPDX-License-Identifier: MIT\n\nimport { useState, useEffect, useRef, useCallback } from '../hooks/index';\nimport { assertSecureUrl } from '../shared/secure-fetch';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface GraphQLError {\n message: string;\n locations?: { line: number; column: number }[];\n path?: (string | number)[];\n}\n\nexport interface GraphQLResponse<T> {\n data: T | null;\n errors: GraphQLError[] | null;\n extensions?: Record<string, unknown>;\n}\n\nexport interface GraphQLClientConfig {\n url: string;\n headers?: Record<string, string>;\n credentials?: RequestCredentials;\n cache?: boolean;\n}\n\nexport interface GraphQLClient {\n query<T>(query: string, variables?: Record<string, unknown>): Promise<GraphQLResponse<T>>;\n mutate<T>(mutation: string, variables?: Record<string, unknown>): Promise<GraphQLResponse<T>>;\n clearCache(): void;\n invalidate(query: string): void;\n}\n\nexport interface UseQueryOptions {\n variables?: Record<string, unknown>;\n deps?: readonly unknown[];\n enabled?: boolean;\n cache?: boolean;\n}\n\nexport interface UseQueryResult<T> {\n data: T | null;\n loading: boolean;\n error: GraphQLError[] | null;\n refetch: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// gql template tag\n// ---------------------------------------------------------------------------\n\n/**\n * Tagged template literal for GraphQL queries.\n * Returns the query string as-is. Provides editor syntax highlighting support.\n */\nexport function gql(strings: TemplateStringsArray, ...values: unknown[]): string {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n const val = String(values[i]);\n // M-8: Warn if interpolated values contain GraphQL metacharacters\n if (/[{}():]/.test(val)) {\n if (typeof console !== 'undefined') {\n console.warn(\n '[SpecifyJS] gql: Interpolated value contains GraphQL metacharacters. Use variables parameter instead of string interpolation to prevent injection.',\n );\n }\n }\n result += val;\n }\n }\n return result.replace(/\\s+/g, ' ').trim();\n}\n\n// ---------------------------------------------------------------------------\n// createGraphQLClient\n// ---------------------------------------------------------------------------\n\n/**\n * Factory function that creates a GraphQL client instance.\n */\nexport function createGraphQLClient(config: GraphQLClientConfig): GraphQLClient {\n const { url, headers: configHeaders, credentials, cache: cacheEnabled = false } = config;\n\n const MAX_CACHE_SIZE = 100;\n const responseCache = new Map<string, GraphQLResponse<unknown>>();\n\n function buildCacheKey(query: string, variables?: Record<string, unknown>): string {\n return JSON.stringify({ query, variables });\n }\n\n async function execute<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n const reqHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...configHeaders,\n };\n\n const body = JSON.stringify({ query, variables });\n\n assertSecureUrl(url);\n const response = await fetch(url, {\n method: 'POST',\n headers: reqHeaders,\n credentials,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`GraphQL request failed with status ${response.status}`);\n }\n\n const json = (await response.json()) as GraphQLResponse<T>;\n\n return {\n data: json.data ?? null,\n errors: json.errors ?? null,\n ...(json.extensions !== undefined ? { extensions: json.extensions } : {}),\n };\n }\n\n const client: GraphQLClient = {\n async query<T>(\n query: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n if (cacheEnabled) {\n const key = buildCacheKey(query, variables);\n const cached = responseCache.get(key);\n if (cached) {\n return cached as GraphQLResponse<T>;\n }\n const result = await execute<T>(query, variables);\n if (responseCache.size >= MAX_CACHE_SIZE) {\n const oldest = responseCache.keys().next().value;\n if (oldest !== undefined) responseCache.delete(oldest);\n }\n responseCache.set(key, result);\n return result;\n }\n return execute<T>(query, variables);\n },\n\n async mutate<T>(\n mutation: string,\n variables?: Record<string, unknown>,\n ): Promise<GraphQLResponse<T>> {\n return execute<T>(mutation, variables);\n },\n\n clearCache(): void {\n responseCache.clear();\n },\n\n invalidate(query: string): void {\n for (const key of responseCache.keys()) {\n try {\n const parsed = JSON.parse(key) as { query: string };\n if (parsed.query === query) {\n responseCache.delete(key);\n }\n } catch {\n // skip malformed keys\n }\n }\n },\n };\n\n return client;\n}\n\n// ---------------------------------------------------------------------------\n// useQuery hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for executing GraphQL queries with automatic fetching.\n * Auto-fetches on mount and when deps change.\n */\nexport function useQuery<T>(\n client: GraphQLClient,\n query: string,\n opts?: UseQueryOptions,\n): UseQueryResult<T> {\n const variables = opts?.variables;\n const deps = opts?.deps;\n const enabled = opts?.enabled ?? true;\n\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState<boolean>(enabled);\n const [error, setError] = useState<GraphQLError[] | null>(null);\n\n const fetchIdRef = useRef(0);\n\n const fetchData = useCallback(() => {\n if (!enabled) return;\n\n const id = ++fetchIdRef.current;\n setLoading(true);\n setError(null);\n\n client\n .query<T>(query, variables)\n .then((result) => {\n if (fetchIdRef.current !== id) return;\n setData(result.data);\n setError(result.errors);\n setLoading(false);\n })\n .catch((err: unknown) => {\n if (fetchIdRef.current !== id) return;\n setError([{ message: err instanceof Error ? err.message : String(err) }]);\n setLoading(false);\n });\n }, [client, query, variables, enabled]);\n\n const effectDeps = deps ? [fetchData, ...deps] : [fetchData];\n\n useEffect(() => {\n fetchData();\n }, effectDeps);\n\n return { data, loading, error, refetch: fetchData };\n}\n\n// ---------------------------------------------------------------------------\n// useMutation hook\n// ---------------------------------------------------------------------------\n\n/**\n * Hook for executing GraphQL mutations.\n * Does not auto-fire; only executes on explicit call.\n */\nexport function useMutation<T>(\n client: GraphQLClient,\n mutation: string,\n): [\n (variables?: Record<string, unknown>) => Promise<GraphQLResponse<T>>,\n { data: T | null; loading: boolean; error: GraphQLError[] | null },\n] {\n const [data, setData] = useState<T | null>(null);\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<GraphQLError[] | null>(null);\n\n const mutateFn = async (variables?: Record<string, unknown>): Promise<GraphQLResponse<T>> => {\n setLoading(true);\n setError(null);\n\n try {\n const result = await client.mutate<T>(mutation, variables);\n setData(result.data);\n setError(result.errors);\n setLoading(false);\n return result;\n } catch (err: unknown) {\n const errors: GraphQLError[] = [\n { message: err instanceof Error ? err.message : String(err) },\n ];\n setError(errors);\n setLoading(false);\n return { data: null, errors, extensions: undefined };\n }\n };\n\n const mutate = useCallback(\n ((...args: unknown[]) => mutateFn(args[0] as Record<string, unknown> | undefined)) as (\n ...args: unknown[]\n ) => unknown,\n [client, mutation],\n ) as unknown as (variables?: Record<string, unknown>) => Promise<GraphQLResponse<T>>;\n\n return [mutate, { data, loading, error }];\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "RestError", "createGraphQLClient", "createGrpcWebClient", "createRestClient", "defineMessage", "gql", "useMutation", "useProto", "useQuery", "useRest", "__toCommonJS", "currentDispatcher", "resolveDispatcher", "currentDispatcher", "useState", "initialState", "useEffect", "create", "deps", "useCallback", "callback", "deps", "resolveDispatcher", "useRef", "initialValue", "resolveDispatcher", "assertSecureUrl", "url", "parsed", "RestError", "message", "status", "statusText", "data", "config", "parseResponseHeaders", "headers", "result", "value", "key", "buildURL", "baseURL", "path", "base", "rel", "createRestClient", "defaultHeaders", "defaultTimeout", "interceptors", "requestInterceptors", "responseInterceptors", "errorInterceptors", "request", "method", "body", "opts", "reqConfig", "interceptor", "timeoutId", "controller", "externalSignal", "fetchSignal", "fetchInit", "response", "assertSecureUrl", "err", "restError", "contentType", "text", "parsedHeaders", "restResponse", "useRest", "client", "deps", "enabled", "setData", "useState", "loading", "setLoading", "error", "setError", "controllerRef", "useRef", "mountedRef", "fetchData", "useCallback", "requestOpts", "promise", "upperMethod", "useEffect", "refetch", "encodeVarint", "value", "bytes", "v", "decodeVarint", "offset", "result", "shift", "pos", "b", "WIRE_VARINT", "WIRE_64BIT", "WIRE_LENGTH_DELIMITED", "wireTypeFor", "type", "encodeFieldKey", "tag", "wireType", "encodeFieldValue", "buf", "encoded", "data", "decodeFieldValue", "val", "newOffset", "view", "i", "len", "dataStart", "slice", "defineMessage", "name", "fields", "tagToField", "fieldName", "descriptor", "encode", "obj", "out", "record", "wt", "arr", "item", "decode", "keyVarint", "entry", "skipField", "nextOffset", "next", "encodeGrpcWebFrame", "flags", "frame", "decodeGrpcWebFrame", "length", "createGrpcWebClient", "config", "baseURL", "extraHeaders", "unary", "service", "method", "reqType", "resType", "request", "reqBytes", "url", "hdrs", "assertSecureUrl", "response", "responseBytes", "consumed", "useProto", "client", "opts", "setData", "useState", "loading", "setLoading", "error", "setError", "mountedRef", "useRef", "requestRef", "enabled", "refetch", "useCallback", "res", "err", "useEffect", "gql", "strings", "values", "result", "i", "val", "createGraphQLClient", "config", "url", "configHeaders", "credentials", "cacheEnabled", "MAX_CACHE_SIZE", "responseCache", "buildCacheKey", "query", "variables", "execute", "reqHeaders", "body", "assertSecureUrl", "response", "json", "key", "cached", "oldest", "mutation", "useQuery", "client", "opts", "deps", "enabled", "data", "setData", "useState", "loading", "setLoading", "error", "setError", "fetchIdRef", "useRef", "fetchData", "useCallback", "id", "err", "effectDeps", "useEffect", "useMutation", "mutateFn", "errors", "args"]
|
|
7
|
+
}
|
|
@@ -1,159 +1 @@
|
|
|
1
|
-
|
|
2
|
-
baseURL: string;
|
|
3
|
-
headers?: Record<string, string>;
|
|
4
|
-
timeout?: number;
|
|
5
|
-
interceptors?: {
|
|
6
|
-
request?: RequestInterceptor[];
|
|
7
|
-
response?: ResponseInterceptor[];
|
|
8
|
-
error?: ErrorInterceptor[];
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
interface RequestConfig {
|
|
12
|
-
url: string;
|
|
13
|
-
method: string;
|
|
14
|
-
headers: Record<string, string>;
|
|
15
|
-
body?: unknown;
|
|
16
|
-
signal?: AbortSignal;
|
|
17
|
-
timeout?: number;
|
|
18
|
-
}
|
|
19
|
-
interface RestResponse<T> {
|
|
20
|
-
data: T;
|
|
21
|
-
status: number;
|
|
22
|
-
headers: Record<string, string>;
|
|
23
|
-
ok: boolean;
|
|
24
|
-
}
|
|
25
|
-
type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;
|
|
26
|
-
type ResponseInterceptor = (response: RestResponse<unknown>) => RestResponse<unknown>;
|
|
27
|
-
type ErrorInterceptor = (error: RestError) => RestError | Promise<RestError>;
|
|
28
|
-
interface RequestOptions {
|
|
29
|
-
headers?: Record<string, string>;
|
|
30
|
-
signal?: AbortSignal;
|
|
31
|
-
timeout?: number;
|
|
32
|
-
}
|
|
33
|
-
interface RestClient {
|
|
34
|
-
get<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>>;
|
|
35
|
-
post<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;
|
|
36
|
-
put<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;
|
|
37
|
-
patch<T>(path: string, body?: unknown, opts?: RequestOptions): Promise<RestResponse<T>>;
|
|
38
|
-
delete<T>(path: string, opts?: RequestOptions): Promise<RestResponse<T>>;
|
|
39
|
-
}
|
|
40
|
-
declare class RestError extends Error {
|
|
41
|
-
readonly status: number;
|
|
42
|
-
readonly statusText: string;
|
|
43
|
-
readonly data: unknown;
|
|
44
|
-
readonly config: RequestConfig;
|
|
45
|
-
constructor(message: string, status: number, statusText: string, data: unknown, config: RequestConfig);
|
|
46
|
-
}
|
|
47
|
-
declare function createRestClient(config: RestClientConfig): RestClient;
|
|
48
|
-
interface UseRestOptions {
|
|
49
|
-
method?: string;
|
|
50
|
-
body?: unknown;
|
|
51
|
-
deps?: readonly unknown[];
|
|
52
|
-
enabled?: boolean;
|
|
53
|
-
}
|
|
54
|
-
interface UseRestResult<T> {
|
|
55
|
-
data: T | null;
|
|
56
|
-
loading: boolean;
|
|
57
|
-
error: RestError | null;
|
|
58
|
-
refetch: () => void;
|
|
59
|
-
}
|
|
60
|
-
declare function useRest<T>(client: RestClient, path: string, opts?: UseRestOptions): UseRestResult<T>;
|
|
61
|
-
|
|
62
|
-
type FieldType = 'int32' | 'uint32' | 'string' | 'bool' | 'bytes' | 'float64' | 'enum';
|
|
63
|
-
interface FieldDescriptor {
|
|
64
|
-
tag: number;
|
|
65
|
-
type: FieldType;
|
|
66
|
-
repeated?: boolean;
|
|
67
|
-
}
|
|
68
|
-
type FieldMap = Record<string, FieldDescriptor>;
|
|
69
|
-
interface MessageType<T> {
|
|
70
|
-
name: string;
|
|
71
|
-
fields: FieldMap;
|
|
72
|
-
encode(obj: T): Uint8Array;
|
|
73
|
-
decode(bytes: Uint8Array): T;
|
|
74
|
-
}
|
|
75
|
-
interface GrpcWebClientConfig {
|
|
76
|
-
baseURL: string;
|
|
77
|
-
headers?: Record<string, string>;
|
|
78
|
-
}
|
|
79
|
-
interface GrpcWebClient {
|
|
80
|
-
unary<Req, Res>(service: string, method: string, reqType: MessageType<Req>, resType: MessageType<Res>, request: Req): Promise<Res>;
|
|
81
|
-
}
|
|
82
|
-
interface UseProtoResult<T> {
|
|
83
|
-
data: T | null;
|
|
84
|
-
loading: boolean;
|
|
85
|
-
error: Error | null;
|
|
86
|
-
refetch: () => void;
|
|
87
|
-
}
|
|
88
|
-
declare function defineMessage<T>(name: string, fields: FieldMap): MessageType<T>;
|
|
89
|
-
declare function createGrpcWebClient(config: GrpcWebClientConfig): GrpcWebClient;
|
|
90
|
-
declare function useProto<Req, Res>(client: GrpcWebClient, service: string, method: string, reqType: MessageType<Req>, resType: MessageType<Res>, request: Req, opts?: {
|
|
91
|
-
enabled?: boolean;
|
|
92
|
-
}): UseProtoResult<Res>;
|
|
93
|
-
|
|
94
|
-
interface GraphQLError {
|
|
95
|
-
message: string;
|
|
96
|
-
locations?: {
|
|
97
|
-
line: number;
|
|
98
|
-
column: number;
|
|
99
|
-
}[];
|
|
100
|
-
path?: (string | number)[];
|
|
101
|
-
}
|
|
102
|
-
interface GraphQLResponse<T> {
|
|
103
|
-
data: T | null;
|
|
104
|
-
errors: GraphQLError[] | null;
|
|
105
|
-
extensions?: Record<string, unknown>;
|
|
106
|
-
}
|
|
107
|
-
interface GraphQLClientConfig {
|
|
108
|
-
url: string;
|
|
109
|
-
headers?: Record<string, string>;
|
|
110
|
-
credentials?: RequestCredentials;
|
|
111
|
-
cache?: boolean;
|
|
112
|
-
}
|
|
113
|
-
interface GraphQLClient {
|
|
114
|
-
query<T>(query: string, variables?: Record<string, unknown>): Promise<GraphQLResponse<T>>;
|
|
115
|
-
mutate<T>(mutation: string, variables?: Record<string, unknown>): Promise<GraphQLResponse<T>>;
|
|
116
|
-
clearCache(): void;
|
|
117
|
-
invalidate(query: string): void;
|
|
118
|
-
}
|
|
119
|
-
interface UseQueryOptions {
|
|
120
|
-
variables?: Record<string, unknown>;
|
|
121
|
-
deps?: readonly unknown[];
|
|
122
|
-
enabled?: boolean;
|
|
123
|
-
cache?: boolean;
|
|
124
|
-
}
|
|
125
|
-
interface UseQueryResult<T> {
|
|
126
|
-
data: T | null;
|
|
127
|
-
loading: boolean;
|
|
128
|
-
error: GraphQLError[] | null;
|
|
129
|
-
refetch: () => void;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Tagged template literal for GraphQL queries.
|
|
133
|
-
* Returns the query string as-is. Provides editor syntax highlighting support.
|
|
134
|
-
*/
|
|
135
|
-
declare function gql(strings: TemplateStringsArray, ...values: unknown[]): string;
|
|
136
|
-
/**
|
|
137
|
-
* Factory function that creates a GraphQL client instance.
|
|
138
|
-
*/
|
|
139
|
-
declare function createGraphQLClient(config: GraphQLClientConfig): GraphQLClient;
|
|
140
|
-
/**
|
|
141
|
-
* Hook for executing GraphQL queries with automatic fetching.
|
|
142
|
-
* Auto-fetches on mount and when deps change.
|
|
143
|
-
*/
|
|
144
|
-
declare function useQuery<T>(client: GraphQLClient, query: string, opts?: UseQueryOptions): UseQueryResult<T>;
|
|
145
|
-
/**
|
|
146
|
-
* Hook for executing GraphQL mutations.
|
|
147
|
-
* Does not auto-fire; only executes on explicit call.
|
|
148
|
-
*/
|
|
149
|
-
declare function useMutation<T>(client: GraphQLClient, mutation: string): [
|
|
150
|
-
(variables?: Record<string, unknown>) => Promise<GraphQLResponse<T>>,
|
|
151
|
-
{
|
|
152
|
-
data: T | null;
|
|
153
|
-
loading: boolean;
|
|
154
|
-
error: GraphQLError[] | null;
|
|
155
|
-
}
|
|
156
|
-
];
|
|
157
|
-
|
|
158
|
-
export { RestError, createGraphQLClient, createGrpcWebClient, createRestClient, defineMessage, gql, useMutation, useProto, useQuery, useRest };
|
|
159
|
-
export type { GraphQLClient, GraphQLClientConfig, GraphQLError, GraphQLResponse, GrpcWebClient, MessageType, RequestConfig, RequestInterceptor, ResponseInterceptor, RestClient, RestClientConfig, RestResponse };
|
|
1
|
+
export * from "./types/client/index";
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
/* (c) 2025-2026 Asymmetric Effort, LLC. MIT LICENSE */
|
|
2
|
+
var M=null;function G(){if(M===null)throw new Error("Invalid hook call. Hooks can only be called inside the body of a function component.");return M}function w(e){return G().useState(e)}function v(e,t){return G().useEffect(e,t)}function k(e,t){return G().useCallback(e,t)}function x(e){return G().useRef(e)}function S(e){if(e.startsWith("//"))throw new Error(`[SpecifyJS] Protocol-relative URL rejected: "${e}". Use an explicit https:// prefix.`);if(e.startsWith("/")||e.startsWith("./")||e.startsWith("../")||e.startsWith("data:"))return;let t;try{t=new URL(e,typeof window<"u"?window.location.href:void 0)}catch{return}if(t.protocol!=="https:"&&!(t.hostname==="localhost"||t.hostname==="127.0.0.1"))throw new Error(`[SpecifyJS] Insecure URL rejected: "${e}". SpecifyJS enforces HTTPS-only for all network requests. Use https:// or a relative URL. Localhost URLs are allowed for development.`)}var q=class extends Error{constructor(t,n,o,s,u){super(t),this.name="RestError",this.status=n,this.statusText=o,this.data=s,this.config=u}};function $(e){let t={};return e.forEach((n,o)=>{t[o]=n}),t}function N(e,t){let n=e.endsWith("/")?e.slice(0,-1):e,o=t.startsWith("/")?t:"/"+t;return n+o}function j(e){let{baseURL:t,headers:n={},timeout:o,interceptors:s={}}=e,u=s.request??[],c=s.response??[],f=s.error??[];async function h(l,a,r,p){let i={url:N(t,a),method:l,headers:{...n,...p?.headers??{}},body:r,signal:p?.signal,timeout:p?.timeout??o};r!=null&&!i.headers["Content-Type"]&&(i.headers["Content-Type"]="application/json");for(let R of u)i=await R(i);let g,d;if(i.timeout&&i.timeout>0&&(d=new AbortController,g=setTimeout(()=>{d.abort()},i.timeout),i.signal)){let R=i.signal;R.aborted?d.abort():R.addEventListener("abort",()=>{d.abort()})}let T=d?d.signal:i.signal,y={method:i.method,headers:i.headers,signal:T};r!=null&&(y.body=JSON.stringify(r));let m;try{S(i.url),m=await fetch(i.url,y)}catch(R){g!==void 0&&clearTimeout(g);let F=R instanceof DOMException&&R.name==="AbortError"?`Request timeout after ${i.timeout}ms`:R instanceof Error?R.message:"Network error",P=new q(F,0,"",null,i);for(let V of f)P=await V(P);throw P}g!==void 0&&clearTimeout(g);let E=m.headers.get("content-type")??"",b;if(E.includes("application/json"))b=await m.json();else{let R=await m.text();try{b=JSON.parse(R)}catch{b=R}}let C=$(m.headers);if(!m.ok){let R=new q(`Request failed with status ${m.status}`,m.status,m.statusText,b,i);for(let D of f)R=await D(R);throw R}let A={data:b,status:m.status,headers:C,ok:m.ok};for(let R of c)A=R(A);return A}return{get(l,a){return h("GET",l,void 0,a)},post(l,a,r){return h("POST",l,a,r)},put(l,a,r){return h("PUT",l,a,r)},patch(l,a,r){return h("PATCH",l,a,r)},delete(l,a){return h("DELETE",l,void 0,a)}}}function J(e,t,n){let o=n?.method??"GET",s=n?.body,u=n?.deps??[],c=n?.enabled??!0,[f,h]=w(null),[l,a]=w(c),[r,p]=w(null),i=x(null),g=x(!0),d=k(()=>{if(!c){a(!1);return}i.current&&i.current.abort();let y=new AbortController;i.current=y,a(!0),p(null);let m={signal:y.signal},E,b=o.toUpperCase();b==="POST"?E=e.post(t,s,m):b==="PUT"?E=e.put(t,s,m):b==="PATCH"?E=e.patch(t,s,m):b==="DELETE"?E=e.delete(t,m):E=e.get(t,m),E.then(C=>{g.current&&!y.signal.aborted&&(h(C.data),a(!1))}).catch(C=>{g.current&&!y.signal.aborted&&(p(C instanceof q?C:new q(C instanceof Error?C.message:"Unknown error",0,"",null,{url:t,method:b,headers:{}})),a(!1))})},[e,t,o,s,c,...u]);v(()=>(g.current=!0,d(),()=>{g.current=!1,i.current&&i.current.abort()}),[d]);let T=k(()=>{d()},[d]);return{data:f,loading:l,error:r,refetch:T}}function L(e){let t=[],n=e>>>0;for(;n>127;)t.push(n&127|128),n>>>=7;return t.push(n&127),t}function U(e,t){let n=0,o=0,s=t;for(;s<e.length;){let u=e[s];if(n|=(u&127)<<o,s++,(u&128)===0)return[n>>>0,s];if(o+=7,o>=35)throw new Error("Varint too long")}throw new Error("Unexpected end of data while decoding varint")}var O=0,Q=1,I=2;function _(e){switch(e){case"int32":case"uint32":case"bool":case"enum":return O;case"float64":return Q;case"string":case"bytes":return I}}function H(e,t){return L(e<<3|t)}function W(e,t){switch(e){case"int32":return L(t|0);case"uint32":return L(t>>>0);case"bool":return L(t?1:0);case"enum":return L(t>>>0);case"float64":{let n=new ArrayBuffer(8);return new DataView(n).setFloat64(0,t,!0),Array.from(new Uint8Array(n))}case"string":{let n=new TextEncoder().encode(t);return[...L(n.length),...n]}case"bytes":{let n=t;return[...L(n.length),...n]}}}function B(e,t,n,o){switch(t){case O:{let[s,u]=U(n,o);switch(e){case"bool":return[s!==0,u];case"int32":return[s|0,u];case"uint32":case"enum":return[s>>>0,u];default:return[s,u]}}case Q:{if(o+8>n.length)throw new Error("Unexpected end of data while decoding 64-bit value");let s=new ArrayBuffer(8),u=new Uint8Array(s);for(let f=0;f<8;f++)u[f]=n[o+f]??0;return[new DataView(s).getFloat64(0,!0),o+8]}case I:{let[s,u]=U(n,o);if(u+s>n.length)throw new Error("Unexpected end of data while decoding length-delimited value");let c=n.slice(u,u+s);return e==="string"?[new TextDecoder().decode(c),u+s]:[c,u+s]}default:throw new Error(`Unknown wire type: ${t}`)}}function X(e,t){let n=new Map;for(let[u,c]of Object.entries(t))n.set(c.tag,{fieldName:u,descriptor:c});function o(u){let c=[],f=u;for(let[h,l]of Object.entries(t)){let a=f[h];if(a==null)continue;let r=_(l.type);if(l.repeated){let p=a;for(let i of p)c.push(...H(l.tag,r)),c.push(...W(l.type,i))}else c.push(...H(l.tag,r)),c.push(...W(l.type,a))}return new Uint8Array(c)}function s(u){let c={};for(let[h,l]of Object.entries(t))l.repeated&&(c[h]=[]);let f=0;for(;f<u.length;){let[h,l]=U(u,f),a=h>>>3,r=h&7;f=l;let p=n.get(a);if(!p){f=K(r,u,f);continue}let[i,g]=B(p.descriptor.type,r,u,f);f=g,p.descriptor.repeated?c[p.fieldName].push(i):c[p.fieldName]=i}return c}return{name:e,fields:t,encode:o,decode:s}}function K(e,t,n){switch(e){case O:{let[,o]=U(t,n);return o}case Q:return n+8;case I:{let[o,s]=U(t,n);return s+o}default:throw new Error(`Cannot skip unknown wire type: ${e}`)}}function z(e,t=0){let n=new Uint8Array(5+e.length);return n[0]=t,new DataView(n.buffer,n.byteOffset,n.byteLength).setUint32(1,e.length,!1),n.set(e,5),n}function Z(e){if(e.length<5)throw new Error("gRPC-Web frame too short");let t=e[0]??0,o=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(1,!1);if(e.length<5+o)throw new Error("gRPC-Web frame data incomplete");let s=e.slice(5,5+o);return[t,s,5+o]}function Y(e){let{baseURL:t,headers:n}=e;async function o(s,u,c,f,h){let l=c.encode(h),a=z(l),r=`${t.replace(/\/+$/,"")}/${s}/${u}`,p={"Content-Type":"application/grpc-web+proto",Accept:"application/grpc-web+proto","X-Grpc-Web":"1",...n};S(r);let i=await fetch(r,{method:"POST",headers:p,body:a.buffer});if(!i.ok)throw new Error(`gRPC-Web request failed: ${i.status} ${i.statusText}`);let g=new Uint8Array(await i.arrayBuffer()),d=0;for(;d<g.length;){let[T,y,m]=Z(g.subarray(d));if(d+=m,(T&128)===0)return f.decode(y)}throw new Error("No data frame found in gRPC-Web response")}return{unary:o}}function ee(e,t,n,o,s,u,c){let[f,h]=w(null),[l,a]=w(!1),[r,p]=w(null),i=x(!0),g=x(u);g.current=u;let d=c?.enabled!==!1,T=k(()=>{d&&(a(!0),p(null),e.unary(t,n,o,s,g.current).then(y=>{i.current&&(h(y),a(!1))}).catch(y=>{i.current&&(p(y instanceof Error?y:new Error(String(y))),a(!1))}))},[e,t,n,o,s,d]);return v(()=>(i.current=!0,T(),()=>{i.current=!1}),[T]),{data:f,loading:l,error:r,refetch:T}}function te(e,...t){let n="";for(let o=0;o<e.length;o++)if(n+=e[o],o<t.length){let s=String(t[o]);/[{}():]/.test(s)&&typeof console<"u"&&console.warn("[SpecifyJS] gql: Interpolated value contains GraphQL metacharacters. Use variables parameter instead of string interpolation to prevent injection."),n+=s}return n.replace(/\s+/g," ").trim()}function ne(e){let{url:t,headers:n,credentials:o,cache:s=!1}=e,u=100,c=new Map;function f(a,r){return JSON.stringify({query:a,variables:r})}async function h(a,r){let p={"Content-Type":"application/json",...n},i=JSON.stringify({query:a,variables:r});S(t);let g=await fetch(t,{method:"POST",headers:p,credentials:o,body:i});if(!g.ok)throw new Error(`GraphQL request failed with status ${g.status}`);let d=await g.json();return{data:d.data??null,errors:d.errors??null,...d.extensions!==void 0?{extensions:d.extensions}:{}}}return{async query(a,r){if(s){let p=f(a,r),i=c.get(p);if(i)return i;let g=await h(a,r);if(c.size>=u){let d=c.keys().next().value;d!==void 0&&c.delete(d)}return c.set(p,g),g}return h(a,r)},async mutate(a,r){return h(a,r)},clearCache(){c.clear()},invalidate(a){for(let r of c.keys())try{JSON.parse(r).query===a&&c.delete(r)}catch{}}}}function re(e,t,n){let o=n?.variables,s=n?.deps,u=n?.enabled??!0,[c,f]=w(null),[h,l]=w(u),[a,r]=w(null),p=x(0),i=k(()=>{if(!u)return;let d=++p.current;l(!0),r(null),e.query(t,o).then(T=>{p.current===d&&(f(T.data),r(T.errors),l(!1))}).catch(T=>{p.current===d&&(r([{message:T instanceof Error?T.message:String(T)}]),l(!1))})},[e,t,o,u]),g=s?[i,...s]:[i];return v(()=>{i()},g),{data:c,loading:h,error:a,refetch:i}}function oe(e,t){let[n,o]=w(null),[s,u]=w(!1),[c,f]=w(null),h=async a=>{u(!0),f(null);try{let r=await e.mutate(t,a);return o(r.data),f(r.errors),u(!1),r}catch(r){let p=[{message:r instanceof Error?r.message:String(r)}];return f(p),u(!1),{data:null,errors:p,extensions:void 0}}};return[k(((...a)=>h(a[0])),[e,t]),{data:n,loading:s,error:c}]}export{q as RestError,ne as createGraphQLClient,Y as createGrpcWebClient,j as createRestClient,X as defineMessage,te as gql,oe as useMutation,ee as useProto,re as useQuery,J as useRest};
|
|
2
3
|
//# sourceMappingURL=specifyjs-client.esm.js.map
|