@molecule/app-solid 1.0.0
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/LICENSE +115 -0
- package/README.md +2543 -0
- package/dist/context.d.ts +82 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +141 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/async-state.d.ts +46 -0
- package/dist/primitives/async-state.d.ts.map +1 -0
- package/dist/primitives/async-state.js +83 -0
- package/dist/primitives/async-state.js.map +1 -0
- package/dist/primitives/auth.d.ts +85 -0
- package/dist/primitives/auth.d.ts.map +1 -0
- package/dist/primitives/auth.js +147 -0
- package/dist/primitives/auth.js.map +1 -0
- package/dist/primitives/capacitor-app.d.ts +46 -0
- package/dist/primitives/capacitor-app.d.ts.map +1 -0
- package/dist/primitives/capacitor-app.js +57 -0
- package/dist/primitives/capacitor-app.js.map +1 -0
- package/dist/primitives/change-password.d.ts +36 -0
- package/dist/primitives/change-password.d.ts.map +1 -0
- package/dist/primitives/change-password.js +32 -0
- package/dist/primitives/change-password.js.map +1 -0
- package/dist/primitives/device.d.ts +48 -0
- package/dist/primitives/device.d.ts.map +1 -0
- package/dist/primitives/device.js +47 -0
- package/dist/primitives/device.js.map +1 -0
- package/dist/primitives/forms.d.ts +193 -0
- package/dist/primitives/forms.d.ts.map +1 -0
- package/dist/primitives/forms.js +309 -0
- package/dist/primitives/forms.js.map +1 -0
- package/dist/primitives/http.d.ts +176 -0
- package/dist/primitives/http.d.ts.map +1 -0
- package/dist/primitives/http.js +254 -0
- package/dist/primitives/http.js.map +1 -0
- package/dist/primitives/i18n.d.ts +146 -0
- package/dist/primitives/i18n.d.ts.map +1 -0
- package/dist/primitives/i18n.js +223 -0
- package/dist/primitives/i18n.js.map +1 -0
- package/dist/primitives/index.d.ts +27 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +27 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/logger.d.ts +143 -0
- package/dist/primitives/logger.d.ts.map +1 -0
- package/dist/primitives/logger.js +165 -0
- package/dist/primitives/logger.js.map +1 -0
- package/dist/primitives/login.d.ts +37 -0
- package/dist/primitives/login.d.ts.map +1 -0
- package/dist/primitives/login.js +32 -0
- package/dist/primitives/login.js.map +1 -0
- package/dist/primitives/oauth.d.ts +102 -0
- package/dist/primitives/oauth.d.ts.map +1 -0
- package/dist/primitives/oauth.js +232 -0
- package/dist/primitives/oauth.js.map +1 -0
- package/dist/primitives/password-reset.d.ts +46 -0
- package/dist/primitives/password-reset.d.ts.map +1 -0
- package/dist/primitives/password-reset.js +49 -0
- package/dist/primitives/password-reset.js.map +1 -0
- package/dist/primitives/platform.d.ts +48 -0
- package/dist/primitives/platform.d.ts.map +1 -0
- package/dist/primitives/platform.js +47 -0
- package/dist/primitives/platform.js.map +1 -0
- package/dist/primitives/promise.d.ts +46 -0
- package/dist/primitives/promise.d.ts.map +1 -0
- package/dist/primitives/promise.js +104 -0
- package/dist/primitives/promise.js.map +1 -0
- package/dist/primitives/push.d.ts +52 -0
- package/dist/primitives/push.d.ts.map +1 -0
- package/dist/primitives/push.js +72 -0
- package/dist/primitives/push.js.map +1 -0
- package/dist/primitives/router.d.ts +170 -0
- package/dist/primitives/router.d.ts.map +1 -0
- package/dist/primitives/router.js +251 -0
- package/dist/primitives/router.js.map +1 -0
- package/dist/primitives/signup.d.ts +37 -0
- package/dist/primitives/signup.d.ts.map +1 -0
- package/dist/primitives/signup.js +32 -0
- package/dist/primitives/signup.js.map +1 -0
- package/dist/primitives/state.d.ts +132 -0
- package/dist/primitives/state.d.ts.map +1 -0
- package/dist/primitives/state.js +167 -0
- package/dist/primitives/state.js.map +1 -0
- package/dist/primitives/storage.d.ts +132 -0
- package/dist/primitives/storage.d.ts.map +1 -0
- package/dist/primitives/storage.js +275 -0
- package/dist/primitives/storage.js.map +1 -0
- package/dist/primitives/theme.d.ts +106 -0
- package/dist/primitives/theme.d.ts.map +1 -0
- package/dist/primitives/theme.js +187 -0
- package/dist/primitives/theme.js.map +1 -0
- package/dist/primitives/version.d.ts +50 -0
- package/dist/primitives/version.d.ts.map +1 -0
- package/dist/primitives/version.js +62 -0
- package/dist/primitives/version.js.map +1 -0
- package/dist/provider.d.ts +36 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.jsx +71 -0
- package/dist/provider.jsx.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for authentication.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { createEffect, createSignal, onCleanup } from 'solid-js';
|
|
7
|
+
import { getAuthClient } from '../context.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create auth primitives for authentication state and actions.
|
|
10
|
+
*
|
|
11
|
+
* @returns Auth primitives object
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* import { createAuth } from '@molecule/app-solid'
|
|
16
|
+
*
|
|
17
|
+
* function LoginButton() {
|
|
18
|
+
* const { isAuthenticated, user, login, logout } = createAuth()
|
|
19
|
+
*
|
|
20
|
+
* return (
|
|
21
|
+
* <Show
|
|
22
|
+
* when={isAuthenticated()}
|
|
23
|
+
* fallback={
|
|
24
|
+
* <button onClick={() => login({ email: '...', password: '...' })}>
|
|
25
|
+
* Login
|
|
26
|
+
* </button>
|
|
27
|
+
* }
|
|
28
|
+
* >
|
|
29
|
+
* <div>
|
|
30
|
+
* <span>Welcome, {user()?.name}</span>
|
|
31
|
+
* <button onClick={() => logout()}>Logout</button>
|
|
32
|
+
* </div>
|
|
33
|
+
* </Show>
|
|
34
|
+
* )
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function createAuth() {
|
|
39
|
+
const client = getAuthClient();
|
|
40
|
+
const [state, setState] = createSignal(client.getState());
|
|
41
|
+
// Subscribe to auth changes
|
|
42
|
+
createEffect(() => {
|
|
43
|
+
const unsubscribe = client.onAuthChange((newState) => {
|
|
44
|
+
setState(newState);
|
|
45
|
+
});
|
|
46
|
+
onCleanup(unsubscribe);
|
|
47
|
+
});
|
|
48
|
+
// Initialize auth state
|
|
49
|
+
createEffect(() => {
|
|
50
|
+
client.refresh().catch(() => {
|
|
51
|
+
setState((prev) => ({ ...prev, loading: false }));
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
const user = () => state().user;
|
|
55
|
+
const isAuthenticated = () => state().authenticated;
|
|
56
|
+
const isLoading = () => state().loading;
|
|
57
|
+
return {
|
|
58
|
+
state,
|
|
59
|
+
user,
|
|
60
|
+
isAuthenticated,
|
|
61
|
+
isLoading,
|
|
62
|
+
login: client.login.bind(client),
|
|
63
|
+
logout: client.logout.bind(client),
|
|
64
|
+
register: client.register.bind(client),
|
|
65
|
+
refresh: client.refresh.bind(client),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create a guard primitive that redirects unauthenticated users.
|
|
70
|
+
*
|
|
71
|
+
* @param redirectTo - Path to redirect to
|
|
72
|
+
* @returns Accessor indicating if user is allowed
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```tsx
|
|
76
|
+
* function ProtectedPage() {
|
|
77
|
+
* const isAllowed = createAuthGuard('/login')
|
|
78
|
+
*
|
|
79
|
+
* return (
|
|
80
|
+
* <Show when={isAllowed()} fallback={<div>Redirecting...</div>}>
|
|
81
|
+
* <ProtectedContent />
|
|
82
|
+
* </Show>
|
|
83
|
+
* )
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export function createAuthGuard(redirectTo) {
|
|
88
|
+
const { isAuthenticated, isLoading } = createAuth();
|
|
89
|
+
createEffect(() => {
|
|
90
|
+
if (!isLoading() && !isAuthenticated()) {
|
|
91
|
+
window.location.href = redirectTo;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return () => isAuthenticated();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create auth helpers from context.
|
|
98
|
+
*
|
|
99
|
+
* @returns Auth helper functions
|
|
100
|
+
*/
|
|
101
|
+
/**
|
|
102
|
+
* Creates a auth helpers.
|
|
103
|
+
* @returns The created result.
|
|
104
|
+
*/
|
|
105
|
+
export function createAuthHelpers() {
|
|
106
|
+
const client = getAuthClient();
|
|
107
|
+
return {
|
|
108
|
+
login: (credentials) => client.login(credentials),
|
|
109
|
+
logout: () => client.logout(),
|
|
110
|
+
register: (data) => client.register(data),
|
|
111
|
+
refresh: () => client.refresh(),
|
|
112
|
+
getUser: () => client.getUser(),
|
|
113
|
+
getToken: () => client.getToken?.() ?? null,
|
|
114
|
+
isAuthenticated: () => client.isAuthenticated(),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create auth primitives from a specific client.
|
|
119
|
+
*
|
|
120
|
+
* @param client - Auth client
|
|
121
|
+
* @returns Auth primitives
|
|
122
|
+
*/
|
|
123
|
+
export function createAuthFromClient(client) {
|
|
124
|
+
const [state, setState] = createSignal(client.getState());
|
|
125
|
+
createEffect(() => {
|
|
126
|
+
const unsubscribe = client.onAuthChange((newState) => {
|
|
127
|
+
setState(newState);
|
|
128
|
+
});
|
|
129
|
+
onCleanup(unsubscribe);
|
|
130
|
+
});
|
|
131
|
+
createEffect(() => {
|
|
132
|
+
client.refresh().catch(() => {
|
|
133
|
+
setState((prev) => ({ ...prev, loading: false }));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
state,
|
|
138
|
+
user: () => state().user,
|
|
139
|
+
isAuthenticated: () => state().authenticated,
|
|
140
|
+
isLoading: () => state().loading,
|
|
141
|
+
login: client.login.bind(client),
|
|
142
|
+
logout: client.logout.bind(client),
|
|
143
|
+
register: client.register.bind(client),
|
|
144
|
+
refresh: client.refresh.bind(client),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/primitives/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for Capacitor app initialization.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type Accessor } from 'solid-js';
|
|
7
|
+
import type { CapacitorAppOptions, CapacitorAppState } from '@molecule/app-platform';
|
|
8
|
+
/**
|
|
9
|
+
* Capacitor app primitives return type.
|
|
10
|
+
*/
|
|
11
|
+
export interface CapacitorAppPrimitives {
|
|
12
|
+
state: Accessor<CapacitorAppState>;
|
|
13
|
+
ready: Accessor<boolean>;
|
|
14
|
+
initialize: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create Capacitor app primitives for native app initialization.
|
|
18
|
+
*
|
|
19
|
+
* Wraps the core `createCapacitorApp` coordinator with Solid signals,
|
|
20
|
+
* automatically initializing and cleaning up on disposal.
|
|
21
|
+
*
|
|
22
|
+
* @param options - Capacitor app configuration options.
|
|
23
|
+
* @returns Capacitor app primitives object
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```tsx
|
|
27
|
+
* import { createCapacitorApp } from '@molecule/app-solid'
|
|
28
|
+
*
|
|
29
|
+
* function App() {
|
|
30
|
+
* const { state, ready } = createCapacitorApp({
|
|
31
|
+
* pushNotifications: true,
|
|
32
|
+
* deepLinks: true,
|
|
33
|
+
* onDeepLink: (url) => console.log('Deep link:', url),
|
|
34
|
+
* onReady: () => console.log('App ready!'),
|
|
35
|
+
* })
|
|
36
|
+
*
|
|
37
|
+
* return (
|
|
38
|
+
* <Show when={ready()} fallback={<p>Loading...</p>}>
|
|
39
|
+
* <Main />
|
|
40
|
+
* </Show>
|
|
41
|
+
* )
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function createCapacitorApp(options?: CapacitorAppOptions): CapacitorAppPrimitives;
|
|
46
|
+
//# sourceMappingURL=capacitor-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-app.d.ts","sourceRoot":"","sources":["../../src/primitives/capacitor-app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAA2B,MAAM,UAAU,CAAA;AAEjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAGpF;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IAClC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;IACxB,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,sBAAsB,CAwBxF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for Capacitor app initialization.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { createSignal, onCleanup } from 'solid-js';
|
|
7
|
+
import { createCapacitorApp as createCapacitorAppCore } from '@molecule/app-platform';
|
|
8
|
+
/**
|
|
9
|
+
* Create Capacitor app primitives for native app initialization.
|
|
10
|
+
*
|
|
11
|
+
* Wraps the core `createCapacitorApp` coordinator with Solid signals,
|
|
12
|
+
* automatically initializing and cleaning up on disposal.
|
|
13
|
+
*
|
|
14
|
+
* @param options - Capacitor app configuration options.
|
|
15
|
+
* @returns Capacitor app primitives object
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* import { createCapacitorApp } from '@molecule/app-solid'
|
|
20
|
+
*
|
|
21
|
+
* function App() {
|
|
22
|
+
* const { state, ready } = createCapacitorApp({
|
|
23
|
+
* pushNotifications: true,
|
|
24
|
+
* deepLinks: true,
|
|
25
|
+
* onDeepLink: (url) => console.log('Deep link:', url),
|
|
26
|
+
* onReady: () => console.log('App ready!'),
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <Show when={ready()} fallback={<p>Loading...</p>}>
|
|
31
|
+
* <Main />
|
|
32
|
+
* </Show>
|
|
33
|
+
* )
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function createCapacitorApp(options) {
|
|
38
|
+
const app = createCapacitorAppCore(options);
|
|
39
|
+
const [state, setState] = createSignal(app.getState());
|
|
40
|
+
const unsubscribe = app.subscribe((newState) => {
|
|
41
|
+
setState(newState);
|
|
42
|
+
});
|
|
43
|
+
// Auto-initialize
|
|
44
|
+
app.initialize().catch(() => {
|
|
45
|
+
// Error is captured in state.error via the core coordinator
|
|
46
|
+
});
|
|
47
|
+
onCleanup(() => {
|
|
48
|
+
unsubscribe();
|
|
49
|
+
app.destroy();
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
state,
|
|
53
|
+
ready: () => state().ready,
|
|
54
|
+
initialize: () => app.initialize(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=capacitor-app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-app.js","sourceRoot":"","sources":["../../src/primitives/capacitor-app.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGjE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAWrF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC9D,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAE3C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAoB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzE,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7C,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,kBAAkB;IAClB,GAAG,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;QAC1B,4DAA4D;IAC9D,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAA;QACb,GAAG,CAAC,OAAO,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK;QAC1B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitive for changing password with async state tracking.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Accessor } from 'solid-js';
|
|
7
|
+
import type { PromiseState } from '@molecule/app-utilities';
|
|
8
|
+
/**
|
|
9
|
+
* Return type for createChangePassword primitive.
|
|
10
|
+
*/
|
|
11
|
+
export interface CreateChangePasswordReturn {
|
|
12
|
+
state: Accessor<PromiseState<void>>;
|
|
13
|
+
changePassword: (oldPassword: string, newPassword: string) => Promise<void>;
|
|
14
|
+
reset: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates a change password primitive with async state tracking.
|
|
18
|
+
*
|
|
19
|
+
* @returns Change password state and action
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const { state, changePassword } = createChangePassword()
|
|
24
|
+
*
|
|
25
|
+
* return (
|
|
26
|
+
* <button
|
|
27
|
+
* onClick={() => changePassword(oldPassword(), newPassword())}
|
|
28
|
+
* disabled={state().status === 'pending'}
|
|
29
|
+
* >
|
|
30
|
+
* {state().status === 'pending' ? 'Changing...' : 'Change Password'}
|
|
31
|
+
* </button>
|
|
32
|
+
* )
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function createChangePassword(): CreateChangePasswordReturn;
|
|
36
|
+
//# sourceMappingURL=change-password.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-password.d.ts","sourceRoot":"","sources":["../../src/primitives/change-password.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAK3D;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;IACnC,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3E,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,IAAI,0BAA0B,CAOjE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitive for changing password with async state tracking.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { getAuthClient } from '../context.js';
|
|
7
|
+
import { createPromise } from './promise.js';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a change password primitive with async state tracking.
|
|
10
|
+
*
|
|
11
|
+
* @returns Change password state and action
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* const { state, changePassword } = createChangePassword()
|
|
16
|
+
*
|
|
17
|
+
* return (
|
|
18
|
+
* <button
|
|
19
|
+
* onClick={() => changePassword(oldPassword(), newPassword())}
|
|
20
|
+
* disabled={state().status === 'pending'}
|
|
21
|
+
* >
|
|
22
|
+
* {state().status === 'pending' ? 'Changing...' : 'Change Password'}
|
|
23
|
+
* </button>
|
|
24
|
+
* )
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function createChangePassword() {
|
|
28
|
+
const client = getAuthClient();
|
|
29
|
+
const { state, call, reset } = createPromise((oldPassword, newPassword) => client.changePassword(oldPassword, newPassword));
|
|
30
|
+
return { state, changePassword: call, reset };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=change-password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-password.js","sourceRoot":"","sources":["../../src/primitives/change-password.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAW5C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;IAC9B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,CAAC,WAAmB,EAAE,WAAmB,EAAE,EAAE,CACxF,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,CAChD,CAAA;IAED,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for device information.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { DeviceInfo, FeatureSupport, HardwareInfo, ScreenInfo } from '@molecule/app-device';
|
|
7
|
+
/**
|
|
8
|
+
* Device primitives return type.
|
|
9
|
+
*/
|
|
10
|
+
export interface DevicePrimitives {
|
|
11
|
+
deviceInfo: DeviceInfo;
|
|
12
|
+
screenInfo: ScreenInfo;
|
|
13
|
+
hardwareInfo: HardwareInfo;
|
|
14
|
+
featureSupport: FeatureSupport;
|
|
15
|
+
supports: (feature: keyof FeatureSupport) => boolean;
|
|
16
|
+
isOnline: () => boolean;
|
|
17
|
+
isStandalone: () => boolean;
|
|
18
|
+
language: string;
|
|
19
|
+
languages: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create device primitives for accessing device information.
|
|
23
|
+
*
|
|
24
|
+
* This is a static primitive (no reactive signals) since device info
|
|
25
|
+
* does not change during the lifecycle of the app.
|
|
26
|
+
*
|
|
27
|
+
* @returns Device primitives object
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* import { createDevice } from '@molecule/app-solid'
|
|
32
|
+
*
|
|
33
|
+
* function DeviceDetails() {
|
|
34
|
+
* const { deviceInfo, screenInfo, supports } = createDevice()
|
|
35
|
+
*
|
|
36
|
+
* return (
|
|
37
|
+
* <div>
|
|
38
|
+
* <p>Browser: {deviceInfo.browser.name}</p>
|
|
39
|
+
* <p>OS: {deviceInfo.os.name}</p>
|
|
40
|
+
* <p>Screen: {screenInfo.width}x{screenInfo.height}</p>
|
|
41
|
+
* <p>Push supported: {supports('pushNotifications') ? 'Yes' : 'No'}</p>
|
|
42
|
+
* </div>
|
|
43
|
+
* )
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function createDevice(): DevicePrimitives;
|
|
48
|
+
//# sourceMappingURL=device.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/primitives/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGhG;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,cAAc,KAAK,OAAO,CAAA;IACpD,QAAQ,EAAE,MAAM,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,CAc/C"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for device information.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { getProvider } from '@molecule/app-device';
|
|
7
|
+
/**
|
|
8
|
+
* Create device primitives for accessing device information.
|
|
9
|
+
*
|
|
10
|
+
* This is a static primitive (no reactive signals) since device info
|
|
11
|
+
* does not change during the lifecycle of the app.
|
|
12
|
+
*
|
|
13
|
+
* @returns Device primitives object
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { createDevice } from '@molecule/app-solid'
|
|
18
|
+
*
|
|
19
|
+
* function DeviceDetails() {
|
|
20
|
+
* const { deviceInfo, screenInfo, supports } = createDevice()
|
|
21
|
+
*
|
|
22
|
+
* return (
|
|
23
|
+
* <div>
|
|
24
|
+
* <p>Browser: {deviceInfo.browser.name}</p>
|
|
25
|
+
* <p>OS: {deviceInfo.os.name}</p>
|
|
26
|
+
* <p>Screen: {screenInfo.width}x{screenInfo.height}</p>
|
|
27
|
+
* <p>Push supported: {supports('pushNotifications') ? 'Yes' : 'No'}</p>
|
|
28
|
+
* </div>
|
|
29
|
+
* )
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function createDevice() {
|
|
34
|
+
const provider = getProvider();
|
|
35
|
+
return {
|
|
36
|
+
deviceInfo: provider.getDeviceInfo(),
|
|
37
|
+
screenInfo: provider.getScreenInfo(),
|
|
38
|
+
hardwareInfo: provider.getHardwareInfo(),
|
|
39
|
+
featureSupport: provider.getFeatureSupport(),
|
|
40
|
+
supports: (feature) => provider.supports(feature),
|
|
41
|
+
isOnline: () => provider.isOnline(),
|
|
42
|
+
isStandalone: () => provider.isStandalone(),
|
|
43
|
+
language: provider.getLanguage(),
|
|
44
|
+
languages: provider.getLanguages(),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/primitives/device.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAiBlD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;QACpC,UAAU,EAAE,QAAQ,CAAC,aAAa,EAAE;QACpC,YAAY,EAAE,QAAQ,CAAC,eAAe,EAAE;QACxC,cAAc,EAAE,QAAQ,CAAC,iBAAiB,EAAE;QAC5C,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QACjD,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACnC,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE;QAC3C,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solid.js primitives for form handling.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type Accessor } from 'solid-js';
|
|
7
|
+
import type { FieldRegistration, FieldState, FormController, FormOptions, FormProvider, FormState, RegisterOptions } from '@molecule/app-forms';
|
|
8
|
+
/**
|
|
9
|
+
* Result of createForm primitive.
|
|
10
|
+
*/
|
|
11
|
+
export interface CreateFormResult<T extends Record<string, unknown>> {
|
|
12
|
+
/** Reactive form state accessor. */
|
|
13
|
+
formState: Accessor<FormState<T>>;
|
|
14
|
+
/** Whether the form is currently valid. */
|
|
15
|
+
isValid: Accessor<boolean>;
|
|
16
|
+
/** Whether any field has been modified. */
|
|
17
|
+
isDirty: Accessor<boolean>;
|
|
18
|
+
/** Whether the form is currently submitting. */
|
|
19
|
+
isSubmitting: Accessor<boolean>;
|
|
20
|
+
/** Current field errors. */
|
|
21
|
+
errors: Accessor<Partial<Record<keyof T, string>>>;
|
|
22
|
+
/** Register a field for form management. */
|
|
23
|
+
register: (name: keyof T, options?: RegisterOptions) => FieldRegistration;
|
|
24
|
+
/** Get the current value of a field. */
|
|
25
|
+
getValue: <K extends keyof T>(name: K) => T[K];
|
|
26
|
+
/** Set the value of a field. */
|
|
27
|
+
setValue: <K extends keyof T>(name: K, value: T[K]) => void;
|
|
28
|
+
/** Get the error message for a field. */
|
|
29
|
+
getError: (name: keyof T) => string | undefined;
|
|
30
|
+
/** Set an error message for a field. */
|
|
31
|
+
setError: (name: keyof T, error: string | undefined) => void;
|
|
32
|
+
/** Clear all field errors. */
|
|
33
|
+
clearErrors: () => void;
|
|
34
|
+
/** Create a submit handler function. */
|
|
35
|
+
handleSubmit: (onSubmit: (values: T) => void | Promise<void>) => (event?: {
|
|
36
|
+
preventDefault?: () => void;
|
|
37
|
+
}) => Promise<void>;
|
|
38
|
+
/** Reset the form to initial or provided values. */
|
|
39
|
+
reset: (values?: Partial<T>) => void;
|
|
40
|
+
/** Validate all fields. */
|
|
41
|
+
validate: () => Promise<boolean>;
|
|
42
|
+
/** The raw FormController instance for advanced use. */
|
|
43
|
+
controller: FormController<T>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create form primitives for form state management and validation.
|
|
47
|
+
*
|
|
48
|
+
* @param provider - Form provider that creates controllers
|
|
49
|
+
* @param options - Form configuration options
|
|
50
|
+
* @returns Form primitives object
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```tsx
|
|
54
|
+
* import { createForm } from '@molecule/app-solid'
|
|
55
|
+
* import { createNativeFormProvider } from '@molecule/app-forms'
|
|
56
|
+
*
|
|
57
|
+
* const provider = createNativeFormProvider()
|
|
58
|
+
*
|
|
59
|
+
* function LoginForm() {
|
|
60
|
+
* const { register, handleSubmit, formState, isSubmitting, errors } = createForm(provider, {
|
|
61
|
+
* defaultValues: { email: '', password: '' },
|
|
62
|
+
* })
|
|
63
|
+
*
|
|
64
|
+
* const onSubmit = async (values: { email: string; password: string }) => {
|
|
65
|
+
* await login(values)
|
|
66
|
+
* }
|
|
67
|
+
*
|
|
68
|
+
* return (
|
|
69
|
+
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
70
|
+
* <input {...register('email', { required: true, email: true })} />
|
|
71
|
+
* <Show when={errors().email}>
|
|
72
|
+
* <span>{errors().email}</span>
|
|
73
|
+
* </Show>
|
|
74
|
+
*
|
|
75
|
+
* <input {...register('password', { required: true, minLength: 8 })} type="password" />
|
|
76
|
+
* <Show when={errors().password}>
|
|
77
|
+
* <span>{errors().password}</span>
|
|
78
|
+
* </Show>
|
|
79
|
+
*
|
|
80
|
+
* <button type="submit" disabled={isSubmitting()}>
|
|
81
|
+
* {isSubmitting() ? 'Logging in...' : 'Log In'}
|
|
82
|
+
* </button>
|
|
83
|
+
* </form>
|
|
84
|
+
* )
|
|
85
|
+
* }
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function createForm<T extends Record<string, unknown>>(provider: FormProvider, options: FormOptions<T>): CreateFormResult<T>;
|
|
89
|
+
/**
|
|
90
|
+
* Create a reactive accessor for a single field's state.
|
|
91
|
+
*
|
|
92
|
+
* @param controller - Form controller
|
|
93
|
+
* @param name - Field name to track
|
|
94
|
+
* @returns Accessor for the field state
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```tsx
|
|
98
|
+
* function EmailField(props: { controller: FormController<LoginValues> }) {
|
|
99
|
+
* const fieldState = createFieldSignal(props.controller, 'email')
|
|
100
|
+
*
|
|
101
|
+
* return (
|
|
102
|
+
* <div>
|
|
103
|
+
* <input value={fieldState().value as string} />
|
|
104
|
+
* <Show when={fieldState().error}>
|
|
105
|
+
* <span class="error">{fieldState().error}</span>
|
|
106
|
+
* </Show>
|
|
107
|
+
* <Show when={fieldState().touched && !fieldState().valid}>
|
|
108
|
+
* <span class="invalid">Invalid</span>
|
|
109
|
+
* </Show>
|
|
110
|
+
* </div>
|
|
111
|
+
* )
|
|
112
|
+
* }
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export declare function createFieldSignal<T extends Record<string, unknown>>(controller: FormController<T>, name: keyof T): Accessor<FieldState<T[keyof T]>>;
|
|
116
|
+
/**
|
|
117
|
+
* Create a reactive accessor that tracks a single field's value.
|
|
118
|
+
*
|
|
119
|
+
* @param controller - Form controller
|
|
120
|
+
* @param name - Field name to watch
|
|
121
|
+
* @returns Accessor for the field value
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* function PasswordStrength(props: { controller: FormController<SignUpValues> }) {
|
|
126
|
+
* const password = createWatchSignal(props.controller, 'password')
|
|
127
|
+
*
|
|
128
|
+
* const strength = () => {
|
|
129
|
+
* const val = password()
|
|
130
|
+
* if (!val || (val as string).length < 4) return 'weak'
|
|
131
|
+
* if ((val as string).length < 8) return 'medium'
|
|
132
|
+
* return 'strong'
|
|
133
|
+
* }
|
|
134
|
+
*
|
|
135
|
+
* return <div class={`strength-${strength()}`}>Password: {strength()}</div>
|
|
136
|
+
* }
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
export declare function createWatchSignal<T extends Record<string, unknown>, K extends keyof T>(controller: FormController<T>, name: K): Accessor<T[K]>;
|
|
140
|
+
/**
|
|
141
|
+
* Create form helpers bound to a specific form provider.
|
|
142
|
+
*
|
|
143
|
+
* Returns a factory object so you can create multiple forms from the same provider
|
|
144
|
+
* without passing it each time.
|
|
145
|
+
*
|
|
146
|
+
* @param provider - Form provider
|
|
147
|
+
* @returns Object with a bound createForm function
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```tsx
|
|
151
|
+
* import { createFormHelpers } from '@molecule/app-solid'
|
|
152
|
+
* import { createNativeFormProvider } from '@molecule/app-forms'
|
|
153
|
+
*
|
|
154
|
+
* const { createForm } = createFormHelpers(createNativeFormProvider())
|
|
155
|
+
*
|
|
156
|
+
* function LoginForm() {
|
|
157
|
+
* const { register, handleSubmit, isSubmitting } = createForm({
|
|
158
|
+
* defaultValues: { email: '', password: '' },
|
|
159
|
+
* })
|
|
160
|
+
*
|
|
161
|
+
* // ...
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
/**
|
|
166
|
+
* Creates a form helpers.
|
|
167
|
+
* @param provider - The provider implementation.
|
|
168
|
+
* @returns The created result.
|
|
169
|
+
*/
|
|
170
|
+
export declare function createFormHelpers(provider: FormProvider): {
|
|
171
|
+
createForm: <T extends Record<string, unknown>>(options: FormOptions<T>) => CreateFormResult<T>;
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Create form primitives from an existing controller.
|
|
175
|
+
*
|
|
176
|
+
* Useful when you have a controller created externally and want to
|
|
177
|
+
* wrap it with Solid reactivity.
|
|
178
|
+
*
|
|
179
|
+
* @param controller - An existing FormController
|
|
180
|
+
* @returns Form primitives object
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* ```tsx
|
|
184
|
+
* const controller = provider.createForm({ defaultValues: { name: '' } })
|
|
185
|
+
*
|
|
186
|
+
* function NameForm() {
|
|
187
|
+
* const { formState, register, handleSubmit } = createFormFromController(controller)
|
|
188
|
+
* // ...
|
|
189
|
+
* }
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
export declare function createFormFromController<T extends Record<string, unknown>>(controller: FormController<T>): CreateFormResult<T>;
|
|
193
|
+
//# sourceMappingURL=forms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../src/primitives/forms.ts"],"names":[],"mappings":"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"}
|