@simplysm/solid 13.0.31 → 13.0.33
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/README.md +39 -14
- package/dist/hooks/useLogger.js +4 -4
- package/dist/hooks/useLogger.js.map +1 -1
- package/dist/hooks/useSyncConfig.d.ts +1 -1
- package/dist/hooks/useSyncConfig.d.ts.map +1 -1
- package/dist/hooks/useSyncConfig.js +6 -4
- package/dist/hooks/useSyncConfig.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/{hooks/useClipboardValueCopy.d.ts → providers/ClipboardProvider.d.ts} +4 -3
- package/dist/providers/ClipboardProvider.d.ts.map +1 -0
- package/dist/{hooks/useClipboardValueCopy.js → providers/ClipboardProvider.js} +11 -8
- package/dist/providers/ClipboardProvider.js.map +6 -0
- package/dist/providers/ConfigContext.d.ts +15 -47
- package/dist/providers/ConfigContext.d.ts.map +1 -1
- package/dist/providers/ConfigContext.js +18 -1
- package/dist/providers/ConfigContext.js.map +3 -3
- package/dist/providers/ErrorLoggerProvider.d.ts +10 -0
- package/dist/providers/ErrorLoggerProvider.d.ts.map +1 -0
- package/dist/providers/ErrorLoggerProvider.js +23 -0
- package/dist/providers/ErrorLoggerProvider.js.map +6 -0
- package/dist/providers/LoggerContext.d.ts +38 -0
- package/dist/providers/LoggerContext.d.ts.map +1 -0
- package/dist/providers/LoggerContext.js +25 -0
- package/dist/providers/LoggerContext.js.map +6 -0
- package/dist/providers/PwaUpdateProvider.d.ts +12 -0
- package/dist/providers/PwaUpdateProvider.d.ts.map +1 -0
- package/dist/providers/PwaUpdateProvider.js +56 -0
- package/dist/providers/PwaUpdateProvider.js.map +6 -0
- package/dist/providers/ServiceClientContext.d.ts.map +1 -1
- package/dist/providers/ServiceClientContext.js +1 -3
- package/dist/providers/ServiceClientContext.js.map +1 -1
- package/dist/providers/SyncStorageContext.d.ts +42 -0
- package/dist/providers/SyncStorageContext.d.ts.map +1 -0
- package/dist/providers/SyncStorageContext.js +25 -0
- package/dist/providers/SyncStorageContext.js.map +6 -0
- package/dist/providers/ThemeContext.d.ts.map +1 -1
- package/dist/providers/ThemeContext.js +1 -1
- package/dist/providers/ThemeContext.js.map +1 -1
- package/docs/disclosure.md +1 -1
- package/docs/feedback.md +4 -4
- package/docs/form-controls.md +1 -1
- package/docs/hooks.md +8 -42
- package/docs/providers.md +116 -3
- package/docs/styling.md +1 -1
- package/package.json +16 -16
- package/src/hooks/useLogger.ts +4 -4
- package/src/hooks/useSyncConfig.ts +7 -5
- package/src/index.ts +6 -3
- package/src/{hooks/useClipboardValueCopy.ts → providers/ClipboardProvider.tsx} +6 -4
- package/src/providers/ConfigContext.tsx +48 -0
- package/src/providers/ErrorLoggerProvider.tsx +31 -0
- package/src/providers/LoggerContext.tsx +46 -0
- package/src/providers/PwaUpdateProvider.tsx +68 -0
- package/src/providers/ServiceClientContext.ts +1 -3
- package/src/providers/SyncStorageContext.tsx +52 -0
- package/src/providers/ThemeContext.tsx +1 -3
- package/dist/hooks/useClipboardValueCopy.d.ts.map +0 -1
- package/dist/hooks/useClipboardValueCopy.js.map +0 -6
- package/dist/hooks/usePwaUpdate.d.ts +0 -14
- package/dist/hooks/usePwaUpdate.d.ts.map +0 -1
- package/dist/hooks/usePwaUpdate.js +0 -50
- package/dist/hooks/usePwaUpdate.js.map +0 -6
- package/dist/providers/InitializeProvider.d.ts +0 -25
- package/dist/providers/InitializeProvider.d.ts.map +0 -1
- package/dist/providers/InitializeProvider.js +0 -60
- package/dist/providers/InitializeProvider.js.map +0 -6
- package/src/hooks/usePwaUpdate.ts +0 -73
- package/src/providers/ConfigContext.ts +0 -80
- package/src/providers/InitializeProvider.tsx +0 -79
package/README.md
CHANGED
|
@@ -37,28 +37,48 @@ export default {
|
|
|
37
37
|
|
|
38
38
|
### Provider Setup
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
Compose individual providers at the app root. Each provider is independent and optional (except `ConfigProvider` which is required).
|
|
41
41
|
|
|
42
42
|
```tsx
|
|
43
|
-
import {
|
|
43
|
+
import {
|
|
44
|
+
BusyProvider,
|
|
45
|
+
ClipboardProvider,
|
|
46
|
+
ConfigProvider,
|
|
47
|
+
ErrorLoggerProvider,
|
|
48
|
+
NotificationBanner,
|
|
49
|
+
NotificationProvider,
|
|
50
|
+
PwaUpdateProvider,
|
|
51
|
+
ThemeProvider,
|
|
52
|
+
} from "@simplysm/solid";
|
|
44
53
|
|
|
45
54
|
function App() {
|
|
46
55
|
return (
|
|
47
|
-
<
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
<ConfigProvider clientName="my-app">
|
|
57
|
+
<NotificationProvider>
|
|
58
|
+
<NotificationBanner />
|
|
59
|
+
<ErrorLoggerProvider>
|
|
60
|
+
<PwaUpdateProvider>
|
|
61
|
+
<ClipboardProvider>
|
|
62
|
+
<ThemeProvider>
|
|
63
|
+
<BusyProvider>{/* app content */}</BusyProvider>
|
|
64
|
+
</ThemeProvider>
|
|
65
|
+
</ClipboardProvider>
|
|
66
|
+
</PwaUpdateProvider>
|
|
67
|
+
</ErrorLoggerProvider>
|
|
68
|
+
</NotificationProvider>
|
|
69
|
+
</ConfigProvider>
|
|
50
70
|
);
|
|
51
71
|
}
|
|
52
72
|
```
|
|
53
73
|
|
|
54
|
-
**
|
|
74
|
+
**Optional providers** (add when needed):
|
|
55
75
|
|
|
56
|
-
|
|
|
57
|
-
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
76
|
+
| Provider | Purpose |
|
|
77
|
+
|----------|---------|
|
|
78
|
+
| `SyncStorageProvider` | Custom sync storage adapter for `useSyncConfig` (wraps above `ConfigProvider`) |
|
|
79
|
+
| `LoggerProvider` | Remote log adapter for `useLogger` (wraps above `ErrorLoggerProvider`) |
|
|
80
|
+
| `ServiceClientProvider` | WebSocket RPC client |
|
|
81
|
+
| `SharedDataProvider` | Server-side data subscriptions |
|
|
62
82
|
|
|
63
83
|
**StorageAdapter interface:**
|
|
64
84
|
|
|
@@ -169,11 +189,16 @@ import "@simplysm/solid/tailwind.css";
|
|
|
169
189
|
- [`createMountTransition`](docs/hooks.md#createmounttransition) - Mount/unmount CSS animation hook
|
|
170
190
|
- [`createIMEHandler`](docs/hooks.md#createimehandler) - IME composition delay handler
|
|
171
191
|
- [`useRouterLink`](docs/hooks.md#userouterlink) - Navigation with Ctrl/Shift+click support
|
|
172
|
-
- [`usePwaUpdate`](docs/hooks.md#usepwaupdate) - PWA Service Worker update detection
|
|
173
192
|
|
|
174
193
|
## Providers
|
|
175
194
|
|
|
176
|
-
- [`
|
|
195
|
+
- [`ConfigProvider`](docs/providers.md#configprovider) - App configuration (required, topmost)
|
|
196
|
+
- [`SyncStorageProvider`](docs/providers.md#syncstorageprovider) - Custom sync storage adapter (optional)
|
|
197
|
+
- [`LoggerProvider`](docs/providers.md#loggerprovider) - Remote log adapter (optional)
|
|
198
|
+
- [`ErrorLoggerProvider`](docs/providers.md#errorloggerprovider) - Global error capturing (window.onerror, unhandledrejection)
|
|
199
|
+
- [`PwaUpdateProvider`](docs/providers.md#pwaupdateprovider) - PWA Service Worker update detection
|
|
200
|
+
- [`ClipboardProvider`](docs/providers.md#clipboardprovider) - Form control clipboard value copy
|
|
201
|
+
- [`ThemeProvider`](docs/providers.md#themeprovider) - Dark/light/system theme
|
|
177
202
|
- [`ServiceClientProvider`](docs/providers.md#serviceclientprovider) - WebSocket RPC client provider (`useServiceClient`)
|
|
178
203
|
- [`SharedDataProvider`](docs/providers.md#shareddataprovider) - Server-side data subscription provider (`useSharedData`)
|
|
179
204
|
|
package/dist/hooks/useLogger.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { consola } from "consola";
|
|
2
|
-
import {
|
|
2
|
+
import { useLogAdapter } from "../providers/LoggerContext.js";
|
|
3
3
|
function useLogger() {
|
|
4
|
-
const
|
|
4
|
+
const logAdapter = useLogAdapter();
|
|
5
5
|
const createLogFunction = (level) => {
|
|
6
6
|
return (...args) => {
|
|
7
|
-
if (
|
|
8
|
-
void
|
|
7
|
+
if (logAdapter) {
|
|
8
|
+
void logAdapter.write(level, ...args);
|
|
9
9
|
} else {
|
|
10
10
|
consola[level](...args);
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/useLogger.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,
|
|
4
|
+
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,qBAAsC;AAWxC,SAAS,YAAoB;AAClC,QAAM,aAAa,cAAc;AAEjC,QAAM,oBAAoB,CAAC,UAAoB;AAC7C,WAAO,IAAI,SAAoB;AAC7B,UAAI,YAAY;AACd,aAAK,WAAW,MAAM,OAAO,GAAG,IAAI;AAAA,MACtC,OAAO;AACL,QAAC,QAAgB,KAAK,EAAE,GAAG,IAAI;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,kBAAkB,KAAK;AAAA,IAC5B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,MAAM,kBAAkB,MAAM;AAAA,IAC9B,OAAO,kBAAkB,OAAO;AAAA,EAClC;AACF;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -2,7 +2,7 @@ import { type Accessor, type Setter } from "solid-js";
|
|
|
2
2
|
/**
|
|
3
3
|
* Creates a reactive signal that syncs configuration data to storage.
|
|
4
4
|
*
|
|
5
|
-
* Uses `
|
|
5
|
+
* Uses `SyncStorageProvider` storage if available, otherwise falls back to `localStorage`.
|
|
6
6
|
* Designed for data that should persist and sync across devices (e.g., theme, user preferences, DataSheet configs).
|
|
7
7
|
*
|
|
8
8
|
* @param key - Storage key for the config value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSyncConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAA8B,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useSyncConfig.d.ts","sourceRoot":"","sources":["../../src/hooks/useSyncConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,EAA8B,MAAM,UAAU,CAAC;AAIlF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAClC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAuEvD"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { createEffect, createSignal } from "solid-js";
|
|
2
2
|
import { useConfig } from "../providers/ConfigContext.js";
|
|
3
|
+
import { useSyncStorage } from "../providers/SyncStorageContext.js";
|
|
3
4
|
function useSyncConfig(key, defaultValue) {
|
|
4
5
|
const config = useConfig();
|
|
6
|
+
const syncStorage = useSyncStorage();
|
|
5
7
|
const prefixedKey = `${config.clientName}.${key}`;
|
|
6
8
|
const [value, setValue] = createSignal(defaultValue);
|
|
7
9
|
const [ready, setReady] = createSignal(false);
|
|
8
10
|
const initializeFromStorage = async () => {
|
|
9
|
-
if (!
|
|
11
|
+
if (!syncStorage) {
|
|
10
12
|
try {
|
|
11
13
|
const stored = localStorage.getItem(prefixedKey);
|
|
12
14
|
if (stored !== null) {
|
|
@@ -18,7 +20,7 @@ function useSyncConfig(key, defaultValue) {
|
|
|
18
20
|
return;
|
|
19
21
|
}
|
|
20
22
|
try {
|
|
21
|
-
const stored = await
|
|
23
|
+
const stored = await syncStorage.getItem(prefixedKey);
|
|
22
24
|
if (stored !== null) {
|
|
23
25
|
setValue(() => JSON.parse(stored));
|
|
24
26
|
}
|
|
@@ -39,13 +41,13 @@ function useSyncConfig(key, defaultValue) {
|
|
|
39
41
|
if (!ready()) return;
|
|
40
42
|
const currentValue = value();
|
|
41
43
|
const serialized = JSON.stringify(currentValue);
|
|
42
|
-
if (!
|
|
44
|
+
if (!syncStorage) {
|
|
43
45
|
localStorage.setItem(prefixedKey, serialized);
|
|
44
46
|
return;
|
|
45
47
|
}
|
|
46
48
|
void (async () => {
|
|
47
49
|
try {
|
|
48
|
-
await
|
|
50
|
+
await syncStorage.setItem(prefixedKey, serialized);
|
|
49
51
|
} catch {
|
|
50
52
|
localStorage.setItem(prefixedKey, serialized);
|
|
51
53
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/hooks/useSyncConfig.ts"],
|
|
4
|
-
"mappings": "AAAA,SAAqC,cAAc,oBAAoB;AACvE,SAAS,iBAAiB;
|
|
4
|
+
"mappings": "AAAA,SAAqC,cAAc,oBAAoB;AACvE,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAuBxB,SAAS,cACd,KACA,cACuD;AACvD,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,GAAG,OAAO,UAAU,IAAI,GAAG;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAqB,YAAY;AAC3D,QAAM,CAAC,OAAO,QAAQ,IAAI,aAAa,KAAK;AAG5C,QAAM,wBAAwB,YAAY;AACxC,QAAI,CAAC,aAAa;AAEhB,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AACA,eAAS,IAAI;AACb;AAAA,IACF;AAGA,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,QAAQ,WAAW;AACpD,UAAI,WAAW,MAAM;AACnB,iBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,MAC7C;AAAA,IACF,QAAQ;AAEN,UAAI;AACF,cAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,YAAI,WAAW,MAAM;AACnB,mBAAS,MAAM,KAAK,MAAM,MAAM,CAAW;AAAA,QAC7C;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,UAAE;AACA,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAGA,OAAK,sBAAsB;AAG3B,eAAa,MAAM;AACjB,QAAI,CAAC,MAAM,EAAG;AACd,UAAM,eAAe,MAAM;AAC3B,UAAM,aAAa,KAAK,UAAU,YAAY;AAE9C,QAAI,CAAC,aAAa;AAEhB,mBAAa,QAAQ,aAAa,UAAU;AAC5C;AAAA,IACF;AAGA,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,YAAY,QAAQ,aAAa,UAAU;AAAA,MACnD,QAAQ;AAEN,qBAAa,QAAQ,aAAa,UAAU;AAAA,MAC9C;AAAA,IACF,GAAG;AAAA,EACL,CAAC;AAED,SAAO,CAAC,OAAO,UAAU,KAAK;AAChC;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -62,8 +62,12 @@ export * from "./components/feedback/print/Print";
|
|
|
62
62
|
export * from "./components/feedback/print/PrintInstanceContext";
|
|
63
63
|
export * from "./components/feedback/Progress";
|
|
64
64
|
export * from "./providers/ConfigContext";
|
|
65
|
-
export * from "./providers/
|
|
66
|
-
export
|
|
65
|
+
export * from "./providers/SyncStorageContext";
|
|
66
|
+
export * from "./providers/LoggerContext";
|
|
67
|
+
export * from "./providers/ErrorLoggerProvider";
|
|
68
|
+
export * from "./providers/PwaUpdateProvider";
|
|
69
|
+
export * from "./providers/ClipboardProvider";
|
|
70
|
+
export { useTheme, ThemeProvider } from "./providers/ThemeContext";
|
|
67
71
|
export type { ThemeMode, ResolvedTheme } from "./providers/ThemeContext";
|
|
68
72
|
export * from "./providers/ServiceClientContext";
|
|
69
73
|
export * from "./providers/ServiceClientProvider";
|
|
@@ -77,7 +81,6 @@ export * from "./hooks/usePrint";
|
|
|
77
81
|
export { createControllableSignal } from "./hooks/createControllableSignal";
|
|
78
82
|
export { createIMEHandler } from "./hooks/createIMEHandler";
|
|
79
83
|
export { createMountTransition } from "./hooks/createMountTransition";
|
|
80
|
-
export { usePwaUpdate } from "./hooks/usePwaUpdate";
|
|
81
84
|
export { useRouterLink } from "./hooks/useRouterLink";
|
|
82
85
|
export * from "./styles/tokens.styles";
|
|
83
86
|
export * from "./styles/patterns.styles";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kCAAkC,CAAC;AAGjD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,6CAA6C,CAAC;AAG5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAG7D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,oDAAoD,CAAC;AACnE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,iDAAiD,CAAC;AAChE,cAAc,yCAAyC,CAAC;AACxD,cAAc,oDAAoD,CAAC;AACnE,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAMlD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAMlD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oDAAoD,CAAC;AACnE,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AAMvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAM3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAO7C,cAAc,wDAAwD,CAAC;AACvE,cAAc,qDAAqD,CAAC;AACpE,cAAc,yDAAyD,CAAC;AACxE,cAAc,uDAAuD,CAAC;AAGtE,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,kDAAkD,CAAC;AACjE,cAAc,gCAAgC,CAAC;AAM/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -62,8 +62,12 @@ export * from "./components/feedback/print/Print.js";
|
|
|
62
62
|
export * from "./components/feedback/print/PrintInstanceContext.js";
|
|
63
63
|
export * from "./components/feedback/Progress.js";
|
|
64
64
|
export * from "./providers/ConfigContext.js";
|
|
65
|
-
export * from "./providers/
|
|
66
|
-
|
|
65
|
+
export * from "./providers/SyncStorageContext.js";
|
|
66
|
+
export * from "./providers/LoggerContext.js";
|
|
67
|
+
export * from "./providers/ErrorLoggerProvider.js";
|
|
68
|
+
export * from "./providers/PwaUpdateProvider.js";
|
|
69
|
+
export * from "./providers/ClipboardProvider.js";
|
|
70
|
+
import { useTheme, ThemeProvider } from "./providers/ThemeContext.js";
|
|
67
71
|
export * from "./providers/ServiceClientContext.js";
|
|
68
72
|
export * from "./providers/ServiceClientProvider.js";
|
|
69
73
|
export * from "./providers/shared-data/SharedDataContext.js";
|
|
@@ -76,7 +80,6 @@ export * from "./hooks/usePrint.js";
|
|
|
76
80
|
import { createControllableSignal } from "./hooks/createControllableSignal.js";
|
|
77
81
|
import { createIMEHandler } from "./hooks/createIMEHandler.js";
|
|
78
82
|
import { createMountTransition } from "./hooks/createMountTransition.js";
|
|
79
|
-
import { usePwaUpdate } from "./hooks/usePwaUpdate.js";
|
|
80
83
|
import { useRouterLink } from "./hooks/useRouterLink.js";
|
|
81
84
|
export * from "./styles/tokens.styles.js";
|
|
82
85
|
export * from "./styles/patterns.styles.js";
|
|
@@ -85,6 +88,7 @@ import { mergeStyles } from "./helpers/mergeStyles.js";
|
|
|
85
88
|
import { splitSlots } from "./helpers/splitSlots.js";
|
|
86
89
|
import { createAppStructure } from "./helpers/createAppStructure.js";
|
|
87
90
|
export {
|
|
91
|
+
ThemeProvider,
|
|
88
92
|
createAppStructure,
|
|
89
93
|
createControllableSignal,
|
|
90
94
|
createIMEHandler,
|
|
@@ -92,7 +96,6 @@ export {
|
|
|
92
96
|
mergeStyles,
|
|
93
97
|
ripple,
|
|
94
98
|
splitSlots,
|
|
95
|
-
usePwaUpdate,
|
|
96
99
|
useRouterLink,
|
|
97
100
|
useTheme
|
|
98
101
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,SAAS,
|
|
4
|
+
"mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,UAAU,qBAAqB;AAExC,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAM9B,cAAc;AACd,cAAc;AAMd,SAAS,cAAc;AAMvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type ParentComponent } from "solid-js";
|
|
1
2
|
/**
|
|
2
|
-
* 폼 컨트롤의 value를 클립보드 복사에 포함시키는
|
|
3
|
+
* 폼 컨트롤의 value를 클립보드 복사에 포함시키는 Provider
|
|
3
4
|
*
|
|
4
5
|
* @remarks
|
|
5
6
|
* 브라우저 기본 동작에서는 드래그 선택 후 복사 시 `<input>`, `<textarea>`, `<select>`의
|
|
@@ -11,5 +12,5 @@
|
|
|
11
12
|
* - `<input type="checkbox|radio">` → `.checked` ? "Y" : ""
|
|
12
13
|
* - 테이블 내에서는 셀 간 탭(`\t`), 행 간 개행(`\n`) 구분 (Excel 호환)
|
|
13
14
|
*/
|
|
14
|
-
export declare
|
|
15
|
-
//# sourceMappingURL=
|
|
15
|
+
export declare const ClipboardProvider: ParentComponent;
|
|
16
|
+
//# sourceMappingURL=ClipboardProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClipboardProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClipboardProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAmB/B,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { memo as _$memo } from "solid-js/web";
|
|
1
2
|
import { onCleanup, onMount } from "solid-js";
|
|
2
|
-
|
|
3
|
+
const ClipboardProvider = (props) => {
|
|
3
4
|
onMount(() => {
|
|
4
5
|
const handler = (e) => {
|
|
5
6
|
const sel = window.getSelection();
|
|
@@ -13,14 +14,13 @@ function useClipboardValueCopy() {
|
|
|
13
14
|
document.addEventListener("copy", handler);
|
|
14
15
|
onCleanup(() => document.removeEventListener("copy", handler));
|
|
15
16
|
});
|
|
16
|
-
|
|
17
|
+
return _$memo(() => props.children);
|
|
18
|
+
};
|
|
17
19
|
function extractTextFromRange(range) {
|
|
18
20
|
const root = range.commonAncestorContainer instanceof Element ? range.commonAncestorContainer : range.commonAncestorContainer.parentElement;
|
|
19
21
|
if (!root) return null;
|
|
20
22
|
const formSelector = 'input:not([type=hidden]), textarea, select, [role="checkbox"], [role="radio"]';
|
|
21
|
-
const hasFormElements = [...root.querySelectorAll(formSelector)].some(
|
|
22
|
-
(el) => range.intersectsNode(el)
|
|
23
|
-
);
|
|
23
|
+
const hasFormElements = [...root.querySelectorAll(formSelector)].some((el) => range.intersectsNode(el));
|
|
24
24
|
if (!hasFormElements) return null;
|
|
25
25
|
const parts = [];
|
|
26
26
|
const walk = (node) => {
|
|
@@ -100,7 +100,10 @@ function extractTextFromRange(range) {
|
|
|
100
100
|
return parts.join("").replace(/\n+$/, "");
|
|
101
101
|
}
|
|
102
102
|
function formatInputValue(input) {
|
|
103
|
-
const {
|
|
103
|
+
const {
|
|
104
|
+
type,
|
|
105
|
+
value
|
|
106
|
+
} = input;
|
|
104
107
|
if (!value) return "";
|
|
105
108
|
if (type === "date" || type === "datetime-local") {
|
|
106
109
|
const date = new Date(value);
|
|
@@ -117,6 +120,6 @@ function formatInputValue(input) {
|
|
|
117
120
|
return value;
|
|
118
121
|
}
|
|
119
122
|
export {
|
|
120
|
-
|
|
123
|
+
ClipboardProvider
|
|
121
124
|
};
|
|
122
|
-
//# sourceMappingURL=
|
|
125
|
+
//# sourceMappingURL=ClipboardProvider.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/providers/ClipboardProvider.tsx"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["onCleanup", "onMount", "ClipboardProvider", "props", "handler", "e", "sel", "window", "getSelection", "isCollapsed", "rangeCount", "range", "getRangeAt", "text", "extractTextFromRange", "clipboardData", "setData", "preventDefault", "document", "addEventListener", "removeEventListener", "_$memo", "children", "root", "commonAncestorContainer", "Element", "parentElement", "formSelector", "hasFormElements", "querySelectorAll", "some", "el", "intersectsNode", "parts", "walk", "node", "role", "getAttribute", "push", "HTMLInputElement", "type", "checked", "formatInputValue", "HTMLTextAreaElement", "v", "value", "includes", "replace", "HTMLSelectElement", "selectedOptions", "length", "textContent", "trim", "nodeType", "Node", "TEXT_NODE", "parent", "style", "getComputedStyle", "visibility", "display", "startContainer", "endContainer", "slice", "startOffset", "endOffset", "child", "childNodes", "tagName", "firstCell", "HTMLTableCellElement", "join", "input", "date", "Date", "isNaN", "getTime", "toLocaleDateString", "toLocaleString", "toLocaleTimeString"]
|
|
6
|
+
}
|
|
@@ -1,25 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* 커스텀 저장소 어댑터 인터페이스
|
|
3
|
-
*
|
|
4
|
-
* @remarks
|
|
5
|
-
* - 동기 저장소: `localStorage`, `sessionStorage` 등 그대로 전달 가능
|
|
6
|
-
* - 비동기 저장소: `getItem`이 `Promise`를 반환하는 구현체 전달
|
|
7
|
-
*/
|
|
8
|
-
export interface StorageAdapter {
|
|
9
|
-
getItem(key: string): string | null | Promise<string | null>;
|
|
10
|
-
setItem(key: string, value: string): void | Promise<unknown>;
|
|
11
|
-
removeItem(key: string): void | Promise<void>;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 로그 어댑터 인터페이스
|
|
15
|
-
*
|
|
16
|
-
* @remarks
|
|
17
|
-
* - `useLogger`에서 사용하는 로그 전송 어댑터 (DB, 서버 등)
|
|
18
|
-
* - adapter가 설정되면 consola 대신 adapter만 사용됨
|
|
19
|
-
*/
|
|
20
|
-
export interface LogAdapter {
|
|
21
|
-
write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
|
|
22
|
-
}
|
|
1
|
+
import { type ParentComponent } from "solid-js";
|
|
23
2
|
/**
|
|
24
3
|
* 앱 전역 설정
|
|
25
4
|
*/
|
|
@@ -28,39 +7,28 @@ export interface AppConfig {
|
|
|
28
7
|
* 클라이언트 식별자 (저장소 key prefix로 사용)
|
|
29
8
|
*/
|
|
30
9
|
clientName: string;
|
|
31
|
-
/**
|
|
32
|
-
* 동기화 가능 저장소 (useSyncConfig에서 사용, 없으면 localStorage로 fallback)
|
|
33
|
-
*/
|
|
34
|
-
syncStorage?: StorageAdapter;
|
|
35
|
-
/**
|
|
36
|
-
* 로그 어댑터 (useLogger에서 consola 외 추가 전송에 사용)
|
|
37
|
-
*/
|
|
38
|
-
logger?: LogAdapter;
|
|
39
|
-
/**
|
|
40
|
-
* 루트 busy 오버레이 변형 (기본값: "spinner")
|
|
41
|
-
*/
|
|
42
|
-
busyVariant?: "spinner" | "bar";
|
|
43
10
|
}
|
|
44
11
|
/**
|
|
45
12
|
* 앱 전역 설정 Context
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```tsx
|
|
49
|
-
* // 앱 루트에서 Provider 설정
|
|
50
|
-
* <ConfigContext.Provider value={{ clientName: "myApp" }}>
|
|
51
|
-
* <App />
|
|
52
|
-
* </ConfigContext.Provider>
|
|
53
|
-
*
|
|
54
|
-
* // 컴포넌트에서 사용
|
|
55
|
-
* const config = useConfig();
|
|
56
|
-
* console.log(config.clientName); // "myApp"
|
|
57
|
-
* ```
|
|
58
13
|
*/
|
|
59
14
|
export declare const ConfigContext: import("solid-js").Context<AppConfig | undefined>;
|
|
60
15
|
/**
|
|
61
16
|
* 앱 전역 설정에 접근하는 훅
|
|
62
17
|
*
|
|
63
|
-
* @throws
|
|
18
|
+
* @throws ConfigProvider가 없으면 에러 발생
|
|
64
19
|
*/
|
|
65
20
|
export declare function useConfig(): AppConfig;
|
|
21
|
+
/**
|
|
22
|
+
* 앱 전역 설정 Provider
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* <ConfigProvider clientName="myApp">
|
|
27
|
+
* <App />
|
|
28
|
+
* </ConfigProvider>
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const ConfigProvider: ParentComponent<{
|
|
32
|
+
clientName: string;
|
|
33
|
+
}>;
|
|
66
34
|
//# sourceMappingURL=ConfigContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/providers/ConfigContext.
|
|
1
|
+
{"version":3,"file":"ConfigContext.d.ts","sourceRoot":"","sources":["../../src/providers/ConfigContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,mDAA6B,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAMrC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAOlE,CAAC"}
|
|
@@ -1,14 +1,31 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
1
2
|
import { createContext, useContext } from "solid-js";
|
|
2
3
|
const ConfigContext = createContext();
|
|
3
4
|
function useConfig() {
|
|
4
5
|
const context = useContext(ConfigContext);
|
|
5
6
|
if (!context) {
|
|
6
|
-
throw new Error("useConfig\uB294
|
|
7
|
+
throw new Error("useConfig\uB294 ConfigProvider \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
|
|
7
8
|
}
|
|
8
9
|
return context;
|
|
9
10
|
}
|
|
11
|
+
const ConfigProvider = (props) => {
|
|
12
|
+
return (
|
|
13
|
+
// eslint-disable-next-line solid/reactivity -- clientName은 초기 설정값으로 변경되지 않음
|
|
14
|
+
_$createComponent(ConfigContext.Provider, {
|
|
15
|
+
get value() {
|
|
16
|
+
return {
|
|
17
|
+
clientName: props.clientName
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
get children() {
|
|
21
|
+
return props.children;
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
};
|
|
10
26
|
export {
|
|
11
27
|
ConfigContext,
|
|
28
|
+
ConfigProvider,
|
|
12
29
|
useConfig
|
|
13
30
|
};
|
|
14
31
|
//# sourceMappingURL=ConfigContext.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/providers/ConfigContext.
|
|
4
|
-
"mappings": "AAAA,
|
|
5
|
-
"names": []
|
|
3
|
+
"sources": ["../../src/providers/ConfigContext.tsx"],
|
|
4
|
+
"mappings": ";AAAA,SAASA,eAAeC,kBAAwC;AAezD,MAAMC,gBAAgBF,cAAyB;AAO/C,SAASG,YAAuB;AACrC,QAAMC,UAAUH,WAAWC,aAAa;AACxC,MAAI,CAACE,SAAS;AACZ,UAAM,IAAIC,MAAM,kHAA4C;EAC9D;AACA,SAAOD;AACT;AAYO,MAAME,iBAA2DC,WAAU;AAChF;;IACEC,kBACCN,cAAcO,UAAQ;MAAA,IAACC,QAAK;AAAA,eAAE;UAAEC,YAAYJ,MAAMI;QAAW;MAAC;MAAA,IAAAC,WAAA;AAAA,eAC5DL,MAAMK;MAAQ;IAAA,CAAA;;AAGrB;",
|
|
5
|
+
"names": ["createContext", "useContext", "ConfigContext", "useConfig", "context", "Error", "ConfigProvider", "props", "_$createComponent", "Provider", "value", "clientName", "children"]
|
|
6
6
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ParentComponent } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* 전역 에러 캡처 Provider
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* window.onerror, unhandledrejection 이벤트를 캡처하여 useLogger를 통해 로깅한다.
|
|
7
|
+
* LoggerProvider가 없으면 consola로 fallback.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ErrorLoggerProvider: ParentComponent;
|
|
10
|
+
//# sourceMappingURL=ErrorLoggerProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorLoggerProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ErrorLoggerProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3D;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAoBjC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { memo as _$memo } from "solid-js/web";
|
|
2
|
+
import { onCleanup } from "solid-js";
|
|
3
|
+
import { useLogger } from "../hooks/useLogger.js";
|
|
4
|
+
const ErrorLoggerProvider = (props) => {
|
|
5
|
+
const logger = useLogger();
|
|
6
|
+
const onError = (event) => {
|
|
7
|
+
logger.error("Uncaught error:", event.error ?? event.message);
|
|
8
|
+
};
|
|
9
|
+
const onUnhandledRejection = (event) => {
|
|
10
|
+
logger.error("Unhandled rejection:", event.reason);
|
|
11
|
+
};
|
|
12
|
+
window.addEventListener("error", onError);
|
|
13
|
+
window.addEventListener("unhandledrejection", onUnhandledRejection);
|
|
14
|
+
onCleanup(() => {
|
|
15
|
+
window.removeEventListener("error", onError);
|
|
16
|
+
window.removeEventListener("unhandledrejection", onUnhandledRejection);
|
|
17
|
+
});
|
|
18
|
+
return _$memo(() => props.children);
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
ErrorLoggerProvider
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=ErrorLoggerProvider.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/providers/ErrorLoggerProvider.tsx"],
|
|
4
|
+
"mappings": ";AAAA,SAASA,iBAAuC;AAChD,SAASC,iBAAiB;AASnB,MAAMC,sBAAwCC,WAAU;AAC7D,QAAMC,SAASH,UAAU;AAEzB,QAAMI,UAAWC,WAAsB;AACrCF,WAAOG,MAAM,mBAAmBD,MAAMC,SAASD,MAAME,OAAO;EAC9D;AAEA,QAAMC,uBAAwBH,WAAiC;AAC7DF,WAAOG,MAAM,wBAAwBD,MAAMI,MAAM;EACnD;AAEAC,SAAOC,iBAAiB,SAASP,OAAO;AACxCM,SAAOC,iBAAiB,sBAAsBH,oBAAoB;AAElET,YAAU,MAAM;AACdW,WAAOE,oBAAoB,SAASR,OAAO;AAC3CM,WAAOE,oBAAoB,sBAAsBJ,oBAAoB;EACvE,CAAC;AAED,SAAAK,OAAA,MAAUX,MAAMY,QAAQ;AAC1B;",
|
|
5
|
+
"names": ["onCleanup", "useLogger", "ErrorLoggerProvider", "props", "logger", "onError", "event", "error", "message", "onUnhandledRejection", "reason", "window", "addEventListener", "removeEventListener", "_$memo", "children"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ParentComponent } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* 로그 어댑터 인터페이스
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* - `useLogger`에서 사용하는 로그 전송 어댑터 (DB, 서버 등)
|
|
7
|
+
* - adapter가 설정되면 consola 대신 adapter만 사용됨
|
|
8
|
+
*/
|
|
9
|
+
export interface LogAdapter {
|
|
10
|
+
write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 로그 어댑터 Context
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* Provider가 없으면 `undefined` (useLogger에서 consola로 fallback)
|
|
17
|
+
*/
|
|
18
|
+
export declare const LoggerContext: import("solid-js").Context<LogAdapter | undefined>;
|
|
19
|
+
/**
|
|
20
|
+
* 로그 어댑터 Context에 접근하는 훅
|
|
21
|
+
*
|
|
22
|
+
* @returns LogAdapter 또는 undefined (Provider가 없으면)
|
|
23
|
+
*/
|
|
24
|
+
export declare function useLogAdapter(): LogAdapter | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* 로그 어댑터 Provider
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* <LoggerProvider adapter={myLogAdapter}>
|
|
31
|
+
* <App />
|
|
32
|
+
* </LoggerProvider>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare const LoggerProvider: ParentComponent<{
|
|
36
|
+
adapter: LogAdapter;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=LoggerContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoggerContext.d.ts","sourceRoot":"","sources":["../../src/providers/LoggerContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1F;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,oDAAmD,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,UAAU,GAAG,SAAS,CAEtD;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,CAKnE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
|
+
import { createContext, useContext } from "solid-js";
|
|
3
|
+
const LoggerContext = createContext(void 0);
|
|
4
|
+
function useLogAdapter() {
|
|
5
|
+
return useContext(LoggerContext);
|
|
6
|
+
}
|
|
7
|
+
const LoggerProvider = (props) => {
|
|
8
|
+
return (
|
|
9
|
+
// eslint-disable-next-line solid/reactivity -- adapter는 초기 설정값으로 변경되지 않음
|
|
10
|
+
_$createComponent(LoggerContext.Provider, {
|
|
11
|
+
get value() {
|
|
12
|
+
return props.adapter;
|
|
13
|
+
},
|
|
14
|
+
get children() {
|
|
15
|
+
return props.children;
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
export {
|
|
21
|
+
LoggerContext,
|
|
22
|
+
LoggerProvider,
|
|
23
|
+
useLogAdapter
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=LoggerContext.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/providers/LoggerContext.tsx"],
|
|
4
|
+
"mappings": ";AAAA,SAASA,eAAeC,kBAAwC;AAmBzD,MAAMC,gBAAgBF,cAAsCG,MAAS;AAOrE,SAASC,gBAAwC;AACtD,SAAOH,WAAWC,aAAa;AACjC;AAYO,MAAMG,iBAA4DC,WAAU;AACjF;;IACEC,kBACCL,cAAcM,UAAQ;MAAA,IAACC,QAAK;AAAA,eAAEH,MAAMI;MAAO;MAAA,IAAAC,WAAA;AAAA,eAAGL,MAAMK;MAAQ;IAAA,CAAA;;AAEjE;",
|
|
5
|
+
"names": ["createContext", "useContext", "LoggerContext", "undefined", "useLogAdapter", "LoggerProvider", "props", "_$createComponent", "Provider", "value", "adapter", "children"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ParentComponent } from "solid-js";
|
|
2
|
+
/**
|
|
3
|
+
* PWA Service Worker 업데이트 감지 Provider
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* 5분마다 SW 업데이트를 폴링하며, 새 버전 감지 시 알림을 표시한다.
|
|
7
|
+
* NotificationProvider 내부에서 사용해야 한다.
|
|
8
|
+
*
|
|
9
|
+
* navigator.serviceWorker가 없거나 등록된 SW가 없으면 graceful no-op.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PwaUpdateProvider: ParentComponent;
|
|
12
|
+
//# sourceMappingURL=PwaUpdateProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PwaUpdateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/PwaUpdateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3D;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAqD/B,CAAC"}
|