Compare commits

..

947 Commits

Author SHA1 Message Date
Gregory Schier
cd07123157 Back to @latest 2024-07-22 18:28:27 -07:00
Gregory Schier
b62901e295 Force bump Yaak CLI 2024-07-22 18:27:24 -07:00
Gregory Schier
96996f73d5 Remove test runs 2024-07-22 18:12:12 -07:00
Gregory Schier
4782fd376b Checkout plugins later in the release workflow 2024-07-22 18:08:49 -07:00
Gregory Schier
41dfa15feb Various tweaks 2024-07-22 17:55:28 -07:00
Gregory Schier
47d4fffc20 Plugin tweaks 2024-07-22 12:17:46 -07:00
Gregory Schier
994f314cff Better wording for moving workspace 2024-07-22 09:46:46 -07:00
Gregory Schier
0f8f086e01 Lowercase product name for Linux 2024-07-22 09:03:31 -07:00
Gregory Schier
19280c3bbc Some small refactoring 2024-07-21 22:18:45 -07:00
Gregory Schier
3cd7c1ef2e From SEA to regular NodeJS 2024-07-21 22:14:17 -07:00
Gregory Schier
6a5f61e84b Fixed plugins on Windows 2024-07-21 16:01:13 -07:00
Gregory Schier
a444984aed Fix import plugin hook 2024-07-21 15:46:47 -07:00
Gregory Schier
c0e253ef84 Change app name 2024-07-20 11:33:02 -07:00
Gregory Schier
7910d1b0fc Fix Windows key map 2024-07-20 10:49:08 -07:00
Gregory Schier
d26d20180e Don't resign SEA binary 2024-07-20 10:28:50 -07:00
Gregory Schier
54d9a78474 Fix tool location 2024-07-19 17:38:57 -07:00
Gregory Schier
216c41d8cf Fix deps 2024-07-19 17:31:37 -07:00
Gregory Schier
bf2c392380 Dynamic signtool.exe location 2024-07-19 17:30:20 -07:00
Gregory Schier
1835fa3ba4 Fix signtool path 2024-07-19 17:28:13 -07:00
Gregory Schier
d701381041 Add ampersand 2024-07-19 17:21:23 -07:00
Gregory Schier
89c19858df Fix signtool path? 2024-07-19 17:18:52 -07:00
Gregory Schier
01136921df Absolute signtool path 2024-07-19 17:11:53 -07:00
Gregory Schier
17ab201b96 Remove tmp dirs 2024-07-19 16:58:55 -07:00
Gregory Schier
5d3182da4c Again 2024-07-19 16:53:37 -07:00
Gregory Schier
293a91012f Better tmp dir creation 2024-07-19 16:51:05 -07:00
Gregory Schier
a43f601b6a Fix tmpdir on Windows 2024-07-19 16:43:22 -07:00
Gregory Schier
447932697d Fix script for Windows? 2024-07-19 16:30:20 -07:00
Gregory Schier
0c75c2289e Add protoc back 2024-07-19 16:23:16 -07:00
Gregory Schier
c97c9b599d Install Yaak CLI 2024-07-19 16:13:39 -07:00
Gregory Schier
fc972b04f7 Oops, fix arch 2024-07-19 16:10:40 -07:00
Gregory Schier
e8410f70a1 Fix Node arch 2024-07-19 16:08:37 -07:00
Gregory Schier
70c63fc63c Debug log 2024-07-19 16:01:05 -07:00
Gregory Schier
c4e1353b51 Add repo token 2024-07-19 15:45:54 -07:00
Gregory Schier
fd6959e868 Add protoc installation 2024-07-19 15:38:44 -07:00
Gregory Schier
854c19c1a1 Add download-protoc to build 2024-07-19 15:25:20 -07:00
Gregory Schier
9370b4879b Deps for plugin-runtime 2024-07-19 15:16:35 -07:00
Gregory Schier
0b2da8e7ae Ignore plugins checkout for eslint 2024-07-19 15:13:19 -07:00
Gregory Schier
2e0982b999 Fix is valid 2024-07-19 15:09:45 -07:00
Gregory Schier
2ec3be4374 Update yaak cli path 2024-07-19 14:39:48 -07:00
Gregory Schier
b1e6f52396 Fix Go install 2024-07-19 14:28:59 -07:00
Gregory Schier
5ce928068c Fix again 2024-07-19 14:28:05 -07:00
Gregory Schier
76b1e5b103 Fix setup go 2024-07-19 14:26:47 -07:00
Gregory Schier
4a95128416 Install Yaak CLI with Go 2024-07-19 14:25:21 -07:00
Gregory Schier
cae6eb2b24 Specify version 2024-07-19 14:06:33 -07:00
Gregory Schier
cdcfb585cf Fix directory 2024-07-19 14:01:21 -07:00
Gregory Schier
d4d56dfe1b Install Yaak CLI in workflow 2024-07-19 13:57:04 -07:00
Gregory Schier
f6c491498b Fix checkout 2024-07-19 11:16:15 -07:00
Gregory Schier
e01cdd1dad Fix working directory 2024-07-19 11:13:58 -07:00
Gregory Schier
9e41d366c1 Remove failing step 2024-07-19 11:10:45 -07:00
Gregory Schier
fee46de974 Move ci/build to workflow 2024-07-19 11:09:07 -07:00
Gregory Schier
fa14b7aaf8 Debug where npm is 2024-07-19 11:06:39 -07:00
Gregory Schier
bb44bfca49 Inherit env for exec 2024-07-19 11:04:03 -07:00
Gregory Schier
6fcb3948ce TRy again 2024-07-19 11:02:15 -07:00
Gregory Schier
f716291328 Add debug 2024-07-19 10:58:48 -07:00
Gregory Schier
9f8eabe22b Fix copy plugins script 2024-07-19 10:53:39 -07:00
Gregory Schier
6d9e14784f Fix workflow 2024-07-19 10:49:29 -07:00
Gregory Schier
1d5f3260e2 NodeJS Plugin Runtime (#53) 2024-07-19 10:41:47 -07:00
Gregory Schier
883fcdb6b8 Update useSaveResponse.tsx 2024-06-27 22:05:41 -07:00
Gregory Schier
c9040a6e5f Fix RadioDropdown key 2024-06-24 11:18:38 -07:00
Gregory Schier
151450f55b Better performance on large workspaces 2024-06-21 10:53:11 -07:00
Gregory Schier
5722880890 Better active workspace change notification 2024-06-21 10:11:00 -07:00
Gregory Schier
d361a40903 Consolidate any* hooks 2024-06-21 10:01:45 -07:00
Gregory Schier
cd9e720835 Add mutationKey everywhere 2024-06-21 09:25:25 -07:00
Gregory Schier
50e2ab3a03 Move request to another workspace (#52) 2024-06-21 09:01:18 -07:00
Gregory Schier
dc5dfeb022 Bump CI node version 2024-06-20 16:45:59 -07:00
Gregory Schier
0b8a18edae Safe URI for reflection 2024-06-20 13:11:40 -07:00
Gregory Schier
0bb3f14b4c Fix button styles 2024-06-20 12:55:13 -07:00
Gregory Schier
c18d30b89f Refactor gRPC reflection! 2024-06-20 12:49:58 -07:00
Gregory Schier
8f06a834c8 Update script 2024-06-20 09:23:50 -07:00
Gregory Schier
bd948f9cd6 Actually write the file 2024-06-20 09:20:04 -07:00
Gregory Schier
d70254bcdc Generic build version 2024-06-20 09:17:28 -07:00
Gregory Schier
fac5385d5d Bump version 2024-06-20 09:07:38 -07:00
Gregory Schier
e8bcc695bb Better fallback request name generation 2024-06-20 09:03:24 -07:00
Gregory Schier
88aeb0e530 Fix GRPC with files not refreshing, and tight render loop 2024-06-20 08:40:10 -07:00
Gregory Schier
92b1582232 Better gRPC reflection errors 2024-06-18 10:54:39 -07:00
Gregory Schier
196990c077 Bump version 2024-06-18 10:41:22 -07:00
Gregory Schier
c42b8cf538 Editor autocomplete same font size as editor 2024-06-18 09:43:51 -07:00
Gregory Schier
085274c960 Move GraphQL introspection out of LocalStorage 2024-06-18 09:43:28 -07:00
Gregory Schier
7ef187abf6 REvert other thing 2024-06-17 17:05:51 -07:00
Gregory Schier
12eac34d95 Fix editor tags wrapping behavior 2024-06-17 17:05:29 -07:00
Gregory Schier
c29b3c6509 Change version 2024-06-17 15:09:44 -07:00
Gregory Schier
7faa423aba Recursive environments 2024-06-17 12:24:06 -07:00
Gregory Schier
5b2162e48d Fix flash loading response viewer 2024-06-17 11:43:45 -07:00
Gregory Schier
ee776143b2 Fix parsing notification timestamp 2024-06-17 11:43:20 -07:00
Gregory Schier
7a18fb29e4 More dynamic plugin access 2024-06-15 22:13:01 -07:00
Gregory Schier
4485cad9e8 Workspace dropdown to RadioDropdown 2024-06-14 17:07:35 -07:00
Gregory Schier
33763b6d2f Fix plugins 2024-06-13 07:03:50 -07:00
Gregory Schier
641fe86cf7 Support nested functions 2024-06-12 23:13:36 -07:00
Gregory Schier
65e7c804d7 Parse window title and theme better 2024-06-12 10:15:14 -07:00
Gregory Schier
23ec8bee8f Move binary detection to TextViewer 2024-06-12 09:47:34 -07:00
Gregory Schier
8aeeaa2e09 Bump version 2024-06-12 00:23:50 -07:00
Gregory Schier
57f01d249e Entitlement for v8/Deno 2024-06-12 00:23:32 -07:00
Gregory Schier
6c5a914db6 Variables in pair editor 2024-06-11 12:33:43 -07:00
Gregory Schier
155e51aa74 Put toast on top 2024-06-11 12:04:46 -07:00
Gregory Schier
012a984456 Fix bulk edit label 2024-06-11 09:02:11 -07:00
Gregory Schier
25800202f2 Bump version 2024-06-11 08:35:29 -07:00
Gregory Schier
a058064f1f Adjust fuzzy threshold 2024-06-10 23:25:57 -07:00
Gregory Schier
9f40804532 Fix window drag above cmd+k 2024-06-10 23:24:03 -07:00
Gregory Schier
26cc467858 Fix delete request in sidebar 2024-06-10 23:17:12 -07:00
Gregory Schier
be1cf7bf65 Don't arrow-nav to hidden dropdown items 2024-06-10 23:16:37 -07:00
Gregory Schier
ea4f104ca7 Bulk edit environments 2024-06-10 23:16:21 -07:00
Gregory Schier
32a28a3170 Fix hotkey react keys 2024-06-10 22:29:06 -07:00
Gregory Schier
6215914212 Cmd Palette Improvements (#50)
- Fuzzy matching
- Show hotkeys
- Add actions
2024-06-10 21:37:41 -07:00
Gregory Schier
a2dbd7f849 Download Active Response (#49)
This PR prompts you to save un-previewable file types and adds an option
to save to the response history.
2024-06-10 16:36:09 -07:00
Gregory Schier
5bb9815f4b Remove jump to request hotkey 2024-06-10 09:00:26 -07:00
Gregory Schier
7cd8ac3b21 Response viewer for PDF (#48)
This PR adds a response viewer for PDF files using `react-pdf`
2024-06-10 08:57:08 -07:00
Gregory Schier
456d3aaf52 Don't focus sidebar on cmd+0 2024-06-09 08:36:12 -07:00
Gregory Schier
113743f7cf Try fix CI 2024-06-09 08:09:47 -07:00
Gregory Schier
01a4d6f4ac Bump version 2024-06-09 07:56:44 -07:00
Gregory Schier
ff5cfe744e Remove CI again 2024-06-09 07:56:09 -07:00
Gregory Schier
29c4b51f54 Add it back 2024-06-09 07:23:28 -07:00
Gregory Schier
2f74bf8db8 Remove CI in release stage 2024-06-09 07:22:49 -07:00
Gregory Schier
b30d784d06 Remove GH Action step names 2024-06-09 07:16:53 -07:00
Gregory Schier
ac0adaf3d8 Back to other 2024-06-09 07:14:07 -07:00
Gregory Schier
c246d3a748 Fix action step 2024-06-09 07:10:44 -07:00
Gregory Schier
ae40728c1e Rust cache release 2024-06-09 07:09:46 -07:00
Gregory Schier
0430ec883b Cmd jump to request 2024-06-09 07:03:16 -07:00
Gregory Schier
eba6f33536 Only CI on PR 2024-06-09 06:47:47 -07:00
Gregory Schier
dae2873376 Fix Rust lint 2024-06-09 06:43:53 -07:00
Gregory Schier
cb2f56d9a1 Remove slow udeps from CI 2024-06-08 21:03:17 -07:00
Gregory Schier
7d82aa70a4 Rust CI to release 2024-06-08 20:51:03 -07:00
Gregory Schier
adea234987 Try again 2024-06-08 20:47:48 -07:00
Gregory Schier
37d0b487b8 Remove cache 2024-06-08 20:47:18 -07:00
Gregory Schier
d507f8c99f Try removing git db 2024-06-08 20:44:58 -07:00
Gregory Schier
60406ac83f Cargo check 2024-06-08 20:36:56 -07:00
Gregory Schier
8fe6f3a335 Remove Cargo fmt 2024-06-08 20:34:24 -07:00
Gregory Schier
69e027c302 Fix tests 2024-06-08 20:30:52 -07:00
Gregory Schier
4232bdd298 Cargo format 2024-06-08 20:28:45 -07:00
Gregory Schier
ef1c5da027 Set max dropdown width 2024-06-08 19:55:25 -07:00
Gregory Schier
e250326868 Bump version 2024-06-08 19:46:32 -07:00
Gregory Schier
125f503cfa Upgrade reqwest and add ALPN for http/2 2024-06-08 19:40:35 -07:00
Gregory Schier
8f086425fe Fix curl exporter 2024-06-08 19:40:11 -07:00
Gregory Schier
ae2da73873 Fix cmd+k filtering 2024-06-07 22:52:23 -07:00
Gregory Schier
3cd6688ffb Remove delete hotkey for request 2024-06-07 22:52:10 -07:00
Gregory Schier
8538da8879 Short method tags and hide active in cmd+k 2024-06-07 22:39:11 -07:00
Gregory Schier
b0e4ece278 Add command palette (#46)
This PR finished the initial PoC command palette. It currently only
supports switching between requests and workspaces, but can easily be
extended for more.
2024-06-07 21:59:57 -07:00
Gregory Schier
5e058af03e Bulk editor (#45)
Bulk editor for all pair editors except multipart/form-data
2024-06-07 13:42:08 -07:00
Gregory Schier
5108bc92f3 Fix rose pine and method tags 2024-06-07 12:01:31 -07:00
Gregory Schier
3c5fdcb18d Generate things 2024-06-07 11:58:08 -07:00
Gregory Schier
4672de4a47 Remove tauri-plugin-deep-link 2024-06-07 11:57:44 -07:00
Gregory Schier
239f6da141 Update CI script 2024-06-07 11:01:21 -07:00
Gregory Schier
ec148d1736 Fix workflow 2024-06-07 10:54:50 -07:00
Gregory Schier
392b549646 Deno plugins (#42)
Switch from BoaJS to Deno core
2024-06-07 10:47:41 -07:00
Gregory Schier
993d4dc65d Open workspace pref (#44)
Ability to remember workspace window opening selection.
2024-06-07 09:04:53 -07:00
Gregory Schier
e326405f4f Templating (#43)
Add new `templating` crate with custom parser/renderer for dealing with
variables
2024-06-07 08:39:12 -07:00
Gregory Schier
a83e094f00 Fix copy-as-curl variables 2024-06-05 06:53:38 -07:00
Gregory Schier
e683a2cb2a Bump version 2024-06-04 23:53:45 -07:00
Gregory Schier
1f231c2722 Only release on tag again 2024-06-04 23:53:31 -07:00
Gregory Schier
0fc2575ef6 Fix default workspace settings on initial Workspace 2024-06-04 17:06:40 -07:00
Gregory Schier
44c718e6bc Better analytics error log 2024-06-04 16:27:22 -07:00
Gregory Schier
495df847ab Merge branch 'beta' into master 2024-06-04 15:01:55 -07:00
Gregory Schier
5dbb9852f3 Bump version 2024-06-04 15:00:34 -07:00
Gregory Schier
82d3304c38 Hopefully fix AppImage build not finding migrations. I think it was because the productName had a capital Yaak in it. 2024-06-04 14:59:40 -07:00
Gregory Schier
5e2218fd64 Remove Windows plugin 2024-06-04 02:56:52 -07:00
Gregory Schier
5b12fad173 2024.5.0-beta.2 (#38) 2024-06-03 14:03:25 -07:00
Gregory Schier
8d6f23eacb Bump version 2024-06-03 14:00:49 -07:00
Gregory Schier
75a09859bc Move Postman to first plugin 2024-06-03 14:00:40 -07:00
Gregory Schier
dc47c4ceba Preserve JSON/XPath filter (Closes #22) 2024-06-03 13:49:51 -07:00
Gregory Schier
8ae0290aed Don't send request on completion (Fixes #27) 2024-06-03 07:49:13 -07:00
Gregory Schier
f01d1e704b Don't always change request method. Closes #29 2024-06-03 07:26:40 -07:00
Gregory Schier
3f72996e64 Tweak settings labels 2024-06-02 23:54:00 -07:00
Gregory Schier
fe862517fb Fix dropdown icon color 2024-06-02 23:50:26 -07:00
Gregory Schier
b39335dc4f Don't call is_fullscreen so much 2024-06-02 23:38:56 -07:00
Gregory Schier
8f3bdb5039 Fix autocomplete for environment editor names 2024-06-02 17:52:51 -07:00
Gregory Schier
b47ec01f9c <Select> uses custom component on Windows 2024-06-02 16:57:23 -07:00
Gregory Schier
36728d1d1f Tweak Moonlight theme 2024-06-02 15:48:27 -07:00
Gregory Schier
c3f0351445 Fix font size 2024-06-02 11:53:41 -07:00
Gregory Schier
9a5364187c Better invalid URL errors 2024-06-02 11:53:35 -07:00
Gregory Schier
a9db14994f Import content-type from Postman multi-part form 2024-06-02 11:53:25 -07:00
Gregory Schier
2383e8468f Also release on beta branch 2024-05-31 10:37:21 -07:00
Gregory Schier
a79d485b6a Bump version 2024-05-31 09:46:57 -07:00
Gregory Schier
7eb931d689 Fix multipart files 2024-05-31 09:32:16 -07:00
Gregory Schier
995cd2aa7b Fade in window contents (Layout) 2024-05-31 09:16:52 -07:00
Gregory Schier
1ce50e0c1b Window border on Linux 2024-05-31 08:43:35 -07:00
Gregory Schier
bce3d26a1a Try tweaking settings/theme for Windows. Setting the theme didn't work. 2024-05-30 23:38:49 -07:00
Gregory Schier
d9680ad0fa Ignore stoplights when centering settings title 2024-05-30 12:33:59 -07:00
Gregory Schier
e2e026e1ff Tweak appearance settings 2024-05-30 12:32:12 -07:00
Gregory Schier
16739d9a37 Dracula theme 2024-05-30 11:56:57 -07:00
Gregory Schier
524a4f2275 Tweak 2024-05-30 11:45:40 -07:00
Gregory Schier
ba66883dc2 Theme analytics and Moonlight 2024-05-30 11:00:50 -07:00
Gregory Schier
2caa735a2e Tweak settings for release 2024-05-30 10:28:59 -07:00
Gregory Schier
90637fda6b Unlisten to window event and fix hotkeys 2024-05-30 00:29:01 -07:00
Gregory Schier
2cef46b46a Window title working again 2024-05-30 00:11:55 -07:00
Gregory Schier
14b3abf76c Fix window stoplights 2024-05-29 22:59:34 -07:00
Gregory Schier
8cd3961f87 Custom font sizes and better zoom 2024-05-29 12:10:01 -07:00
Gregory Schier
5eb2e2b5a2 Merge branch 'refs/heads/release'
# Conflicts:
#	src-tauri/src/updates.rs
2024-05-26 09:11:29 -07:00
Gregory Schier
5dd897e042 Initial handler for yaak:// protocol 2024-05-26 08:45:15 -07:00
Gregory Schier
9c77ec296d Better theme export 2024-05-24 18:54:30 -07:00
Gregory Schier
696e72323b More theme stuff 2024-05-24 17:36:48 -07:00
Gregory Schier
3e8c01f436 Tweak themes 2024-05-23 10:16:29 -07:00
Gregory Schier
80fc4dec09 Hotdog stand 2024-05-23 10:14:07 -07:00
Gregory Schier
671885fc8c More themes! 2024-05-23 09:40:11 -07:00
Gregory Schier
002b61f0d7 Set window title on Mac 2024-05-23 09:40:00 -07:00
Gregory Schier
d32b462bd9 More tweaks 2024-05-22 23:44:47 -07:00
Gregory Schier
5c8b47288a Tweak Yaak default themes 2024-05-22 23:28:53 -07:00
Gregory Schier
8e662e6feb A bunch more theme stuff 2024-05-22 23:14:53 -07:00
Gregory Schier
83aaeb94f6 Theme system refactor (#31) 2024-05-21 17:56:06 -07:00
Gregory Schier
8606940dee Move is_dev check for updates 2024-05-16 10:28:25 -07:00
Gregory Schier
60e469a1c9 Fix release (#30) 2024-05-14 15:35:53 -07:00
Gregory Schier
57d548743f Merge remote-tracking branch 'refs/remotes/origin/release'
# Conflicts:
#	src-tauri/tauri.conf.json
2024-05-14 15:35:33 -07:00
Gregory Schier
dab7ee2492 Bump version 2024-05-14 15:34:34 -07:00
Gregory Schier
9360fd7e43 Oops 2024-05-14 15:33:27 -07:00
Gregory Schier
7b4bc53c0f Release 2024.4.1 (#28) 2024-05-14 15:01:55 -07:00
Gregory Schier
0f7969d10a Fix maximize permission 2024-05-14 14:54:09 -07:00
Gregory Schier
6b373b5985 Fix autocomplete 2024-05-14 14:47:33 -07:00
Gregory Schier
c0068a1561 Add num launches to notification call 2024-05-14 14:25:10 -07:00
Gregory Schier
fad5e03f8b Fix window clicking on Linux 2024-05-14 12:19:19 -07:00
Gregory Schier
a22fc68764 Slight refactor 2024-05-14 08:44:15 -07:00
Gregory Schier
59a442e8c0 Build plugin 2024-05-14 08:28:20 -07:00
Gregory Schier
35e8155ecf Improve Curl imports 2024-05-14 08:28:01 -07:00
Gregory Schier
8b9a5cb5fb Bump version for release 2024-05-14 07:50:01 -07:00
Gregory Schier
29f9825f04 Fix upgrade cancel 2024-05-14 07:08:57 -07:00
Gregory Schier
ad8a6beacf Toast after data export 2024-05-14 00:36:15 -07:00
Gregory Schier
194ac78814 Fix selection of HTTP Request on create dropdown hotkey 2024-05-14 00:17:33 -07:00
Gregory Schier
0542f1ebea Fix curl export with multi-line body 2024-05-14 00:05:54 -07:00
Gregory Schier
8de917ea5e Autocomplete URLs of other requests 2024-05-13 23:54:52 -07:00
Gregory Schier
0b494bbfbf Fixed asset:// loading and tweak curl stuff 2024-05-13 23:20:30 -07:00
Gregory Schier
7e74f71c79 Bump version 2024-05-13 16:52:32 -07:00
Gregory Schier
bd7fd676a5 Better notifications 2024-05-13 16:52:20 -07:00
Gregory Schier
cb1c6a4d8c Improve copy-as-curl 2024-05-13 11:30:10 -07:00
Gregory Schier
b640f0c357 Refactor UpdateMode 2024-05-13 07:28:45 -07:00
Gregory Schier
967590c7ff Hide large GRPC messages by default 2024-05-13 07:19:26 -07:00
Gregory Schier
321d6ec9d7 Bump version 2024-05-12 12:11:14 -07:00
Gregory Schier
79b4fd7829 Add curl banner to import dialog 2024-05-10 13:36:30 -07:00
Gregory Schier
52eb4d338f Change curl import to post-toast 2024-05-10 13:06:40 -07:00
Gregory Schier
4b8b48e92f Toast component and use for copy-as-curl 2024-05-10 12:37:04 -07:00
Gregory Schier
e3f45b58e5 Insomnia YAML and loading state on import 2024-05-10 09:46:20 -07:00
Gregory Schier
a5f1922446 Some fixes after upgrading react-query 2024-05-10 09:19:29 -07:00
Gregory Schier
22e7b15a63 Update deps 2024-05-10 08:52:06 -07:00
Gregory Schier
c6bb2a73f8 Fix paste handler in Editor.tsx 2024-05-09 23:17:43 -07:00
Gregory Schier
bde961f95d Fix release targets 2024-05-09 15:38:27 -07:00
Gregory Schier
c4867b3f68 Don't commit .cargo 2024-05-09 10:17:35 -07:00
Gregory Schier
1c36e9a2f0 Fix args 2024-05-09 09:35:39 -07:00
Gregory Schier
1c82d8a738 Update GH action 2024-05-09 09:33:47 -07:00
Gregory Schier
a2df591102 Try fix linux 2024-05-09 08:37:18 -07:00
Gregory Schier
c950ee0fb8 Fix env var in GH Action 2024-05-09 08:29:45 -07:00
Gregory Schier
0ce5a9fcce Fix curl export tests 2024-05-09 08:18:06 -07:00
Gregory Schier
bd1970a805 Default .app/.dev/etc domains to https protos 2024-05-09 08:16:06 -07:00
Gregory Schier
3aaa4b1050 Bump version for beta 2024-05-09 07:52:36 -07:00
Gregory Schier
31d2426846 Fix GRPC event.emit permissions 2024-05-09 07:45:00 -07:00
Gregory Schier
25c4e4edaf Import from Curl 2024-05-09 07:31:52 -07:00
Gregory Schier
1a5bf53b02 Package lock 2024-05-08 15:37:53 -07:00
Gregory Schier
e2d1b62044 Slight refactor to copy-as-curl 2024-05-08 00:28:40 -07:00
Gregory Schier
6186104d11 Add rename request to context menu
Closes #21
2024-05-08 00:08:18 -07:00
Gregory Schier
f1e97eaea4 Copy as curl 2024-05-08 00:00:50 -07:00
Gregory Schier
bb0e58bf8b Curl import (#24) 2024-05-07 21:57:03 -07:00
Gregory Schier
dc802fa055 Upgrade to Tauri 2.0 (#23) 2024-05-04 14:14:19 -07:00
Gregory Schier
3c8e19367f Fix horizontal scroll on GraphQL variables editor 2024-04-18 10:53:36 -07:00
Gregory Schier
a89887eab8 Oops 2024-04-02 10:11:37 +02:00
Gregory Schier
7d3f0ad549 Postman text body import 2024-04-02 10:10:16 +02:00
Gregory Schier
5608db1334 Bump version 2024-04-01 08:48:26 +02:00
Gregory Schier
10443b3c02 Separate floating sidebar hidden state 2024-03-22 10:43:10 -07:00
Gregory Schier
7d272f3cd6 Filtering for cmd palette 2024-03-22 10:42:45 -07:00
Gregory Schier
d60a62ab24 Space between var placeholders and code fold cursor 2024-03-22 10:42:35 -07:00
Gregory Schier
2b0f73b7c5 Fix Postman variable import 2024-03-22 10:40:51 -07:00
Gregory Schier
0915ea8585 Adjust highlight color 2024-03-22 10:37:45 -07:00
Gregory Schier
ed9a0b8ac7 Some scrolling tweaks 2024-03-20 17:27:47 -07:00
Gregory Schier
7437f39ed3 Fix URL bar buttons in expanded state 2024-03-20 16:17:05 -07:00
Gregory Schier
27f80cd97b Bump version 2024-03-20 16:05:14 -07:00
Gregory Schier
04cf688a9b Fix dialog height 2024-03-20 16:05:01 -07:00
Gregory Schier
178af308ce Remove openOnHotKeyAction in favor of putting hotkey on the trigger button= 2024-03-20 15:56:39 -07:00
Gregory Schier
d40732a910 Use SQLite connect options 2024-03-20 13:33:11 -07:00
Gregory Schier
d8a579b7b3 Pass workspace id to import 2024-03-20 07:30:59 -07:00
Gregory Schier
bf8ef40708 Handle import errors 2024-03-20 07:27:12 -07:00
Gregory Schier
41060d5d43 Postman bearer, global auth, global vars 2024-03-20 07:26:46 -07:00
Gregory Schier
ab6cef064c Implement select for command palette 2024-03-19 17:24:57 -07:00
Gregory Schier
829d10d7b9 Tweak checkbox and autocomplete styles 2024-03-19 17:08:06 -07:00
Gregory Schier
57e1f641a7 Fix sidebar border 2024-03-19 16:44:37 -07:00
Gregory Schier
7df965e74b Export multiple workspaces 2024-03-19 13:43:33 -07:00
Gregory Schier
0e1153fdfd Fix settings query store and analytics 2024-03-19 10:23:21 -07:00
Gregory Schier
9797bc1830 Start of command palette 2024-03-18 17:09:01 -07:00
Gregory Schier
9d00eb98d2 useRequests hook 2024-03-18 13:49:36 -07:00
Gregory Schier
88f6e882c6 Fix editor key events 2024-03-18 13:40:15 -07:00
Gregory Schier
230a773909 Simple tests for Postman and Yaak importers 2024-03-18 13:40:00 -07:00
Gregory Schier
e6da1afa82 Set filename on Multipart part 2024-03-18 13:24:27 -07:00
Gregory Schier
a70d9e57be Fix GraphQL editor large variables quirk 2024-03-18 13:10:55 -07:00
Gregory Schier
8afe0c0755 Fix postman import and import Insomnia gRPC 2024-03-18 08:18:04 -07:00
Gregory Schier
e47c2513a8 Better padding 2024-03-16 13:59:06 -07:00
Gregory Schier
276bcfceeb Remove debug log 2024-03-16 12:50:27 -07:00
Gregory Schier
6fd1b35a50 Custom content-type for multipart items 2024-03-16 12:49:17 -07:00
Gregory Schier
bc33244549 Content menu on entire sidebar 2024-03-16 10:47:10 -07:00
Gregory Schier
33c982b288 Obfuscate environment variables 2024-03-16 10:42:46 -07:00
Gregory Schier
98493a1167 Fix light mode text selection 2024-03-16 09:48:55 -07:00
Gregory Schier
a8c10f9601 Stubbed out global commands helper 2024-03-16 09:46:11 -07:00
Gregory Schier
1051f84bbf Fix deleting workspace staying on deleted workspace path 2024-03-15 13:07:02 -07:00
Gregory Schier
eea137e677 Bump version 2024-03-10 18:15:00 -07:00
Gregory Schier
27cf4e925f Fix recent workspaces 2024-03-10 17:42:25 -07:00
Gregory Schier
6b239c4e3f Fix adding header if not exist 2024-03-10 17:10:16 -07:00
Gregory Schier
4c7ee5ef80 Remove completion debug blur thing 2024-03-10 16:46:18 -07:00
Gregory Schier
3ddb79899e Adjust detected content-type header 2024-03-10 16:26:06 -07:00
Gregory Schier
b14595a3e2 Clickable links in response viewer 2024-03-10 13:41:44 -07:00
Gregory Schier
82c94369ae Better error handling for file not found 2024-03-10 11:02:32 -07:00
Gregory Schier
7e77d2e9a8 Cancel file selection sets to undefined 2024-03-10 10:57:49 -07:00
Gregory Schier
ce5ce76b21 Binary file uploads and missing workspace empty state 2024-03-10 10:56:38 -07:00
Gregory Schier
27d6b30cf9 Fix GraphQL Header backend 2024-02-28 13:38:22 -08:00
Gregory Schier
9285dd5d70 Fix GraphQL content type on creation, and placeholder 2024-02-28 13:04:17 -08:00
Gregory Schier
977234808e Include default protoc includes 2024-02-28 09:45:11 -08:00
Gregory Schier
e1ccd327f5 Bump version 2024-02-28 08:51:34 -08:00
Gregory Schier
a0e3e71a4b Fix dropdown arrow keys 2024-02-28 08:51:08 -08:00
Gregory Schier
2d4037da37 Track GRPC 2024-02-28 07:32:05 -08:00
Gregory Schier
d21608bb82 Analytics ID 2024-02-28 07:27:19 -08:00
Gregory Schier
f16239de73 Analytics ID 2024-02-28 07:26:02 -08:00
Gregory Schier
d00f34c240 Remove Escape from hotkeys 2024-02-27 18:58:41 -08:00
Gregory Schier
fd77437f59 Fix sidebar focus 2024-02-27 10:33:20 -08:00
Gregory Schier
f9cd8d24a1 Fix gap in dropdown menu items 2024-02-27 10:27:04 -08:00
Gregory Schier
c0a9f79834 Methods in recent dropdown 2024-02-27 10:20:35 -08:00
Gregory Schier
ca63c101a1 Many hotkey improvements 2024-02-27 10:10:38 -08:00
Gregory Schier
dbd0b46ef2 Info logs in build 2024-02-26 17:27:08 -08:00
Gregory Schier
89793ebe2f Introspection tweak 2024-02-26 17:24:44 -08:00
Gregory Schier
e1ffc387ea Tweak editor find/replace 2024-02-26 17:17:37 -08:00
Gregory Schier
1efd0852ef Fix find/replace CM styling 2024-02-26 17:07:09 -08:00
Gregory Schier
59d532ed4d Fix lint errors 2024-02-26 07:43:08 -08:00
Gregory Schier
f034cda7cd Autocomplete icons and transfer proto files on duplicate 2024-02-26 07:39:53 -08:00
Gregory Schier
5c1cf1e57d Prompt folder name on create 2024-02-26 07:14:27 -08:00
Gregory Schier
780960f5de Better creation from folder menu 2024-02-26 07:09:59 -08:00
Gregory Schier
aada95e9da Auto-fill link to changelog in release script 2024-02-25 18:42:04 -08:00
Gregory Schier
89b5003cce Protoc sidecar 2024-02-25 17:43:29 -08:00
Gregory Schier
3559333461 Fix deletion in sidebar 2024-02-25 12:56:57 -08:00
Gregory Schier
fbb6cab567 Fix create dropdown hotkey 2024-02-24 22:02:04 -08:00
Gregory Schier
30fca29c6d Try changing macOS version 2024-02-24 21:25:58 -08:00
Gregory Schier
ec1e521b39 Bump some things 2024-02-24 21:23:02 -08:00
Gregory Schier
a8998cd696 Fix response pane height 2024-02-24 19:31:59 -08:00
Gregory Schier
df178baed6 Don't build plugins 2024-02-24 18:58:51 -08:00
Gregory Schier
e2f75371e6 Remove npm ci plugins 2024-02-24 18:28:07 -08:00
Gregory Schier
9f25ab39c6 Check in built plugins again 2024-02-24 18:27:36 -08:00
Gregory Schier
937df6a024 Add pkg locks 2024-02-24 18:19:16 -08:00
Gregory Schier
7deb7182a8 Install plugins in CI 2024-02-24 16:29:22 -08:00
Gregory Schier
82b14c56be Bump version 2024-02-24 16:22:55 -08:00
Gregory Schier
58b98734c9 Got json-schema autocomplete working again 2024-02-24 16:22:22 -08:00
Gregory Schier
c2f58f328c Proto files off model 2024-02-24 14:16:58 -08:00
Gregory Schier
36eabe7528 Better gRPC status on error 2024-02-24 12:41:43 -08:00
Gregory Schier
8347093e8b More analytics, and cancel requests 2024-02-24 11:30:07 -08:00
Gregory Schier
75282cb43a Hook up empty state buttons for first-launch experience 2024-02-23 16:34:19 -08:00
Gregory Schier
3a253a758d gRPC in import/export 2024-02-23 16:16:13 -08:00
Gregory Schier
f2955c26c1 Everything in messages now 2024-02-22 19:51:30 -08:00
Gregory Schier
e6c0317b37 Format XML responses 2024-02-22 01:00:02 -08:00
Gregory Schier
0cfb218b07 Refactor into grpc events 2024-02-22 00:49:22 -08:00
Gregory Schier
8ef103fbde Fix split layout placeholder 2024-02-18 09:12:44 -08:00
Gregory Schier
ec5cdfb025 Add other body type 2024-02-18 08:59:14 -08:00
Gregory Schier
7f4d082c17 Add metadata and squash migrations 2024-02-18 08:35:31 -08:00
Gregory Schier
e10011ef34 Better environment edit dialog 2024-02-18 07:44:53 -08:00
Gregory Schier
1eb6999c37 Allow editing base environment 2024-02-18 00:14:47 -08:00
Gregory Schier
35596916bf Render gRPC message body 2024-02-18 00:14:26 -08:00
Gregory Schier
d61b22dd87 gRPC authentication 2024-02-17 23:47:28 -08:00
Gregory Schier
5565a9db9a Even better dropdown filtering 2024-02-17 22:27:01 -08:00
Gregory Schier
b803655306 Started gRPC tabs 2024-02-17 22:15:44 -08:00
Gregory Schier
20df2bf13a Better dropdown filtering 2024-02-17 22:03:42 -08:00
Gregory Schier
e8fab85ce5 Prevent dragging folders into itself 2024-02-17 15:32:15 -08:00
Gregory Schier
ce730f3dbe Fix deps 2024-02-17 15:20:13 -08:00
Gregory Schier
2328973de5 Upgrade Vite deps and fix windows DnD 2024-02-17 14:57:12 -08:00
Gregory Schier
37dea50c91 Fix postman importer TS ref 2024-02-17 11:05:57 -08:00
Gregory Schier
40dfc8b30a Add more info to settings 2024-02-17 11:04:19 -08:00
Gregory Schier
72971bb9ec Adjust placeholder error colors 2024-02-15 21:15:18 -08:00
Gregory Schier
f835599502 Tweak tab padding 2024-02-15 16:38:14 -08:00
Gregory Schier
0caa4f8099 Responsive (scroll) workspace header 2024-02-15 16:30:08 -08:00
Gregory Schier
71d3c9acd1 Better button highlight border 2024-02-15 15:55:32 -08:00
Gregory Schier
239ffa174a Refactor recentRequest/Env/Workspace 2024-02-15 15:14:18 -08:00
Gregory Schier
eae79ab14b Better sidebar collapse, debuonce container uqeries, fix recent requests 2024-02-15 15:07:15 -08:00
Gregory Schier
ef7912615a Better recent work/env/req logic 2024-02-13 17:21:54 -08:00
Gregory Schier
7f20b67380 Fix active environment on workspace change 2024-02-13 16:42:07 -08:00
Gregory Schier
504337c178 Active environment in query param 2024-02-13 16:32:31 -08:00
Gregory Schier
d6b4f06ac8 Better variable placeholder styles 2024-02-13 16:32:17 -08:00
Gregory Schier
28cbf5474d Show GQL for graphql requests in sidebar 2024-02-13 16:32:00 -08:00
Gregory Schier
d797b84d4e Better highlight on JSON tree 2024-02-13 16:31:38 -08:00
Gregory Schier
720745857d Cmd+n to open dropdown 2024-02-11 14:17:09 -08:00
Gregory Schier
a74ea1aeda Tab-to-indent in editor 2024-02-11 14:16:36 -08:00
Gregory Schier
643f5e7f26 Make editor variables more prominent 2024-02-11 14:16:25 -08:00
Gregory Schier
a208b934e4 Fix dropdown open index 2024-02-11 14:16:11 -08:00
Gregory Schier
5892774082 Catch URL error when URL = "{{HOST}}" 2024-02-11 09:04:27 -08:00
Gregory Schier
13bfc1c3bd Grap gRPC status codes 2024-02-11 08:52:12 -08:00
Gregory Schier
00289734c7 Use basemsg 2024-02-11 08:29:57 -08:00
Gregory Schier
09c7c2cb91 Combine grpc handlers, fix duplicate 2024-02-10 10:41:45 -08:00
Gregory Schier
bbe62abd20 Fix response emit and sidebar flex 2024-02-09 16:16:02 -08:00
Gregory Schier
cae9a4fd36 Sidebar methods and fix model hooks 2024-02-09 16:09:24 -08:00
Gregory Schier
e7ee4a8867 Fix editor selection/cursor and lint errors 2024-02-09 14:32:58 -08:00
Gregory Schier
b020574c88 Remove built plugins from source control 2024-02-09 05:09:37 -08:00
Gregory Schier
192e1da5b6 Merge branch 'grpc' 2024-02-09 05:07:45 -08:00
Gregory Schier
0640079e59 Move plugins to build folder 2024-02-09 05:07:34 -08:00
Gregory Schier
a9d99aa17f gRPC Support (#20) 2024-02-09 05:01:00 -08:00
Gregory Schier
b4667e1f88 Better message serialization 2024-02-09 05:00:48 -08:00
Gregory Schier
7bc26fd448 Working sidebar actions for grpc 2024-02-07 00:02:02 -08:00
Gregory Schier
94a9a5d5d5 Change hotkey handling to capture phase 2024-02-06 23:44:10 -08:00
Gregory Schier
bcfa2c411f Fix pool management 2024-02-06 23:26:24 -08:00
Gregory Schier
1e3d43dbae Minor tweaks 2024-02-06 19:32:03 -08:00
Gregory Schier
c6b5e4d5df gRPC schema from files! 2024-02-06 19:20:32 -08:00
Gregory Schier
1293870e11 Proto selection UI/models 2024-02-06 12:29:23 -08:00
Gregory Schier
8309c19167 Better reflect failure UI 2024-02-05 14:50:47 -08:00
Gregory Schier
63a381c55a Async connection management 2024-02-05 11:29:27 -08:00
Gregory Schier
d891f891b7 Refactor model emit, and recent conn dropdown 2024-02-05 10:39:47 -08:00
Gregory Schier
0b12a6b318 db to app_handle! 2024-02-04 22:52:04 -08:00
Gregory Schier
0144ab05a0 Single upserted_model event 2024-02-04 21:19:15 -08:00
Gregory Schier
1f71d4372f Fix DB mutex deadlock 2024-02-04 21:17:05 -08:00
Gregory Schier
5ed1ea07ef More messages 2024-02-04 19:08:31 -08:00
Gregory Schier
4d2b101278 Client streaming working 2024-02-04 17:53:15 -08:00
Gregory Schier
1dfdadde98 Bidirectional working 2024-02-04 14:10:38 -08:00
Gregory Schier
d19729869e Messages are flowing! 2024-02-04 12:09:10 -08:00
Gregory Schier
5f782ad109 Use req/conn/msg models in unary/server 2024-02-04 11:57:12 -08:00
Gregory Schier
27dbdc9b5a Remove console log 2024-02-03 13:39:45 -08:00
Gregory Schier
4892863dd7 Grpc layout use new models 2024-02-03 13:28:31 -08:00
Gregory Schier
dc077209cc Show gRPC requests in sidebar 2024-02-03 13:08:24 -08:00
Gregory Schier
d8d5344d21 gRPC models and tables 2024-02-03 11:14:42 -08:00
Gregory Schier
d148a8384d Tiny fixes 2024-02-02 18:41:00 -08:00
Gregory Schier
6884e9428b Better formatting 2024-02-02 13:37:44 -08:00
Gregory Schier
25ebccfcd7 A bit better handling of responses 2024-02-02 13:32:06 -08:00
Gregory Schier
7adb0cbb50 Split layouts and things 2024-02-02 12:41:37 -08:00
Gregory Schier
50866abda4 bidi hacked! 2024-02-02 01:10:54 -08:00
Gregory Schier
c83d904cf0 Implement cancel 2024-02-02 00:18:37 -08:00
Gregory Schier
160447f8f6 Better connection management 2024-02-01 20:29:32 -08:00
Gregory Schier
184b13cc2a gRPC manager mostly working 2024-02-01 15:36:50 -08:00
Gregory Schier
8fa965e055 Small refactor 2024-02-01 02:42:59 -08:00
Gregory Schier
1dd0b69079 Refactor commands and DB 2024-02-01 02:29:24 -08:00
Gregory Schier
be8dd107e3 Some minor tweaks 2024-02-01 00:48:03 -08:00
Gregory Schier
8f139f10ef Revert response JSON tree 2024-02-01 00:38:57 -08:00
Gregory Schier
8b0823984b Even better styles 2024-02-01 00:36:49 -08:00
Gregory Schier
d82d2229d4 Styled it up a bit 2024-02-01 00:16:09 -08:00
Gregory Schier
4be1bc17f3 Merge remote-tracking branch 'origin/grpc' into grpc 2024-01-31 22:14:15 -08:00
Gregory Schier
e6af0c6009 Hacky server streaming done 2024-01-31 22:14:08 -08:00
Gregory Schier
e5d10bd72b Hacky client streaming done 2024-01-31 22:13:46 -08:00
Gregory Schier
9426885bb8 Initial frontend for gRPC UI 2024-01-30 16:43:54 -08:00
Gregory Schier
89e5d4f235 Hooked up test call from frontend! 2024-01-29 20:50:43 -08:00
Gregory Schier
eecb3fbc7f Fix cookie jar 2024-01-28 17:49:04 -08:00
Gregory Schier
244f1319b4 Track dialogs 2024-01-28 16:33:36 -08:00
Gregory Schier
6a2b76e760 Fix dropdown separator 2024-01-28 16:21:41 -08:00
Gregory Schier
bc0278fce9 Better format 2024-01-28 16:19:46 -08:00
Gregory Schier
959841fb22 More response info 2024-01-28 16:02:49 -08:00
Gregory Schier
fbc878dbe5 Better BG color 2024-01-28 14:43:04 -08:00
Gregory Schier
7d183c6580 Cookie Support (#19) 2024-01-28 14:39:51 -08:00
Gregory Schier
0555420ad9 Add shift to hotkey dialog hotkey 2024-01-19 22:11:20 -08:00
Gregory Schier
ae25561c7e Show alert after force checking updates 2024-01-19 22:11:02 -08:00
Gregory Schier
92e2b2b8f9 Better dialog padding 2024-01-19 22:08:32 -08:00
Gregory Schier
2a4a830fb7 Change env hotkey to use shift 2024-01-19 21:53:48 -08:00
Gregory Schier
0ad4c7cd7e Fix URL 2px grow on focus 2024-01-19 21:49:51 -08:00
Gregory Schier
41413d52ad Bump version 2024-01-19 13:42:02 -08:00
Gregory Schier
eabc1bd305 Fix analytics again 2024-01-18 22:28:25 -08:00
Gregory Schier
9c312e12c1 Fix dialog close button 2024-01-18 20:57:42 -08:00
Gregory Schier
18ea9dda3d Fix URLBar expanded state inner buttons 2024-01-18 20:40:56 -08:00
Gregory Schier
56d4212f68 Some analytics fixes 2024-01-18 20:23:02 -08:00
Gregory Schier
d932c19513 Launch analytics events, changelog, better filter styles 2024-01-18 14:42:02 -08:00
Gregory Schier
b800f00b7e Bump version 2024-01-17 14:56:47 -08:00
Gregory Schier
e43af5234f Custom HTTP method names 2024-01-17 14:52:19 -08:00
Gregory Schier
aa59d96e55 Workspace header tweak Windows 2024-01-17 18:48:43 -08:00
Gregory Schier
5be04ceea6 Fix header in fullscreen mode on Mac 2024-01-17 09:34:47 -08:00
Gregory Schier
da3392ac53 Download response, and some fixes 2024-01-16 17:02:55 -08:00
Gregory Schier
a2c9c98b21 Fix editor toolbar blocking things 2024-01-15 21:44:53 -08:00
Gregory Schier
8298d6e031 Better request creation (Closes #14) 2024-01-15 21:39:27 -08:00
Gregory Schier
d6331022ad XPath plugin 2024-01-15 21:27:47 -08:00
Gregory Schier
5e75d8c9a7 Fix send icon 2024-01-15 15:43:55 -08:00
Gregory Schier
51944a212a Switch to Lucide icons 2024-01-15 15:42:28 -08:00
Gregory Schier
49ed756479 Improve response filter UX 2024-01-15 15:19:29 -08:00
Gregory Schier
1d207d5fbd JSONPath filter plugins working 2024-01-15 15:06:49 -08:00
Gregory Schier
6b1d15415d Move plugin stuff around 2024-01-15 14:33:51 -08:00
Gregory Schier
df3bfaaab7 Fix request duplication 2024-01-15 13:47:44 -08:00
Gregory Schier
ad0b8a8e7d Fix workspace defaults 2024-01-15 12:25:13 -08:00
Gregory Schier
d5459229b9 Better settings dialog 2024-01-15 12:16:44 -08:00
Gregory Schier
adbf596f0b Fix resize observer 2024-01-15 12:02:08 -08:00
Gregory Schier
c740966394 Move request-related settings to workspace 2024-01-15 11:52:36 -08:00
Gregory Schier
7adab73af3 Bump beta version 2024-01-14 20:30:25 -08:00
Gregory Schier
c964f255d8 fix mac decorations 2024-01-14 17:22:31 -08:00
Gregory Schier
a7ffed9716 Integrated titlebar windows 2024-01-14 16:44:04 -08:00
Gregory Schier
488d66d248 Further titlebar tweaks 2024-01-14 12:02:44 -08:00
Gregory Schier
93cb469cb8 Better titlebar control icons 2024-01-14 11:56:21 -08:00
Gregory Schier
03a2fc8ee5 Basic Linux/Windows integrated titlebar 2024-01-13 23:40:32 -08:00
Gregory Schier
2d72e5792e Fix hotkey formatting 2024-01-12 22:12:01 -08:00
Gregory Schier
9bf9a87f12 beta tag 2024-01-12 22:00:55 -08:00
Gregory Schier
e2fca399e0 fix appearance init 2024-01-12 21:59:46 -08:00
Gregory Schier
e13fdddf98 Vendor Openssl 2024-01-12 21:03:28 -08:00
Gregory Schier
890eea299d Hotkeys for request switcher 2024-01-12 21:03:20 -08:00
Gregory Schier
9beac00981 Appearance setting and gzip/etc support 2024-01-12 13:39:08 -08:00
Gregory Schier
1a64d7d9e6 Initial settings implementation 2024-01-11 21:13:17 -08:00
Gregory Schier
bd5ae12f2e Dropdown manages hotkeys now 2024-01-11 10:18:05 -08:00
Gregory Schier
dbaf1da3ce Hotkey for keyboard shortcut help 2024-01-10 22:05:16 -08:00
Gregory Schier
a03c5df440 Bump version number 2024-01-10 16:25:55 -08:00
Gregory Schier
0776f6a2be Add hotkey dialog and rust-only analytics 2024-01-10 16:18:08 -08:00
Gregory Schier
ac9d050d9e Fix beta icon 2024-01-08 17:07:42 -08:00
Gregory Schier
b885c358a3 Bump version to 2024.0.0 2024-01-08 15:57:59 -08:00
Gregory Schier
84d447973e Hotkey labels 2024-01-08 15:57:21 -08:00
Gregory Schier
019ec4de20 Show hotkeys on empty views 2024-01-08 15:13:44 -08:00
Gregory Schier
26189067cd Remove base env, fix hotkeys, and QoL improvements 2024-01-07 22:24:19 -08:00
Gregory Schier
caf39071af Fix hotkeys getting stuck on cmd+tab 2024-01-07 21:32:25 -08:00
Gregory Schier
08a1223482 Always show settings dropdown 2023-11-22 09:39:30 -08:00
Gregory Schier
24bd90745e Tweak margin 2023-11-22 09:37:50 -08:00
Gregory Schier
7a72920e66 Fix bottom-up dropdown positioning 2023-11-22 09:35:56 -08:00
Gregory Schier
81a8276e2b Bump version 2023-11-22 09:06:47 -08:00
Gregory Schier
8fb6f51555 Better linux/Windows support for hotkeys 2023-11-22 09:06:22 -08:00
Gregory Schier
b0026aff66 Good hotkey support 2023-11-22 09:01:48 -08:00
Gregory Schier
3ced7f7c18 Reset URL bar when request changes 2023-11-21 23:26:29 -08:00
Gregory Schier
33f6995193 Env dialog hotkey 2023-11-21 22:35:28 -08:00
Gregory Schier
8af526682a Remove response body and basic hotkeys 2023-11-21 22:15:01 -08:00
Gregory Schier
d0d4324957 Remove app-specific menu items 2023-11-21 19:18:40 -08:00
Gregory Schier
2bcd0e0bbe Fix macOS menu and fallback URL 2023-11-21 09:24:13 -08:00
Gregory Schier
1b99c7e10f Hide menu on windows/linux 2023-11-21 08:17:37 -08:00
Gregory Schier
2831bb61b8 Disable sandboxing (again) 2023-11-19 21:59:55 -08:00
Gregory Schier
320670de2a Fix drag-drop reorder 2023-11-19 21:43:01 -08:00
Gregory Schier
1f39a36f26 Postman ID generation 2023-11-19 20:54:02 -08:00
Gregory Schier
1f84ba716e Bump beta.3 2023-11-19 20:46:55 -08:00
Gregory Schier
d034965d9c Postman variables + urlencoded forms 2023-11-19 20:29:24 -08:00
Gregory Schier
5eb30489e5 Add back Windows/Linux builds 2023-11-19 18:22:13 -08:00
Gregory Schier
05458a0753 Remove Tauri context menu plugin 2023-11-19 18:21:10 -08:00
Gregory Schier
7975ef0699 Fix header padding windows/linux 2023-11-19 18:14:49 -08:00
Gregory Schier
5f810a1b4c Some tweaks 2023-11-19 18:13:32 -08:00
Gregory Schier
c4093e79cf Beta 2 2023-11-19 17:41:58 -08:00
Gregory Schier
956f8ed2ea Network entitlement 2023-11-19 17:41:46 -08:00
Gregory Schier
7b32f76a1e Try sandboxing again 2023-11-19 17:06:31 -08:00
Gregory Schier
0dd11bc051 Remove sandboxing 2023-11-17 09:33:16 -08:00
Gregory Schier
aa38df28af Out of beta 2023-11-17 07:53:26 -08:00
Gregory Schier
32962a6336 Tweak 2023-11-17 07:52:03 -08:00
Gregory Schier
b268b72a4a Format GraphQL variables 2023-11-17 07:51:03 -08:00
Gregory Schier
eb0c90311b Drag into folder (Closes #8) 2023-11-17 07:36:01 -08:00
Gregory Schier
1070bf8e8f Mostly move some stuff around 2023-11-16 18:53:34 -08:00
Gregory Schier
9bdb01987c Better update logic 2023-11-14 14:28:06 -08:00
Gregory Schier
3130fb948a Better dropdown menu 2023-11-14 10:56:56 -08:00
Gregory Schier
e46de9eebd Version to beta 2023-11-14 10:07:39 -08:00
Gregory Schier
4360355c8c Beta channel updates 2023-11-14 08:57:46 -08:00
Gregory Schier
3baaddba0b Multipart form UI and fixes 2023-11-14 00:32:02 -08:00
Gregory Schier
e77c1c2a46 Got multipart working (text-only) 2023-11-13 23:26:11 -08:00
Gregory Schier
38422d59fd Fix window title moving stoplights (for now) 2023-11-13 23:25:47 -08:00
Gregory Schier
c884cedfc2 Postman import form data 2023-11-13 11:48:28 -08:00
Gregory Schier
91074a35d8 Some small improvements 2023-11-13 11:44:29 -08:00
Gregory Schier
9a02b63a6b Form urlencoded bodies! 2023-11-13 11:28:37 -08:00
Gregory Schier
4470409a24 Url parameters done 2023-11-13 10:52:11 -08:00
Gregory Schier
8a978420be Minor tweaks 2023-11-12 21:16:42 -08:00
Gregory Schier
dfc01d51ca Custom updater code 2023-11-12 21:16:33 -08:00
Gregory Schier
758154fa14 Request body is now an object 2023-11-12 11:16:12 -08:00
Gregory Schier
ef23a85577 Some postman import improvements 2023-11-11 10:43:11 -08:00
Gregory Schier
e4533088ed Sync window title (Closes #13) 2023-11-10 15:55:50 -08:00
Gregory Schier
4ffce4a534 Dev app icon 2023-11-10 13:06:12 -08:00
Gregory Schier
6b77a62934 Upgrade sqlx 2023-11-10 12:28:33 -08:00
Gregory Schier
f603867040 Clean up importers 2023-11-10 11:39:17 -08:00
Gregory Schier
b6eb7418aa Fix is_empty check 2023-11-10 09:12:20 -08:00
Gregory Schier
39c97681cf Postman importer semi-complete 2023-11-10 09:08:20 -08:00
Gregory Schier
2d0f0d8f6b Tidy up logs and general cleanup 2023-11-09 20:33:09 -08:00
Gregory Schier
209a767c91 Move error alert to hook 2023-11-09 20:02:42 -08:00
Gregory Schier
71f2a724cb Show import errors 2023-11-09 20:00:19 -08:00
Gregory Schier
4b89b95738 Hacky Yaak import complete! 2023-11-09 19:40:31 -08:00
Gregory Schier
b535722acd More fallback request handing 2023-11-09 17:42:10 -08:00
Gregory Schier
a9806a06a2 Request fallback name in header 2023-11-09 17:34:57 -08:00
Gregory Schier
948e19b82f Better default request names 2023-11-09 17:26:04 -08:00
Gregory Schier
cd841fa13a Better non-named requests 2023-11-09 17:17:03 -08:00
Gregory Schier
3ffcf91abd Better Yaak export 2023-11-09 17:03:29 -08:00
Gregory Schier
9fd84a3bfc Refactor previous commit 2023-11-09 16:50:57 -08:00
Gregory Schier
627c451cd1 Default request name to URL(ish) 2023-11-09 16:47:00 -08:00
Gregory Schier
e6ee89464a Rename initial workspace to "Yaak" 2023-11-09 13:17:21 -08:00
Gregory Schier
136e9f2738 No analytics in dev 2023-11-09 11:46:52 -08:00
Gregory Schier
d97986e526 Analytics event properties 2023-11-09 11:44:59 -08:00
Gregory Schier
7661aa9819 Context menu, logs in DevTools, export, tweaks 2023-11-09 09:28:01 -08:00
Gregory Schier
b7596f3f78 Fix plugin (again) 2023-11-08 13:33:15 -08:00
Gregory Schier
4e2231674c Bundle plugin in Git 2023-11-08 13:06:49 -08:00
Gregory Schier
d36d023a5c Move plugins back 2023-11-08 12:34:14 -08:00
Gregory Schier
3d5a7ebe3d Fix permissions 2023-11-08 12:02:17 -08:00
Gregory Schier
819384e952 Bump version 2023-11-08 10:12:01 -08:00
Gregory Schier
2f34c5e821 Tweak theme 2023-11-08 10:11:29 -08:00
Gregory Schier
0c89c154ee Tweak theme 2023-11-08 09:56:13 -08:00
Gregory Schier
060dce7440 Track screen size, os, and version 2023-11-08 09:49:29 -08:00
Gregory Schier
91707529bd Rust analytics and a few tweaks 2023-11-08 09:13:32 -08:00
Gregory Schier
22f182a8eb Add basic analytics 2023-11-07 09:53:59 -08:00
Gregory Schier
6ccc42dc3f Cancel responses on startup 2023-11-06 13:06:15 -08:00
Gregory Schier
655f5a8eed Send all in a folder 2023-11-06 10:53:39 -08:00
Gregory Schier
cd06a72d6f Rework workspace header 2023-11-06 10:42:59 -08:00
Gregory Schier
0a5d71ecc2 Fix sidebar focus max recursion 2023-11-06 10:40:02 -08:00
Gregory Schier
9c214b619c Save after formatting GraphQL (Closes #9) 2023-11-06 07:20:47 -08:00
Gregory Schier
6fddb727be Move plugins back to root dir 2023-11-06 07:18:53 -08:00
Gregory Schier
b5d3b9a803 Persist sidebar collapsed state (Closes #10) 2023-11-06 07:18:42 -08:00
Gregory Schier
a74c8a94db Vite to bundle insomnia plugin 2023-11-05 22:13:22 -08:00
Gregory Schier
abc6d0ff1e Better import conversion 2023-11-05 14:46:08 -08:00
Gregory Schier
afdbcd0a38 Basic import of request body and bearer auth 2023-11-05 14:35:25 -08:00
Gregory Schier
c31ae805a6 Recursive Insomnia import! 2023-11-05 13:33:23 -08:00
Gregory Schier
7c1afd7fe5 Remove numbers from recent requests 2023-11-04 16:19:21 -07:00
Gregory Schier
ad470a3fd2 Fix drop marker indent 2023-11-04 11:16:41 -07:00
Gregory Schier
7755d06bba Folder actions 2023-11-04 10:48:18 -07:00
Gregory Schier
5aed4b79be Folder chevron icon 2023-11-03 23:10:44 -07:00
Gregory Schier
f0e3f29606 Fix arrow navigation for nested sidebar 2023-11-03 17:29:33 -07:00
Gregory Schier
abbcc525bf Folder-based drag-n-drop complete! 2023-11-03 16:29:21 -07:00
Gregory Schier
ef8ade45b1 Sidebar ordering 95% done! 2023-11-03 15:02:17 -07:00
Gregory Schier
8919d598c2 Nested sidebar ordering almost working 2023-11-03 14:08:46 -07:00
Gregory Schier
e21e42f5fe Add folder model 2023-11-03 07:49:44 -07:00
Gregory Schier
658aed8a29 Even better focus state 2023-11-02 22:23:21 -07:00
Gregory Schier
a666f7d216 Remove focus on env sidebar buttons 2023-11-02 22:18:13 -07:00
Gregory Schier
62429df469 Rearrange menus 2023-11-02 21:41:35 -07:00
Gregory Schier
7aed699c3f Refactor environment edit dialog 2023-11-02 20:38:33 -07:00
Gregory Schier
a14db0ab74 Base environments fully working 2023-11-02 18:43:39 -07:00
Gregory Schier
7b67770dc7 Initial "plugin" system with importer (#7) 2023-11-02 18:08:43 -07:00
Gregory Schier
7766d8439b Fix cursor color in single-line mode 2023-10-31 15:10:33 -07:00
Gregory Schier
fac0683a71 Fix sending of ephemeral requests 2023-10-30 08:24:49 -07:00
Gregory Schier
79e04967f5 Fix GQL introspection and bearer auth templating 2023-10-30 08:07:34 -07:00
Gregory Schier
47eb8947f5 Fix button styles 2023-10-30 07:27:27 -07:00
Gregory Schier
959c55315c Fix editor stale callbacks and recent item deletion 2023-10-30 07:07:14 -07:00
Gregory Schier
b392f0c00f Refactored some core UI 2023-10-30 06:35:52 -07:00
Gregory Schier
c8e674d015 Plugin module loading 2023-10-29 20:50:23 -07:00
Gregory Schier
90fbb81e1d Bump version 2023-10-29 17:22:27 -07:00
Gregory Schier
21e58ca644 Fix sidebar scroll 2023-10-29 17:19:03 -07:00
Gregory Schier
cfb0aa55ea A bit more playing with JS runtime 2023-10-29 17:05:48 -07:00
Gregory Schier
9e0c021481 Initial "Hello World" for plugins 2023-10-29 16:43:28 -07:00
Gregory Schier
4acca8dd06 Fix request creation 2023-10-29 12:05:05 -07:00
Gregory Schier
88eea09428 Restore recent environment on workspace change
Fixes #6
2023-10-29 11:32:55 -07:00
Gregory Schier
90d2743267 Fix var complete and env dialog actions 2023-10-29 11:18:55 -07:00
Gregory Schier
89945532a0 Remove broken key/value enter/backspace logic 2023-10-29 10:45:05 -07:00
Gregory Schier
671860e053 Delete key/value on backspace 2023-10-29 10:26:38 -07:00
Gregory Schier
a87ca6af47 Move workspace menu, better env mgmt, QoL 2023-10-29 09:45:16 -07:00
Gregory Schier
b59ea4991c Bump version 2023-10-28 23:41:58 -07:00
Gregory Schier
b6fd59219f Better listening for path changes 2023-10-28 23:41:24 -07:00
Gregory Schier
38ce7650c1 Bump version 2023-10-28 22:14:51 -07:00
Gregory Schier
2b21e28096 Fixed auto-focus in prompt and env dropdown 2023-10-28 22:14:12 -07:00
Gregory Schier
3206651248 Clear selected sidebar index on drag-drop end 2023-10-28 21:47:00 -07:00
Gregory Schier
ba8aa0e218 Revert debug name 2023-10-28 21:43:09 -07:00
Gregory Schier
975a001635 Fix drag-n-drop things 2023-10-28 21:42:35 -07:00
Gregory Schier
30e7f7ccfe Persist window paths 2023-10-28 21:23:46 -07:00
Gregory Schier
cca8d97d63 Bump version to 2023.1.0 2023-10-28 19:15:33 -07:00
Gregory Schier
455e6c3520 Update placeholders when env changes 2023-10-28 19:14:51 -07:00
Gregory Schier
d05ee3ec16 Placeholder error and fix env nav 2023-10-28 19:08:31 -07:00
Gregory Schier
b1b5d08e89 Recent requests/workspaces. Closes #1 2023-10-28 18:46:54 -07:00
Gregory Schier
6202e59daa Fix recent requests loading on startup 2023-10-28 18:27:18 -07:00
Gregory Schier
c4a8603b81 Add tauri window save state plugin 2023-10-28 13:14:27 -07:00
Gregory Schier
5d15d1565c Fix rustfmt 2023-10-28 12:45:25 -07:00
Gregory Schier
045ff558f8 Handle enabled/disabled variables and render multi 2023-10-28 11:36:40 -07:00
Gregory Schier
504ed583cc Remove unused Variable type 2023-10-28 11:31:45 -07:00
Gregory Schier
15087f2d5a Variables under Environment, and render all props 2023-10-28 11:29:29 -07:00
Gregory Schier
eb1cd1c14b Native Codemirror cursor 2023-10-27 13:14:41 -07:00
Gregory Schier
0918d86654 Only wrap URLBar on focus and hotkey to open recent requests 2023-10-27 12:40:43 -07:00
Gregory Schier
d0e2220df7 Resizing window no longer changes sidebar visibility
Fixes #4
2023-10-27 11:21:59 -07:00
Gregory Schier
ccb04f0b45 Auto-expand URL bar height 2023-10-27 10:57:07 -07:00
Gregory Schier
54b6e1c7c3 Environment deletion and better actions menu 2023-10-26 16:18:47 -07:00
Gregory Schier
7c8acdc956 Stop autocomplete from jumping around 2023-10-26 15:27:48 -07:00
Gregory Schier
3973ae15be Fix request creation from menu 2023-10-26 10:41:14 -07:00
Gregory Schier
86dadf4f5e Send requests with active environment 2023-10-26 10:32:06 -07:00
Gregory Schier
dc4cb4be74 Move create request and fix slow HTML highlighting 2023-10-26 09:42:19 -07:00
Gregory Schier
2a29c4b551 Better project selector, Fixes #2, and a bunch more 2023-10-26 09:11:44 -07:00
Gregory Schier
2f64f45aba Fixed some routing and introspection requests 2023-10-25 21:53:18 -07:00
Gregory Schier
2f998ddfb6 Environments in URL and better rendering 2023-10-25 11:13:00 -07:00
Gregory Schier
93369a779d Move responses dropdown to separate component 2023-10-25 07:59:10 -07:00
Gregory Schier
74e28123a8 Fix dialog height 2023-10-25 00:02:51 -07:00
Gregory Schier
fef7db8710 Better style when no active environment 2023-10-24 23:58:12 -07:00
Gregory Schier
cb5d7626ac Environment dropdown and actions 2023-10-24 09:17:29 -07:00
Gregory Schier
e74f9f33c0 Started on environment edit dialog 2023-10-23 21:00:36 -07:00
Gregory Schier
0d27c17e28 Hacky implementation of variable autocomplete 2023-10-23 10:31:21 -07:00
Gregory Schier
f0b6d32639 Rendered first variable! 2023-10-22 22:30:29 -07:00
Gregory Schier
9ebd506056 Updating environments! 2023-10-22 22:06:51 -07:00
Gregory Schier
a5a91d2444 Update .gitignore 2023-10-22 20:40:00 -07:00
Gregory Schier
4435a66ece Prettier and start of env editor 2023-10-22 20:38:57 -07:00
Gregory Schier
874a1079c3 Environments data model 2023-10-22 18:28:56 -07:00
Gregory Schier
1dc239d243 Environment data model backend 2023-10-22 16:05:09 -07:00
Gregory Schier
73a04276c0 Fix some eslint warnings 2023-10-22 11:02:39 -07:00
Gregory Schier
9955064484 Add APPLE_TEAM_ID 2023-10-18 14:12:08 -07:00
Gregory Schier
7975b528ec Revert artifacts things 2023-10-18 13:25:35 -07:00
Gregory Schier
7d9fbda975 Bump cargo deps 2023-10-18 13:25:20 -07:00
Gregory Schier
fce06747e3 Bump version 2023-10-18 12:14:38 -07:00
Gregory Schier
db0cca54a7 Fix sidebar drag-n-drop 2023-10-18 11:58:58 -07:00
Gregory Schier
4424caecc5 Retry button on introspection errors 2023-06-12 13:20:42 -07:00
Gregory Schier
b866dcd566 Fix autocomplete doc font size 2023-05-31 21:32:48 -07:00
Gregory Schier
9e4e6435ab Persist introspection queries and also improve 2023-05-31 21:29:41 -07:00
Gregory Schier
41b10ff442 Update tauri NPM 2023-05-29 12:49:50 -07:00
Gregory Schier
79f3307104 Fix graphql instrospection 2023-05-29 12:31:34 -07:00
Gregory Schier
026629cd6d Change version 2023-04-27 16:53:39 -07:00
Gregory Schier
cf570a8f88 Version 1.0.0 2023-04-27 16:47:49 -07:00
Gregory Schier
4a64384468 Fix window methods on Linux/Windows 2023-04-27 16:27:02 -07:00
Gregory Schier
a9065c3380 Cross platform window controls 2023-04-27 10:19:49 -07:00
Gregory Schier
e5e5548562 Fix ubuntu build 2023-04-26 17:00:30 -07:00
Gregory Schier
44cf2f670f Windows and Linux 2023-04-26 16:54:51 -07:00
Gregory Schier
d04d91d6dd Bump version 2023-04-26 16:47:50 -07:00
Gregory Schier
3eb25b1507 Very basic CSV viewer 2023-04-22 21:53:04 +08:00
Gregory Schier
a95cae5610 Truncate response files 2023-04-14 14:15:33 -07:00
Gregory Schier
9cc6e62f28 Randomly offset new windows 2023-04-14 14:05:23 -07:00
Gregory Schier
24117f7c8d Fix text encoding and delete responses 2023-04-14 13:50:41 -07:00
Gregory Schier
7245e6e593 Delete response files 2023-04-14 12:17:11 -07:00
Gregory Schier
4a5b1f4da3 Readonly editor disable tabindex 2023-04-13 22:36:11 -07:00
Gregory Schier
c1ac67cc31 Fix imageview padding 2023-04-13 22:33:47 -07:00
Gregory Schier
4085361b7e Duration and size tags 2023-04-13 20:50:17 -07:00
Gregory Schier
8b4227dbff Comment 2023-04-13 18:55:32 -07:00
Gregory Schier
3f7ed9e177 Always store response on filesystem 2023-04-13 18:52:56 -07:00
Gregory Schier
f9f1ba9e24 Support binary responses! 2023-04-13 18:48:40 -07:00
Gregory Schier
29309500a6 Blur backdrop 2023-04-11 16:12:26 -07:00
Gregory Schier
6b07fe105f Autofocus buttons 2023-04-11 14:04:23 -07:00
Gregory Schier
90b03a0b97 Better opening workspaces and redirect workspace to recent request 2023-04-11 11:11:36 -07:00
Gregory Schier
d54a468006 Button disabled style opacity 2023-04-10 16:03:45 -07:00
Gregory Schier
7e98b6d853 Dropdown keys and pointer events 2023-04-10 16:02:29 -07:00
Gregory Schier
8069094201 Upgrade deno core 2023-04-10 11:16:25 -07:00
Gregory Schier
b28dc01e6b Tweak response history 2023-04-09 23:15:51 -07:00
Gregory Schier
6bc1f9f494 Fixed multi-window model sync 2023-04-09 22:32:47 -07:00
Gregory Schier
e85dd32005 Tweak recent requests 2023-04-09 22:25:00 -07:00
Gregory Schier
efc4e3bf6c Toggle settings 2023-04-09 22:12:16 -07:00
Gregory Schier
768a13ff4d Fix sidebar request focus 2023-04-09 22:03:41 -07:00
Gregory Schier
a8d73f74f4 More stuff on sidebar 2023-04-09 21:52:04 -07:00
Gregory Schier
4dddfc0cc5 Small tweaks 2023-04-09 15:32:13 -07:00
Gregory Schier
4163bebe3b Request history navigator 2023-04-09 15:26:54 -07:00
Gregory Schier
ad13744d14 Enter name on create workspace 2023-04-09 12:27:02 -07:00
Gregory Schier
9f9b3a5b21 Rename workspace 2023-04-09 12:23:41 -07:00
Gregory Schier
63e68baeb1 Sidebar hover transitions 2023-04-06 16:30:46 -07:00
Gregory Schier
4382ca6582 Remove some more key value usage 2023-04-06 16:26:56 -07:00
Gregory Schier
99f2f4c211 A bunch of tweaks 2023-04-06 16:05:25 -07:00
Gregory Schier
6b23379e5a macOS 12 2023-04-06 08:39:30 -07:00
Gregory Schier
4deda36e8f Remove system tray icon 2023-04-06 08:15:40 -07:00
Gregory Schier
0ce7831cfb Minor tweaks 2023-04-04 17:21:02 -07:00
Gregory Schier
4e9005e240 Fix some things 2023-04-04 16:56:45 -07:00
Gregory Schier
9147252e5b Editor line wrapping support (not used yet) 2023-04-04 16:40:37 -07:00
Gregory Schier
b6b549ca18 remove janky last location tracking 2023-04-04 16:23:08 -07:00
Gregory Schier
85c25fb71e Fix resize cursor 2023-04-04 16:12:45 -07:00
Gregory Schier
50637ba9fd Better button styles 2023-04-04 15:40:25 -07:00
Gregory Schier
bfe55dd55a Bump version 2023-04-04 13:56:24 -07:00
Gregory Schier
1a2bb3d12e Some small fixes 2023-04-04 13:56:14 -07:00
Gregory Schier
452a0c3ed5 A few fixes 2023-04-04 13:31:48 -07:00
Gregory Schier
b594a4690f Better status tags and delete request on key 2023-04-04 12:36:30 -07:00
Gregory Schier
7d2ba43463 Remove expects from request sending 2023-04-04 08:14:32 -07:00
Gregory Schier
107db42c33 Fix web view height 2023-04-04 07:51:41 -07:00
Gregory Schier
dbacb9fc8d Fix autocomplete spacing 2023-04-04 07:51:19 -07:00
Gregory Schier
1fa3499ca6 Fix input focus border 2023-04-03 12:19:37 -07:00
Gregory Schier
62f3198d27 Hot keys and cleanup 2023-04-03 07:59:49 -07:00
Gregory Schier
529550934b Add entitlemet for v8 2023-04-02 20:23:21 -07:00
Gregory Schier
ca3b22a881 Debug codesigned build 2023-04-02 19:09:14 -07:00
Gregory Schier
0ecf2d9123 Disable code signing 2023-04-02 18:27:14 -07:00
Gregory Schier
af9bb7138b Fix tauri script command 2023-04-02 17:25:24 -07:00
Gregory Schier
6cbfa74f97 Fix universal binary 2023-04-02 17:12:20 -07:00
Gregory Schier
2845fb8d35 Bump version 2023-04-02 15:44:41 -07:00
Gregory Schier
fbe2660a57 Fix toolchain 2023-04-02 15:44:21 -07:00
Gregory Schier
1519282ac6 Add proper target 2023-04-02 15:42:19 -07:00
Gregory Schier
5d8d8dca70 Try universal binary 2023-04-02 15:33:13 -07:00
Gregory Schier
0254e2c31d Fix version 2023-04-02 15:25:24 -07:00
Gregory Schier
368b494d62 Bump version 2023-04-02 14:54:41 -07:00
Gregory Schier
00d2213d05 Notorization (hopefully) 2023-04-02 14:53:49 -07:00
Gregory Schier
b04602bcb9 Change tabs again 2023-04-02 11:11:53 -07:00
Gregory Schier
80bfbd503a Better response headers 2023-04-02 10:45:41 -07:00
Gregory Schier
bfa186aebb Show response headers 2023-04-01 23:43:22 -07:00
Gregory Schier
818595e961 Some more refactoring 2023-04-01 21:48:30 -07:00
Gregory Schier
b5e9852f8d Refactor debounce and tauri event listeners 2023-04-01 21:39:46 -07:00
Gregory Schier
ff3734d65a Fix dropdown and dialog key handling 2023-04-01 21:04:39 -07:00
Gregory Schier
4aa771ba29 Refactor sidebar display 2023-04-01 20:58:53 -07:00
Gregory Schier
5848c381fa Better GraphQL schema fetching 2023-04-01 17:53:36 -07:00
Gregory Schier
03b35beae4 More eslint fixes 2023-04-01 15:48:37 -07:00
Gregory Schier
49856bb6f7 Add React hooks eslint 2023-04-01 15:26:57 -07:00
Gregory Schier
0cb56f1a85 Fix Tauri listeners 2023-04-01 00:02:17 -07:00
Gregory Schier
4a0d698776 Memo editor 2023-03-31 23:19:15 -07:00
Gregory Schier
a4ebdb5736 Fix request duplication 2023-03-31 22:54:32 -07:00
Gregory Schier
6a5ecc2880 Fix tauri listeners causing too many updates 2023-03-31 22:48:34 -07:00
Gregory Schier
7a5bd92442 Remove import 2023-03-31 22:42:41 -07:00
Gregory Schier
63c1111608 Fix 2023-03-31 22:42:26 -07:00
Gregory Schier
5704fb560a Upgrade Deno 2023-03-31 22:42:08 -07:00
Gregory Schier
33dc3b719d Tweak 2023-03-31 16:14:25 -07:00
Gregory Schier
d3329b4628 Fix send hotkey 2023-03-31 16:13:34 -07:00
Gregory Schier
42e2c9f96f Better schema fetching 2023-03-31 16:02:09 -07:00
Gregory Schier
3e8a10757f Finally fix the editor! 2023-03-31 15:56:35 -07:00
Gregory Schier
8028d82fd0 Fix editor blurring bug! 2023-03-31 13:53:28 -07:00
Gregory Schier
4ad9feba68 Better model updates 2023-03-31 13:21:02 -07:00
Gregory Schier
ef469be7a9 Fix text obscuring 2023-03-30 17:22:52 -07:00
Gregory Schier
14cd73d75a Button ring colors 2023-03-30 17:17:07 -07:00
Gregory Schier
fbe6039845 Remove dummy button 2023-03-30 17:12:38 -07:00
Gregory Schier
f3fbd070dd Confirm deletions 2023-03-30 17:09:11 -07:00
Gregory Schier
7c2611a5a7 Dedicated event for model creation 2023-03-30 16:49:49 -07:00
Gregory Schier
ae949f4616 Unify text selection color 2023-03-30 16:36:24 -07:00
Gregory Schier
89da434c0e Some icon tweaks 2023-03-30 16:29:14 -07:00
Gregory Schier
4a98d1d655 Fix strict mode editor blur bug 2023-03-30 10:38:33 -07:00
Gregory Schier
bb41f0e4fe Better tauri listeners and stuff 2023-03-30 09:05:54 -07:00
Gregory Schier
d2e0717d91 Remove updated_by, remember last location 2023-03-30 08:11:51 -07:00
Gregory Schier
7912204fcb Remove hardcoded window config 2023-03-29 22:16:21 -07:00
Gregory Schier
83e41ad618 Fix build 2023-03-29 22:15:55 -07:00
Gregory Schier
dd7e46c2cc Remove unused import 2023-03-29 21:53:49 -07:00
Gregory Schier
fb7424714a Better multi-window updates 2023-03-29 21:53:20 -07:00
Gregory Schier
47481b711e Fixed key/value stuff 2023-03-29 14:46:36 -07:00
Gregory Schier
0f86c3a731 Fix bundle parts 2023-03-29 14:00:34 -07:00
Gregory Schier
b91d1b8b3c Fix(ish) multiwindow updates 2023-03-29 11:15:37 -07:00
Gregory Schier
cd5ae6691c Obscure text 2023-03-29 10:16:51 -07:00
Gregory Schier
0f58986b4c Simple auth schemes 2023-03-29 09:03:38 -07:00
Gregory Schier
af9755c513 Good start to multi-window 2023-03-28 18:29:40 -07:00
Gregory Schier
56ce25f953 Focus traps for dialog and dropdown 2023-03-26 23:07:09 -07:00
Gregory Schier
ed70c15ee9 Confirmation Dialogs 2023-03-26 12:02:20 -07:00
Gregory Schier
d88ae99425 Floating sidebar 2023-03-26 10:09:28 -07:00
Gregory Schier
cf7ef55b7d Panel icons 2023-03-25 23:29:04 -07:00
Gregory Schier
2f12424f8d Update dialog 2023-03-25 21:59:18 -07:00
Gregory Schier
96aacec4fc Optimistically-update key values 2023-03-25 21:54:00 -07:00
Gregory Schier
7e57bb98a8 More tweaks 2023-03-25 21:40:14 -07:00
Gregory Schier
298f5c5a99 Animate dropdown 2023-03-25 21:36:17 -07:00
Gregory Schier
bf44ea7864 Animate sidebar transition 2023-03-25 21:31:52 -07:00
Gregory Schier
9abdc45e93 Refactor and improve layout resizing 2023-03-25 21:16:10 -07:00
Gregory Schier
0d82cc7574 Even better layouts 2023-03-25 18:33:01 -07:00
Gregory Schier
402b2a551f Better grid layouts 2023-03-25 18:12:09 -07:00
Gregory Schier
700c589ae2 Global layout component 2023-03-25 13:26:31 -07:00
Gregory Schier
8929d736d9 Better dropdown separator 2023-03-25 11:06:05 -07:00
Gregory Schier
8c65fce357 Fix sidebar drag 2023-03-24 08:37:52 -07:00
Gregory Schier
b81f1e9e6b Upgrade TYpescript 2023-03-23 15:37:36 -07:00
Gregory Schier
44d083d773 Fix resize 2023-03-23 07:47:58 -07:00
Gregory Schier
2b308282d4 Style tweak 2023-03-21 23:59:09 -07:00
Gregory Schier
c7738743c5 GraphQL autocomplete and duplicate request 2023-03-21 23:54:45 -07:00
Gregory Schier
abc60667c6 Tweak sidebar drag resizer 2023-03-21 19:36:32 -07:00
Gregory Schier
53162e8bca Minor style tweaks 2023-03-21 18:31:05 -07:00
Gregory Schier
6b95574e3d Pull out resize bar 2023-03-21 16:53:49 -07:00
Gregory Schier
c9d62ae961 Resize titlebar and tweak things 2023-03-21 16:42:52 -07:00
Gregory Schier
a70019927d Remove icon generation from build script 2023-03-21 14:21:07 -07:00
Gregory Schier
01cd7f951a query client cache and better body types 2023-03-21 11:38:37 -07:00
Gregory Schier
50f92bcfab Fix workspace deletion 2023-03-21 09:32:15 -07:00
Gregory Schier
362d9f8e59 Use proper gray for syntax 2023-03-20 17:15:12 -07:00
Gregory Schier
0b1cf53942 fix import 2023-03-20 17:13:14 -07:00
Gregory Schier
a4c769b33c Minor tweaks 2023-03-20 17:12:19 -07:00
Gregory Schier
74a1cb61c1 Fix URL bar spacing 2023-03-20 17:01:29 -07:00
Gregory Schier
268545c728 Better radio dropdown type 2023-03-20 16:54:26 -07:00
Gregory Schier
184bbb01c5 Typesafe routing and CM line height issue 2023-03-20 16:47:36 -07:00
Gregory Schier
66fa7ac419 Better tab dropdown handling 2023-03-20 14:14:30 -07:00
Gregory Schier
a80f3d997e Fix request creation priority 2023-03-20 13:56:03 -07:00
Gregory Schier
efa7c24c9f Remove log 2023-03-20 13:49:35 -07:00
Gregory Schier
91de21c7ad Handle "no body" case 2023-03-20 13:49:21 -07:00
Gregory Schier
1e9ba57ef0 Small fix 2023-03-20 13:37:14 -07:00
Gregory Schier
464389b248 Fix pointer window drag 2023-03-20 13:34:49 -07:00
Gregory Schier
107eb72eda Fix extra dropdown element 2023-03-20 13:19:23 -07:00
Gregory Schier
ee7bf838f4 Remove most of Radix UI 2023-03-20 13:16:58 -07:00
Gregory Schier
f63bcd94d1 Better Header validation 2023-03-20 01:38:05 -07:00
Gregory Schier
16d5cb6ade Tweak sidebar 2023-03-20 01:30:45 -07:00
Gregory Schier
63decdef8b Fix pair editor container 2023-03-20 01:18:44 -07:00
Gregory Schier
e54e88f46d Fix input thingy 2023-03-20 01:14:13 -07:00
Gregory Schier
b6f53d059e Container queries! 2023-03-20 01:08:41 -07:00
Gregory Schier
9e1771c5ec Better pair editor delete button 2023-03-20 00:30:42 -07:00
Gregory Schier
8306bc2198 Pair validation 2023-03-20 00:17:29 -07:00
Gregory Schier
3810fb7d51 Don't send disabled headers 2023-03-20 00:05:19 -07:00
Gregory Schier
5b4984113e Small tweak 2023-03-20 00:04:40 -07:00
Gregory Schier
baf9efe246 Pair checkboxes and fix twig indent 2023-03-20 00:03:33 -07:00
Gregory Schier
f4a3109a31 Rewrote twig grammar 2023-03-19 22:12:11 -07:00
Gregory Schier
241f2f39ec Re-order of pair editor 2023-03-19 13:28:57 -07:00
Gregory Schier
d9b40dca83 Better header editor and added completion data 2023-03-19 11:09:21 -07:00
Gregory Schier
cb3f053057 A couple tweaks 2023-03-19 01:01:13 -07:00
Gregory Schier
c4ab045e57 Persist sort priority! 2023-03-19 00:48:09 -07:00
Gregory Schier
d9b38efd97 Create new workspace, and more optimizations 2023-03-18 19:36:31 -07:00
Gregory Schier
5981588c95 Optimized a few components 2023-03-18 18:49:01 -07:00
Gregory Schier
388bef59b8 Fix sidebar drag-n-drop 2023-03-18 18:09:36 -07:00
Gregory Schier
3d8de61c1c Got drag opacity working 2023-03-18 15:06:38 -07:00
Gregory Schier
91b818f98d Good start to drag-n-drop sidebar! 2023-03-18 14:41:07 -07:00
Gregory Schier
3a7f0898f9 Fix mixed parser 2023-03-17 17:57:43 -07:00
Gregory Schier
c2f6de875a Dropdown highlight 2023-03-17 17:32:24 -07:00
Gregory Schier
0647001807 Beginnings of autocomplete for headers 2023-03-17 16:51:20 -07:00
Gregory Schier
4181d87792 Flatten migrations, kvs lib, fix tabs 2023-03-17 08:36:21 -07:00
Gregory Schier
58cf0a2015 Sidebar item dropdown 2023-03-16 15:37:53 -07:00
Gregory Schier
d80c3d305b Sidebar dragging 2023-03-16 14:34:49 -07:00
Gregory Schier
4d64a2bc2f Add devtools toggle hotkey 2023-03-16 11:25:38 -07:00
Gregory Schier
5c54beaaa9 Adjust window sizes 2023-03-16 11:16:23 -07:00
Gregory Schier
eee98f32b2 Store appearance in k/v 2023-03-16 11:01:30 -07:00
Gregory Schier
0949de66bf Hotkeys and view mode kvs 2023-03-16 09:24:28 -07:00
Gregory Schier
5a6acb24d9 Some fixes 2023-03-15 23:33:46 -07:00
Gregory Schier
2e5cab62c7 Got key values working 2023-03-15 23:24:41 -07:00
Gregory Schier
903db5fffd Fix editor padding 2023-03-15 17:29:35 -07:00
Gregory Schier
e3faf32708 Minor style updates 2023-03-15 17:25:04 -07:00
Gregory Schier
97926ddc03 Add stuff to app header 2023-03-15 16:35:19 -07:00
Gregory Schier
e891804051 Better request delete and formatting 2023-03-15 09:41:38 -07:00
Gregory Schier
a2982f8b77 Fix graphql and other things 2023-03-15 09:06:56 -07:00
Gregory Schier
321941baab Header editor to pair editor 2023-03-15 08:09:45 -07:00
Gregory Schier
e2e25dc30b Better header editor 2023-03-15 07:54:04 -07:00
Gregory Schier
1170ca4789 Strict mode and tweak layout padding 2023-03-14 20:19:45 -07:00
Gregory Schier
d159f62138 Add GraphQL variables editor 2023-03-14 19:56:02 -07:00
Gregory Schier
25005eef1b GraphQL query editor transformer works! 2023-03-14 19:08:18 -07:00
Gregory Schier
b17824c88d Add body type to request and tab dropdown 2023-03-14 11:18:56 -07:00
Gregory Schier
00f4a008f8 Improved header editor 2023-03-14 00:54:41 -07:00
Gregory Schier
3e2bc67b59 Fix platform check 2023-03-14 00:15:01 -07:00
Gregory Schier
efe072c7c4 Some small changes 2023-03-14 00:08:03 -07:00
Gregory Schier
59f1d11e40 Move stuff around 2023-03-13 23:30:14 -07:00
Gregory Schier
5f947ac983 Refactor hooks to be easier to use 2023-03-13 23:25:41 -07:00
Gregory Schier
aa66f957f2 Fix header editor and scroll in general 2023-03-13 19:37:36 -07:00
Gregory Schier
cf5f69271f Lazy load routes 2023-03-13 13:56:13 -07:00
Gregory Schier
c6653af782 Back to React 2023-03-13 09:50:49 -07:00
Gregory Schier
fa1f33a2ac Move some stuff around 2023-03-13 09:24:38 -07:00
Gregory Schier
9f479882ad Fix URL bar 2023-03-13 00:13:25 -07:00
Gregory Schier
41db316489 Fix ButtonLink and edit request names 2023-03-13 00:11:23 -07:00
Gregory Schier
50f0f5885e Remove old rust cache action 2023-03-12 22:48:43 -07:00
Gregory Schier
a609f09d50 Better rust cache 2023-03-12 22:47:43 -07:00
Gregory Schier
43f2aa3068 Start GraphQL support 2023-03-12 22:43:25 -07:00
Gregory Schier
a094e13bd5 Fix artifact tag 2023-03-12 21:41:15 -07:00
Gregory Schier
eb076afbe4 Remove wasm stuff 2023-03-12 21:25:31 -07:00
Gregory Schier
7b41488a38 Use tauri action 2023-03-12 21:13:08 -07:00
Gregory Schier
ca12d48352 Fix traffic lights thingy 2023-03-12 20:47:52 -07:00
Gregory Schier
0331d3b2b0 Cache cargo bin for "install" 2023-03-12 19:10:39 -07:00
Gregory Schier
4d4814583c Refformat 2023-03-12 19:03:27 -07:00
Gregory Schier
da3e158516 Fix artifact upload 2023-03-12 19:01:48 -07:00
Gregory Schier
7b9d6baff0 Fix dev 2023-03-12 18:39:02 -07:00
Gregory Schier
550f1b7c6f Split out macos deps 2023-03-12 18:36:25 -07:00
Gregory Schier
74e8ee1786 Cache workflow 2023-03-12 18:28:14 -07:00
Gregory Schier
55d3ea01b6 Add wasm-pack 2023-03-12 18:19:20 -07:00
Gregory Schier
4cfe51cbb2 Install rsw 2023-03-12 18:14:38 -07:00
Gregory Schier
1f5ac60523 Fix artifact names 2023-03-12 18:13:00 -07:00
Gregory Schier
26bf4f2abd Fix build command 2023-03-12 18:11:24 -07:00
Gregory Schier
54671fff79 Update secrets context 2023-03-12 18:07:57 -07:00
Gregory Schier
378309d763 Update workflow name 2023-03-12 18:05:45 -07:00
Gregory Schier
e7d4bba8b3 Fix workflow 2023-03-12 18:05:13 -07:00
Gregory Schier
fe3de0bc98 Start of auto updates 2023-03-12 18:04:11 -07:00
Gregory Schier
f3e38d7b71 Fix tabbing to tabs 2023-03-11 23:32:39 -08:00
Gregory Schier
eafa3b2de9 Fix eslint errors 2023-03-11 23:29:25 -08:00
Gregory Schier
d8cc075bd0 Got tab content scrolling working 2023-03-11 22:36:13 -08:00
Gregory Schier
bdb877a936 Removed some debug stuff 2023-03-10 10:43:15 -08:00
Gregory Schier
5c96e83a22 Refactor editor to update better 2023-03-10 10:39:23 -08:00
Gregory Schier
43abb57f77 Fix headers persistence and better sending 2023-03-09 13:38:17 -08:00
Gregory Schier
9c6d821978 Hook up header editor! 2023-03-09 13:07:13 -08:00
Gregory Schier
7e9babf515 Fix 2023-03-09 10:58:27 -08:00
Gregory Schier
ee36baf432 Fix blur de-select speed 2023-03-09 10:57:34 -08:00
Gregory Schier
0bf57dcab7 Fix Codemirror performance!! 2023-03-09 10:50:55 -08:00
Gregory Schier
e647d23adc Switch to Preact!!! 2023-03-09 00:47:25 -08:00
Gregory Schier
d1b5b9c371 Move some things around 2023-03-08 23:20:15 -08:00
Gregory Schier
92ec514442 Better scrollbar color 2023-03-08 19:23:24 -08:00
Gregory Schier
107466dd58 Zoom, better sizes, color picker, sidebar footer 2023-03-08 19:22:04 -08:00
Gregory Schier
4246260ce6 Read-only editor 2023-03-08 16:53:13 -08:00
Gregory Schier
936787d327 More theme tweaks 2023-03-08 16:37:20 -08:00
Gregory Schier
f976397283 Debounce autocomplete 2023-03-08 11:25:20 -08:00
Gregory Schier
657c6ad9a9 Minor theme updates again 2023-03-08 09:43:35 -08:00
Gregory Schier
ede07c3b0e Editor tweaks 2023-03-07 23:05:33 -08:00
Gregory Schier
9326e8dcce Remove unneeded space 2023-03-07 22:58:13 -08:00
Gregory Schier
8ff2adf833 Fix small view 2023-03-07 22:55:51 -08:00
Gregory Schier
5e387b513a Minor style tweaks 2023-03-07 22:21:58 -08:00
Gregory Schier
dca316c0d5 Lots more theme stuff 2023-03-07 21:52:21 -08:00
Gregory Schier
db2d786d50 Start of themes 2023-03-07 11:24:38 -08:00
Gregory Schier
c0d7962142 More subtle layout tweaks 2023-03-06 08:57:57 -08:00
Gregory Schier
5d14354ca9 More layout fiddling and error page 2023-03-04 22:26:00 -08:00
Gregory Schier
347dace6de More work on the layout 2023-03-04 21:51:17 -08:00
Gregory Schier
d952c75e3c Try new layout and a bunch of editor fixes 2023-03-04 19:06:12 -08:00
Gregory Schier
abc3745be1 Fix autocomplete inside dialog 2023-03-03 17:03:20 -08:00
Gregory Schier
1382d7c523 Beginnings of Header Editor 2023-03-03 13:18:57 -08:00
Gregory Schier
3de0edf0f9 Fix tailwind dark selector 2023-03-03 07:54:19 -08:00
Gregory Schier
5513d39152 Fix content type in URL 2023-03-02 23:17:09 -08:00
Gregory Schier
1a9547d1d2 Add Dialog component 2023-03-02 18:46:10 -08:00
Gregory Schier
26cc64d3a0 More colors 2023-03-02 17:56:53 -08:00
Gregory Schier
e465b33365 Minor style tweaks 2023-03-02 16:16:41 -08:00
Gregory Schier
957739ba5e Improved autocompletion! 2023-03-02 11:14:51 -08:00
Gregory Schier
59967374c5 Rename, fix autocomplete and singleline, etc... 2023-03-02 10:42:43 -08:00
Gregory Schier
43bc346a2b Editor placeholder 2023-03-01 14:22:10 -08:00
Gregory Schier
5fbd3f67cd Some minor bugs 2023-03-01 14:16:02 -08:00
Gregory Schier
e352343d62 Fix migrations for build and iframe rendering 2023-03-01 10:31:50 -08:00
Gregory Schier
baee0f0c6f Tweaks 2023-03-01 10:19:21 -08:00
Gregory Schier
fcc5eead88 Response streaming 2023-03-01 09:05:00 -08:00
Gregory Schier
29d1f687d1 Autocomplete, and more CM stuff! 2023-02-28 22:54:54 -08:00
Gregory Schier
f568266c7f Some small tweaks 2023-02-28 17:25:59 -08:00
Gregory Schier
a1e42b8ddb Better editor updating 2023-02-28 12:41:03 -08:00
Gregory Schier
e6389b1153 URL highlighting with inline CM 2023-02-28 11:26:26 -08:00
Gregory Schier
f0835acb33 Implement request deletion 2023-02-27 15:42:06 -08:00
Gregory Schier
35b04b219f Tauri events for request model updates 2023-02-27 13:28:50 -08:00
Gregory Schier
01b62e936a Split request upsert command 2023-02-27 10:00:57 -08:00
Gregory Schier
09d16a03ef Add toggle for pretty view 2023-02-27 09:08:48 -08:00
Gregory Schier
bb61602fd2 Small tweaks 2023-02-26 15:25:55 -08:00
Gregory Schier
f30b78ea1f Add variable highlighting widgets 2023-02-26 15:06:14 -08:00
Gregory Schier
6ee652ca75 Dropdown scrolling 2023-02-25 23:33:07 -08:00
Gregory Schier
67d8bbc154 Show response body size 2023-02-25 23:08:19 -08:00
Gregory Schier
b852484559 A bunch more small things 2023-02-25 23:04:31 -08:00
Gregory Schier
0b077e5e88 Added react-router 2023-02-25 18:04:14 -08:00
Gregory Schier
381d957db2 Migrations and initial data stuff 2023-02-25 16:39:18 -08:00
Gregory Schier
f8f77abc12 Minor tweaks 2023-02-24 17:01:48 -08:00
Gregory Schier
0b0484c610 Dummy requests in sidebar 2023-02-24 16:46:56 -08:00
Gregory Schier
2b769088af Codemirror initial value support 2023-02-24 16:43:47 -08:00
Gregory Schier
856d13c603 Send request body 2023-02-24 16:09:19 -08:00
Gregory Schier
76e398b8a1 Vendor basicSetup 2023-02-24 14:51:56 -08:00
Gregory Schier
24a7d85be0 Additional methods and tweaks 2023-02-24 14:10:25 -08:00
Gregory Schier
989271f653 Focus states 2023-02-24 12:35:13 -08:00
Gregory Schier
3fd8cd5713 Hook up theme and clear responses 2023-02-24 12:13:30 -08:00
Gregory Schier
43f1c7caf6 SQLite store in proper dir 2023-02-22 20:18:14 -08:00
Gregory Schier
bd91ac88a3 Started on grid layout 2023-02-22 19:44:44 -08:00
Gregory Schier
fbcbf2e5a5 Save responses in DB 2023-02-22 18:53:44 -08:00
Gregory Schier
31eb03da0d Better URL bar 2023-02-22 16:15:25 -08:00
Gregory Schier
a4dbfed712 Cleaner URL bar and some improvements 2023-02-22 15:58:04 -08:00
Gregory Schier
784cb53ec6 Refactor classname usage 2023-02-21 18:03:57 -08:00
Gregory Schier
43c799bd60 Some minor tweaks 2023-02-21 17:56:48 -08:00
368 changed files with 48835 additions and 21676 deletions

View File

@@ -12,7 +12,7 @@ module.exports = {
parserOptions: {
project: ["./tsconfig.json"]
},
ignorePatterns: ["src-tauri/**/*", "plugins/**/*"],
ignorePatterns: ["scripts/**/*", "plugin-runtime/**/*", "src-tauri/**/*", "plugins/**/*"],
settings: {
react: {
version: "detect"

View File

@@ -1,72 +0,0 @@
name: Generate Artifacts
on:
push:
tags: [ v* ]
permissions: write-all
jobs:
build-artifacts:
name: Build
strategy:
fail-fast: false
matrix:
include:
- os: macos-latest
target: aarch64-apple-darwin
- os: macos-latest
target: x86_64-apple-darwin
- os: windows-latest
target: x86_64-pc-windows-msvc
- os: ubuntu-20.04
target: x86_64-unknown-linux-gnu
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v3
- uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cache Rust
uses: actions/cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
./src-tauri/target
key: ${{ runner.os }}-cargo-${{ hashFiles('src-tauri/Cargo.lock') }}
- uses: actions/setup-node@v3
with:
node-version: 20
cache: 'npm'
- name: install dependencies (ubuntu only)
if: matrix.os == 'ubuntu-20.04'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
# Pin dev version to get non-default targets
# https://github.com/tauri-apps/tauri-action/issues/356
- uses: tauri-apps/tauri-action@dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
with:
tagName: 'v__VERSION__'
releaseName: 'Release __VERSION__'
releaseBody: 'https://yaak.app/changelog/__VERSION__'
releaseDraft: true
prerelease: false
args: '--target ${{ matrix.target }}'

18
.github/workflows/ci-js.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
on:
pull_request:
branches: [develop]
name: CI (JS)
jobs:
test:
name: Lint/Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm run lint
- run: npm test

36
.github/workflows/ci-rust.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
on:
pull_request:
branches: [develop]
paths:
- src-tauri/**
- .github/workflows/**
name: CI (Rust)
defaults:
run:
working-directory: src-tauri
jobs:
test:
name: Check/Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v3
continue-on-error: false
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-
- run: cargo check --all
- run: cargo test --all

120
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,120 @@
name: Generate Artifacts
on:
push:
tags: [ v* ]
env:
YAAK_PLUGINS_DIR: checkout/plugins
jobs:
build-artifacts:
permissions:
contents: write
name: Build
strategy:
fail-fast: false
matrix:
include:
- platform: 'macos-latest' # for Arm-based macs (M1 and above).
args: '--target aarch64-apple-darwin'
node_arch: 'arm64'
- platform: 'macos-latest' # for Intel-based macs.
args: '--target x86_64-apple-darwin'
node_arch: 'x64'
- platform: 'ubuntu-22.04' # for Tauri v1, you could replace this with ubuntu-20.04.
args: ''
node_arch: 'x64'
- platform: 'windows-latest'
args: ''
node_arch: 'x64'
runs-on: ${{ matrix.platform }}
steps:
- name: Checkout yaakapp/app
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
- uses: actions/setup-go@v5
with:
go-version: '1.22'
- name: install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
# Those targets are only used on macos runners so it's in an `if` to slightly speed up windows and linux builds.
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
- uses: actions/cache@v3
continue-on-error: false
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-
- name: install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-22.04' # This must match the platform value defined above.
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
- name: Install Node dependencies
run: |
npm ci
- name: Install plugin-runtime Node dependencies
working-directory: plugin-runtime
run: |
npm ci
- name: Install Protoc for plugin-runtime
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install yaak CLI
run: go install github.com/yaakapp/yaakcli@latest
- name: Run lint
run: npm run lint
- name: Set version
run: npm run replace-version
env:
YAAK_VERSION: ${{ github.ref_name }}
- name: Checkout yaakapp/plugins
uses: actions/checkout@v4
with:
repository: yaakapp/plugins
path: ${{ env.YAAK_PLUGINS_DIR }}
- uses: tauri-apps/tauri-action@v0
env:
YAAK_PLUGINS_DIR: ${{ env.YAAK_PLUGINS_DIR }}
NODE_ARCH: ${{ matrix.node_arch }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
with:
tagName: 'v__VERSION__'
releaseName: 'Release __VERSION__'
releaseBody: 'https://yaak.app/changelog/__VERSION__'
releaseDraft: true
prerelease: false
args: ${{ matrix.args }}

5
.gitignore vendored
View File

@@ -26,3 +26,8 @@ dist-ssr
*.sqlite
*.sqlite-*
.cargo
.tmp
tmp

View File

@@ -1,20 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Build Desktop" type="ShConfigurationType">
<option name="SCRIPT_TEXT" value="npm run tauri build -- --target universal-apple-darwin" />
<option name="INDEPENDENT_SCRIPT_PATH" value="true" />
<option name="SCRIPT_PATH" value="" />
<option name="SCRIPT_OPTIONS" value="" />
<option name="INDEPENDENT_SCRIPT_WORKING_DIRECTORY" value="true" />
<option name="SCRIPT_WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="INDEPENDENT_INTERPRETER_PATH" value="true" />
<option name="INTERPRETER_PATH" value="/bin/zsh" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="EXECUTE_IN_TERMINAL" value="true" />
<option name="EXECUTE_SCRIPT_FILE" value="false" />
<envs>
<env name="TAURI_KEY_PASSWORD" value="fishhook-upstream-wash-assured" />
<env name="TAURI_PRIVATE_KEY" value="dW50cnVzdGVkIGNvbW1lbnQ6IHJzaWduIGVuY3J5cHRlZCBzZWNyZXQga2V5ClJXUlRZMEl5OGxWaytTa3dIa2xXVUltQzRGUXIzd2lYQ2NpV0ZhQURSbWJWZ1NrK0tnY0FBQkFBQUFBQUFBQUFBQUlBQUFBQUV2M1VKdVRyVHpHSzhQdGc2ZVFtOVNsMU5tNEVSN280cFNrbXhncW9tdjNXaFJZUTJqUzQ5Q01zWTJWRVhaY1pGNHNjR1NFR3JmcWFRN09NdWdGMXpZVXhzejR4V3lDV1JpZHlnbW5LNS9vMFFtRlZjbUl4YjZSNzhlMmk3ait5SExYcG5QZUkxOFE9Cg==" />
</envs>
<method v="2" />
</configuration>
</component>

View File

@@ -1 +0,0 @@
plugins

Binary file not shown.

View File

@@ -1,27 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Yaak App</title>
<!-- <script src="http://localhost:8097"></script>-->
<script src="http://localhost:8097"></script>
<!-- Certain elements like webview (and maybe <select>?) will use background
color depending on document background color-->
<style>
html, body {
background-color: white;
}
html, body {
background-color: white;
}
@media (prefers-color-scheme: dark) {
html, body {
background-color: black;
}
@media (prefers-color-scheme: dark) {
html, body {
background-color: #1b1a29;
}
}
</style>
</head>
<body>
<body class="text-base">
<div id="root"></div>
<div id="cm-portal" class="cm-portal"></div>
<div id="react-portal"></div>

4259
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,29 +4,27 @@
"version": "0.0.0",
"type": "module",
"scripts": {
"start": "npm run build:plugins && npm run tauri-dev",
"tauri-dev": "tauri dev --no-watch --config ./src-tauri/tauri-dev.conf.json",
"start": "npm run tauri-dev:desktop",
"tauri-dev:desktop": "tauri dev --no-watch --config ./src-tauri/tauri-dev.conf.json",
"tauri-dev:ios": "tauri ios dev --force-ip-prompt --config ./src-tauri/tauri-dev.conf.json",
"tauri-build": "tauri build",
"tauri": "tauri",
"build": "npm run build:frontend",
"dev": "vite dev",
"dev:js": "vite dev",
"lint": "tsc && eslint . --ext .ts,.tsx",
"build:icon:release": "tauri icon design/icon.png --output ./src-tauri/icons/release",
"build:icon:dev": "tauri icon design/icon-dev.png --output ./src-tauri/icons/dev",
"build:frontend": "vite build",
"build:plugins": "run-p build:plugin:*",
"build:plugin:importer-insomnia": "cd plugins/importer-insomnia && vite build --emptyOutDir",
"build:plugin:importer-postman": "cd plugins/importer-postman && vite build --emptyOutDir",
"build:plugin:importer-yaak": "cd plugins/importer-yaak && vite build --emptyOutDir",
"build:plugin:filter-jsonpath": "cd plugins/filter-jsonpath && vite build --emptyOutDir",
"build:plugin:filter-xpath": "cd plugins/filter-xpath && vite build --emptyOutDir",
"test": "vitest",
"coverage": "vitest run --coverage",
"prepare": "husky install"
"build": "run-p build:*",
"build:js": "vite build",
"build:vendor-protoc": "node scripts/vendor-protoc.cjs",
"build:vendor-plugins": "node scripts/vendor-plugins.cjs",
"build:vendor-node": "node scripts/vendor-node.cjs",
"build:plugin-runtime": "npm run --prefix plugin-runtime build",
"prepare": "husky install",
"replace-version": "node scripts/replace-version.cjs"
},
"dependencies": {
"@codemirror/commands": "^6.2.1",
"@codemirror/lang-javascript": "^6.1.4",
"@codemirror/lang-javascript": "^6.2.2",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-xml": "^6.0.2",
"@codemirror/language": "^6.6.0",
@@ -36,21 +34,25 @@
"@lezer/lr": "^1.3.3",
"@react-hook/resize-observer": "^1.2.6",
"@tailwindcss/container-queries": "^0.1.0",
"@tanstack/query-sync-storage-persister": "^4.27.1",
"@tanstack/react-query": "^4.28.0",
"@tanstack/react-query-devtools": "^4.28.0",
"@tanstack/react-query-persist-client": "^4.28.0",
"@tauri-apps/api": "^1.5.3",
"@tanstack/react-query": "^5.45.1",
"@tauri-apps/api": ">=2.0.0-beta.0",
"@tauri-apps/plugin-clipboard-manager": "^2.1.0-beta.1",
"@tauri-apps/plugin-dialog": ">=2.0.0-beta.0",
"@tauri-apps/plugin-fs": ">=2.0.0-beta.0",
"@tauri-apps/plugin-os": ">=2.0.0-beta.0",
"@tauri-apps/plugin-shell": ">=2.0.0-beta.0",
"buffer": "^6.0.3",
"classnames": "^2.3.2",
"cm6-graphql": "^0.0.9",
"codemirror": "^6.0.1",
"codemirror-json-schema": "^0.6.1",
"date-fns": "^3.3.1",
"fast-fuzzy": "^1.12.0",
"focus-trap-react": "^10.1.1",
"format-graphql": "^1.4.0",
"framer-motion": "^9.0.4",
"lucide-react": "^0.309.0",
"mime": "^4.0.1",
"papaparse": "^5.4.1",
"parse-color": "^1.0.0",
"react": "^18.2.0",
@@ -58,16 +60,18 @@
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0",
"react-helmet-async": "^1.3.0",
"react-pdf": "^9.0.0",
"react-router-dom": "^6.8.1",
"react-use": "^17.4.0",
"slugify": "^1.6.6",
"tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v1",
"tauri-plugin-log-api": "github:tauri-apps/tauri-plugin-log#v2",
"uuid": "^9.0.0",
"xml-formatter": "^3.6.2"
},
"devDependencies": {
"@tailwindcss/nesting": "^0.0.0-insiders.565cd3e",
"@tauri-apps/cli": "^1.5.10",
"@tanstack/react-query-devtools": "^5.45.1",
"@tauri-apps/cli": ">=2.0.0-beta.0",
"@types/node": "^18.7.10",
"@types/papaparse": "^5.3.7",
"@types/parse-color": "^1.0.1",
@@ -86,6 +90,7 @@
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-react-hooks": "^4.6.0",
"husky": "^8.0.3",
"internal-ip": "^8.0.0",
"lint-staged": "^15.0.2",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.21",
@@ -93,11 +98,14 @@
"prettier": "^2.8.4",
"react-devtools": "^4.27.2",
"tailwindcss": "^3.2.7",
"typescript": "^5.3.3",
"vite": "^5.1.1",
"typescript": "^5.4.5",
"vite": "^5.0.0",
"vite-plugin-static-copy": "^1.0.5",
"decompress": "^4.2.1",
"nodejs-file-downloader": "^4.13.0",
"rimraf": "^5.0.7",
"vite-plugin-svgr": "^4.2.0",
"vite-plugin-top-level-await": "^1.4.1",
"vitest": "^1.3.0"
"vite-plugin-top-level-await": "^1.4.1"
},
"lint-staged": {
"*.{ts,tsx}": "eslint --cache --fix",

3
plugin-runtime/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
build
node_modules
*.blob

View File

@@ -0,0 +1,5 @@
{
"watch": ["src"],
"ext": "ts",
"exec": "node -r ts-node/register ./src/index.ts"
}

3004
plugin-runtime/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
{
"name": "@yaak/plugin-runtime",
"scripts": {
"dev": "nodemon",
"build": "run-p build:*",
"build:main": "esbuild src/index.ts --bundle --platform=node --outfile=build/index.cjs",
"build:worker": "esbuild src/index.worker.ts --bundle --platform=node --outfile=build/index.worker.cjs",
"build:proto": "grpc_tools_node_protoc --ts_proto_out=src/gen --ts_proto_opt=outputServices=nice-grpc,outputServices=generic-definitions,useExactTypes=false --proto_path=../proto ../proto/plugins/*.proto"
},
"dependencies": {
"long": "^5.2.3",
"nice-grpc": "^2.1.9",
"protobufjs": "^7.3.2"
},
"devDependencies": {
"grpc-tools": "^1.12.4",
"nodemon": "^3.1.4",
"npm-run-all": "^4.1.5",
"ts-node": "^10.9.2",
"ts-proto": "^1.180.0",
"typescript": "^5.5.2"
}
}

View File

@@ -0,0 +1,92 @@
import { randomUUID } from 'node:crypto';
import path from 'node:path';
import { Worker } from 'node:worker_threads';
import { PluginInfo } from './plugins';
export interface ParentToWorkerEvent<T = any> {
callbackId: string;
name: string;
payload: T;
}
export type WorkerToParentSuccessEvent<T> = {
callbackId: string;
payload: T;
};
export type WorkerToParentErrorEvent = {
callbackId: string;
error: string;
};
export type WorkerToParentEvent<T = any> = WorkerToParentErrorEvent | WorkerToParentSuccessEvent<T>;
export class PluginHandle {
readonly pluginDir: string;
readonly #worker: Worker;
constructor(pluginDir: string) {
this.pluginDir = pluginDir;
const workerPath = path.join(__dirname, 'index.worker.cjs');
this.#worker = new Worker(workerPath, {
workerData: {
pluginDir: this.pluginDir,
},
});
this.#worker.on('error', this.#handleError.bind(this));
this.#worker.on('exit', this.#handleExit.bind(this));
}
async getInfo(): Promise<PluginInfo> {
return this.#callPlugin('info', null);
}
async runResponseFilter({ filter, body }: { filter: string; body: string }): Promise<string> {
return this.#callPlugin('run-filter', { filter, body });
}
async runExport(request: any): Promise<string> {
return this.#callPlugin('run-export', request);
}
async runImport(data: string): Promise<string> {
const result = await this.#callPlugin('run-import', data);
// Plugin returns object, but we convert to string
return JSON.stringify(result, null, 2);
}
#callPlugin<P, R>(name: string, payload: P): Promise<R> {
const callbackId = `cb_${randomUUID().replaceAll('-', '')}`;
return new Promise((resolve, reject) => {
const cb = (e: WorkerToParentEvent<R>) => {
if (e.callbackId !== callbackId) return;
if ('error' in e) {
reject(e.error);
} else {
resolve(e.payload as R);
}
this.#worker.removeListener('message', cb);
};
this.#worker.addListener('message', cb);
this.#worker.postMessage({ callbackId, name, payload });
});
}
async #handleError(err: Error) {
console.error('Plugin errored', this.pluginDir, err);
}
async #handleExit(code: number) {
if (code === 0) {
console.log('Plugin exited successfully', this.pluginDir);
} else {
console.log('Plugin exited with error', code, this.pluginDir);
}
}
}

View File

@@ -0,0 +1,44 @@
import { PluginHandle } from './PluginHandle';
import { loadPlugins, PluginInfo } from './plugins';
export class PluginManager {
#handles: PluginHandle[] | null = null;
static #instance: PluginManager | null = null;
public static instance(): PluginManager {
if (PluginManager.#instance == null) {
PluginManager.#instance = new PluginManager();
PluginManager.#instance.plugins(); // Trigger workers to boot, as it takes a few seconds
}
return PluginManager.#instance;
}
async plugins(): Promise<PluginHandle[]> {
this.#handles = this.#handles ?? loadPlugins();
return this.#handles;
}
async #pluginsWithInfo(): Promise<{ plugin: PluginHandle; info: PluginInfo }[]> {
const plugins = await this.plugins();
return Promise.all(plugins.map(async (plugin) => ({ plugin, info: await plugin.getInfo() })));
}
async pluginsWith(capability: PluginInfo['capabilities'][0]): Promise<PluginHandle[]> {
return (await this.#pluginsWithInfo())
.filter((v) => v.info.capabilities.includes(capability))
.map((v) => v.plugin);
}
async plugin(name: string): Promise<PluginHandle | null> {
return (await this.#pluginsWithInfo()).find((v) => v.info.name === name)?.plugin ?? null;
}
async pluginOrThrow(name: string): Promise<PluginHandle> {
const plugin = await this.plugin(name);
if (plugin == null) {
throw new Error(`Failed to find plugin by ${name}`);
}
return plugin;
}
}

View File

@@ -0,0 +1,432 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v1.180.0
// protoc v3.19.1
// source: plugins/runtime.proto
/* eslint-disable */
import { type CallContext, type CallOptions } from "nice-grpc-common";
import * as _m0 from "protobufjs/minimal";
export const protobufPackage = "yaak.plugins.runtime";
export interface PluginInfo {
plugin: string;
}
export interface HookResponse {
info: PluginInfo | undefined;
data: string;
}
export interface HookImportRequest {
data: string;
}
export interface HookResponseFilterRequest {
filter: string;
body: string;
contentType: string;
}
export interface HookExportRequest {
request: string;
}
function createBasePluginInfo(): PluginInfo {
return { plugin: "" };
}
export const PluginInfo = {
encode(message: PluginInfo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.plugin !== "") {
writer.uint32(10).string(message.plugin);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): PluginInfo {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBasePluginInfo();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag !== 10) {
break;
}
message.plugin = reader.string();
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): PluginInfo {
return { plugin: isSet(object.plugin) ? globalThis.String(object.plugin) : "" };
},
toJSON(message: PluginInfo): unknown {
const obj: any = {};
if (message.plugin !== "") {
obj.plugin = message.plugin;
}
return obj;
},
create(base?: DeepPartial<PluginInfo>): PluginInfo {
return PluginInfo.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<PluginInfo>): PluginInfo {
const message = createBasePluginInfo();
message.plugin = object.plugin ?? "";
return message;
},
};
function createBaseHookResponse(): HookResponse {
return { info: undefined, data: "" };
}
export const HookResponse = {
encode(message: HookResponse, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.info !== undefined) {
PluginInfo.encode(message.info, writer.uint32(10).fork()).ldelim();
}
if (message.data !== "") {
writer.uint32(18).string(message.data);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): HookResponse {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseHookResponse();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag !== 10) {
break;
}
message.info = PluginInfo.decode(reader, reader.uint32());
continue;
case 2:
if (tag !== 18) {
break;
}
message.data = reader.string();
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): HookResponse {
return {
info: isSet(object.info) ? PluginInfo.fromJSON(object.info) : undefined,
data: isSet(object.data) ? globalThis.String(object.data) : "",
};
},
toJSON(message: HookResponse): unknown {
const obj: any = {};
if (message.info !== undefined) {
obj.info = PluginInfo.toJSON(message.info);
}
if (message.data !== "") {
obj.data = message.data;
}
return obj;
},
create(base?: DeepPartial<HookResponse>): HookResponse {
return HookResponse.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<HookResponse>): HookResponse {
const message = createBaseHookResponse();
message.info = (object.info !== undefined && object.info !== null)
? PluginInfo.fromPartial(object.info)
: undefined;
message.data = object.data ?? "";
return message;
},
};
function createBaseHookImportRequest(): HookImportRequest {
return { data: "" };
}
export const HookImportRequest = {
encode(message: HookImportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.data !== "") {
writer.uint32(10).string(message.data);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): HookImportRequest {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseHookImportRequest();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag !== 10) {
break;
}
message.data = reader.string();
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): HookImportRequest {
return { data: isSet(object.data) ? globalThis.String(object.data) : "" };
},
toJSON(message: HookImportRequest): unknown {
const obj: any = {};
if (message.data !== "") {
obj.data = message.data;
}
return obj;
},
create(base?: DeepPartial<HookImportRequest>): HookImportRequest {
return HookImportRequest.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<HookImportRequest>): HookImportRequest {
const message = createBaseHookImportRequest();
message.data = object.data ?? "";
return message;
},
};
function createBaseHookResponseFilterRequest(): HookResponseFilterRequest {
return { filter: "", body: "", contentType: "" };
}
export const HookResponseFilterRequest = {
encode(message: HookResponseFilterRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.filter !== "") {
writer.uint32(10).string(message.filter);
}
if (message.body !== "") {
writer.uint32(18).string(message.body);
}
if (message.contentType !== "") {
writer.uint32(26).string(message.contentType);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): HookResponseFilterRequest {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseHookResponseFilterRequest();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag !== 10) {
break;
}
message.filter = reader.string();
continue;
case 2:
if (tag !== 18) {
break;
}
message.body = reader.string();
continue;
case 3:
if (tag !== 26) {
break;
}
message.contentType = reader.string();
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): HookResponseFilterRequest {
return {
filter: isSet(object.filter) ? globalThis.String(object.filter) : "",
body: isSet(object.body) ? globalThis.String(object.body) : "",
contentType: isSet(object.contentType) ? globalThis.String(object.contentType) : "",
};
},
toJSON(message: HookResponseFilterRequest): unknown {
const obj: any = {};
if (message.filter !== "") {
obj.filter = message.filter;
}
if (message.body !== "") {
obj.body = message.body;
}
if (message.contentType !== "") {
obj.contentType = message.contentType;
}
return obj;
},
create(base?: DeepPartial<HookResponseFilterRequest>): HookResponseFilterRequest {
return HookResponseFilterRequest.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<HookResponseFilterRequest>): HookResponseFilterRequest {
const message = createBaseHookResponseFilterRequest();
message.filter = object.filter ?? "";
message.body = object.body ?? "";
message.contentType = object.contentType ?? "";
return message;
},
};
function createBaseHookExportRequest(): HookExportRequest {
return { request: "" };
}
export const HookExportRequest = {
encode(message: HookExportRequest, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer {
if (message.request !== "") {
writer.uint32(10).string(message.request);
}
return writer;
},
decode(input: _m0.Reader | Uint8Array, length?: number): HookExportRequest {
const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseHookExportRequest();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1:
if (tag !== 10) {
break;
}
message.request = reader.string();
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skipType(tag & 7);
}
return message;
},
fromJSON(object: any): HookExportRequest {
return { request: isSet(object.request) ? globalThis.String(object.request) : "" };
},
toJSON(message: HookExportRequest): unknown {
const obj: any = {};
if (message.request !== "") {
obj.request = message.request;
}
return obj;
},
create(base?: DeepPartial<HookExportRequest>): HookExportRequest {
return HookExportRequest.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<HookExportRequest>): HookExportRequest {
const message = createBaseHookExportRequest();
message.request = object.request ?? "";
return message;
},
};
export type PluginRuntimeDefinition = typeof PluginRuntimeDefinition;
export const PluginRuntimeDefinition = {
name: "PluginRuntime",
fullName: "yaak.plugins.runtime.PluginRuntime",
methods: {
hookImport: {
name: "hookImport",
requestType: HookImportRequest,
requestStream: false,
responseType: HookResponse,
responseStream: false,
options: {},
},
hookResponseFilter: {
name: "hookResponseFilter",
requestType: HookResponseFilterRequest,
requestStream: false,
responseType: HookResponse,
responseStream: false,
options: {},
},
hookExport: {
name: "hookExport",
requestType: HookExportRequest,
requestStream: false,
responseType: HookResponse,
responseStream: false,
options: {},
},
},
} as const;
export interface PluginRuntimeServiceImplementation<CallContextExt = {}> {
hookImport(request: HookImportRequest, context: CallContext & CallContextExt): Promise<DeepPartial<HookResponse>>;
hookResponseFilter(
request: HookResponseFilterRequest,
context: CallContext & CallContextExt,
): Promise<DeepPartial<HookResponse>>;
hookExport(request: HookExportRequest, context: CallContext & CallContextExt): Promise<DeepPartial<HookResponse>>;
}
export interface PluginRuntimeClient<CallOptionsExt = {}> {
hookImport(request: DeepPartial<HookImportRequest>, options?: CallOptions & CallOptionsExt): Promise<HookResponse>;
hookResponseFilter(
request: DeepPartial<HookResponseFilterRequest>,
options?: CallOptions & CallOptionsExt,
): Promise<HookResponse>;
hookExport(request: DeepPartial<HookExportRequest>, options?: CallOptions & CallOptionsExt): Promise<HookResponse>;
}
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
export type DeepPartial<T> = T extends Builtin ? T
: T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>
: T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>;
function isSet(value: any): boolean {
return value !== null && value !== undefined;
}

View File

@@ -0,0 +1,87 @@
import { isAbortError } from 'abort-controller-x';
import { createServer, ServerError, ServerMiddlewareCall, Status } from 'nice-grpc';
import { CallContext } from 'nice-grpc-common';
import * as fs from 'node:fs';
import {
DeepPartial,
HookExportRequest,
HookImportRequest,
HookResponse,
HookResponseFilterRequest,
PluginRuntimeDefinition,
PluginRuntimeServiceImplementation,
} from './gen/plugins/runtime';
import { PluginManager } from './PluginManager';
class PluginRuntimeService implements PluginRuntimeServiceImplementation {
#manager: PluginManager;
constructor() {
this.#manager = PluginManager.instance();
}
async hookExport(request: HookExportRequest): Promise<DeepPartial<HookResponse>> {
const plugin = await this.#manager.pluginOrThrow('exporter-curl');
const data = await plugin.runExport(JSON.parse(request.request));
const info = { plugin: (await plugin.getInfo()).name };
return { info, data };
}
async hookImport(request: HookImportRequest): Promise<DeepPartial<HookResponse>> {
const plugins = await this.#manager.pluginsWith('import');
for (const p of plugins) {
const data = await p.runImport(request.data);
if (data != null && data !== 'null') {
const info = { plugin: (await p.getInfo()).name };
return { info, data };
}
}
throw new ServerError(Status.UNKNOWN, 'No importers found for data');
}
async hookResponseFilter(request: HookResponseFilterRequest): Promise<DeepPartial<HookResponse>> {
const pluginName = request.contentType.includes('json') ? 'filter-jsonpath' : 'filter-xpath';
const plugin = await this.#manager.pluginOrThrow(pluginName);
const data = await plugin.runResponseFilter(request);
const info = { plugin: (await plugin.getInfo()).name };
return { info, data };
}
}
let server = createServer();
async function* errorHandlingMiddleware<Request, Response>(
call: ServerMiddlewareCall<Request, Response>,
context: CallContext,
) {
try {
return yield* call.next(call.request, context);
} catch (error: unknown) {
if (error instanceof ServerError || isAbortError(error)) {
throw error;
}
let details = String(error);
if (process.env.NODE_ENV === 'development') {
// @ts-ignore
details += `: ${error.stack}`;
}
throw new ServerError(Status.UNKNOWN, details);
}
}
server = server.use(errorHandlingMiddleware);
server.add(PluginRuntimeDefinition, new PluginRuntimeService());
// Start on random port if YAAK_GRPC_PORT_FILE_PATH is set, or :4000
const addr = process.env.YAAK_GRPC_PORT_FILE_PATH ? 'localhost:0' : 'localhost:4000';
server.listen(addr).then((port) => {
console.log('gRPC server listening on', `http://localhost:${port}`);
if (process.env.YAAK_GRPC_PORT_FILE_PATH) {
console.log('Wrote port file to', process.env.YAAK_GRPC_PORT_FILE_PATH);
fs.writeFileSync(process.env.YAAK_GRPC_PORT_FILE_PATH, JSON.stringify({ port }, null, 2));
}
});

View File

@@ -0,0 +1,76 @@
import { readFileSync } from 'node:fs';
import path from 'node:path';
import { parentPort, workerData } from 'node:worker_threads';
import { ParentToWorkerEvent } from './PluginHandle';
import { PluginInfo } from './plugins';
new Promise<void>(async (resolve, reject) => {
const { pluginDir } = workerData;
const pathMod = path.join(pluginDir, 'build/index.js');
const pathPkg = path.join(pluginDir, 'package.json');
let pkg: { [x: string]: any };
try {
pkg = JSON.parse(readFileSync(pathPkg, 'utf8'));
} catch (err) {
// TODO: Do something better here
reject(err);
return;
}
const mod = (await import(`file://${pathMod}`)).default ?? {};
const info: PluginInfo = {
capabilities: [],
name: pkg['name'] ?? 'n/a',
dir: pluginDir,
};
if (typeof mod['pluginHookImport'] === 'function') {
info.capabilities.push('import');
}
if (typeof mod['pluginHookExport'] === 'function') {
info.capabilities.push('export');
}
if (typeof mod['pluginHookResponseFilter'] === 'function') {
info.capabilities.push('filter');
}
console.log('Loaded plugin', info.name, info.capabilities, info.dir);
function reply<T>(originalMsg: ParentToWorkerEvent, payload: T) {
parentPort!.postMessage({ payload, callbackId: originalMsg.callbackId });
}
function replyErr(originalMsg: ParentToWorkerEvent, error: unknown) {
parentPort!.postMessage({
error: String(error),
callbackId: originalMsg.callbackId,
});
}
parentPort!.on('message', async (msg: ParentToWorkerEvent) => {
try {
const ctx = { todo: 'implement me' };
if (msg.name === 'run-import') {
reply(msg, await mod.pluginHookImport(ctx, msg.payload));
} else if (msg.name === 'run-filter') {
reply(msg, await mod.pluginHookResponseFilter(ctx, msg.payload));
} else if (msg.name === 'run-export') {
reply(msg, await mod.pluginHookExport(ctx, msg.payload));
} else if (msg.name === 'info') {
reply(msg, info);
} else {
console.log('Unknown message', msg);
}
} catch (err: unknown) {
replyErr(msg, err);
}
});
resolve();
}).catch((err) => {
console.log('failed to boot plugin', err);
});

View File

@@ -0,0 +1,18 @@
import * as fs from 'node:fs';
import path from 'node:path';
import { PluginHandle } from './PluginHandle';
export interface PluginInfo {
name: string;
dir: string;
capabilities: ('import' | 'export' | 'filter')[];
}
export function loadPlugins(): PluginHandle[] {
const pluginsDir = process.env.YAAK_PLUGINS_DIR;
if (!pluginsDir) throw new Error('YAAK_PLUGINS_DIR is not set');
console.log('Loading plugins from', pluginsDir);
const pluginDirs = fs.readdirSync(pluginsDir).map((p) => path.join(pluginsDir, p));
return pluginDirs.map((pluginDir) => new PluginHandle(pluginDir));
}

View File

@@ -0,0 +1,25 @@
{
"compilerOptions": {
"module": "node16",
"strict": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"target": "es2021",
"lib": ["es2021"],
"noImplicitAny": false,
"moduleResolution": "node",
"sourceMap": true,
"outDir": "dist",
"baseUrl": ".",
"skipLibCheck": true,
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
}
},
"include": [
"src/**/*"
]
}

View File

@@ -1,173 +0,0 @@
{
"name": "filter-jsonpath",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "filter-jsonpath",
"version": "0.0.1",
"dependencies": {
"jsonpath": "^1.1.1"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
},
"node_modules/escodegen": {
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
"integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^4.2.0",
"esutils": "^2.0.2",
"optionator": "^0.8.1"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
"node": ">=4.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
"node_modules/escodegen/node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/esprima": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz",
"integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"engines": {
"node": ">=4.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
},
"node_modules/jsonpath": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz",
"integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==",
"dependencies": {
"esprima": "1.2.2",
"static-eval": "2.0.2",
"underscore": "1.12.1"
}
},
"node_modules/levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
"dependencies": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/optionator": {
"version": "0.8.3",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
"integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
"dependencies": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.6",
"levn": "~0.3.0",
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2",
"word-wrap": "~1.2.3"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-eval": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz",
"integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==",
"dependencies": {
"escodegen": "^1.8.1"
}
},
"node_modules/type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
"dependencies": {
"prelude-ls": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/underscore": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
"integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw=="
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"engines": {
"node": ">=0.10.0"
}
}
}
}

View File

@@ -1,7 +0,0 @@
{
"name": "filter-jsonpath",
"version": "0.0.1",
"dependencies": {
"jsonpath": "^1.1.1"
}
}

View File

@@ -1,12 +0,0 @@
import jp from 'jsonpath';
export function pluginHookResponseFilter(filter, text) {
let parsed;
try {
parsed = JSON.parse(text);
} catch (e) {
return;
}
const filtered = jp.query(parsed, filter);
return { filtered: JSON.stringify(filtered, null, 2) };
}

View File

@@ -1,13 +0,0 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.js'),
fileName: 'index',
formats: ['es'],
},
outDir: resolve(__dirname, '../../src-tauri/plugins/filter-jsonpath'),
},
});

View File

@@ -1,32 +0,0 @@
{
"name": "filter-xpath",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "filter-xpath",
"version": "0.0.1",
"dependencies": {
"@xmldom/xmldom": "^0.8.10",
"xpath": "^0.0.34"
}
},
"node_modules/@xmldom/xmldom": {
"version": "0.8.10",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
"integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/xpath": {
"version": "0.0.34",
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz",
"integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==",
"engines": {
"node": ">=0.6.0"
}
}
}
}

View File

@@ -1,8 +0,0 @@
{
"name": "filter-xpath",
"version": "0.0.1",
"dependencies": {
"@xmldom/xmldom": "^0.8.10",
"xpath": "^0.0.34"
}
}

View File

@@ -1,8 +0,0 @@
import xpath from 'xpath';
import { DOMParser } from '@xmldom/xmldom';
export function pluginHookResponseFilter(filter, text) {
const doc = new DOMParser().parseFromString(text, 'text/xml');
const filtered = `${xpath.select(filter, doc)}`;
return { filtered };
}

View File

@@ -1,13 +0,0 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.js'),
fileName: 'index',
formats: ['es'],
},
outDir: resolve(__dirname, '../../src-tauri/plugins/filter-xpath'),
},
});

View File

@@ -1,12 +0,0 @@
{
"name": "importer-insomnia",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "importer-insomnia",
"version": "0.0.1"
}
}
}

View File

@@ -1,4 +0,0 @@
{
"name": "importer-insomnia",
"version": "0.0.1"
}

View File

@@ -1,23 +0,0 @@
export function isWorkspace(obj) {
return isJSObject(obj) && obj._type === 'workspace';
}
export function isRequestGroup(obj) {
return isJSObject(obj) && obj._type === 'request_group';
}
export function isRequest(obj) {
return isJSObject(obj) && obj._type === 'request';
}
export function isEnvironment(obj) {
return isJSObject(obj) && obj._type === 'environment';
}
export function isJSObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
export function isJSString(obj) {
return Object.prototype.toString.call(obj) === '[object String]';
}

View File

@@ -1,18 +0,0 @@
import { isJSString } from './types.js';
export function parseVariables(data) {
return Object.entries(data).map(([name, value]) => ({
enabled: true,
name,
value: `${value}`,
}));
}
/**
* Convert Insomnia syntax to Yaak syntax
* @param {string} variable - Text to convert
*/
export function convertSyntax(variable) {
if (!isJSString(variable)) return variable;
return variable.replaceAll(/{{\s*(_\.)?([^}]+)\s*}}/g, '${[$2]}');
}

View File

@@ -1,21 +0,0 @@
/**
* Import an Insomnia environment object.
* @param {Object} e - The environment object to import.
* @param workspaceId - Workspace to import into.
*/
export function importEnvironment(e, workspaceId) {
console.log('IMPORTING Environment', e._id, e.name, JSON.stringify(e, null, 2));
return {
id: e._id,
createdAt: new Date(e.created ?? Date.now()).toISOString().replace('Z', ''),
updatedAt: new Date(e.updated ?? Date.now()).toISOString().replace('Z', ''),
workspaceId,
model: 'environment',
name: e.name,
variables: Object.entries(e.data).map(([name, value]) => ({
enabled: true,
name,
value: `${value}`,
})),
};
}

View File

@@ -1,17 +0,0 @@
/**
* Import an Insomnia folder object.
* @param {Object} f - The environment object to import.
* @param workspaceId - Workspace to import into.
*/
export function importFolder(f, workspaceId) {
console.log('IMPORTING FOLDER', f._id, f.name, JSON.stringify(f, null, 2));
return {
id: f._id,
createdAt: new Date(f.created ?? Date.now()).toISOString().replace('Z', ''),
updatedAt: new Date(f.updated ?? Date.now()).toISOString().replace('Z', ''),
folderId: f.parentId === workspaceId ? null : f.parentId,
workspaceId,
model: 'folder',
name: f.name,
};
}

View File

@@ -1,60 +0,0 @@
import { convertSyntax } from '../helpers/variables.js';
/**
* Import an Insomnia request object.
* @param {Object} r - The request object to import.
* @param workspaceId - The workspace ID to use for the request.
* @param {number} sortPriority - The sort priority to use for the request.
*/
export function importRequest(r, workspaceId, sortPriority = 0) {
console.log('IMPORTING REQUEST', r._id, r.name, JSON.stringify(r, null, 2));
let bodyType = null;
let body = null;
if (r.body?.mimeType === 'application/graphql') {
bodyType = 'graphql';
body = convertSyntax(r.body.text);
} else if (r.body?.mimeType === 'application/json') {
bodyType = 'application/json';
body = convertSyntax(r.body.text);
}
let authenticationType = null;
let authentication = {};
if (r.authentication.type === 'bearer') {
authenticationType = 'bearer';
authentication = {
token: convertSyntax(r.authentication.token),
};
} else if (r.authentication.type === 'basic') {
authenticationType = 'basic';
authentication = {
username: convertSyntax(r.authentication.username),
password: convertSyntax(r.authentication.password),
};
}
return {
id: r._id,
createdAt: new Date(r.created ?? Date.now()).toISOString().replace('Z', ''),
updatedAt: new Date(r.updated ?? Date.now()).toISOString().replace('Z', ''),
workspaceId,
folderId: r.parentId === workspaceId ? null : r.parentId,
model: 'http_request',
sortPriority,
name: r.name,
url: convertSyntax(r.url),
body,
bodyType,
authentication,
authenticationType,
method: r.method,
headers: (r.headers ?? [])
.map(({ name, value, disabled }) => ({
enabled: !disabled,
name,
value,
}))
.filter(({ name, value }) => name !== '' || value !== ''),
};
}

View File

@@ -1,76 +0,0 @@
import { importEnvironment } from './importers/environment.js';
import { importRequest } from './importers/request.js';
import {
isEnvironment,
isJSObject,
isRequest,
isRequestGroup,
isWorkspace,
} from './helpers/types.js';
import { parseVariables } from './helpers/variables.js';
import { importFolder } from './importers/folder.js';
export function pluginHookImport(contents) {
console.log('RUNNING INSOMNIA');
let parsed;
try {
parsed = JSON.parse(contents);
} catch (e) {
return;
}
if (!isJSObject(parsed)) return;
if (!Array.isArray(parsed.resources)) return;
const resources = {
workspaces: [],
requests: [],
environments: [],
folders: [],
};
// Import workspaces
const workspacesToImport = parsed.resources.filter(isWorkspace);
for (const workspaceToImport of workspacesToImport) {
const baseEnvironment = parsed.resources.find(
(r) => isEnvironment(r) && r.parentId === workspaceToImport._id,
);
resources.workspaces.push({
id: workspaceToImport._id,
createdAt: new Date(workspacesToImport.created ?? Date.now()).toISOString().replace('Z', ''),
updatedAt: new Date(workspacesToImport.updated ?? Date.now()).toISOString().replace('Z', ''),
model: 'workspace',
name: workspaceToImport.name,
variables: baseEnvironment ? parseVariables(baseEnvironment.data) : [],
});
const environmentsToImport = parsed.resources.filter(
(r) => isEnvironment(r) && r.parentId === baseEnvironment?._id,
);
resources.environments.push(
...environmentsToImport.map((r) => importEnvironment(r, workspaceToImport._id)),
);
const nextFolder = (parentId) => {
const children = parsed.resources.filter((r) => r.parentId === parentId);
let sortPriority = 0;
for (const child of children) {
if (isRequestGroup(child)) {
resources.folders.push(importFolder(child, workspaceToImport._id));
nextFolder(child._id);
} else if (isRequest(child)) {
resources.requests.push(importRequest(child, workspaceToImport._id, sortPriority++));
}
}
};
// Import folders
nextFolder(workspaceToImport._id);
}
// Filter out any `null` values
resources.requests = resources.requests.filter(Boolean);
resources.environments = resources.environments.filter(Boolean);
resources.workspaces = resources.workspaces.filter(Boolean);
return { resources };
}

View File

@@ -1,13 +0,0 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.js'),
fileName: 'index',
formats: ['es'],
},
outDir: resolve(__dirname, '../../src-tauri/plugins/importer-insomnia'),
},
});

View File

@@ -1,12 +0,0 @@
{
"name": "importer-postman",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "importer-postman",
"version": "0.0.1"
}
}
}

View File

@@ -1,4 +0,0 @@
{
"name": "importer-postman",
"version": "0.0.1"
}

View File

@@ -1,223 +0,0 @@
import { Environment, Folder, HttpRequest, Workspace } from '../../../src-web/lib/models';
const POSTMAN_2_1_0_SCHEMA = 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json';
const POSTMAN_2_0_0_SCHEMA = 'https://schema.getpostman.com/json/collection/v2.0.0/collection.json';
const VALID_SCHEMAS = [POSTMAN_2_0_0_SCHEMA, POSTMAN_2_1_0_SCHEMA];
type AtLeast<T, K extends keyof T> = Partial<T> & Pick<T, K>;
interface ExportResources {
workspaces: AtLeast<Workspace, 'name' | 'id' | 'model'>[];
environments: AtLeast<Environment, 'name' | 'id' | 'model' | 'workspaceId'>[];
requests: AtLeast<HttpRequest, 'name' | 'id' | 'model' | 'workspaceId'>[];
folders: AtLeast<Folder, 'name' | 'id' | 'model' | 'workspaceId'>[];
}
export function pluginHookImport(contents: string): { resources: ExportResources } | undefined {
const root = parseJSONToRecord(contents);
if (root == null) return;
const info = toRecord(root.info);
const isValidSchema = VALID_SCHEMAS.includes(info.schema);
if (!isValidSchema || !Array.isArray(root.item)) {
return;
}
const exportResources: ExportResources = {
workspaces: [],
environments: [],
requests: [],
folders: [],
};
const workspace: ExportResources['workspaces'][0] = {
model: 'workspace',
id: generateId('wk'),
name: info.name || 'Postman Import',
description: info.description || '',
};
exportResources.workspaces.push(workspace);
const importItem = (v: Record<string, any>, folderId: string | null = null) => {
if (typeof v.name === 'string' && Array.isArray(v.item)) {
const folder: ExportResources['folders'][0] = {
model: 'folder',
workspaceId: workspace.id,
id: generateId('fl'),
name: v.name,
folderId,
};
exportResources.folders.push(folder);
for (const child of v.item) {
importItem(child, folder.id);
}
} else if (typeof v.name === 'string' && 'request' in v) {
const r = toRecord(v.request);
const bodyPatch = importBody(r.body);
const authPatch = importAuth(r.auth);
const request: ExportResources['requests'][0] = {
model: 'http_request',
id: generateId('rq'),
workspaceId: workspace.id,
folderId,
name: v.name,
method: r.method || 'GET',
url: typeof r.url === 'string' ? r.url : toRecord(r.url).raw,
body: bodyPatch.body,
bodyType: bodyPatch.bodyType,
authentication: authPatch.authentication,
authenticationType: authPatch.authenticationType,
headers: [
...bodyPatch.headers,
...authPatch.headers,
...toArray(r.header).map((h) => {
return {
name: h.key,
value: h.value,
enabled: !h.disabled,
};
}),
],
};
exportResources.requests.push(request);
} else {
console.log('Unknown item', v, folderId);
}
};
for (const item of root.item) {
importItem(item);
}
return { resources: convertTemplateSyntax(exportResources) };
}
function importAuth(
rawAuth: any,
): Pick<HttpRequest, 'authentication' | 'authenticationType' | 'headers'> {
const auth = toRecord(rawAuth);
if ('basic' in auth) {
return {
headers: [],
authenticationType: 'basic',
authentication: {
username: auth.basic.username || '',
password: auth.basic.password || '',
},
};
} else {
// TODO: support other auth types
return { headers: [], authenticationType: null, authentication: {} };
}
}
function importBody(rawBody: any): Pick<HttpRequest, 'body' | 'bodyType' | 'headers'> {
const body = toRecord(rawBody);
if ('graphql' in body) {
return {
headers: [
{
name: 'Content-Type',
value: 'application/json',
enabled: true,
},
],
bodyType: 'graphql',
body: {
text: JSON.stringify(
{ query: body.graphql.query, variables: parseJSONToRecord(body.graphql.variables) },
null,
2,
),
},
};
} else if ('urlencoded' in body) {
return {
headers: [
{
name: 'Content-Type',
value: 'application/x-www-form-urlencoded',
enabled: true,
},
],
bodyType: 'application/x-www-form-urlencoded',
body: {
form: toArray(body.urlencoded).map((f) => ({
enabled: !f.disabled,
name: f.key ?? '',
value: f.value ?? '',
})),
},
};
} else if ('formdata' in body) {
return {
headers: [
{
name: 'Content-Type',
value: 'multipart/form-data',
enabled: true,
},
],
bodyType: 'multipart/form-data',
body: {
form: toArray(body.formdata).map((f) =>
f.src != null
? {
enabled: !f.disabled,
name: f.key ?? '',
file: f.src ?? '',
}
: {
enabled: !f.disabled,
name: f.key ?? '',
value: f.value ?? '',
},
),
},
};
} else {
// TODO: support other body types
return { headers: [], bodyType: null, body: {} };
}
}
function parseJSONToRecord(jsonStr: string): Record<string, any> | null {
try {
return toRecord(JSON.parse(jsonStr));
} catch (err) {}
return null;
}
function toRecord(value: any): Record<string, any> {
if (Object.prototype.toString.call(value) === '[object Object]') return value;
else return {};
}
function toArray(value: any): any[] {
if (Object.prototype.toString.call(value) === '[object Array]') return value;
else return [];
}
/** Recursively render all nested object properties */
function convertTemplateSyntax<T>(obj: T): T {
if (typeof obj === 'string') {
return obj.replace(/{{\s*(_\.)?([^}]+)\s*}}/g, '${[$2]}') as T;
} else if (Array.isArray(obj) && obj != null) {
return obj.map(convertTemplateSyntax) as T;
} else if (typeof obj === 'object' && obj != null) {
return Object.fromEntries(
Object.entries(obj).map(([k, v]) => [k, convertTemplateSyntax(v)]),
) as T;
} else {
return obj;
}
}
function generateId(prefix: 'wk' | 'rq' | 'fl'): string {
const alphabet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let id = `${prefix}_`;
for (let i = 0; i < 10; i++) {
id += alphabet[Math.floor(Math.random() * alphabet.length)];
}
return id;
}

View File

@@ -1,23 +0,0 @@
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": [
"ESNext",
],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": [
"./src"
]
}

View File

@@ -1,13 +0,0 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
fileName: 'index',
formats: ['es'],
},
outDir: resolve(__dirname, '../../src-tauri/plugins/importer-postman'),
},
});

View File

@@ -1,12 +0,0 @@
{
"name": "importer-yaak",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "importer-yaak",
"version": "0.0.1"
}
}
}

View File

@@ -1,4 +0,0 @@
{
"name": "importer-yaak",
"version": "0.0.1"
}

View File

@@ -1,32 +0,0 @@
export function pluginHookImport(contents) {
let parsed;
try {
parsed = JSON.parse(contents);
} catch (err) {
return undefined;
}
if (!isJSObject(parsed)) {
return undefined;
}
if (!('yaakSchema' in parsed)) {
return;
}
// Migrate v1 to v2 -- changes requests to httpRequests
if (parsed.yaakSchema === 1) {
parsed.resources.httpRequests = parsed.resources.requests;
parsed.yaakSchema = 2;
}
if (parsed.yaakSchema === 2) {
return { resources: parsed.resources }; // Should already be in the correct format
}
return undefined;
}
export function isJSObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}

View File

@@ -1,13 +0,0 @@
import { resolve } from 'path';
import { defineConfig } from 'vite';
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/index.js'),
fileName: 'index',
formats: ['es'],
},
outDir: resolve(__dirname, '../../src-tauri/plugins/importer-yaak'),
},
});

View File

@@ -0,0 +1,32 @@
syntax = "proto3";
package yaak.plugins.runtime;
service PluginRuntime {
rpc hookImport (HookImportRequest) returns (HookResponse);
rpc hookResponseFilter (HookResponseFilterRequest) returns (HookResponse);
rpc hookExport (HookExportRequest) returns (HookResponse);
}
message PluginInfo {
string plugin = 1;
}
message HookResponse {
PluginInfo info = 1;
string data = 2;
}
message HookImportRequest {
string data = 1;
}
message HookResponseFilterRequest {
string filter = 1;
string body = 2;
string contentType = 3;
}
message HookExportRequest {
string request = 1;
}

View File

@@ -0,0 +1,15 @@
const path = require('path');
const fs = require('fs');
const version = process.env.YAAK_VERSION?.replace('v', '');
if (!version) {
throw new Error('YAAK_VERSION environment variable not set')
}
const tauriConfigPath = path.join(__dirname, '../src-tauri/tauri.conf.json');
const tauriConfig = JSON.parse(fs.readFileSync(tauriConfigPath, 'utf8'));
tauriConfig.version = version;
console.log('Writing version ' + version + ' to ' + tauriConfigPath)
fs.writeFileSync(tauriConfigPath, JSON.stringify(tauriConfig, null, 2));

22
scripts/vendor-node.cjs Normal file
View File

@@ -0,0 +1,22 @@
const path = require('node:path');
const {cpSync} = require('node:fs');
const destDir = path.join(__dirname, '..', 'src-tauri', 'vendored', 'node');
const DST_BIN_MAP = {
darwin_arm64: 'node-aarch64-apple-darwin',
darwin_x64: 'node-x86_64-apple-darwin',
linux_x64: 'node-x86_64-unknown-linux-gnu',
win32_x64: 'node-x86_64-pc-windows-msvc.exe',
};
// Build the sea
console.log('Vendoring NodeJS binary');
// console.log('Changing Node.js binary permissions');
// chmodSync(tmpNodePath, 0o755);
const key = `${process.platform}_${process.env.NODE_ARCH ?? process.arch}`;
const dstPath = path.join(destDir, DST_BIN_MAP[key]);
cpSync(process.execPath, dstPath);
console.log(`Copied NodeJS to ${dstPath}`)

View File

@@ -0,0 +1,25 @@
const {readdirSync, cpSync} = require("node:fs");
const path = require("node:path");
const {execSync} = require("node:child_process");
const pluginsDir = process.env.YAAK_PLUGINS_DIR;
if (!pluginsDir) {
console.log("YAAK_PLUGINS_DIR is not set");
process.exit(1);
}
console.log('Installing Yaak plugins dependencies', pluginsDir);
execSync('npm ci', {cwd: pluginsDir});
console.log('Building Yaak plugins', pluginsDir);
execSync('npm run build', {cwd: pluginsDir});
console.log('Copying Yaak plugins to', pluginsDir);
const pluginsRoot = path.join(pluginsDir, 'plugins');
for (const name of readdirSync(pluginsRoot)) {
const dir = path.join(pluginsRoot, name);
if (name.startsWith('.')) continue;
const destDir = path.join(__dirname, '../src-tauri/vendored/plugins/', name);
console.log(`Copying ${name} to ${destDir}`);
cpSync(path.join(dir, 'package.json'), path.join(destDir, 'package.json'));
cpSync(path.join(dir, 'build/index.js'), path.join(destDir, 'build/index.js'));
}

64
scripts/vendor-protoc.cjs Normal file
View File

@@ -0,0 +1,64 @@
const decompress = require('decompress');
const Downloader = require("nodejs-file-downloader");
const path = require("node:path");
const fs = require("node:fs");
const rimraf = require('rimraf');
const {rmSync} = require("node:fs");
// `${process.platform}_${process.arch}`
const MAC_ARM = 'darwin_arm64';
const MAC_X64 = 'darwin_x64';
const LNX_X64 = 'linux_x64';
const WIN_X64 = 'win32_x64';
const URL_MAP = {
[MAC_ARM]: 'https://github.com/protocolbuffers/protobuf/releases/download/v27.2/protoc-27.2-osx-aarch_64.zip',
[MAC_X64]: 'https://github.com/protocolbuffers/protobuf/releases/download/v27.2/protoc-27.2-osx-x86_64.zip',
[LNX_X64]: 'https://github.com/protocolbuffers/protobuf/releases/download/v27.2/protoc-27.2-linux-x86_64.zip',
[WIN_X64]: 'https://github.com/protocolbuffers/protobuf/releases/download/v27.2/protoc-27.2-win64.zip',
};
const DST_BIN_MAP = {
[MAC_ARM]: 'protoc-aarch64-apple-darwin',
[MAC_X64]: 'protoc-x86_64-apple-darwin',
[LNX_X64]: 'protoc-x86_64-unknown-linux-gnu',
[WIN_X64]: 'protoc-x86_64-pc-windows-msvc.exe',
};
const SRC_BIN_MAP = {
[MAC_ARM]: 'protoc',
[MAC_X64]: 'protoc',
[LNX_X64]: 'protoc',
[WIN_X64]: 'protoc.exe',
};
(async function () {
const key = `${process.platform}_${process.env.NODE_ARCH ?? process.arch}`;
const url = URL_MAP[key];
const tmpDir = path.join(__dirname, 'tmp', `${Math.random()}`);
const dstDir = path.join(__dirname, `..`, 'src-tauri', 'vendored', 'protoc');
rimraf.sync(dstDir);
// Download GitHub release artifact
const {filePath} = await new Downloader({url, directory: tmpDir,}).download();
// Decompress to the same directory
await decompress(filePath, tmpDir, {});
// Remove the original archive
fs.unlinkSync(filePath);
// Copy binary
const binSrc = path.join(tmpDir, 'bin', SRC_BIN_MAP[key]);
const binDst = path.join(dstDir, DST_BIN_MAP[key]);
fs.cpSync(binSrc, binDst);
// Copy other files
const includeSrc = path.join(tmpDir, 'include');
const includeDst = path.join(dstDir, 'include');
fs.cpSync(includeSrc, includeDst, {recursive: true});
rmSync(tmpDir, {recursive: true, force: true});
console.log("Downloaded protoc to", binDst);
})().catch(err => console.log('Script failed:', err));

View File

@@ -2,3 +2,4 @@
# will have compiled files and executables
/target/
vendored

View File

@@ -1,12 +0,0 @@
{
"db_name": "SQLite",
"query": "\n INSERT INTO http_requests (\n id, workspace_id, folder_id, name, url, url_parameters, method, body, body_type,\n authentication, authentication_type, headers, sort_priority\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n updated_at = CURRENT_TIMESTAMP,\n name = excluded.name,\n folder_id = excluded.folder_id,\n method = excluded.method,\n headers = excluded.headers,\n body = excluded.body,\n body_type = excluded.body_type,\n authentication = excluded.authentication,\n authentication_type = excluded.authentication_type,\n url = excluded.url,\n url_parameters = excluded.url_parameters,\n sort_priority = excluded.sort_priority\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 13
},
"nullable": []
},
"hash": "11394af12419cca3be3a26dff9275514ea2a44504e3c7a568a9578c64b5713d1"
}

View File

@@ -1,12 +0,0 @@
{
"db_name": "SQLite",
"query": "\n INSERT INTO grpc_requests (\n id, name, workspace_id, folder_id, sort_priority, url, service, method, message,\n authentication_type, authentication, metadata\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n updated_at = CURRENT_TIMESTAMP,\n name = excluded.name,\n folder_id = excluded.folder_id,\n sort_priority = excluded.sort_priority,\n url = excluded.url,\n service = excluded.service,\n method = excluded.method,\n message = excluded.message,\n authentication_type = excluded.authentication_type,\n authentication = excluded.authentication,\n metadata = excluded.metadata\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 12
},
"nullable": []
},
"hash": "467b87ad1209a4653b1dc8462d79236a655240c5b402fa9fd75c12ebd9bb6b86"
}

View File

@@ -1,12 +0,0 @@
{
"db_name": "SQLite",
"query": "\n UPDATE settings SET (\n theme, appearance, update_channel\n ) = (?, ?, ?) WHERE id = 'default';\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "48ec5fdf20f34add763c540061caa25054545503704e19f149987f99b1a0e4f0"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n INSERT INTO grpc_requests (\n id, name, workspace_id, folder_id, sort_priority, url, service, method, message,\n authentication_type, authentication, metadata\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n updated_at = CURRENT_TIMESTAMP,\n workspace_id = excluded.workspace_id,\n name = excluded.name,\n folder_id = excluded.folder_id,\n sort_priority = excluded.sort_priority,\n url = excluded.url,\n service = excluded.service,\n method = excluded.method,\n message = excluded.message,\n authentication_type = excluded.authentication_type,\n authentication = excluded.authentication,\n metadata = excluded.metadata\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 12
},
"nullable": []
},
"hash": "5af82cd333895d3d7d67a92f37b0feb338f615b88aea2bd09cb5809008c645a3"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n INSERT INTO http_requests (\n id, workspace_id, folder_id, name, url, url_parameters, method, body, body_type,\n authentication, authentication_type, headers, sort_priority\n )\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT (id) DO UPDATE SET\n updated_at = CURRENT_TIMESTAMP,\n workspace_id = excluded.workspace_id,\n name = excluded.name,\n folder_id = excluded.folder_id,\n method = excluded.method,\n headers = excluded.headers,\n body = excluded.body,\n body_type = excluded.body_type,\n authentication = excluded.authentication,\n authentication_type = excluded.authentication_type,\n url = excluded.url,\n url_parameters = excluded.url_parameters,\n sort_priority = excluded.sort_priority\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 13
},
"nullable": []
},
"hash": "5f2f40062abbe93e23b38876319cf16d4d2b3f8d0be32ffe7848528c725e1429"
}

View File

@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n UPDATE settings SET (\n theme, appearance, theme_dark, theme_light, update_channel,\n interface_font_size, interface_scale, editor_font_size, editor_soft_wrap,\n open_workspace_new_window\n ) = (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE id = 'default';\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 10
},
"nullable": []
},
"hash": "6b5edf45a6799cd7f87c23a3c7f818ad110d58c601f694a619d9345ae9e8e11d"
}

View File

@@ -1,56 +0,0 @@
{
"db_name": "SQLite",
"query": "\n SELECT\n id, model, created_at, updated_at, theme, appearance, update_channel\n FROM settings\n WHERE id = 'default'\n ",
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Text"
},
{
"name": "model",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "created_at",
"ordinal": 2,
"type_info": "Datetime"
},
{
"name": "updated_at",
"ordinal": 3,
"type_info": "Datetime"
},
{
"name": "theme",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "appearance",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "update_channel",
"ordinal": 6,
"type_info": "Text"
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false
]
},
"hash": "b32994b09ae7a06eb0f031069d327e55127a5bce60cbb499b83d1701386a23cb"
}

View File

@@ -0,0 +1,98 @@
{
"db_name": "SQLite",
"query": "\n SELECT\n id, model, created_at, updated_at, theme, appearance,\n theme_dark, theme_light, update_channel,\n interface_font_size, interface_scale, editor_font_size, editor_soft_wrap,\n open_workspace_new_window\n FROM settings\n WHERE id = 'default'\n ",
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Text"
},
{
"name": "model",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "created_at",
"ordinal": 2,
"type_info": "Datetime"
},
{
"name": "updated_at",
"ordinal": 3,
"type_info": "Datetime"
},
{
"name": "theme",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "appearance",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "theme_dark",
"ordinal": 6,
"type_info": "Text"
},
{
"name": "theme_light",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "update_channel",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "interface_font_size",
"ordinal": 9,
"type_info": "Int64"
},
{
"name": "interface_scale",
"ordinal": 10,
"type_info": "Int64"
},
{
"name": "editor_font_size",
"ordinal": 11,
"type_info": "Int64"
},
{
"name": "editor_soft_wrap",
"ordinal": 12,
"type_info": "Bool"
},
{
"name": "open_workspace_new_window",
"ordinal": 13,
"type_info": "Bool"
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true
]
},
"hash": "daa61066517df649e7c80a8ce407839ad502e8e5e43aa8c02e049865acbbae75"
}

4550
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,20 @@
workspace = { members = ["grpc"] }
workspace = { members = ["grpc", "templates", "tauri-plugin-plugin-runtime"] }
[package]
name = "yaak-app"
version = "0.0.0"
description = "A network protocol testing utility app"
authors = ["Gregory Schier"]
license = "MIT"
repository = "https://github.com/gschier/yaak-app"
edition = "2021"
# Produce a library for mobile support
[lib]
name = "tauri_app_lib"
crate-type = ["staticlib", "cdylib", "lib"]
[profile.release]
strip = true # Automatically strip symbols from the binary.
[build-dependencies]
tauri-build = { version = "1.5", features = [] }
tauri-build = { version = "2.0.0-beta", features = [] }
[target.'cfg(target_os = "macos")'.dependencies]
objc = "0.2.7"
@@ -22,53 +24,34 @@ cocoa = "0.25.0"
openssl-sys = { version = "0.9", features = ["vendored"] } # For Ubuntu installation to work
[dependencies]
base64 = "0.21.0"
boa_engine = { version = "0.17.3", features = ["annex-b"] }
boa_runtime = { version = "0.17.3" }
chrono = { version = "0.4.31", features = ["serde"] }
futures = "0.3.26"
http = "0.2.8"
rand = "0.8.5"
reqwest = { version = "0.11.23", features = ["multipart", "cookies", "gzip", "brotli", "deflate"] }
cookie = { version = "0.18.0" }
serde = { version = "1.0.195", features = ["derive"] }
serde_json = { version = "1.0.111", features = ["raw_value"] }
sqlx = { version = "0.7.3", features = ["sqlite", "runtime-tokio-rustls", "json", "chrono", "time"] }
tauri = { version = "1.5.4", features = [
"config-toml",
"path-all",
"devtools",
"dialog-open",
"dialog-save",
"fs-read-file",
"os-all",
"protocol-asset",
"shell-open",
"shell-sidecar",
"updater",
"window-close",
"window-maximize",
"window-minimize",
"window-set-decorations",
"window-set-title",
"window-start-dragging",
"window-unmaximize",
] }
tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" }
tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1", features = ["colored"] }
tokio = { version = "1.25.0", features = ["sync"] }
uuid = "1.3.0"
log = "0.4.20"
datetime = "0.5.2"
window-shadows = "0.2.2"
reqwest_cookie_store = "0.6.0"
grpc = { path = "./grpc" }
tokio-stream = "0.1.14"
[features]
# by default Tauri runs in production mode
# when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL
default = ["custom-protocol"]
# this feature is used used for production builds where `devPath` points to the filesystem
# DO NOT remove this
custom-protocol = ["tauri/custom-protocol"]
templates = { path = "./templates" }
plugin_runtime = { path = "tauri-plugin-plugin-runtime" }
anyhow = "1.0.86"
base64 = "0.22.0"
chrono = { version = "0.4.31", features = ["serde"] }
datetime = "0.5.2"
hex_color = "3.0.0"
http = "1"
log = "0.4.21"
rand = "0.8.5"
regex = "1.10.2"
reqwest = { version = "0.12.4", features = ["multipart", "cookies", "gzip", "brotli", "deflate", "json", "native-tls-alpn"] }
reqwest_cookie_store = "0.8.0"
serde = { version = "1.0.198", features = ["derive"] }
serde_json = { version = "1.0.116", features = ["raw_value"] }
serde_yaml = "0.9.34"
sqlx = { version = "0.7.4", features = ["sqlite", "runtime-tokio-rustls", "json", "chrono", "time"] }
tauri = { version = "2.0.0-beta", features = ["devtools", "protocol-asset"] }
tauri-plugin-clipboard-manager = "2.1.0-beta"
tauri-plugin-dialog = "2.0.0-beta"
tauri-plugin-fs = "2.0.0-beta"
tauri-plugin-log = { version = "2.0.0-beta", features = ["colored"] }
tauri-plugin-os = "2.0.0-beta"
tauri-plugin-shell = "2.0.0-beta"
tauri-plugin-updater = "2.0.0-beta"
tauri-plugin-window-state = "2.0.0-beta"
tokio = { version = "1.36.0", features = ["sync"] }
tokio-stream = "0.1.15"
uuid = "1.7.0"
thiserror = "1.0.61"

View File

@@ -0,0 +1,56 @@
{
"$schema": "../gen/schemas/capabilities.json",
"identifier": "main",
"description": "Main permissions",
"local": true,
"windows": [
"*"
],
"permissions": [
"os:allow-os-type",
"event:allow-emit",
"clipboard-manager:allow-write-text",
"clipboard-manager:allow-read-text",
"dialog:allow-open",
"dialog:allow-save",
"event:allow-listen",
"event:allow-unlisten",
"fs:allow-read-file",
"fs:allow-read-text-file",
{
"identifier": "fs:scope",
"allow": [
{
"path": "$APPDATA"
},
{
"path": "$APPDATA/**"
}
]
},
"shell:allow-open",
{
"identifier": "shell:allow-execute",
"allow": [
{
"name": "protoc",
"sidecar": true,
"args": true
}
]
},
"webview:allow-set-webview-zoom",
"window:allow-close",
"window:allow-is-fullscreen",
"window:allow-maximize",
"window:allow-minimize",
"window:allow-toggle-maximize",
"window:allow-set-decorations",
"window:allow-set-title",
"window:allow-start-dragging",
"window:allow-unmaximize",
"window:allow-theme",
"clipboard-manager:allow-read-text",
"clipboard-manager:allow-write-text"
]
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"main":{"identifier":"main","description":"Main permissions","local":true,"windows":["*"],"permissions":["os:allow-os-type","event:allow-emit","clipboard-manager:allow-write-text","clipboard-manager:allow-read-text","dialog:allow-open","dialog:allow-save","event:allow-listen","event:allow-unlisten","fs:allow-read-file","fs:allow-read-text-file",{"identifier":"fs:scope","allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]},"shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":true,"name":"protoc","sidecar":true}]},"webview:allow-set-webview-zoom","window:allow-close","window:allow-is-fullscreen","window:allow-maximize","window:allow-minimize","window:allow-toggle-maximize","window:allow-set-decorations","window:allow-set-title","window:allow-start-dragging","window:allow-unmaximize","window:allow-theme","clipboard-manager:allow-read-text","clipboard-manager:allow-write-text"]}}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -14,10 +14,10 @@ serde = { version = "1.0.196", features = ["derive"] }
serde_json = "1.0.113"
prost-reflect = { version = "0.12.0", features = ["serde", "derive"] }
log = "0.4.20"
once_cell = { version = "1.19.0", features = [] }
anyhow = "1.0.79"
hyper = { version = "0.14" }
hyper-rustls = { version = "0.24.0", features = ["http2"] }
protoc-bin-vendored = "3.0.0"
uuid = { version = "1.7.0", features = ["v4"] }
tauri = { version = "1.5.4", features = ["process-command-api"]}
tauri = { version = "2.0.0-beta" }
tauri-plugin-shell = "2.0.0-beta"
md5 = "0.7.0"

View File

@@ -16,7 +16,9 @@ use tonic::transport::Uri;
use tonic::{IntoRequest, IntoStreamingRequest, Request, Response, Status, Streaming};
use crate::codec::DynamicCodec;
use crate::proto::{fill_pool, fill_pool_from_files, get_transport, method_desc_to_path};
use crate::proto::{
fill_pool_from_files, fill_pool_from_reflection, get_transport, method_desc_to_path,
};
use crate::{json_schema, MethodDefinition, ServiceDefinition};
#[derive(Clone)]
@@ -174,33 +176,45 @@ pub struct GrpcHandle {
impl GrpcHandle {
pub fn new(app_handle: &AppHandle) -> Self {
let pools = HashMap::new();
Self { pools, app_handle: app_handle.clone() }
Self {
pools,
app_handle: app_handle.clone(),
}
}
}
impl GrpcHandle {
pub async fn services_from_files(
pub async fn reflect(
&mut self,
id: &str,
uri: &Uri,
paths: Vec<PathBuf>,
) -> Result<Vec<ServiceDefinition>, String> {
let pool = fill_pool_from_files(&self.app_handle, paths).await?;
self.pools.insert(self.get_pool_key(id, uri), pool.clone());
Ok(self.services_from_pool(&pool))
}
pub async fn services_from_reflection(
&mut self,
id: &str,
uri: &Uri,
) -> Result<Vec<ServiceDefinition>, String> {
let pool = fill_pool(uri).await?;
self.pools.insert(self.get_pool_key(id, uri), pool.clone());
Ok(self.services_from_pool(&pool))
uri: &str,
proto_files: &Vec<PathBuf>,
) -> Result<(), String> {
let pool = if proto_files.is_empty() {
let full_uri = uri_from_str(uri)?;
fill_pool_from_reflection(&full_uri).await
} else {
fill_pool_from_files(&self.app_handle, proto_files).await
}?;
self.pools
.insert(make_pool_key(id, uri, proto_files), pool.clone());
Ok(())
}
fn get_pool_key(&self, id: &str, uri: &Uri) -> String {
format!("{}-{}", id, uri)
pub async fn services(
&mut self,
id: &str,
uri: &str,
proto_files: &Vec<PathBuf>,
) -> Result<Vec<ServiceDefinition>, String> {
// Ensure reflection is up-to-date
self.reflect(id, uri, proto_files).await?;
let pool = self
.get_pool(id, uri, proto_files)
.ok_or("Failed to get pool".to_string())?;
Ok(self.services_from_pool(&pool))
}
fn services_from_pool(&self, pool: &DescriptorPool) -> Vec<ServiceDefinition> {
@@ -231,25 +245,27 @@ impl GrpcHandle {
pub async fn connect(
&mut self,
id: &str,
uri: Uri,
proto_files: Vec<PathBuf>,
uri: &str,
proto_files: &Vec<PathBuf>,
) -> Result<GrpcConnection, String> {
let pool = match self.pools.get(id) {
Some(p) => p.clone(),
None => match proto_files.len() {
0 => fill_pool(&uri).await?,
_ => {
let pool = fill_pool_from_files(&self.app_handle, proto_files).await?;
self.pools.insert(id.to_string(), pool.clone());
pool
}
},
};
self.reflect(id, uri, proto_files).await?;
let pool = self
.get_pool(id, uri, proto_files)
.ok_or("Failed to get pool")?;
let uri = uri_from_str(uri)?;
let conn = get_transport();
let connection = GrpcConnection { pool, conn, uri };
let connection = GrpcConnection {
pool: pool.clone(),
conn,
uri,
};
Ok(connection)
}
fn get_pool(&self, id: &str, uri: &str, proto_files: &Vec<PathBuf>) -> Option<&DescriptorPool> {
self.pools.get(make_pool_key(id, uri, proto_files).as_str())
}
}
fn decorate_req<T>(metadata: HashMap<String, String>, req: &mut Request<T>) -> Result<(), String> {
@@ -261,3 +277,28 @@ fn decorate_req<T>(metadata: HashMap<String, String>, req: &mut Request<T>) -> R
}
Ok(())
}
fn uri_from_str(uri_str: &str) -> Result<Uri, String> {
match Uri::from_str(uri_str) {
Ok(uri) => Ok(uri),
Err(err) => {
// Uri::from_str basically only returns "invalid format" so we add more context here
Err(format!("Failed to parse URL, {}", err.to_string()))
}
}
}
fn make_pool_key(id: &str, uri: &str, proto_files: &Vec<PathBuf>) -> String {
let pool_key = format!(
"{}::{}::{}",
id,
uri,
proto_files
.iter()
.map(|p| p.to_string_lossy().to_string())
.collect::<Vec<String>>()
.join(":")
);
format!("{:x}", md5::compute(pool_key))
}

View File

@@ -1,7 +1,7 @@
use std::env::temp_dir;
use std::ops::Deref;
use std::path::PathBuf;
use std::str::FromStr;
use std::str::{from_utf8, FromStr};
use anyhow::anyhow;
use hyper::client::HttpConnector;
@@ -11,8 +11,10 @@ use log::{debug, info, warn};
use prost::Message;
use prost_reflect::{DescriptorPool, MethodDescriptor};
use prost_types::{FileDescriptorProto, FileDescriptorSet};
use tauri::api::process::{Command, CommandEvent};
use tauri::AppHandle;
use tauri::path::BaseDirectory;
use tauri::{AppHandle, Manager};
use tauri_plugin_shell::process::CommandEvent;
use tauri_plugin_shell::ShellExt;
use tokio::fs;
use tokio_stream::StreamExt;
use tonic::body::BoxBody;
@@ -26,14 +28,14 @@ use tonic_reflection::pb::ServerReflectionRequest;
pub async fn fill_pool_from_files(
app_handle: &AppHandle,
paths: Vec<PathBuf>,
paths: &Vec<PathBuf>,
) -> Result<DescriptorPool, String> {
let mut pool = DescriptorPool::new();
let random_file_name = format!("{}.desc", uuid::Uuid::new_v4());
let desc_path = temp_dir().join(random_file_name);
let global_import_dir = app_handle
.path_resolver()
.resolve_resource("protoc-vendored/include")
.path()
.resolve("protoc-include", BaseDirectory::Resource)
.expect("failed to resolve protoc include directory");
let mut args = vec![
@@ -63,7 +65,9 @@ pub async fn fill_pool_from_files(
}
}
let (mut rx, _child) = Command::new_sidecar("protoc")
let (mut rx, _child) = app_handle
.shell()
.sidecar("protoc")
.expect("protoc not found")
.args(args)
.spawn()
@@ -72,10 +76,16 @@ pub async fn fill_pool_from_files(
while let Some(event) = rx.recv().await {
match event {
CommandEvent::Stdout(line) => {
info!("protoc stdout: {}", line);
info!(
"protoc stdout: {}",
from_utf8(line.as_slice()).unwrap_or_default().to_string()
);
}
CommandEvent::Stderr(line) => {
info!("protoc stderr: {}", line);
info!(
"protoc stderr: {}",
from_utf8(line.as_slice()).unwrap_or_default().to_string()
);
}
CommandEvent::Error(e) => {
return Err(e.to_string());
@@ -111,7 +121,7 @@ pub async fn fill_pool_from_files(
Ok(pool)
}
pub async fn fill_pool(uri: &Uri) -> Result<DescriptorPool, String> {
pub async fn fill_pool_from_reflection(uri: &Uri) -> Result<DescriptorPool, String> {
let mut pool = DescriptorPool::new();
let mut client = ServerReflectionClient::with_origin(get_transport(), uri.clone());

View File

@@ -1,10 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- Re-enable for sandboxing. Currently disabled because auto-updater doesn't work with sandboxing.-->
<!-- <key>com.apple.security.app-sandbox</key> <true/>-->
<!-- <key>com.apple.security.files.user-selected.read-write</key> <true/>-->
<!-- <key>com.apple.security.network.client</key> <true/>-->
</dict>
<dict>
<!-- Enable for v8 execution -->
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<!-- Re-enable for sandboxing. Currently disabled because auto-updater doesn't work with sandboxing.-->
<!-- <key>com.apple.security.app-sandbox</key> <true/>-->
<!-- <key>com.apple.security.files.user-selected.read-write</key> <true/>-->
<!-- <key>com.apple.security.network.client</key> <true/>-->
</dict>
</plist>

View File

@@ -0,0 +1,4 @@
ALTER TABLE settings
ADD COLUMN theme_dark TEXT DEFAULT 'yaak-dark' NOT NULL;
ALTER TABLE settings
ADD COLUMN theme_light TEXT DEFAULT 'yaak-light' NOT NULL;

View File

@@ -0,0 +1,4 @@
ALTER TABLE settings ADD COLUMN interface_font_size INTEGER DEFAULT 15 NOT NULL;
ALTER TABLE settings ADD COLUMN interface_scale INTEGER DEFAULT 1 NOT NULL;
ALTER TABLE settings ADD COLUMN editor_font_size INTEGER DEFAULT 13 NOT NULL;
ALTER TABLE settings ADD COLUMN editor_soft_wrap BOOLEAN DEFAULT 1 NOT NULL;

View File

@@ -0,0 +1 @@
ALTER TABLE settings ADD COLUMN open_workspace_new_window BOOLEAN NULL DEFAULT NULL;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,134 +0,0 @@
function S(e, t) {
return console.log("IMPORTING Environment", e._id, e.name, JSON.stringify(e, null, 2)), {
id: e._id,
createdAt: new Date(e.created ?? Date.now()).toISOString().replace("Z", ""),
updatedAt: new Date(e.updated ?? Date.now()).toISOString().replace("Z", ""),
workspaceId: t,
model: "environment",
name: e.name,
variables: Object.entries(e.data).map(([n, a]) => ({
enabled: !0,
name: n,
value: `${a}`
}))
};
}
function I(e) {
return m(e) && e._type === "workspace";
}
function y(e) {
return m(e) && e._type === "request_group";
}
function g(e) {
return m(e) && e._type === "request";
}
function f(e) {
return m(e) && e._type === "environment";
}
function m(e) {
return Object.prototype.toString.call(e) === "[object Object]";
}
function w(e) {
return Object.prototype.toString.call(e) === "[object String]";
}
function O(e) {
return Object.entries(e).map(([t, n]) => ({
enabled: !0,
name: t,
value: `${n}`
}));
}
function l(e) {
return w(e) ? e.replaceAll(/{{\s*(_\.)?([^}]+)\s*}}/g, "${[$2]}") : e;
}
function h(e, t, n = 0) {
var c, o;
console.log("IMPORTING REQUEST", e._id, e.name, JSON.stringify(e, null, 2));
let a = null, r = null;
((c = e.body) == null ? void 0 : c.mimeType) === "application/graphql" ? (a = "graphql", r = l(e.body.text)) : ((o = e.body) == null ? void 0 : o.mimeType) === "application/json" && (a = "application/json", r = l(e.body.text));
let i = null, u = {};
return e.authentication.type === "bearer" ? (i = "bearer", u = {
token: l(e.authentication.token)
}) : e.authentication.type === "basic" && (i = "basic", u = {
username: l(e.authentication.username),
password: l(e.authentication.password)
}), {
id: e._id,
createdAt: new Date(e.created ?? Date.now()).toISOString().replace("Z", ""),
updatedAt: new Date(e.updated ?? Date.now()).toISOString().replace("Z", ""),
workspaceId: t,
folderId: e.parentId === t ? null : e.parentId,
model: "http_request",
sortPriority: n,
name: e.name,
url: l(e.url),
body: r,
bodyType: a,
authentication: u,
authenticationType: i,
method: e.method,
headers: (e.headers ?? []).map(({ name: d, value: p, disabled: s }) => ({
enabled: !s,
name: d,
value: p
})).filter(({ name: d, value: p }) => d !== "" || p !== "")
};
}
function _(e, t) {
return console.log("IMPORTING FOLDER", e._id, e.name, JSON.stringify(e, null, 2)), {
id: e._id,
createdAt: new Date(e.created ?? Date.now()).toISOString().replace("Z", ""),
updatedAt: new Date(e.updated ?? Date.now()).toISOString().replace("Z", ""),
folderId: e.parentId === t ? null : e.parentId,
workspaceId: t,
model: "folder",
name: e.name
};
}
function b(e) {
console.log("RUNNING INSOMNIA");
let t;
try {
t = JSON.parse(e);
} catch {
return;
}
if (!m(t) || !Array.isArray(t.resources))
return;
const n = {
workspaces: [],
requests: [],
environments: [],
folders: []
}, a = t.resources.filter(I);
for (const r of a) {
const i = t.resources.find(
(o) => f(o) && o.parentId === r._id
);
n.workspaces.push({
id: r._id,
createdAt: new Date(a.created ?? Date.now()).toISOString().replace("Z", ""),
updatedAt: new Date(a.updated ?? Date.now()).toISOString().replace("Z", ""),
model: "workspace",
name: r.name,
variables: i ? O(i.data) : []
});
const u = t.resources.filter(
(o) => f(o) && o.parentId === (i == null ? void 0 : i._id)
);
n.environments.push(
...u.map((o) => S(o, r._id))
);
const c = (o) => {
const d = t.resources.filter((s) => s.parentId === o);
let p = 0;
for (const s of d)
y(s) ? (n.folders.push(_(s, r._id)), c(s._id)) : g(s) && n.requests.push(h(s, r._id, p++));
};
c(r._id);
}
return n.requests = n.requests.filter(Boolean), n.environments = n.environments.filter(Boolean), n.workspaces = n.workspaces.filter(Boolean), { resources: n };
}
export {
b as pluginHookImport
};

View File

@@ -1,160 +0,0 @@
const T = "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", w = "https://schema.getpostman.com/json/collection/v2.0.0/collection.json", A = [w, T];
function q(e) {
const t = b(e);
if (t == null)
return;
const n = a(t.info);
if (!A.includes(n.schema) || !Array.isArray(t.item))
return;
const i = {
workspaces: [],
environments: [],
requests: [],
folders: []
}, c = {
model: "workspace",
id: m("wk"),
name: n.name || "Postman Import",
description: n.description || ""
};
i.workspaces.push(c);
const f = (r, u = null) => {
if (typeof r.name == "string" && Array.isArray(r.item)) {
const o = {
model: "folder",
workspaceId: c.id,
id: m("fl"),
name: r.name,
folderId: u
};
i.folders.push(o);
for (const s of r.item)
f(s, o.id);
} else if (typeof r.name == "string" && "request" in r) {
const o = a(r.request), s = k(o.body), d = S(o.auth), g = {
model: "http_request",
id: m("rq"),
workspaceId: c.id,
folderId: u,
name: r.name,
method: o.method || "GET",
url: typeof o.url == "string" ? o.url : a(o.url).raw,
body: s.body,
bodyType: s.bodyType,
authentication: d.authentication,
authenticationType: d.authenticationType,
headers: [
...s.headers,
...d.headers,
...y(o.header).map((p) => ({
name: p.key,
value: p.value,
enabled: !p.disabled
}))
]
};
i.requests.push(g);
} else
console.log("Unknown item", r, u);
};
for (const r of t.item)
f(r);
return { resources: h(i) };
}
function S(e) {
const t = a(e);
return "basic" in t ? {
headers: [],
authenticationType: "basic",
authentication: {
username: t.basic.username || "",
password: t.basic.password || ""
}
} : { headers: [], authenticationType: null, authentication: {} };
}
function k(e) {
const t = a(e);
return "graphql" in t ? {
headers: [
{
name: "Content-Type",
value: "application/json",
enabled: !0
}
],
bodyType: "graphql",
body: {
text: JSON.stringify(
{ query: t.graphql.query, variables: b(t.graphql.variables) },
null,
2
)
}
} : "urlencoded" in t ? {
headers: [
{
name: "Content-Type",
value: "application/x-www-form-urlencoded",
enabled: !0
}
],
bodyType: "application/x-www-form-urlencoded",
body: {
form: y(t.urlencoded).map((n) => ({
enabled: !n.disabled,
name: n.key ?? "",
value: n.value ?? ""
}))
}
} : "formdata" in t ? {
headers: [
{
name: "Content-Type",
value: "multipart/form-data",
enabled: !0
}
],
bodyType: "multipart/form-data",
body: {
form: y(t.formdata).map(
(n) => n.src != null ? {
enabled: !n.disabled,
name: n.key ?? "",
file: n.src ?? ""
} : {
enabled: !n.disabled,
name: n.key ?? "",
value: n.value ?? ""
}
)
}
} : { headers: [], bodyType: null, body: {} };
}
function b(e) {
try {
return a(JSON.parse(e));
} catch {
}
return null;
}
function a(e) {
return Object.prototype.toString.call(e) === "[object Object]" ? e : {};
}
function y(e) {
return Object.prototype.toString.call(e) === "[object Array]" ? e : [];
}
function h(e) {
return typeof e == "string" ? e.replace(/{{\s*(_\.)?([^}]+)\s*}}/g, "${[$2]}") : Array.isArray(e) && e != null ? e.map(h) : typeof e == "object" && e != null ? Object.fromEntries(
Object.entries(e).map(([t, n]) => [t, h(n)])
) : e;
}
function m(e) {
const t = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
let n = `${e}_`;
for (let l = 0; l < 10; l++)
n += t[Math.floor(Math.random() * t.length)];
return n;
}
export {
q as pluginHookImport
};

View File

@@ -1,17 +0,0 @@
function u(r) {
let e;
try {
e = JSON.parse(r);
} catch {
return;
}
if (t(e) && "yaakSchema" in e && (e.yaakSchema === 1 && (e.resources.httpRequests = e.resources.requests, e.yaakSchema = 2), e.yaakSchema === 2))
return { resources: e.resources };
}
function t(r) {
return Object.prototype.toString.call(r) === "[object Object]";
}
export {
t as isJSObject,
u as pluginHookImport
};

View File

@@ -1,162 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option go_package = "google.golang.org/protobuf/types/known/anypb";
option java_package = "com.google.protobuf";
option java_outer_classname = "AnyProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
// `Any` contains an arbitrary serialized protocol buffer message along with a
// URL that describes the type of the serialized message.
//
// Protobuf library provides support to pack/unpack Any values in the form
// of utility functions or additional generated methods of the Any type.
//
// Example 1: Pack and unpack a message in C++.
//
// Foo foo = ...;
// Any any;
// any.PackFrom(foo);
// ...
// if (any.UnpackTo(&foo)) {
// ...
// }
//
// Example 2: Pack and unpack a message in Java.
//
// Foo foo = ...;
// Any any = Any.pack(foo);
// ...
// if (any.is(Foo.class)) {
// foo = any.unpack(Foo.class);
// }
// // or ...
// if (any.isSameTypeAs(Foo.getDefaultInstance())) {
// foo = any.unpack(Foo.getDefaultInstance());
// }
//
// Example 3: Pack and unpack a message in Python.
//
// foo = Foo(...)
// any = Any()
// any.Pack(foo)
// ...
// if any.Is(Foo.DESCRIPTOR):
// any.Unpack(foo)
// ...
//
// Example 4: Pack and unpack a message in Go
//
// foo := &pb.Foo{...}
// any, err := anypb.New(foo)
// if err != nil {
// ...
// }
// ...
// foo := &pb.Foo{}
// if err := any.UnmarshalTo(foo); err != nil {
// ...
// }
//
// The pack methods provided by protobuf library will by default use
// 'type.googleapis.com/full.type.name' as the type URL and the unpack
// methods only use the fully qualified type name after the last '/'
// in the type URL, for example "foo.bar.com/x/y.z" will yield type
// name "y.z".
//
// JSON
// ====
// The JSON representation of an `Any` value uses the regular
// representation of the deserialized, embedded message, with an
// additional field `@type` which contains the type URL. Example:
//
// package google.profile;
// message Person {
// string first_name = 1;
// string last_name = 2;
// }
//
// {
// "@type": "type.googleapis.com/google.profile.Person",
// "firstName": <string>,
// "lastName": <string>
// }
//
// If the embedded message type is well-known and has a custom JSON
// representation, that representation will be embedded adding a field
// `value` which holds the custom JSON in addition to the `@type`
// field. Example (for message [google.protobuf.Duration][]):
//
// {
// "@type": "type.googleapis.com/google.protobuf.Duration",
// "value": "1.212s"
// }
//
message Any {
// A URL/resource name that uniquely identifies the type of the serialized
// protocol buffer message. This string must contain at least
// one "/" character. The last segment of the URL's path must represent
// the fully qualified name of the type (as in
// `path/google.protobuf.Duration`). The name should be in a canonical form
// (e.g., leading "." is not accepted).
//
// In practice, teams usually precompile into the binary all types that they
// expect it to use in the context of Any. However, for URLs which use the
// scheme `http`, `https`, or no scheme, one can optionally set up a type
// server that maps type URLs to message definitions as follows:
//
// * If no scheme is provided, `https` is assumed.
// * An HTTP GET on the URL must yield a [google.protobuf.Type][]
// value in binary format, or produce an error.
// * Applications are allowed to cache lookup results based on the
// URL, or have them precompiled into a binary to avoid any
// lookup. Therefore, binary compatibility needs to be preserved
// on changes to types. (Use versioned type names to manage
// breaking changes.)
//
// Note: this functionality is not currently available in the official
// protobuf release, and it is not used for type URLs beginning with
// type.googleapis.com. As of May 2023, there are no widely used type server
// implementations and no plans to implement one.
//
// Schemes other than `http`, `https` (or the empty scheme) might be
// used with implementation specific semantics.
//
string type_url = 1;
// Must be a valid serialized protocol buffer of the above specified type.
bytes value = 2;
}

View File

@@ -1,207 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
import "google/protobuf/source_context.proto";
import "google/protobuf/type.proto";
option java_package = "com.google.protobuf";
option java_outer_classname = "ApiProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option go_package = "google.golang.org/protobuf/types/known/apipb";
// Api is a light-weight descriptor for an API Interface.
//
// Interfaces are also described as "protocol buffer services" in some contexts,
// such as by the "service" keyword in a .proto file, but they are different
// from API Services, which represent a concrete implementation of an interface
// as opposed to simply a description of methods and bindings. They are also
// sometimes simply referred to as "APIs" in other contexts, such as the name of
// this message itself. See https://cloud.google.com/apis/design/glossary for
// detailed terminology.
message Api {
// The fully qualified name of this interface, including package name
// followed by the interface's simple name.
string name = 1;
// The methods of this interface, in unspecified order.
repeated Method methods = 2;
// Any metadata attached to the interface.
repeated Option options = 3;
// A version string for this interface. If specified, must have the form
// `major-version.minor-version`, as in `1.10`. If the minor version is
// omitted, it defaults to zero. If the entire version field is empty, the
// major version is derived from the package name, as outlined below. If the
// field is not empty, the version in the package name will be verified to be
// consistent with what is provided here.
//
// The versioning schema uses [semantic
// versioning](http://semver.org) where the major version number
// indicates a breaking change and the minor version an additive,
// non-breaking change. Both version numbers are signals to users
// what to expect from different versions, and should be carefully
// chosen based on the product plan.
//
// The major version is also reflected in the package name of the
// interface, which must end in `v<major-version>`, as in
// `google.feature.v1`. For major versions 0 and 1, the suffix can
// be omitted. Zero major versions must only be used for
// experimental, non-GA interfaces.
//
string version = 4;
// Source context for the protocol buffer service represented by this
// message.
SourceContext source_context = 5;
// Included interfaces. See [Mixin][].
repeated Mixin mixins = 6;
// The source syntax of the service.
Syntax syntax = 7;
}
// Method represents a method of an API interface.
message Method {
// The simple name of this method.
string name = 1;
// A URL of the input message type.
string request_type_url = 2;
// If true, the request is streamed.
bool request_streaming = 3;
// The URL of the output message type.
string response_type_url = 4;
// If true, the response is streamed.
bool response_streaming = 5;
// Any metadata attached to the method.
repeated Option options = 6;
// The source syntax of this method.
Syntax syntax = 7;
}
// Declares an API Interface to be included in this interface. The including
// interface must redeclare all the methods from the included interface, but
// documentation and options are inherited as follows:
//
// - If after comment and whitespace stripping, the documentation
// string of the redeclared method is empty, it will be inherited
// from the original method.
//
// - Each annotation belonging to the service config (http,
// visibility) which is not set in the redeclared method will be
// inherited.
//
// - If an http annotation is inherited, the path pattern will be
// modified as follows. Any version prefix will be replaced by the
// version of the including interface plus the [root][] path if
// specified.
//
// Example of a simple mixin:
//
// package google.acl.v1;
// service AccessControl {
// // Get the underlying ACL object.
// rpc GetAcl(GetAclRequest) returns (Acl) {
// option (google.api.http).get = "/v1/{resource=**}:getAcl";
// }
// }
//
// package google.storage.v2;
// service Storage {
// rpc GetAcl(GetAclRequest) returns (Acl);
//
// // Get a data record.
// rpc GetData(GetDataRequest) returns (Data) {
// option (google.api.http).get = "/v2/{resource=**}";
// }
// }
//
// Example of a mixin configuration:
//
// apis:
// - name: google.storage.v2.Storage
// mixins:
// - name: google.acl.v1.AccessControl
//
// The mixin construct implies that all methods in `AccessControl` are
// also declared with same name and request/response types in
// `Storage`. A documentation generator or annotation processor will
// see the effective `Storage.GetAcl` method after inherting
// documentation and annotations as follows:
//
// service Storage {
// // Get the underlying ACL object.
// rpc GetAcl(GetAclRequest) returns (Acl) {
// option (google.api.http).get = "/v2/{resource=**}:getAcl";
// }
// ...
// }
//
// Note how the version in the path pattern changed from `v1` to `v2`.
//
// If the `root` field in the mixin is specified, it should be a
// relative path under which inherited HTTP paths are placed. Example:
//
// apis:
// - name: google.storage.v2.Storage
// mixins:
// - name: google.acl.v1.AccessControl
// root: acls
//
// This implies the following inherited HTTP annotation:
//
// service Storage {
// // Get the underlying ACL object.
// rpc GetAcl(GetAclRequest) returns (Acl) {
// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl";
// }
// ...
// }
message Mixin {
// The fully qualified name of the interface which is included.
string name = 1;
// If non-empty specifies a path under which inherited HTTP paths
// are rooted.
string root = 2;
}

View File

@@ -1,168 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
// Author: kenton@google.com (Kenton Varda)
//
// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is
// just a program that reads a CodeGeneratorRequest from stdin and writes a
// CodeGeneratorResponse to stdout.
//
// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead
// of dealing with the raw protocol defined here.
//
// A plugin executable needs only to be placed somewhere in the path. The
// plugin should be named "protoc-gen-$NAME", and will then be used when the
// flag "--${NAME}_out" is passed to protoc.
syntax = "proto2";
package google.protobuf.compiler;
option java_package = "com.google.protobuf.compiler";
option java_outer_classname = "PluginProtos";
option csharp_namespace = "Google.Protobuf.Compiler";
option go_package = "google.golang.org/protobuf/types/pluginpb";
import "google/protobuf/descriptor.proto";
// The version number of protocol compiler.
message Version {
optional int32 major = 1;
optional int32 minor = 2;
optional int32 patch = 3;
// A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should
// be empty for mainline stable releases.
optional string suffix = 4;
}
// An encoded CodeGeneratorRequest is written to the plugin's stdin.
message CodeGeneratorRequest {
// The .proto files that were explicitly listed on the command-line. The
// code generator should generate code only for these files. Each file's
// descriptor will be included in proto_file, below.
repeated string file_to_generate = 1;
// The generator parameter passed on the command-line.
optional string parameter = 2;
// FileDescriptorProtos for all files in files_to_generate and everything
// they import. The files will appear in topological order, so each file
// appears before any file that imports it.
//
// Note: the files listed in files_to_generate will include runtime-retention
// options only, but all other files will include source-retention options.
// The source_file_descriptors field below is available in case you need
// source-retention options for files_to_generate.
//
// protoc guarantees that all proto_files will be written after
// the fields above, even though this is not technically guaranteed by the
// protobuf wire format. This theoretically could allow a plugin to stream
// in the FileDescriptorProtos and handle them one by one rather than read
// the entire set into memory at once. However, as of this writing, this
// is not similarly optimized on protoc's end -- it will store all fields in
// memory at once before sending them to the plugin.
//
// Type names of fields and extensions in the FileDescriptorProto are always
// fully qualified.
repeated FileDescriptorProto proto_file = 15;
// File descriptors with all options, including source-retention options.
// These descriptors are only provided for the files listed in
// files_to_generate.
repeated FileDescriptorProto source_file_descriptors = 17;
// The version number of protocol compiler.
optional Version compiler_version = 3;
}
// The plugin writes an encoded CodeGeneratorResponse to stdout.
message CodeGeneratorResponse {
// Error message. If non-empty, code generation failed. The plugin process
// should exit with status code zero even if it reports an error in this way.
//
// This should be used to indicate errors in .proto files which prevent the
// code generator from generating correct code. Errors which indicate a
// problem in protoc itself -- such as the input CodeGeneratorRequest being
// unparseable -- should be reported by writing a message to stderr and
// exiting with a non-zero status code.
optional string error = 1;
// A bitmask of supported features that the code generator supports.
// This is a bitwise "or" of values from the Feature enum.
optional uint64 supported_features = 2;
// Sync with code_generator.h.
enum Feature {
FEATURE_NONE = 0;
FEATURE_PROTO3_OPTIONAL = 1;
FEATURE_SUPPORTS_EDITIONS = 2;
}
// Represents a single generated file.
message File {
// The file name, relative to the output directory. The name must not
// contain "." or ".." components and must be relative, not be absolute (so,
// the file cannot lie outside the output directory). "/" must be used as
// the path separator, not "\".
//
// If the name is omitted, the content will be appended to the previous
// file. This allows the generator to break large files into small chunks,
// and allows the generated text to be streamed back to protoc so that large
// files need not reside completely in memory at one time. Note that as of
// this writing protoc does not optimize for this -- it will read the entire
// CodeGeneratorResponse before writing files to disk.
optional string name = 1;
// If non-empty, indicates that the named file should already exist, and the
// content here is to be inserted into that file at a defined insertion
// point. This feature allows a code generator to extend the output
// produced by another code generator. The original generator may provide
// insertion points by placing special annotations in the file that look
// like:
// @@protoc_insertion_point(NAME)
// The annotation can have arbitrary text before and after it on the line,
// which allows it to be placed in a comment. NAME should be replaced with
// an identifier naming the point -- this is what other generators will use
// as the insertion_point. Code inserted at this point will be placed
// immediately above the line containing the insertion point (thus multiple
// insertions to the same point will come out in the order they were added).
// The double-@ is intended to make it unlikely that the generated code
// could contain things that look like insertion points by accident.
//
// For example, the C++ code generator places the following line in the
// .pb.h files that it generates:
// // @@protoc_insertion_point(namespace_scope)
// This line appears within the scope of the file's package namespace, but
// outside of any particular class. Another plugin can then specify the
// insertion_point "namespace_scope" to generate additional classes or
// other declarations that should be placed in this scope.
//
// Note that if the line containing the insertion point begins with
// whitespace, the same whitespace will be added to every line of the
// inserted text. This is useful for languages like Python, where
// indentation matters. In these languages, the insertion point comment
// should be indented the same amount as any inserted code will need to be
// in order to work correctly in that context.
//
// The code generator that generates the initial file and the one which
// inserts into it must both run as part of a single invocation of protoc.
// Code generators are executed in the order in which they appear on the
// command line.
//
// If |insertion_point| is present, |name| must also be present.
optional string insertion_point = 2;
// The file contents.
optional string content = 15;
// Information describing the file content being inserted. If an insertion
// point is used, this information will be appropriately offset and inserted
// into the code generation metadata for the generated files.
optional GeneratedCodeInfo generated_code_info = 16;
}
repeated File file = 15;
}

View File

@@ -1,115 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option cc_enable_arenas = true;
option go_package = "google.golang.org/protobuf/types/known/durationpb";
option java_package = "com.google.protobuf";
option java_outer_classname = "DurationProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
// A Duration represents a signed, fixed-length span of time represented
// as a count of seconds and fractions of seconds at nanosecond
// resolution. It is independent of any calendar and concepts like "day"
// or "month". It is related to Timestamp in that the difference between
// two Timestamp values is a Duration and it can be added or subtracted
// from a Timestamp. Range is approximately +-10,000 years.
//
// # Examples
//
// Example 1: Compute Duration from two Timestamps in pseudo code.
//
// Timestamp start = ...;
// Timestamp end = ...;
// Duration duration = ...;
//
// duration.seconds = end.seconds - start.seconds;
// duration.nanos = end.nanos - start.nanos;
//
// if (duration.seconds < 0 && duration.nanos > 0) {
// duration.seconds += 1;
// duration.nanos -= 1000000000;
// } else if (duration.seconds > 0 && duration.nanos < 0) {
// duration.seconds -= 1;
// duration.nanos += 1000000000;
// }
//
// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
//
// Timestamp start = ...;
// Duration duration = ...;
// Timestamp end = ...;
//
// end.seconds = start.seconds + duration.seconds;
// end.nanos = start.nanos + duration.nanos;
//
// if (end.nanos < 0) {
// end.seconds -= 1;
// end.nanos += 1000000000;
// } else if (end.nanos >= 1000000000) {
// end.seconds += 1;
// end.nanos -= 1000000000;
// }
//
// Example 3: Compute Duration from datetime.timedelta in Python.
//
// td = datetime.timedelta(days=3, minutes=10)
// duration = Duration()
// duration.FromTimedelta(td)
//
// # JSON Mapping
//
// In JSON format, the Duration type is encoded as a string rather than an
// object, where the string ends in the suffix "s" (indicating seconds) and
// is preceded by the number of seconds, with nanoseconds expressed as
// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
// microsecond should be expressed in JSON format as "3.000001s".
//
message Duration {
// Signed seconds of the span of time. Must be from -315,576,000,000
// to +315,576,000,000 inclusive. Note: these bounds are computed from:
// 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
int64 seconds = 1;
// Signed fractions of a second at nanosecond resolution of the span
// of time. Durations less than one second are represented with a 0
// `seconds` field and a positive or negative `nanos` field. For durations
// of one second or more, a non-zero value for the `nanos` field must be
// of the same sign as the `seconds` field. Must be from -999,999,999
// to +999,999,999 inclusive.
int32 nanos = 2;
}

View File

@@ -1,51 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option go_package = "google.golang.org/protobuf/types/known/emptypb";
option java_package = "com.google.protobuf";
option java_outer_classname = "EmptyProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option cc_enable_arenas = true;
// A generic empty message that you can re-use to avoid defining duplicated
// empty messages in your APIs. A typical example is to use it as the request
// or the response type of an API method. For instance:
//
// service Foo {
// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
// }
//
message Empty {}

View File

@@ -1,245 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option java_package = "com.google.protobuf";
option java_outer_classname = "FieldMaskProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb";
option cc_enable_arenas = true;
// `FieldMask` represents a set of symbolic field paths, for example:
//
// paths: "f.a"
// paths: "f.b.d"
//
// Here `f` represents a field in some root message, `a` and `b`
// fields in the message found in `f`, and `d` a field found in the
// message in `f.b`.
//
// Field masks are used to specify a subset of fields that should be
// returned by a get operation or modified by an update operation.
// Field masks also have a custom JSON encoding (see below).
//
// # Field Masks in Projections
//
// When used in the context of a projection, a response message or
// sub-message is filtered by the API to only contain those fields as
// specified in the mask. For example, if the mask in the previous
// example is applied to a response message as follows:
//
// f {
// a : 22
// b {
// d : 1
// x : 2
// }
// y : 13
// }
// z: 8
//
// The result will not contain specific values for fields x,y and z
// (their value will be set to the default, and omitted in proto text
// output):
//
//
// f {
// a : 22
// b {
// d : 1
// }
// }
//
// A repeated field is not allowed except at the last position of a
// paths string.
//
// If a FieldMask object is not present in a get operation, the
// operation applies to all fields (as if a FieldMask of all fields
// had been specified).
//
// Note that a field mask does not necessarily apply to the
// top-level response message. In case of a REST get operation, the
// field mask applies directly to the response, but in case of a REST
// list operation, the mask instead applies to each individual message
// in the returned resource list. In case of a REST custom method,
// other definitions may be used. Where the mask applies will be
// clearly documented together with its declaration in the API. In
// any case, the effect on the returned resource/resources is required
// behavior for APIs.
//
// # Field Masks in Update Operations
//
// A field mask in update operations specifies which fields of the
// targeted resource are going to be updated. The API is required
// to only change the values of the fields as specified in the mask
// and leave the others untouched. If a resource is passed in to
// describe the updated values, the API ignores the values of all
// fields not covered by the mask.
//
// If a repeated field is specified for an update operation, new values will
// be appended to the existing repeated field in the target resource. Note that
// a repeated field is only allowed in the last position of a `paths` string.
//
// If a sub-message is specified in the last position of the field mask for an
// update operation, then new value will be merged into the existing sub-message
// in the target resource.
//
// For example, given the target message:
//
// f {
// b {
// d: 1
// x: 2
// }
// c: [1]
// }
//
// And an update message:
//
// f {
// b {
// d: 10
// }
// c: [2]
// }
//
// then if the field mask is:
//
// paths: ["f.b", "f.c"]
//
// then the result will be:
//
// f {
// b {
// d: 10
// x: 2
// }
// c: [1, 2]
// }
//
// An implementation may provide options to override this default behavior for
// repeated and message fields.
//
// In order to reset a field's value to the default, the field must
// be in the mask and set to the default value in the provided resource.
// Hence, in order to reset all fields of a resource, provide a default
// instance of the resource and set all fields in the mask, or do
// not provide a mask as described below.
//
// If a field mask is not present on update, the operation applies to
// all fields (as if a field mask of all fields has been specified).
// Note that in the presence of schema evolution, this may mean that
// fields the client does not know and has therefore not filled into
// the request will be reset to their default. If this is unwanted
// behavior, a specific service may require a client to always specify
// a field mask, producing an error if not.
//
// As with get operations, the location of the resource which
// describes the updated values in the request message depends on the
// operation kind. In any case, the effect of the field mask is
// required to be honored by the API.
//
// ## Considerations for HTTP REST
//
// The HTTP kind of an update operation which uses a field mask must
// be set to PATCH instead of PUT in order to satisfy HTTP semantics
// (PUT must only be used for full updates).
//
// # JSON Encoding of Field Masks
//
// In JSON, a field mask is encoded as a single string where paths are
// separated by a comma. Fields name in each path are converted
// to/from lower-camel naming conventions.
//
// As an example, consider the following message declarations:
//
// message Profile {
// User user = 1;
// Photo photo = 2;
// }
// message User {
// string display_name = 1;
// string address = 2;
// }
//
// In proto a field mask for `Profile` may look as such:
//
// mask {
// paths: "user.display_name"
// paths: "photo"
// }
//
// In JSON, the same mask is represented as below:
//
// {
// mask: "user.displayName,photo"
// }
//
// # Field Masks and Oneof Fields
//
// Field masks treat fields in oneofs just as regular fields. Consider the
// following message:
//
// message SampleMessage {
// oneof test_oneof {
// string name = 4;
// SubMessage sub_message = 9;
// }
// }
//
// The field mask can be:
//
// mask {
// paths: "name"
// }
//
// Or:
//
// mask {
// paths: "sub_message"
// }
//
// Note that oneof type names ("test_oneof" in this case) cannot be used in
// paths.
//
// ## Field Mask Verification
//
// The implementation of any API method which has a FieldMask type field in the
// request should verify the included field paths, and return an
// `INVALID_ARGUMENT` error if any path is unmappable.
message FieldMask {
// The set of field mask paths.
repeated string paths = 1;
}

View File

@@ -1,48 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option java_package = "com.google.protobuf";
option java_outer_classname = "SourceContextProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb";
// `SourceContext` represents information about the source of a
// protobuf element, like the file in which it is defined.
message SourceContext {
// The path-qualified name of the .proto file that contained the associated
// protobuf element. For example: `"google/protobuf/source_context.proto"`.
string file_name = 1;
}

View File

@@ -1,95 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option cc_enable_arenas = true;
option go_package = "google.golang.org/protobuf/types/known/structpb";
option java_package = "com.google.protobuf";
option java_outer_classname = "StructProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
// `Struct` represents a structured data value, consisting of fields
// which map to dynamically typed values. In some languages, `Struct`
// might be supported by a native representation. For example, in
// scripting languages like JS a struct is represented as an
// object. The details of that representation are described together
// with the proto support for the language.
//
// The JSON representation for `Struct` is JSON object.
message Struct {
// Unordered map of dynamically typed values.
map<string, Value> fields = 1;
}
// `Value` represents a dynamically typed value which can be either
// null, a number, a string, a boolean, a recursive struct value, or a
// list of values. A producer of value is expected to set one of these
// variants. Absence of any variant indicates an error.
//
// The JSON representation for `Value` is JSON value.
message Value {
// The kind of value.
oneof kind {
// Represents a null value.
NullValue null_value = 1;
// Represents a double value.
double number_value = 2;
// Represents a string value.
string string_value = 3;
// Represents a boolean value.
bool bool_value = 4;
// Represents a structured value.
Struct struct_value = 5;
// Represents a repeated `Value`.
ListValue list_value = 6;
}
}
// `NullValue` is a singleton enumeration to represent the null value for the
// `Value` type union.
//
// The JSON representation for `NullValue` is JSON `null`.
enum NullValue {
// Null value.
NULL_VALUE = 0;
}
// `ListValue` is a wrapper around a repeated field of values.
//
// The JSON representation for `ListValue` is JSON array.
message ListValue {
// Repeated field of dynamically typed values.
repeated Value values = 1;
}

View File

@@ -1,144 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
option cc_enable_arenas = true;
option go_package = "google.golang.org/protobuf/types/known/timestamppb";
option java_package = "com.google.protobuf";
option java_outer_classname = "TimestampProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
// A Timestamp represents a point in time independent of any time zone or local
// calendar, encoded as a count of seconds and fractions of seconds at
// nanosecond resolution. The count is relative to an epoch at UTC midnight on
// January 1, 1970, in the proleptic Gregorian calendar which extends the
// Gregorian calendar backwards to year one.
//
// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
// second table is needed for interpretation, using a [24-hour linear
// smear](https://developers.google.com/time/smear).
//
// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
// restricting to that range, we ensure that we can convert to and from [RFC
// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
//
// # Examples
//
// Example 1: Compute Timestamp from POSIX `time()`.
//
// Timestamp timestamp;
// timestamp.set_seconds(time(NULL));
// timestamp.set_nanos(0);
//
// Example 2: Compute Timestamp from POSIX `gettimeofday()`.
//
// struct timeval tv;
// gettimeofday(&tv, NULL);
//
// Timestamp timestamp;
// timestamp.set_seconds(tv.tv_sec);
// timestamp.set_nanos(tv.tv_usec * 1000);
//
// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
//
// FILETIME ft;
// GetSystemTimeAsFileTime(&ft);
// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
//
// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
// Timestamp timestamp;
// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
//
// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
//
// long millis = System.currentTimeMillis();
//
// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
// .setNanos((int) ((millis % 1000) * 1000000)).build();
//
// Example 5: Compute Timestamp from Java `Instant.now()`.
//
// Instant now = Instant.now();
//
// Timestamp timestamp =
// Timestamp.newBuilder().setSeconds(now.getEpochSecond())
// .setNanos(now.getNano()).build();
//
// Example 6: Compute Timestamp from current time in Python.
//
// timestamp = Timestamp()
// timestamp.GetCurrentTime()
//
// # JSON Mapping
//
// In JSON format, the Timestamp type is encoded as a string in the
// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
// where {year} is always expressed using four digits while {month}, {day},
// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
// is required. A proto3 JSON serializer should always use UTC (as indicated by
// "Z") when printing the Timestamp type and a proto3 JSON parser should be
// able to accept both UTC and other timezones (as indicated by an offset).
//
// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
// 01:30 UTC on January 15, 2017.
//
// In JavaScript, one can convert a Date object to this format using the
// standard
// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
// method. In Python, a standard `datetime.datetime` object can be converted
// to this format using
// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
// the Joda Time's [`ISODateTimeFormat.dateTime()`](
// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()
// ) to obtain a formatter capable of generating timestamps in this format.
//
message Timestamp {
// Represents seconds of UTC time since Unix epoch
// 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
// 9999-12-31T23:59:59Z inclusive.
int64 seconds = 1;
// Non-negative fractions of a second at nanosecond resolution. Negative
// second values with fractions must still have non-negative nanos values
// that count forward in time. Must be from 0 to 999,999,999
// inclusive.
int32 nanos = 2;
}

View File

@@ -1,193 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
syntax = "proto3";
package google.protobuf;
import "google/protobuf/any.proto";
import "google/protobuf/source_context.proto";
option cc_enable_arenas = true;
option java_package = "com.google.protobuf";
option java_outer_classname = "TypeProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
option go_package = "google.golang.org/protobuf/types/known/typepb";
// A protocol buffer message type.
message Type {
// The fully qualified message name.
string name = 1;
// The list of fields.
repeated Field fields = 2;
// The list of types appearing in `oneof` definitions in this type.
repeated string oneofs = 3;
// The protocol buffer options.
repeated Option options = 4;
// The source context.
SourceContext source_context = 5;
// The source syntax.
Syntax syntax = 6;
// The source edition string, only valid when syntax is SYNTAX_EDITIONS.
string edition = 7;
}
// A single field of a message type.
message Field {
// Basic field types.
enum Kind {
// Field type unknown.
TYPE_UNKNOWN = 0;
// Field type double.
TYPE_DOUBLE = 1;
// Field type float.
TYPE_FLOAT = 2;
// Field type int64.
TYPE_INT64 = 3;
// Field type uint64.
TYPE_UINT64 = 4;
// Field type int32.
TYPE_INT32 = 5;
// Field type fixed64.
TYPE_FIXED64 = 6;
// Field type fixed32.
TYPE_FIXED32 = 7;
// Field type bool.
TYPE_BOOL = 8;
// Field type string.
TYPE_STRING = 9;
// Field type group. Proto2 syntax only, and deprecated.
TYPE_GROUP = 10;
// Field type message.
TYPE_MESSAGE = 11;
// Field type bytes.
TYPE_BYTES = 12;
// Field type uint32.
TYPE_UINT32 = 13;
// Field type enum.
TYPE_ENUM = 14;
// Field type sfixed32.
TYPE_SFIXED32 = 15;
// Field type sfixed64.
TYPE_SFIXED64 = 16;
// Field type sint32.
TYPE_SINT32 = 17;
// Field type sint64.
TYPE_SINT64 = 18;
}
// Whether a field is optional, required, or repeated.
enum Cardinality {
// For fields with unknown cardinality.
CARDINALITY_UNKNOWN = 0;
// For optional fields.
CARDINALITY_OPTIONAL = 1;
// For required fields. Proto2 syntax only.
CARDINALITY_REQUIRED = 2;
// For repeated fields.
CARDINALITY_REPEATED = 3;
}
// The field type.
Kind kind = 1;
// The field cardinality.
Cardinality cardinality = 2;
// The field number.
int32 number = 3;
// The field name.
string name = 4;
// The field type URL, without the scheme, for message or enumeration
// types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`.
string type_url = 6;
// The index of the field type in `Type.oneofs`, for message or enumeration
// types. The first type has index 1; zero means the type is not in the list.
int32 oneof_index = 7;
// Whether to use alternative packed wire representation.
bool packed = 8;
// The protocol buffer options.
repeated Option options = 9;
// The field JSON name.
string json_name = 10;
// The string value of the default value of this field. Proto2 syntax only.
string default_value = 11;
}
// Enum type definition.
message Enum {
// Enum type name.
string name = 1;
// Enum value definitions.
repeated EnumValue enumvalue = 2;
// Protocol buffer options.
repeated Option options = 3;
// The source context.
SourceContext source_context = 4;
// The source syntax.
Syntax syntax = 5;
// The source edition string, only valid when syntax is SYNTAX_EDITIONS.
string edition = 6;
}
// Enum value definition.
message EnumValue {
// Enum value name.
string name = 1;
// Enum value number.
int32 number = 2;
// Protocol buffer options.
repeated Option options = 3;
}
// A protocol buffer option, which can be attached to a message, field,
// enumeration, etc.
message Option {
// The option's name. For protobuf built-in options (options defined in
// descriptor.proto), this is the short name. For example, `"map_entry"`.
// For custom options, it should be the fully-qualified name. For example,
// `"google.api.http"`.
string name = 1;
// The option's value packed in an Any message. If the value is a primitive,
// the corresponding wrapper type defined in google/protobuf/wrappers.proto
// should be used. If the value is an enum, it should be stored as an int32
// value using the google.protobuf.Int32Value type.
Any value = 2;
}
// The syntax in which a protocol buffer element is defined.
enum Syntax {
// Syntax `proto2`.
SYNTAX_PROTO2 = 0;
// Syntax `proto3`.
SYNTAX_PROTO3 = 1;
// Syntax `editions`.
SYNTAX_EDITIONS = 2;
}

View File

@@ -1,123 +0,0 @@
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Wrappers for primitive (non-message) types. These types are useful
// for embedding primitives in the `google.protobuf.Any` type and for places
// where we need to distinguish between the absence of a primitive
// typed field and its default value.
//
// These wrappers have no meaningful use within repeated fields as they lack
// the ability to detect presence on individual elements.
// These wrappers have no meaningful use within a map or a oneof since
// individual entries of a map or fields of a oneof can already detect presence.
syntax = "proto3";
package google.protobuf;
option cc_enable_arenas = true;
option go_package = "google.golang.org/protobuf/types/known/wrapperspb";
option java_package = "com.google.protobuf";
option java_outer_classname = "WrappersProto";
option java_multiple_files = true;
option objc_class_prefix = "GPB";
option csharp_namespace = "Google.Protobuf.WellKnownTypes";
// Wrapper message for `double`.
//
// The JSON representation for `DoubleValue` is JSON number.
message DoubleValue {
// The double value.
double value = 1;
}
// Wrapper message for `float`.
//
// The JSON representation for `FloatValue` is JSON number.
message FloatValue {
// The float value.
float value = 1;
}
// Wrapper message for `int64`.
//
// The JSON representation for `Int64Value` is JSON string.
message Int64Value {
// The int64 value.
int64 value = 1;
}
// Wrapper message for `uint64`.
//
// The JSON representation for `UInt64Value` is JSON string.
message UInt64Value {
// The uint64 value.
uint64 value = 1;
}
// Wrapper message for `int32`.
//
// The JSON representation for `Int32Value` is JSON number.
message Int32Value {
// The int32 value.
int32 value = 1;
}
// Wrapper message for `uint32`.
//
// The JSON representation for `UInt32Value` is JSON number.
message UInt32Value {
// The uint32 value.
uint32 value = 1;
}
// Wrapper message for `bool`.
//
// The JSON representation for `BoolValue` is JSON `true` and `false`.
message BoolValue {
// The bool value.
bool value = 1;
}
// Wrapper message for `string`.
//
// The JSON representation for `StringValue` is JSON string.
message StringValue {
// The string value.
string value = 1;
}
// Wrapper message for `bytes`.
//
// The JSON representation for `BytesValue` is JSON string.
message BytesValue {
// The bytes value.
bytes value = 1;
}

Some files were not shown because too many files have changed in this diff Show More