@lyeve-labs/client-svelte 0.1.5 → 0.1.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.
package/dist/index.cjs CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
@@ -28,6 +38,7 @@ __export(src_exports, {
28
38
  module.exports = __toCommonJS(src_exports);
29
39
 
30
40
  // src/runes.svelte.ts
41
+ var $ = __toESM(require("svelte/internal/client"), 1);
31
42
  var import_client = require("@lyeve-labs/client");
32
43
  function createCmsClient(config) {
33
44
  const base = config.baseUrl ?? "";
@@ -40,87 +51,87 @@ function createCmsClient(config) {
40
51
  });
41
52
  }
42
53
  function createAsyncStore(fetcher, client) {
43
- let data = $state(null);
44
- let error = $state(null);
45
- let loading = $state(true);
54
+ let data = $.state(null);
55
+ let error = $.state(null);
56
+ let loading = $.state(true);
46
57
  async function fetch2() {
47
- loading = true;
58
+ $.set(loading, true);
48
59
  try {
49
- data = await fetcher(client);
50
- error = null;
60
+ $.set(data, await fetcher(client), true);
61
+ $.set(error, null);
51
62
  } catch (e) {
52
- error = e;
63
+ $.set(error, e, true);
53
64
  } finally {
54
- loading = false;
65
+ $.set(loading, false);
55
66
  }
56
67
  }
57
68
  fetch2();
58
69
  return {
59
70
  get data() {
60
- return data;
71
+ return $.get(data);
61
72
  },
62
73
  get error() {
63
- return error;
74
+ return $.get(error);
64
75
  },
65
76
  get loading() {
66
- return loading;
77
+ return $.get(loading);
67
78
  },
68
79
  refetch: fetch2
69
80
  };
70
81
  }
71
82
  function createMutation(mutator, client) {
72
- let data = $state(null);
73
- let error = $state(null);
74
- let loading = $state(false);
83
+ let data = $.state(null);
84
+ let error = $.state(null);
85
+ let loading = $.state(false);
75
86
  async function run(vars) {
76
- loading = true;
77
- error = null;
87
+ $.set(loading, true);
88
+ $.set(error, null);
78
89
  try {
79
90
  const result = await mutator(client, vars);
80
- data = result;
91
+ $.set(data, result, true);
81
92
  return result;
82
93
  } catch (e) {
83
- error = e;
94
+ $.set(error, e, true);
84
95
  throw e;
85
96
  } finally {
86
- loading = false;
97
+ $.set(loading, false);
87
98
  }
88
99
  }
89
100
  return {
90
101
  get data() {
91
- return data;
102
+ return $.get(data);
92
103
  },
93
104
  get error() {
94
- return error;
105
+ return $.get(error);
95
106
  },
96
107
  get loading() {
97
- return loading;
108
+ return $.get(loading);
98
109
  },
99
110
  run
100
111
  };
101
112
  }
102
113
  function createAuthStore(client) {
103
- let state = $state({ user: null, token: null });
114
+ let state2 = $.state($.proxy({ user: null, token: null }));
104
115
  return {
105
116
  get user() {
106
- return state.user;
117
+ return $.get(state2).user;
107
118
  },
108
119
  get token() {
109
- return state.token;
120
+ return $.get(state2).token;
110
121
  },
111
122
  get isAuthenticated() {
112
- return state.token !== null;
123
+ return $.get(state2).token !== null;
113
124
  },
114
125
  setUser(user, token) {
115
- state = { user, token };
126
+ $.set(state2, { user, token }, true);
116
127
  },
117
128
  clear() {
118
- state = { user: null, token: null };
129
+ $.set(state2, { user: null, token: null }, true);
119
130
  },
120
131
  async load() {
121
132
  try {
122
133
  const user = await client.get("/api/admin/auth/me");
123
- state = { ...state, user };
134
+ $.set(state2, { ...$.get(state2), user }, true);
124
135
  } catch {
125
136
  }
126
137
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/runes.svelte.ts"],"sourcesContent":["// Re-exports for non-Svelte consumers (bundled by tsup).\n// Implementation lives in runes.svelte.ts so Svelte's compiler handles\n// $state runes natively via the \"svelte\" export condition.\nexport {\n createCmsClient,\n createAsyncStore,\n createMutation,\n createAuthStore,\n type SvelteCmsConfig,\n type AsyncStore,\n type AuthState,\n type AuthStore,\n} from \"./runes.svelte.js\";\n","import { createClient, type HttpClient } from \"@lyeve-labs/client\";\n\n// Client factory\n\nexport interface SvelteCmsConfig {\n /** Base URL prepended to every request path. */\n baseUrl?: string;\n /**\n * Callback returning headers added to every request.\n * Called on every request so auth tokens can be refreshed without\n * recreating the client.\n */\n getHeaders?: () => Record<string, string>;\n}\n\n/**\n * Creates an HttpClient pre-configured with base URL and dynamic request\n * headers. No Provider needed - Svelte callers just pass the client around.\n *\n * @example\n * ```ts\n * const client = createCmsClient({\n * baseUrl: 'https://cms.example.com',\n * getHeaders: () => ({ Authorization: `Bearer ${token}` }),\n * });\n * ```\n */\nexport function createCmsClient(config: SvelteCmsConfig): HttpClient {\n const base = config.baseUrl ?? \"\";\n return createClient((url, init) => {\n const fullUrl = typeof url === \"string\" ? `${base}${url}` : url;\n return fetch(fullUrl, {\n ...init,\n headers: { ...init?.headers, ...config.getHeaders?.() },\n });\n });\n}\n\n// Generic async store\n\nexport interface AsyncStore<T> {\n readonly data: T | null;\n readonly error: Error | null;\n readonly loading: boolean;\n refetch: () => void;\n}\n\n/**\n * Reactive async data store using the $state rune.\n * Fires the fetcher immediately and exposes reactive loading/data/error\n * getters that Svelte components can read directly in markup.\n *\n * @example\n * ```svelte\n * <script lang=\"ts\">\n * const schemas = createAsyncStore((c) => getSchemas(c), client);\n * </script>\n * {#if schemas.loading}...{/if}\n * ```\n */\nexport function createAsyncStore<T>(\n fetcher: (client: HttpClient) => Promise<T>,\n client: HttpClient,\n): AsyncStore<T> {\n let data = $state<T | null>(null);\n let error = $state<Error | null>(null);\n let loading = $state(true);\n\n async function fetch() {\n loading = true;\n try {\n data = await fetcher(client);\n error = null;\n } catch (e) {\n error = e as Error;\n } finally {\n loading = false;\n }\n }\n\n fetch();\n\n return {\n get data() {\n return data;\n },\n get error() {\n return error;\n },\n get loading() {\n return loading;\n },\n refetch: fetch,\n };\n}\n\n/**\n * Reactive mutation primitive using the $state rune.\n * Returns data/error/loading state and a run function that triggers the\n * mutation. Unlike createAsyncStore, the mutation does not fire immediately.\n *\n * @example\n * ```svelte\n * <script lang=\"ts\">\n * const createArticle = createMutation(\n * (c, vars: { title: string }) => createArticle(c, vars),\n * client,\n * );\n * </script>\n * <button onclick={() => createArticle.run({ title: 'Hello' })}>\n * {createArticle.loading ? 'Saving...' : 'Create'}\n * </button>\n * ```\n */\nexport function createMutation<T, V>(\n mutator: (client: HttpClient, vars: V) => Promise<T>,\n client: HttpClient,\n) {\n let data = $state<T | null>(null);\n let error = $state<Error | null>(null);\n let loading = $state(false);\n\n async function run(vars: V): Promise<T> {\n loading = true;\n error = null;\n try {\n const result = await mutator(client, vars);\n data = result;\n return result;\n } catch (e) {\n error = e as Error;\n throw e;\n } finally {\n loading = false;\n }\n }\n\n return {\n get data() {\n return data;\n },\n get error() {\n return error;\n },\n get loading() {\n return loading;\n },\n run,\n };\n}\n\n// Auth store\n\nexport interface AuthState {\n user: { id: string; email: string; roles: string[] } | null;\n token: string | null;\n}\n\nexport interface AuthStore {\n readonly user: AuthState[\"user\"];\n readonly token: string | null;\n readonly isAuthenticated: boolean;\n /** Set the current user and token after a successful login. */\n setUser: (user: AuthState[\"user\"], token: string | null) => void;\n /** Clear auth state (e.g. after logout). */\n clear: () => void;\n /** Try to load the current user from the server using the stored token. */\n load: () => Promise<void>;\n}\n\n/**\n * Simple reactive auth store. The caller is responsible for calling\n * {@link AuthStore.setUser} after login and {@link AuthStore.clear} after\n * logout. Use {@link AuthStore.load} on app start to restore a session\n * from an existing cookie.\n */\nexport function createAuthStore(client: HttpClient): AuthStore {\n let state = $state<AuthState>({ user: null, token: null });\n\n return {\n get user() {\n return state.user;\n },\n get token() {\n return state.token;\n },\n get isAuthenticated() {\n return state.token !== null;\n },\n setUser(user: AuthState[\"user\"], token: string | null) {\n state = { user, token };\n },\n clear() {\n state = { user: null, token: null };\n },\n async load() {\n try {\n const user = await client.get<{\n id: string;\n email: string;\n roles: string[];\n }>(\"/api/admin/auth/me\");\n state = { ...state, user };\n } catch {\n /* not logged in */\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAA8C;AA2BvC,SAAS,gBAAgB,QAAqC;AACnE,QAAM,OAAO,OAAO,WAAW;AAC/B,aAAO,4BAAa,CAAC,KAAK,SAAS;AACjC,UAAM,UAAU,OAAO,QAAQ,WAAW,GAAG,IAAI,GAAG,GAAG,KAAK;AAC5D,WAAO,MAAM,SAAS;AAAA,MACpB,GAAG;AAAA,MACH,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAwBO,SAAS,iBACd,SACA,QACe;AACf,MAAI,OAAO,OAAiB,IAAI;AAChC,MAAI,QAAQ,OAAqB,IAAI;AACrC,MAAI,UAAU,OAAO,IAAI;AAEzB,iBAAeA,SAAQ;AACrB,cAAU;AACV,QAAI;AACF,aAAO,MAAM,QAAQ,MAAM;AAC3B,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,cAAQ;AAAA,IACV,UAAE;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,EAAAA,OAAM;AAEN,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA,SAASA;AAAA,EACX;AACF;AAoBO,SAAS,eACd,SACA,QACA;AACA,MAAI,OAAO,OAAiB,IAAI;AAChC,MAAI,QAAQ,OAAqB,IAAI;AACrC,MAAI,UAAU,OAAO,KAAK;AAE1B,iBAAe,IAAI,MAAqB;AACtC,cAAU;AACV,YAAQ;AACR,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ,IAAI;AACzC,aAAO;AACP,aAAO;AAAA,IACT,SAAS,GAAG;AACV,cAAQ;AACR,YAAM;AAAA,IACR,UAAE;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AA2BO,SAAS,gBAAgB,QAA+B;AAC7D,MAAI,QAAQ,OAAkB,EAAE,MAAM,MAAM,OAAO,KAAK,CAAC;AAEzD,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,kBAAkB;AACpB,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,IACA,QAAQ,MAAyB,OAAsB;AACrD,cAAQ,EAAE,MAAM,MAAM;AAAA,IACxB;AAAA,IACA,QAAQ;AACN,cAAQ,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,IACpC;AAAA,IACA,MAAM,OAAO;AACX,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,IAIvB,oBAAoB;AACvB,gBAAQ,EAAE,GAAG,OAAO,KAAK;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":["fetch"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/runes.svelte.ts"],"sourcesContent":["// Re-exports for non-Svelte consumers (bundled by tsup).\n// Implementation lives in runes.svelte.ts so Svelte's compiler handles\n// $state runes natively via the \"svelte\" export condition.\nexport {\n createCmsClient,\n createAsyncStore,\n createMutation,\n createAuthStore,\n type SvelteCmsConfig,\n type AsyncStore,\n type AuthState,\n type AuthStore,\n} from \"./runes.svelte.js\";\n","/* runes.svelte.ts generated by Svelte v5.56.7 */\nimport * as $ from 'svelte/internal/client';\nimport { createClient } from \"@lyeve-labs/client\";\n\nfunction createCmsClient(config) {\n\tconst base = config.baseUrl ?? \"\";\n\n\treturn createClient((url, init) => {\n\t\tconst fullUrl = typeof url === \"string\" ? `${base}${url}` : url;\n\n\t\treturn fetch(fullUrl, {\n\t\t\t...init,\n\t\t\theaders: { ...init?.headers, ...config.getHeaders?.() }\n\t\t});\n\t});\n}\n\nfunction createAsyncStore(fetcher, client) {\n\tlet data = $.state(null);\n\tlet error = $.state(null);\n\tlet loading = $.state(true);\n\n\tasync function fetch2() {\n\t\t$.set(loading, true);\n\n\t\ttry {\n\t\t\t$.set(data, await fetcher(client), true);\n\t\t\t$.set(error, null);\n\t\t} catch(e) {\n\t\t\t$.set(error, e, true);\n\t\t} finally {\n\t\t\t$.set(loading, false);\n\t\t}\n\t}\n\n\tfetch2();\n\n\treturn {\n\t\tget data() {\n\t\t\treturn $.get(data);\n\t\t},\n\n\t\tget error() {\n\t\t\treturn $.get(error);\n\t\t},\n\n\t\tget loading() {\n\t\t\treturn $.get(loading);\n\t\t},\n\t\trefetch: fetch2\n\t};\n}\n\nfunction createMutation(mutator, client) {\n\tlet data = $.state(null);\n\tlet error = $.state(null);\n\tlet loading = $.state(false);\n\n\tasync function run(vars) {\n\t\t$.set(loading, true);\n\t\t$.set(error, null);\n\n\t\ttry {\n\t\t\tconst result = await mutator(client, vars);\n\n\t\t\t$.set(data, result, true);\n\n\t\t\treturn result;\n\t\t} catch(e) {\n\t\t\t$.set(error, e, true);\n\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\t$.set(loading, false);\n\t\t}\n\t}\n\n\treturn {\n\t\tget data() {\n\t\t\treturn $.get(data);\n\t\t},\n\n\t\tget error() {\n\t\t\treturn $.get(error);\n\t\t},\n\n\t\tget loading() {\n\t\t\treturn $.get(loading);\n\t\t},\n\t\trun\n\t};\n}\n\nfunction createAuthStore(client) {\n\tlet state = $.state($.proxy({ user: null, token: null }));\n\n\treturn {\n\t\tget user() {\n\t\t\treturn $.get(state).user;\n\t\t},\n\n\t\tget token() {\n\t\t\treturn $.get(state).token;\n\t\t},\n\n\t\tget isAuthenticated() {\n\t\t\treturn $.get(state).token !== null;\n\t\t},\n\n\t\tsetUser(user, token) {\n\t\t\t$.set(state, { user, token }, true);\n\t\t},\n\n\t\tclear() {\n\t\t\t$.set(state, { user: null, token: null }, true);\n\t\t},\n\n\t\tasync load() {\n\t\t\ttry {\n\t\t\t\tconst user = await client.get(\"/api/admin/auth/me\");\n\n\t\t\t\t$.set(state, { ...$.get(state), user }, true);\n\t\t\t} catch {}\n\t\t}\n\t};\n}\n\nexport {\n\tcreateAsyncStore,\n\tcreateAuthStore,\n\tcreateCmsClient,\n\tcreateMutation\n};"],"mappings":"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","names":["state"]}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // src/runes.svelte.ts
2
+ import * as $ from "svelte/internal/client";
2
3
  import { createClient } from "@lyeve-labs/client";
3
4
  function createCmsClient(config) {
4
5
  const base = config.baseUrl ?? "";
@@ -11,87 +12,87 @@ function createCmsClient(config) {
11
12
  });
12
13
  }
13
14
  function createAsyncStore(fetcher, client) {
14
- let data = $state(null);
15
- let error = $state(null);
16
- let loading = $state(true);
15
+ let data = $.state(null);
16
+ let error = $.state(null);
17
+ let loading = $.state(true);
17
18
  async function fetch2() {
18
- loading = true;
19
+ $.set(loading, true);
19
20
  try {
20
- data = await fetcher(client);
21
- error = null;
21
+ $.set(data, await fetcher(client), true);
22
+ $.set(error, null);
22
23
  } catch (e) {
23
- error = e;
24
+ $.set(error, e, true);
24
25
  } finally {
25
- loading = false;
26
+ $.set(loading, false);
26
27
  }
27
28
  }
28
29
  fetch2();
29
30
  return {
30
31
  get data() {
31
- return data;
32
+ return $.get(data);
32
33
  },
33
34
  get error() {
34
- return error;
35
+ return $.get(error);
35
36
  },
36
37
  get loading() {
37
- return loading;
38
+ return $.get(loading);
38
39
  },
39
40
  refetch: fetch2
40
41
  };
41
42
  }
42
43
  function createMutation(mutator, client) {
43
- let data = $state(null);
44
- let error = $state(null);
45
- let loading = $state(false);
44
+ let data = $.state(null);
45
+ let error = $.state(null);
46
+ let loading = $.state(false);
46
47
  async function run(vars) {
47
- loading = true;
48
- error = null;
48
+ $.set(loading, true);
49
+ $.set(error, null);
49
50
  try {
50
51
  const result = await mutator(client, vars);
51
- data = result;
52
+ $.set(data, result, true);
52
53
  return result;
53
54
  } catch (e) {
54
- error = e;
55
+ $.set(error, e, true);
55
56
  throw e;
56
57
  } finally {
57
- loading = false;
58
+ $.set(loading, false);
58
59
  }
59
60
  }
60
61
  return {
61
62
  get data() {
62
- return data;
63
+ return $.get(data);
63
64
  },
64
65
  get error() {
65
- return error;
66
+ return $.get(error);
66
67
  },
67
68
  get loading() {
68
- return loading;
69
+ return $.get(loading);
69
70
  },
70
71
  run
71
72
  };
72
73
  }
73
74
  function createAuthStore(client) {
74
- let state = $state({ user: null, token: null });
75
+ let state2 = $.state($.proxy({ user: null, token: null }));
75
76
  return {
76
77
  get user() {
77
- return state.user;
78
+ return $.get(state2).user;
78
79
  },
79
80
  get token() {
80
- return state.token;
81
+ return $.get(state2).token;
81
82
  },
82
83
  get isAuthenticated() {
83
- return state.token !== null;
84
+ return $.get(state2).token !== null;
84
85
  },
85
86
  setUser(user, token) {
86
- state = { user, token };
87
+ $.set(state2, { user, token }, true);
87
88
  },
88
89
  clear() {
89
- state = { user: null, token: null };
90
+ $.set(state2, { user: null, token: null }, true);
90
91
  },
91
92
  async load() {
92
93
  try {
93
94
  const user = await client.get("/api/admin/auth/me");
94
- state = { ...state, user };
95
+ $.set(state2, { ...$.get(state2), user }, true);
95
96
  } catch {
96
97
  }
97
98
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runes.svelte.ts"],"sourcesContent":["import { createClient, type HttpClient } from \"@lyeve-labs/client\";\n\n// Client factory\n\nexport interface SvelteCmsConfig {\n /** Base URL prepended to every request path. */\n baseUrl?: string;\n /**\n * Callback returning headers added to every request.\n * Called on every request so auth tokens can be refreshed without\n * recreating the client.\n */\n getHeaders?: () => Record<string, string>;\n}\n\n/**\n * Creates an HttpClient pre-configured with base URL and dynamic request\n * headers. No Provider needed - Svelte callers just pass the client around.\n *\n * @example\n * ```ts\n * const client = createCmsClient({\n * baseUrl: 'https://cms.example.com',\n * getHeaders: () => ({ Authorization: `Bearer ${token}` }),\n * });\n * ```\n */\nexport function createCmsClient(config: SvelteCmsConfig): HttpClient {\n const base = config.baseUrl ?? \"\";\n return createClient((url, init) => {\n const fullUrl = typeof url === \"string\" ? `${base}${url}` : url;\n return fetch(fullUrl, {\n ...init,\n headers: { ...init?.headers, ...config.getHeaders?.() },\n });\n });\n}\n\n// Generic async store\n\nexport interface AsyncStore<T> {\n readonly data: T | null;\n readonly error: Error | null;\n readonly loading: boolean;\n refetch: () => void;\n}\n\n/**\n * Reactive async data store using the $state rune.\n * Fires the fetcher immediately and exposes reactive loading/data/error\n * getters that Svelte components can read directly in markup.\n *\n * @example\n * ```svelte\n * <script lang=\"ts\">\n * const schemas = createAsyncStore((c) => getSchemas(c), client);\n * </script>\n * {#if schemas.loading}...{/if}\n * ```\n */\nexport function createAsyncStore<T>(\n fetcher: (client: HttpClient) => Promise<T>,\n client: HttpClient,\n): AsyncStore<T> {\n let data = $state<T | null>(null);\n let error = $state<Error | null>(null);\n let loading = $state(true);\n\n async function fetch() {\n loading = true;\n try {\n data = await fetcher(client);\n error = null;\n } catch (e) {\n error = e as Error;\n } finally {\n loading = false;\n }\n }\n\n fetch();\n\n return {\n get data() {\n return data;\n },\n get error() {\n return error;\n },\n get loading() {\n return loading;\n },\n refetch: fetch,\n };\n}\n\n/**\n * Reactive mutation primitive using the $state rune.\n * Returns data/error/loading state and a run function that triggers the\n * mutation. Unlike createAsyncStore, the mutation does not fire immediately.\n *\n * @example\n * ```svelte\n * <script lang=\"ts\">\n * const createArticle = createMutation(\n * (c, vars: { title: string }) => createArticle(c, vars),\n * client,\n * );\n * </script>\n * <button onclick={() => createArticle.run({ title: 'Hello' })}>\n * {createArticle.loading ? 'Saving...' : 'Create'}\n * </button>\n * ```\n */\nexport function createMutation<T, V>(\n mutator: (client: HttpClient, vars: V) => Promise<T>,\n client: HttpClient,\n) {\n let data = $state<T | null>(null);\n let error = $state<Error | null>(null);\n let loading = $state(false);\n\n async function run(vars: V): Promise<T> {\n loading = true;\n error = null;\n try {\n const result = await mutator(client, vars);\n data = result;\n return result;\n } catch (e) {\n error = e as Error;\n throw e;\n } finally {\n loading = false;\n }\n }\n\n return {\n get data() {\n return data;\n },\n get error() {\n return error;\n },\n get loading() {\n return loading;\n },\n run,\n };\n}\n\n// Auth store\n\nexport interface AuthState {\n user: { id: string; email: string; roles: string[] } | null;\n token: string | null;\n}\n\nexport interface AuthStore {\n readonly user: AuthState[\"user\"];\n readonly token: string | null;\n readonly isAuthenticated: boolean;\n /** Set the current user and token after a successful login. */\n setUser: (user: AuthState[\"user\"], token: string | null) => void;\n /** Clear auth state (e.g. after logout). */\n clear: () => void;\n /** Try to load the current user from the server using the stored token. */\n load: () => Promise<void>;\n}\n\n/**\n * Simple reactive auth store. The caller is responsible for calling\n * {@link AuthStore.setUser} after login and {@link AuthStore.clear} after\n * logout. Use {@link AuthStore.load} on app start to restore a session\n * from an existing cookie.\n */\nexport function createAuthStore(client: HttpClient): AuthStore {\n let state = $state<AuthState>({ user: null, token: null });\n\n return {\n get user() {\n return state.user;\n },\n get token() {\n return state.token;\n },\n get isAuthenticated() {\n return state.token !== null;\n },\n setUser(user: AuthState[\"user\"], token: string | null) {\n state = { user, token };\n },\n clear() {\n state = { user: null, token: null };\n },\n async load() {\n try {\n const user = await client.get<{\n id: string;\n email: string;\n roles: string[];\n }>(\"/api/admin/auth/me\");\n state = { ...state, user };\n } catch {\n /* not logged in */\n }\n },\n };\n}\n"],"mappings":";AAAA,SAAS,oBAAqC;AA2BvC,SAAS,gBAAgB,QAAqC;AACnE,QAAM,OAAO,OAAO,WAAW;AAC/B,SAAO,aAAa,CAAC,KAAK,SAAS;AACjC,UAAM,UAAU,OAAO,QAAQ,WAAW,GAAG,IAAI,GAAG,GAAG,KAAK;AAC5D,WAAO,MAAM,SAAS;AAAA,MACpB,GAAG;AAAA,MACH,SAAS,EAAE,GAAG,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAwBO,SAAS,iBACd,SACA,QACe;AACf,MAAI,OAAO,OAAiB,IAAI;AAChC,MAAI,QAAQ,OAAqB,IAAI;AACrC,MAAI,UAAU,OAAO,IAAI;AAEzB,iBAAeA,SAAQ;AACrB,cAAU;AACV,QAAI;AACF,aAAO,MAAM,QAAQ,MAAM;AAC3B,cAAQ;AAAA,IACV,SAAS,GAAG;AACV,cAAQ;AAAA,IACV,UAAE;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,EAAAA,OAAM;AAEN,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA,SAASA;AAAA,EACX;AACF;AAoBO,SAAS,eACd,SACA,QACA;AACA,MAAI,OAAO,OAAiB,IAAI;AAChC,MAAI,QAAQ,OAAqB,IAAI;AACrC,MAAI,UAAU,OAAO,KAAK;AAE1B,iBAAe,IAAI,MAAqB;AACtC,cAAU;AACV,YAAQ;AACR,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,QAAQ,IAAI;AACzC,aAAO;AACP,aAAO;AAAA,IACT,SAAS,GAAG;AACV,cAAQ;AACR,YAAM;AAAA,IACR,UAAE;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AA2BO,SAAS,gBAAgB,QAA+B;AAC7D,MAAI,QAAQ,OAAkB,EAAE,MAAM,MAAM,OAAO,KAAK,CAAC;AAEzD,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,kBAAkB;AACpB,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,IACA,QAAQ,MAAyB,OAAsB;AACrD,cAAQ,EAAE,MAAM,MAAM;AAAA,IACxB;AAAA,IACA,QAAQ;AACN,cAAQ,EAAE,MAAM,MAAM,OAAO,KAAK;AAAA,IACpC;AAAA,IACA,MAAM,OAAO;AACX,UAAI;AACF,cAAM,OAAO,MAAM,OAAO,IAIvB,oBAAoB;AACvB,gBAAQ,EAAE,GAAG,OAAO,KAAK;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;","names":["fetch"]}
1
+ {"version":3,"sources":["../src/runes.svelte.ts"],"sourcesContent":["/* runes.svelte.ts generated by Svelte v5.56.7 */\nimport * as $ from 'svelte/internal/client';\nimport { createClient } from \"@lyeve-labs/client\";\n\nfunction createCmsClient(config) {\n\tconst base = config.baseUrl ?? \"\";\n\n\treturn createClient((url, init) => {\n\t\tconst fullUrl = typeof url === \"string\" ? `${base}${url}` : url;\n\n\t\treturn fetch(fullUrl, {\n\t\t\t...init,\n\t\t\theaders: { ...init?.headers, ...config.getHeaders?.() }\n\t\t});\n\t});\n}\n\nfunction createAsyncStore(fetcher, client) {\n\tlet data = $.state(null);\n\tlet error = $.state(null);\n\tlet loading = $.state(true);\n\n\tasync function fetch2() {\n\t\t$.set(loading, true);\n\n\t\ttry {\n\t\t\t$.set(data, await fetcher(client), true);\n\t\t\t$.set(error, null);\n\t\t} catch(e) {\n\t\t\t$.set(error, e, true);\n\t\t} finally {\n\t\t\t$.set(loading, false);\n\t\t}\n\t}\n\n\tfetch2();\n\n\treturn {\n\t\tget data() {\n\t\t\treturn $.get(data);\n\t\t},\n\n\t\tget error() {\n\t\t\treturn $.get(error);\n\t\t},\n\n\t\tget loading() {\n\t\t\treturn $.get(loading);\n\t\t},\n\t\trefetch: fetch2\n\t};\n}\n\nfunction createMutation(mutator, client) {\n\tlet data = $.state(null);\n\tlet error = $.state(null);\n\tlet loading = $.state(false);\n\n\tasync function run(vars) {\n\t\t$.set(loading, true);\n\t\t$.set(error, null);\n\n\t\ttry {\n\t\t\tconst result = await mutator(client, vars);\n\n\t\t\t$.set(data, result, true);\n\n\t\t\treturn result;\n\t\t} catch(e) {\n\t\t\t$.set(error, e, true);\n\n\t\t\tthrow e;\n\t\t} finally {\n\t\t\t$.set(loading, false);\n\t\t}\n\t}\n\n\treturn {\n\t\tget data() {\n\t\t\treturn $.get(data);\n\t\t},\n\n\t\tget error() {\n\t\t\treturn $.get(error);\n\t\t},\n\n\t\tget loading() {\n\t\t\treturn $.get(loading);\n\t\t},\n\t\trun\n\t};\n}\n\nfunction createAuthStore(client) {\n\tlet state = $.state($.proxy({ user: null, token: null }));\n\n\treturn {\n\t\tget user() {\n\t\t\treturn $.get(state).user;\n\t\t},\n\n\t\tget token() {\n\t\t\treturn $.get(state).token;\n\t\t},\n\n\t\tget isAuthenticated() {\n\t\t\treturn $.get(state).token !== null;\n\t\t},\n\n\t\tsetUser(user, token) {\n\t\t\t$.set(state, { user, token }, true);\n\t\t},\n\n\t\tclear() {\n\t\t\t$.set(state, { user: null, token: null }, true);\n\t\t},\n\n\t\tasync load() {\n\t\t\ttry {\n\t\t\t\tconst user = await client.get(\"/api/admin/auth/me\");\n\n\t\t\t\t$.set(state, { ...$.get(state), user }, true);\n\t\t\t} catch {}\n\t\t}\n\t};\n}\n\nexport {\n\tcreateAsyncStore,\n\tcreateAuthStore,\n\tcreateCmsClient,\n\tcreateMutation\n};"],"mappings":"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","names":["state"]}
package/package.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@lyeve-labs/client-svelte",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Svelte 5 reactive stores for the LyEve Core API - thin wrapper around @lyeve-labs/client using $state runes",
5
5
  "license": "MIT",
6
6
  "author": "LyEve <info@lyeve.com>",
7
7
  "type": "module",
8
- "packageManager": "pnpm@11.25.0",
9
8
  "engines": {
10
9
  "node": ">=20"
11
10
  },
@@ -39,15 +38,6 @@
39
38
  "publishConfig": {
40
39
  "access": "public"
41
40
  },
42
- "scripts": {
43
- "dev": "tsup --watch",
44
- "build": "tsup && publint && node scripts/check-dist.mjs",
45
- "check": "tsc --noEmit",
46
- "test": "vitest run",
47
- "test:watch": "vitest",
48
- "format": "prettier --write .",
49
- "format:check": "prettier --check ."
50
- },
51
41
  "peerDependencies": {
52
42
  "@lyeve-labs/client": ">=0.2.1",
53
43
  "svelte": ">=5.0.0"
@@ -60,5 +50,14 @@
60
50
  "vitest": "^2.1.0",
61
51
  "publint": "^0.3.0",
62
52
  "prettier": "^3.4.0"
53
+ },
54
+ "scripts": {
55
+ "dev": "tsup --watch",
56
+ "build": "tsup && publint && node scripts/check-dist.mjs",
57
+ "check": "tsc --noEmit",
58
+ "test": "vitest run",
59
+ "test:watch": "vitest",
60
+ "format": "prettier --write .",
61
+ "format:check": "prettier --check ."
63
62
  }
64
- }
63
+ }