-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Remote Functions #13986
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remote Functions #13986
Conversation
* initial commit * various fixes * tweak demo * fix * remove acorn-typescript * simplify * fix * generate, don't transform * use an x- header * regenerate manifest when remote files are added/removed * move RPC logic out of page, it belongs elsewhere * use _app/remote/x * tighten up error handling * unused * CSRF * smaller payloads * belt and braces * don't use 204, that only applies to DELETE/PUT requests * turn remote_call into a factory - more compact and gives us a lot more options * analyze exports of remotes dynamically, add query/action/formAction as different types of remotes * update playground * POC: hydrate query results * remote form actions that hydrate and work without JS * conditional * load fn WIP * rerun query on invalidation * make it possible to call invalidate in rpc functions * fix * adjust form API * fix dev stale bug * let rpc partake in prerendering * prerender POC * cache POC * simplify server remote logic by leveraging ESM self imports * cleanup server remote info * rename functions + some docs * move more stuff into functions to deduplicate/cleanup/make connections clearer * prerendering * hide remote url, avoid unnecessary work * cache refinement * various fixes * tests * don't call prerender function at runtime, tweak tests * tweak * tweak caching behavior * remove cache function from public API for now * add experimental flag * remove load helper function for now * move file * add refreshAll, related to #13139 * adjust overrides signature * query/redirect/form-fail handling * adjust caching behavior to cache until query is removed * disallow non-remote-function exports from .remote files * bump dts-buddy to be able to generate types without bugs again * handle query redirect without going through error boundaries * harmonize refresh with override signature * fixes * resolve cyclic import dependency * prerender treeshaking * refine API * refresh from the server * adjust tests, fix * adjust prerender * reorder functions * make query eager on the client if in reactive context * implement current/error/pending * remove optimistic in favor of override callback * add validate * form.for(...) * tweak api around redirects; allow single flight mutation redirect * implement stacking override API * fixes * deduplicate remote calls on the server during full page visits * rework to use resource class, fix some bugs * ensure refresh/then resolve in order * microtask tweaking * fix * cleanse event for remote functions * implement `updates` and `withOverride` for command * implement `updates` and `withOverride` for form * cleanup * Prevent state_unsafe_mutation error * restrict to 0 or 1 argument, enforce validation * validation tests * tweak * comment out for the time being * remove validate function * lint * guard * bump Svelte version * silence type errors * Update packages/kit/src/runtime/app/server/remote.js Co-authored-by: Paolo Ricciuti <[email protected]> * fix * update playground --------- Co-authored-by: Dominic Gannaway <[email protected]> Co-authored-by: Rich Harris <[email protected]> Co-authored-by: Paolo Ricciuti <[email protected]>
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it's going to take a few passes to fully review this glorious beast, but here's a few notes to start with. also:
- will need a changeset 😆
- if you have a
.remote.ts
that importsquery
or whatever from$app/server
, then at build time you'll get a 'Cannot import $app/server into client-side code' error rather than the more helpful remote-functions-specific error. Would be nice to be more specific here while not creating a breaking change for anyone that happens to have an existing.remote.ts
file (in which case they would probably appreciate a warning that they'll definitely need to rename that file)
Also, I'll probably find the answer to this as I read on but didn't want to lose the thought: are we (de)serializing arguments to remote functions that are called directly on the server? On the one hand it's wasteful, on the other it would avoid a client/server discrepancy (e.g. a mutation being respected on the server but not on the client)
Absolutely pumped for this to land
Co-authored-by: Rich Harris <[email protected]>
…iginal filename for better error messages
Gonna update the behaviour of forms around errors, because it's slightly inconsistent at present. On a form that doesn't use Aside from the inconsistency, the most likely outcome of this is that errors will just end up getting swallowed, as developers forget to add If you try-catch the |
Am second-guessing the For validation errors it feels like you could rely on client-side validation (including things like |
I think we need to come up with a better name than Looking at MDN, the only obvious alternative is (I'm tempted to suggest just throwing Also we should probably have |
In other words you already know when it's valuable - so we shouldn't remove it. One example are validation errors that happen on the server, like "you are not allowed to delete this". Another is to disable the button while a submission is in progress (which we need to add anyway AFAICT). Related: #7175
Sounds tempting indeed. I fear that the onclick handler intercepting unexpectedly could throw people off, also it would probably confuse people why there are more attributes than necessary on the form. When coming up with an alternative name I would then choose something that is not an attribute name, that somehow brings across the intent. |
Yeah, not suggesting removing Consensus on naming appears to be |
Re example: what about pending UI which is made possible through a new Boolean (which we should have anyway) |
Ooh that's a good idea. In the interests of shipping I think it should probably be a follow-up PR but yeah I like that |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
incredible work. lots more stuff to add in follow-up PRs but this is such a good foundation for everything to come
PR for #13897, discussion should happen there.
For a more complete commit history (with lots of explorations and dead ends; also includes some caching ideas) see #13957
Please don't delete this checklist! Before submitting the PR, please make sure you do the following:
Tests
pnpm test
and lint the project withpnpm lint
andpnpm check
Changesets
pnpm changeset
and following the prompts. Changesets that add features should beminor
and those that fix bugs should bepatch
. Please prefix changeset messages withfeat:
,fix:
, orchore:
.