@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.
Files changed (107) hide show
  1. package/LICENSE +115 -0
  2. package/README.md +2543 -0
  3. package/dist/context.d.ts +82 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +141 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/index.d.ts +61 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +61 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/primitives/async-state.d.ts +46 -0
  12. package/dist/primitives/async-state.d.ts.map +1 -0
  13. package/dist/primitives/async-state.js +83 -0
  14. package/dist/primitives/async-state.js.map +1 -0
  15. package/dist/primitives/auth.d.ts +85 -0
  16. package/dist/primitives/auth.d.ts.map +1 -0
  17. package/dist/primitives/auth.js +147 -0
  18. package/dist/primitives/auth.js.map +1 -0
  19. package/dist/primitives/capacitor-app.d.ts +46 -0
  20. package/dist/primitives/capacitor-app.d.ts.map +1 -0
  21. package/dist/primitives/capacitor-app.js +57 -0
  22. package/dist/primitives/capacitor-app.js.map +1 -0
  23. package/dist/primitives/change-password.d.ts +36 -0
  24. package/dist/primitives/change-password.d.ts.map +1 -0
  25. package/dist/primitives/change-password.js +32 -0
  26. package/dist/primitives/change-password.js.map +1 -0
  27. package/dist/primitives/device.d.ts +48 -0
  28. package/dist/primitives/device.d.ts.map +1 -0
  29. package/dist/primitives/device.js +47 -0
  30. package/dist/primitives/device.js.map +1 -0
  31. package/dist/primitives/forms.d.ts +193 -0
  32. package/dist/primitives/forms.d.ts.map +1 -0
  33. package/dist/primitives/forms.js +309 -0
  34. package/dist/primitives/forms.js.map +1 -0
  35. package/dist/primitives/http.d.ts +176 -0
  36. package/dist/primitives/http.d.ts.map +1 -0
  37. package/dist/primitives/http.js +254 -0
  38. package/dist/primitives/http.js.map +1 -0
  39. package/dist/primitives/i18n.d.ts +146 -0
  40. package/dist/primitives/i18n.d.ts.map +1 -0
  41. package/dist/primitives/i18n.js +223 -0
  42. package/dist/primitives/i18n.js.map +1 -0
  43. package/dist/primitives/index.d.ts +27 -0
  44. package/dist/primitives/index.d.ts.map +1 -0
  45. package/dist/primitives/index.js +27 -0
  46. package/dist/primitives/index.js.map +1 -0
  47. package/dist/primitives/logger.d.ts +143 -0
  48. package/dist/primitives/logger.d.ts.map +1 -0
  49. package/dist/primitives/logger.js +165 -0
  50. package/dist/primitives/logger.js.map +1 -0
  51. package/dist/primitives/login.d.ts +37 -0
  52. package/dist/primitives/login.d.ts.map +1 -0
  53. package/dist/primitives/login.js +32 -0
  54. package/dist/primitives/login.js.map +1 -0
  55. package/dist/primitives/oauth.d.ts +102 -0
  56. package/dist/primitives/oauth.d.ts.map +1 -0
  57. package/dist/primitives/oauth.js +232 -0
  58. package/dist/primitives/oauth.js.map +1 -0
  59. package/dist/primitives/password-reset.d.ts +46 -0
  60. package/dist/primitives/password-reset.d.ts.map +1 -0
  61. package/dist/primitives/password-reset.js +49 -0
  62. package/dist/primitives/password-reset.js.map +1 -0
  63. package/dist/primitives/platform.d.ts +48 -0
  64. package/dist/primitives/platform.d.ts.map +1 -0
  65. package/dist/primitives/platform.js +47 -0
  66. package/dist/primitives/platform.js.map +1 -0
  67. package/dist/primitives/promise.d.ts +46 -0
  68. package/dist/primitives/promise.d.ts.map +1 -0
  69. package/dist/primitives/promise.js +104 -0
  70. package/dist/primitives/promise.js.map +1 -0
  71. package/dist/primitives/push.d.ts +52 -0
  72. package/dist/primitives/push.d.ts.map +1 -0
  73. package/dist/primitives/push.js +72 -0
  74. package/dist/primitives/push.js.map +1 -0
  75. package/dist/primitives/router.d.ts +170 -0
  76. package/dist/primitives/router.d.ts.map +1 -0
  77. package/dist/primitives/router.js +251 -0
  78. package/dist/primitives/router.js.map +1 -0
  79. package/dist/primitives/signup.d.ts +37 -0
  80. package/dist/primitives/signup.d.ts.map +1 -0
  81. package/dist/primitives/signup.js +32 -0
  82. package/dist/primitives/signup.js.map +1 -0
  83. package/dist/primitives/state.d.ts +132 -0
  84. package/dist/primitives/state.d.ts.map +1 -0
  85. package/dist/primitives/state.js +167 -0
  86. package/dist/primitives/state.js.map +1 -0
  87. package/dist/primitives/storage.d.ts +132 -0
  88. package/dist/primitives/storage.d.ts.map +1 -0
  89. package/dist/primitives/storage.js +275 -0
  90. package/dist/primitives/storage.js.map +1 -0
  91. package/dist/primitives/theme.d.ts +106 -0
  92. package/dist/primitives/theme.d.ts.map +1 -0
  93. package/dist/primitives/theme.js +187 -0
  94. package/dist/primitives/theme.js.map +1 -0
  95. package/dist/primitives/version.d.ts +50 -0
  96. package/dist/primitives/version.d.ts.map +1 -0
  97. package/dist/primitives/version.js +62 -0
  98. package/dist/primitives/version.js.map +1 -0
  99. package/dist/provider.d.ts +36 -0
  100. package/dist/provider.d.ts.map +1 -0
  101. package/dist/provider.jsx +71 -0
  102. package/dist/provider.jsx.map +1 -0
  103. package/dist/types.d.ts +82 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +7 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +58 -0
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Solid.js primitives for form handling.
3
+ *
4
+ * @module
5
+ */
6
+ import { createEffect, createSignal, onCleanup } from 'solid-js';
7
+ /**
8
+ * Create form primitives for form state management and validation.
9
+ *
10
+ * @param provider - Form provider that creates controllers
11
+ * @param options - Form configuration options
12
+ * @returns Form primitives object
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { createForm } from '@molecule/app-solid'
17
+ * import { createNativeFormProvider } from '@molecule/app-forms'
18
+ *
19
+ * const provider = createNativeFormProvider()
20
+ *
21
+ * function LoginForm() {
22
+ * const { register, handleSubmit, formState, isSubmitting, errors } = createForm(provider, {
23
+ * defaultValues: { email: '', password: '' },
24
+ * })
25
+ *
26
+ * const onSubmit = async (values: { email: string; password: string }) => {
27
+ * await login(values)
28
+ * }
29
+ *
30
+ * return (
31
+ * <form onSubmit={handleSubmit(onSubmit)}>
32
+ * <input {...register('email', { required: true, email: true })} />
33
+ * <Show when={errors().email}>
34
+ * <span>{errors().email}</span>
35
+ * </Show>
36
+ *
37
+ * <input {...register('password', { required: true, minLength: 8 })} type="password" />
38
+ * <Show when={errors().password}>
39
+ * <span>{errors().password}</span>
40
+ * </Show>
41
+ *
42
+ * <button type="submit" disabled={isSubmitting()}>
43
+ * {isSubmitting() ? 'Logging in...' : 'Log In'}
44
+ * </button>
45
+ * </form>
46
+ * )
47
+ * }
48
+ * ```
49
+ */
50
+ export function createForm(provider, options) {
51
+ const controller = provider.createForm(options);
52
+ const [formState, setFormState] = createSignal(controller.getState());
53
+ // Subscribe to form state changes
54
+ createEffect(() => {
55
+ const unsubscribe = controller.subscribe((newState) => {
56
+ setFormState(newState);
57
+ });
58
+ onCleanup(() => {
59
+ unsubscribe();
60
+ controller.destroy();
61
+ });
62
+ });
63
+ // Derived accessors
64
+ const isValid = () => formState().isValid;
65
+ const isDirty = () => formState().isDirty;
66
+ const isSubmitting = () => formState().isSubmitting;
67
+ const errors = () => formState().errors;
68
+ const register = (name, registerOptions) => {
69
+ return controller.register({ ...registerOptions, name: name });
70
+ };
71
+ const getValue = (name) => {
72
+ return controller.getValue(name);
73
+ };
74
+ const setValue = (name, value) => {
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ controller.setValue(name, value);
77
+ };
78
+ const getError = (name) => {
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ return controller.getError(name);
81
+ };
82
+ const setError = (name, error) => {
83
+ if (error !== undefined) {
84
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
85
+ controller.setError(name, error);
86
+ }
87
+ else {
88
+ controller.clearError(name);
89
+ }
90
+ };
91
+ const clearErrors = () => {
92
+ controller.clearErrors();
93
+ };
94
+ const handleSubmit = (onSubmit) => {
95
+ return controller.handleSubmit(onSubmit);
96
+ };
97
+ const reset = (values) => {
98
+ controller.reset(values);
99
+ };
100
+ const validate = () => {
101
+ return controller.validate();
102
+ };
103
+ return {
104
+ formState,
105
+ isValid,
106
+ isDirty,
107
+ isSubmitting,
108
+ errors,
109
+ register,
110
+ getValue,
111
+ setValue,
112
+ getError,
113
+ setError,
114
+ clearErrors,
115
+ handleSubmit,
116
+ reset,
117
+ validate,
118
+ controller,
119
+ };
120
+ }
121
+ /**
122
+ * Create a reactive accessor for a single field's state.
123
+ *
124
+ * @param controller - Form controller
125
+ * @param name - Field name to track
126
+ * @returns Accessor for the field state
127
+ *
128
+ * @example
129
+ * ```tsx
130
+ * function EmailField(props: { controller: FormController<LoginValues> }) {
131
+ * const fieldState = createFieldSignal(props.controller, 'email')
132
+ *
133
+ * return (
134
+ * <div>
135
+ * <input value={fieldState().value as string} />
136
+ * <Show when={fieldState().error}>
137
+ * <span class="error">{fieldState().error}</span>
138
+ * </Show>
139
+ * <Show when={fieldState().touched && !fieldState().valid}>
140
+ * <span class="invalid">Invalid</span>
141
+ * </Show>
142
+ * </div>
143
+ * )
144
+ * }
145
+ * ```
146
+ */
147
+ export function createFieldSignal(controller, name) {
148
+ const [fieldState, setFieldState] = createSignal(controller.getFieldState(name));
149
+ createEffect(() => {
150
+ const unsubscribe = controller.subscribe(() => {
151
+ setFieldState(controller.getFieldState(name));
152
+ });
153
+ onCleanup(unsubscribe);
154
+ });
155
+ return fieldState;
156
+ }
157
+ /**
158
+ * Create a reactive accessor that tracks a single field's value.
159
+ *
160
+ * @param controller - Form controller
161
+ * @param name - Field name to watch
162
+ * @returns Accessor for the field value
163
+ *
164
+ * @example
165
+ * ```tsx
166
+ * function PasswordStrength(props: { controller: FormController<SignUpValues> }) {
167
+ * const password = createWatchSignal(props.controller, 'password')
168
+ *
169
+ * const strength = () => {
170
+ * const val = password()
171
+ * if (!val || (val as string).length < 4) return 'weak'
172
+ * if ((val as string).length < 8) return 'medium'
173
+ * return 'strong'
174
+ * }
175
+ *
176
+ * return <div class={`strength-${strength()}`}>Password: {strength()}</div>
177
+ * }
178
+ * ```
179
+ */
180
+ export function createWatchSignal(controller, name) {
181
+ const [value, setValue] = createSignal(controller.getValue(name));
182
+ createEffect(() => {
183
+ const unsubscribe = controller.subscribe(() => {
184
+ setValue(() => controller.getValue(name));
185
+ });
186
+ onCleanup(unsubscribe);
187
+ });
188
+ return value;
189
+ }
190
+ /**
191
+ * Create form helpers bound to a specific form provider.
192
+ *
193
+ * Returns a factory object so you can create multiple forms from the same provider
194
+ * without passing it each time.
195
+ *
196
+ * @param provider - Form provider
197
+ * @returns Object with a bound createForm function
198
+ *
199
+ * @example
200
+ * ```tsx
201
+ * import { createFormHelpers } from '@molecule/app-solid'
202
+ * import { createNativeFormProvider } from '@molecule/app-forms'
203
+ *
204
+ * const { createForm } = createFormHelpers(createNativeFormProvider())
205
+ *
206
+ * function LoginForm() {
207
+ * const { register, handleSubmit, isSubmitting } = createForm({
208
+ * defaultValues: { email: '', password: '' },
209
+ * })
210
+ *
211
+ * // ...
212
+ * }
213
+ * ```
214
+ */
215
+ /**
216
+ * Creates a form helpers.
217
+ * @param provider - The provider implementation.
218
+ * @returns The created result.
219
+ */
220
+ export function createFormHelpers(provider) {
221
+ return {
222
+ createForm: (options) => createForm(provider, options),
223
+ };
224
+ }
225
+ /**
226
+ * Create form primitives from an existing controller.
227
+ *
228
+ * Useful when you have a controller created externally and want to
229
+ * wrap it with Solid reactivity.
230
+ *
231
+ * @param controller - An existing FormController
232
+ * @returns Form primitives object
233
+ *
234
+ * @example
235
+ * ```tsx
236
+ * const controller = provider.createForm({ defaultValues: { name: '' } })
237
+ *
238
+ * function NameForm() {
239
+ * const { formState, register, handleSubmit } = createFormFromController(controller)
240
+ * // ...
241
+ * }
242
+ * ```
243
+ */
244
+ export function createFormFromController(controller) {
245
+ const [formState, setFormState] = createSignal(controller.getState());
246
+ createEffect(() => {
247
+ const unsubscribe = controller.subscribe((newState) => {
248
+ setFormState(newState);
249
+ });
250
+ onCleanup(unsubscribe);
251
+ });
252
+ const isValid = () => formState().isValid;
253
+ const isDirty = () => formState().isDirty;
254
+ const isSubmitting = () => formState().isSubmitting;
255
+ const errors = () => formState().errors;
256
+ const register = (name, registerOptions) => {
257
+ return controller.register({ ...registerOptions, name: name });
258
+ };
259
+ const getValue = (name) => {
260
+ return controller.getValue(name);
261
+ };
262
+ const setValue = (name, value) => {
263
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
264
+ controller.setValue(name, value);
265
+ };
266
+ const getError = (name) => {
267
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
+ return controller.getError(name);
269
+ };
270
+ const setError = (name, error) => {
271
+ if (error !== undefined) {
272
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
+ controller.setError(name, error);
274
+ }
275
+ else {
276
+ controller.clearError(name);
277
+ }
278
+ };
279
+ const clearErrors = () => {
280
+ controller.clearErrors();
281
+ };
282
+ const handleSubmit = (onSubmit) => {
283
+ return controller.handleSubmit(onSubmit);
284
+ };
285
+ const reset = (values) => {
286
+ controller.reset(values);
287
+ };
288
+ const validate = () => {
289
+ return controller.validate();
290
+ };
291
+ return {
292
+ formState,
293
+ isValid,
294
+ isDirty,
295
+ isSubmitting,
296
+ errors,
297
+ register,
298
+ getValue,
299
+ setValue,
300
+ getError,
301
+ setError,
302
+ clearErrors,
303
+ handleSubmit,
304
+ reset,
305
+ validate,
306
+ controller,
307
+ };
308
+ }
309
+ //# sourceMappingURL=forms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/primitives/forms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Solid.js primitives for HTTP requests.
3
+ *
4
+ * @module
5
+ */
6
+ import { type Accessor, type Resource } from 'solid-js';
7
+ import type { FullRequestConfig, HttpClient, HttpResponse, RequestConfig } from '@molecule/app-http';
8
+ /**
9
+ * Create HTTP primitives for making requests.
10
+ *
11
+ * @returns HTTP methods and utilities
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * import { createHttp } from '@molecule/app-solid'
16
+ *
17
+ * function UserList() {
18
+ * const { get } = createHttp()
19
+ * const [users] = createResource(() => get<User[]>('/api/users'))
20
+ *
21
+ * return (
22
+ * <Show when={!users.loading} fallback={<Spinner />}>
23
+ * <For each={users()}>
24
+ * {(user) => <UserCard user={user} />}
25
+ * </For>
26
+ * </Show>
27
+ * )
28
+ * }
29
+ * ```
30
+ */
31
+ /**
32
+ * Creates a http.
33
+ * @returns The created result.
34
+ */
35
+ export declare function createHttp(): {
36
+ get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
37
+ post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
38
+ put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
39
+ patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
40
+ delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
41
+ request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>;
42
+ };
43
+ /**
44
+ * Create a resource for fetching data.
45
+ *
46
+ * @param url - URL string or accessor returning a URL string.
47
+ * @param config - Optional request configuration.
48
+ * @returns Solid resource
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * function UserProfile(props: { userId: string }) {
53
+ * const user = useFetch<User>(() => `/api/users/${props.userId}`)
54
+ *
55
+ * return (
56
+ * <Show when={!user.loading} fallback={<Loading />}>
57
+ * <h1>{user()?.name}</h1>
58
+ * </Show>
59
+ * )
60
+ * }
61
+ * ```
62
+ */
63
+ export declare function useFetch<T>(url: Accessor<string> | string, config?: RequestConfig): Resource<T | undefined>;
64
+ /**
65
+ * Create a mutation function.
66
+ *
67
+ * @returns Mutation function and state
68
+ *
69
+ * @example
70
+ * ```tsx
71
+ * function CreateUserForm() {
72
+ * const { mutate, isLoading, error } = useMutation<User>()
73
+ *
74
+ * const handleSubmit = async (data: CreateUserData) => {
75
+ * const user = await mutate('/api/users', data)
76
+ * console.log('Created:', user)
77
+ * }
78
+ *
79
+ * return (
80
+ * <form onSubmit={handleSubmit}>
81
+ * <Show when={error()}>
82
+ * <ErrorMessage error={error()} />
83
+ * </Show>
84
+ * <button type="submit" disabled={isLoading()}>
85
+ * Create
86
+ * </button>
87
+ * </form>
88
+ * )
89
+ * }
90
+ * ```
91
+ */
92
+ /**
93
+ * Hook for mutation.
94
+ * @returns The result.
95
+ */
96
+ export declare function useMutation<T>(): {
97
+ mutate: (url: string, payload?: unknown, method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE') => Promise<T>;
98
+ isLoading: Accessor<boolean>;
99
+ error: Accessor<Error | null>;
100
+ data: Accessor<T | null>;
101
+ reset: () => void;
102
+ };
103
+ /**
104
+ * Create a lazy query that only executes when called.
105
+ *
106
+ * @returns Query function and state
107
+ *
108
+ * @example
109
+ * ```tsx
110
+ * function SearchResults() {
111
+ * const { execute, data, isLoading } = useLazyQuery<SearchResult[]>()
112
+ *
113
+ * const handleSearch = (query: string) => {
114
+ * execute(`/api/search?q=${encodeURIComponent(query)}`)
115
+ * }
116
+ *
117
+ * return (
118
+ * <div>
119
+ * <SearchInput onSearch={handleSearch} />
120
+ * <Show when={!isLoading()} fallback={<Loading />}>
121
+ * <ResultsList results={data() ?? []} />
122
+ * </Show>
123
+ * </div>
124
+ * )
125
+ * }
126
+ * ```
127
+ */
128
+ /**
129
+ * Hook for lazy query.
130
+ * @returns The result.
131
+ */
132
+ export declare function useLazyQuery<T>(): {
133
+ execute: (url: string, config?: RequestConfig) => Promise<T>;
134
+ data: () => T | null;
135
+ isLoading: () => boolean;
136
+ error: () => Error | null;
137
+ reset: () => void;
138
+ };
139
+ /**
140
+ * Create HTTP helpers from context.
141
+ *
142
+ * @returns HTTP helper functions
143
+ */
144
+ /**
145
+ * Creates a http helpers.
146
+ * @returns The created result.
147
+ */
148
+ export declare function createHttpHelpers(): {
149
+ get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
150
+ post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
151
+ put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
152
+ patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
153
+ delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
154
+ setAuthToken: (token: string | null) => void;
155
+ getAuthToken: () => string | null;
156
+ };
157
+ /**
158
+ * Create HTTP primitives from a specific client.
159
+ *
160
+ * @param client - HTTP client
161
+ * @returns HTTP methods
162
+ */
163
+ /**
164
+ * Creates a http from client.
165
+ * @param client - The client instance.
166
+ * @returns The created result.
167
+ */
168
+ export declare function createHttpFromClient(client: HttpClient): {
169
+ get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
170
+ post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
171
+ put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
172
+ patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>;
173
+ delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>;
174
+ request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>;
175
+ };
176
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/primitives/http.ts"],"names":[],"mappings":"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"}