@solidjs/router 0.10.0-beta.6 → 0.10.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,13 @@
1
1
  import { JSX } from "solid-js";
2
2
  import { Submission } from "../types";
3
- export type Action<T, U> = ((vars: T) => Promise<U>) & JSX.SerializableAttributeValue;
4
- export declare const actions: Map<string, Function>;
5
- export declare function useSubmissions<T, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U>[] & {
3
+ export type Action<T extends Array<any>, U> = ((...vars: T) => Promise<U>) & JSX.SerializableAttributeValue & {
4
+ url: string;
5
+ with<A extends any[], B extends any[]>(this: (this: any, ...args: [...A, ...B]) => U, ...args: A): Action<B, U>;
6
+ };
7
+ export declare const actions: Map<string, Action<any, any>>;
8
+ export declare function useSubmissions<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U>[] & {
6
9
  pending: boolean;
7
10
  };
8
- export declare function useSubmission<T, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U>;
9
- export declare function useAction<T, U>(action: Action<T, U>): Action<T, U>;
10
- export declare function action<T, U = void>(fn: (args: T) => Promise<U>, name?: string): Action<T, U>;
11
+ export declare function useSubmission<T extends Array<any>, U>(fn: Action<T, U>, filter?: (arg: T) => boolean): Submission<T, U>;
12
+ export declare function useAction<T extends Array<any>, U>(action: Action<T, U>): (...args: Parameters<Action<T, U>>) => Promise<U>;
13
+ export declare function action<T extends Array<any>, U = void>(fn: (...args: T) => Promise<U>, name?: string): Action<T, U>;
@@ -1,8 +1,8 @@
1
- import { $TRACK, createMemo, createSignal } from "solid-js";
1
+ import { $TRACK, createMemo, createSignal, onCleanup, getOwner } from "solid-js";
2
2
  import { isServer } from "solid-js/web";
3
3
  import { useRouter } from "../routing";
4
4
  import { redirectStatusCodes } from "../utils";
5
- import { revalidate } from "./cache";
5
+ import { hashKey, revalidate } from "./cache";
6
6
  export const actions = /* #__PURE__ */ new Map();
7
7
  export function useSubmissions(fn, filter) {
8
8
  const router = useRouter();
@@ -27,11 +27,11 @@ export function useSubmission(fn, filter) {
27
27
  }
28
28
  export function useAction(action) {
29
29
  const router = useRouter();
30
- return action.bind(router);
30
+ return (...args) => action.apply(router, args);
31
31
  }
32
32
  export function action(fn, name) {
33
- function mutate(variables) {
34
- const p = fn(variables);
33
+ function mutate(...variables) {
34
+ const p = fn(...variables);
35
35
  const [result, setResult] = createSignal();
36
36
  let submission;
37
37
  const router = this;
@@ -56,7 +56,7 @@ export function action(fn, name) {
56
56
  },
57
57
  retry() {
58
58
  setResult(undefined);
59
- const p = fn(variables);
59
+ const p = fn(...variables);
60
60
  p.then(handler, handler);
61
61
  return p;
62
62
  }
@@ -66,14 +66,28 @@ export function action(fn, name) {
66
66
  return p;
67
67
  }
68
68
  const url = fn.url || (name && `action:${name}`) || (!isServer ? `action:${fn.name}` : "");
69
- mutate.toString = () => {
69
+ return toAction(mutate, url);
70
+ }
71
+ function toAction(fn, url) {
72
+ fn.toString = () => {
70
73
  if (!url)
71
74
  throw new Error("Client Actions need explicit names if server rendered");
72
75
  return url;
73
76
  };
74
- if (!isServer)
75
- actions.set(url, mutate);
76
- return mutate;
77
+ fn.with = function (...args) {
78
+ const newFn = function (...passedArgs) {
79
+ return fn.call(this, ...args, ...passedArgs);
80
+ };
81
+ const uri = new URL(url, "http://sar");
82
+ uri.searchParams.set("args", hashKey(args));
83
+ return toAction(newFn, uri.toString());
84
+ };
85
+ fn.url = url;
86
+ if (!isServer) {
87
+ actions.set(url, fn);
88
+ getOwner() && onCleanup(() => actions.delete(url));
89
+ }
90
+ return fn;
77
91
  }
78
92
  async function handleResponse(response, navigate) {
79
93
  let data;
@@ -5,3 +5,4 @@ export type CachedFunction<T extends (...args: any) => U | Response, U> = T & {
5
5
  key: string;
6
6
  };
7
7
  export declare function cache<T extends (...args: any) => U | Response, U>(fn: T, name: string, options?: ReconcileOptions): CachedFunction<T, U>;
8
+ export declare function hashKey<T extends Array<any>>(args: T): string;
@@ -139,7 +139,7 @@ function matchKey(key, keys) {
139
139
  }
140
140
  // Modified from the amazing Tanstack Query library (MIT)
141
141
  // https://github.com/TanStack/query/blob/main/packages/query-core/src/utils.ts#L168
142
- function hashKey(args) {
142
+ export function hashKey(args) {
143
143
  return JSON.stringify(args, (_, val) => isPlainObject(val)
144
144
  ? Object.keys(val)
145
145
  .sort()
@@ -81,7 +81,9 @@ export function setupNativeEvents(router) {
81
81
  }
82
82
  }
83
83
  function handleFormSubmit(evt) {
84
- let actionRef = (evt.submitter && evt.submitter.getAttribute("formaction")) || evt.target.action;
84
+ let actionRef = evt.submitter && evt.submitter.hasAttribute("formaction")
85
+ ? evt.submitter.formAction
86
+ : evt.target.action;
85
87
  if (!actionRef)
86
88
  return;
87
89
  if (!actionRef.startsWith("action:")) {
package/dist/index.js CHANGED
@@ -389,7 +389,7 @@ function createRouterContext(integration, getBranches, options = {}) {
389
389
  const [state, setState] = createSignal(source().state);
390
390
  const location = createLocation(reference, state);
391
391
  const referrers = [];
392
- const submissions = createSignal(initFromFlash(location.query));
392
+ const submissions = createSignal(isServer ? initFromFlash() : []);
393
393
  const baseRoute = {
394
394
  pattern: basePath,
395
395
  params: {},
@@ -544,15 +544,9 @@ function createRouterContext(integration, getBranches, options = {}) {
544
544
  }
545
545
  intent = prevIntent;
546
546
  }
547
- function initFromFlash(params) {
548
- let param = params.form ? JSON.parse(params.form) : null;
549
- if (!param || !param.result) return [];
550
- const input = new Map(param.entries);
551
- return [{
552
- url: param.url,
553
- result: param.error ? new Error(param.result) : param.result,
554
- input: input
555
- }];
547
+ function initFromFlash() {
548
+ const e = getRequestEvent();
549
+ return e && e.initialSubmission ? [e.initialSubmission] : [];
556
550
  }
557
551
  }
558
552
  function createRouteContext(router, parent, outlet, match, params) {
@@ -916,11 +910,11 @@ function useSubmission(fn, filter) {
916
910
  }
917
911
  function useAction(action) {
918
912
  const router = useRouter();
919
- return action.bind(router);
913
+ return (...args) => action.apply(router, args);
920
914
  }
921
915
  function action(fn, name) {
922
- function mutate(variables) {
923
- const p = fn(variables);
916
+ function mutate(...variables) {
917
+ const p = fn(...variables);
924
918
  const [result, setResult] = createSignal();
925
919
  let submission;
926
920
  const router = this;
@@ -945,7 +939,7 @@ function action(fn, name) {
945
939
  },
946
940
  retry() {
947
941
  setResult(undefined);
948
- const p = fn(variables);
942
+ const p = fn(...variables);
949
943
  p.then(handler, handler);
950
944
  return p;
951
945
  }
@@ -954,12 +948,27 @@ function action(fn, name) {
954
948
  return p;
955
949
  }
956
950
  const url = fn.url || name && `action:${name}` || (!isServer ? `action:${fn.name}` : "");
957
- mutate.toString = () => {
951
+ return toAction(mutate, url);
952
+ }
953
+ function toAction(fn, url) {
954
+ fn.toString = () => {
958
955
  if (!url) throw new Error("Client Actions need explicit names if server rendered");
959
956
  return url;
960
957
  };
961
- if (!isServer) actions.set(url, mutate);
962
- return mutate;
958
+ fn.with = function (...args) {
959
+ const newFn = function (...passedArgs) {
960
+ return fn.call(this, ...args, ...passedArgs);
961
+ };
962
+ const uri = new URL(url, "http://sar");
963
+ uri.searchParams.set("args", hashKey(args));
964
+ return toAction(newFn, uri.toString());
965
+ };
966
+ fn.url = url;
967
+ if (!isServer) {
968
+ actions.set(url, fn);
969
+ getOwner() && onCleanup(() => actions.delete(url));
970
+ }
971
+ return fn;
963
972
  }
964
973
  async function handleResponse(response, navigate) {
965
974
  let data;
@@ -1043,7 +1052,7 @@ function setupNativeEvents(router) {
1043
1052
  }
1044
1053
  }
1045
1054
  function handleFormSubmit(evt) {
1046
- let actionRef = evt.submitter && evt.submitter.getAttribute("formaction") || evt.target.action;
1055
+ let actionRef = evt.submitter && evt.submitter.hasAttribute("formaction") ? evt.submitter.formAction : evt.target.action;
1047
1056
  if (!actionRef) return;
1048
1057
  if (!actionRef.startsWith("action:")) {
1049
1058
  const url = new URL(actionRef);
package/dist/routing.js CHANGED
@@ -202,7 +202,7 @@ export function createRouterContext(integration, getBranches, options = {}) {
202
202
  const [state, setState] = createSignal(source().state);
203
203
  const location = createLocation(reference, state);
204
204
  const referrers = [];
205
- const submissions = createSignal(initFromFlash(location.query));
205
+ const submissions = createSignal(isServer ? initFromFlash() : []);
206
206
  const baseRoute = {
207
207
  pattern: basePath,
208
208
  params: {},
@@ -342,18 +342,9 @@ export function createRouterContext(integration, getBranches, options = {}) {
342
342
  }
343
343
  intent = prevIntent;
344
344
  }
345
- function initFromFlash(params) {
346
- let param = params.form ? JSON.parse(params.form) : null;
347
- if (!param || !param.result)
348
- return [];
349
- const input = new Map(param.entries);
350
- return [
351
- {
352
- url: param.url,
353
- result: param.error ? new Error(param.result) : param.result,
354
- input: input
355
- }
356
- ];
345
+ function initFromFlash() {
346
+ const e = getRequestEvent();
347
+ return e && e.initialSubmission ? [e.initialSubmission] : [];
357
348
  }
358
349
  }
359
350
  export function createRouteContext(router, parent, outlet, match, params) {
package/dist/types.d.ts CHANGED
@@ -3,6 +3,7 @@ declare module "solid-js/web" {
3
3
  interface RequestEvent {
4
4
  response?: Response;
5
5
  routerCache?: Map<any, any>;
6
+ initialSubmission?: Submission<any, any>;
6
7
  }
7
8
  }
8
9
  export type Params = Record<string, string>;
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "Ryan Turnquist"
7
7
  ],
8
8
  "license": "MIT",
9
- "version": "0.10.0-beta.6",
9
+ "version": "0.10.0-beta.7",
10
10
  "homepage": "https://github.com/solidjs/solid-router#readme",
11
11
  "repository": {
12
12
  "type": "git",