@furystack/shades-common-components 12.0.1 → 12.2.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/CHANGELOG.md +59 -0
- package/README.md +26 -0
- package/esm/components/avatar.d.ts.map +1 -1
- package/esm/components/avatar.js +3 -1
- package/esm/components/avatar.js.map +1 -1
- package/esm/components/avatar.spec.js +4 -4
- package/esm/components/avatar.spec.js.map +1 -1
- package/esm/components/cache-view.d.ts +46 -0
- package/esm/components/cache-view.d.ts.map +1 -0
- package/esm/components/cache-view.js +65 -0
- package/esm/components/cache-view.js.map +1 -0
- package/esm/components/cache-view.spec.d.ts +2 -0
- package/esm/components/cache-view.spec.d.ts.map +1 -0
- package/esm/components/cache-view.spec.js +183 -0
- package/esm/components/cache-view.spec.js.map +1 -0
- package/esm/components/icons/icon-definitions.d.ts +82 -0
- package/esm/components/icons/icon-definitions.d.ts.map +1 -1
- package/esm/components/icons/icon-definitions.js +717 -0
- package/esm/components/icons/icon-definitions.js.map +1 -1
- package/esm/components/icons/icon-definitions.spec.js +22 -2
- package/esm/components/icons/icon-definitions.spec.js.map +1 -1
- package/esm/components/icons/icon-types.d.ts +10 -0
- package/esm/components/icons/icon-types.d.ts.map +1 -1
- package/esm/components/icons/index.d.ts +1 -1
- package/esm/components/icons/index.d.ts.map +1 -1
- package/esm/components/index.d.ts +1 -0
- package/esm/components/index.d.ts.map +1 -1
- package/esm/components/index.js +1 -0
- package/esm/components/index.js.map +1 -1
- package/esm/components/page-container/index.d.ts +1 -1
- package/esm/components/page-container/index.js +1 -1
- package/esm/components/page-container/page-header.d.ts +5 -5
- package/esm/components/page-container/page-header.d.ts.map +1 -1
- package/esm/components/page-container/page-header.js +3 -3
- package/esm/components/skeleton.d.ts.map +1 -1
- package/esm/components/skeleton.js +2 -11
- package/esm/components/skeleton.js.map +1 -1
- package/esm/components/skeleton.spec.js +6 -55
- package/esm/components/skeleton.spec.js.map +1 -1
- package/esm/components/suggest/index.d.ts +1 -1
- package/esm/components/suggest/index.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/components/avatar.spec.tsx +4 -4
- package/src/components/avatar.tsx +3 -1
- package/src/components/cache-view.spec.tsx +210 -0
- package/src/components/cache-view.tsx +103 -0
- package/src/components/icons/icon-definitions.spec.ts +28 -2
- package/src/components/icons/icon-definitions.ts +759 -0
- package/src/components/icons/icon-types.ts +12 -0
- package/src/components/icons/index.ts +1 -1
- package/src/components/index.ts +1 -0
- package/src/components/page-container/index.tsx +1 -1
- package/src/components/page-container/page-header.tsx +5 -5
- package/src/components/skeleton.spec.tsx +6 -73
- package/src/components/skeleton.tsx +2 -11
- package/src/components/suggest/index.tsx +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,64 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.2.0] - 2026-02-19
|
|
4
|
+
|
|
5
|
+
### ⬆️ Dependencies
|
|
6
|
+
|
|
7
|
+
- Updated `@furystack/shades`
|
|
8
|
+
|
|
9
|
+
### ✨ Features
|
|
10
|
+
|
|
11
|
+
### Icon metadata for descriptions, categories, and search keywords
|
|
12
|
+
|
|
13
|
+
Extended the `IconDefinition` type with optional `name`, `description`, `keywords`, and `category` fields. All existing icons now include this metadata, enabling icon galleries to automatically group icons by category and support keyword-based search.
|
|
14
|
+
|
|
15
|
+
### 41 new icons
|
|
16
|
+
|
|
17
|
+
Added 41 new icon definitions covering areas such as communication (`envelope`, `messageCircle`), media (`music`, `film`, `image`, `images`), data visualization (`barChart`), development (`code`, `gamepad`, `puzzle`), and navigation (`arrowLeft`, `arrowRight`, `compass`). The icon set grew from 69 to 110 icons.
|
|
18
|
+
|
|
19
|
+
## [12.1.0] - 2026-02-11
|
|
20
|
+
|
|
21
|
+
### ✨ Features
|
|
22
|
+
|
|
23
|
+
### New `CacheView` component
|
|
24
|
+
|
|
25
|
+
Added a new `CacheView` component that renders the state of a cache entry. It subscribes to a `Cache` instance observable and handles all states automatically:
|
|
26
|
+
|
|
27
|
+
1. **Error first** — shows error UI with a retry button
|
|
28
|
+
2. **Value next** — renders the content component (triggers reload when obsolete)
|
|
29
|
+
3. **Loading last** — shows a custom loader or nothing by default
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { CacheView } from '@furystack/shades-common-components'
|
|
33
|
+
|
|
34
|
+
<CacheView cache={userCache} args={[userId]} content={UserContent} />
|
|
35
|
+
|
|
36
|
+
// With custom loader and error UI
|
|
37
|
+
<CacheView
|
|
38
|
+
cache={userCache}
|
|
39
|
+
args={[userId]}
|
|
40
|
+
content={UserContent}
|
|
41
|
+
loader={<Skeleton />}
|
|
42
|
+
error={(err, retry) => (
|
|
43
|
+
<Alert severity="error">
|
|
44
|
+
<Button onclick={retry}>Retry</Button>
|
|
45
|
+
</Alert>
|
|
46
|
+
)}
|
|
47
|
+
/>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 🐛 Bug Fixes
|
|
51
|
+
|
|
52
|
+
- Fixed `Skeleton` component background styles not rendering correctly when used inside Shadow DOM — moved gradient styles from host CSS to inline styles on the inner element
|
|
53
|
+
|
|
54
|
+
### 📚 Documentation
|
|
55
|
+
|
|
56
|
+
- Added `CacheView` usage examples to the package README
|
|
57
|
+
|
|
58
|
+
### ⬆️ Dependencies
|
|
59
|
+
|
|
60
|
+
- Added `@furystack/cache` (workspace:^) as a new dependency
|
|
61
|
+
|
|
3
62
|
## [12.0.1] - 2026-02-11
|
|
4
63
|
|
|
5
64
|
### 🧪 Tests
|
package/README.md
CHANGED
|
@@ -150,6 +150,32 @@ import { Tabs } from '@furystack/shades-common-components'
|
|
|
150
150
|
/>
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
+
### CacheView
|
|
154
|
+
|
|
155
|
+
Renders the state of a cache entry. Takes a `Cache` instance and `args`, subscribes to the observable, and handles loading, error (with retry), and loaded/obsolete states.
|
|
156
|
+
|
|
157
|
+
```tsx
|
|
158
|
+
import { CacheView } from '@furystack/shades-common-components'
|
|
159
|
+
import type { CacheWithValue } from '@furystack/cache'
|
|
160
|
+
|
|
161
|
+
const UserContent = Shade<{ data: CacheWithValue<User> }>({
|
|
162
|
+
shadowDomName: 'user-content',
|
|
163
|
+
render: ({ props }) => <div>{props.data.value.name}</div>,
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
// Basic usage
|
|
167
|
+
<CacheView cache={userCache} args={[userId]} content={UserContent} />
|
|
168
|
+
|
|
169
|
+
// With custom loader and error
|
|
170
|
+
<CacheView
|
|
171
|
+
cache={userCache}
|
|
172
|
+
args={[userId]}
|
|
173
|
+
content={UserContent}
|
|
174
|
+
loader={<Skeleton />}
|
|
175
|
+
error={(err, retry) => <Alert severity="error"><Button onclick={retry}>Retry</Button></Alert>}
|
|
176
|
+
/>
|
|
177
|
+
```
|
|
178
|
+
|
|
153
179
|
### Loader
|
|
154
180
|
|
|
155
181
|
A loading spinner component.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMvD,MAAM,MAAM,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CAAE,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;AAExG,eAAO,MAAM,MAAM;eAFoB,MAAM;eAAa,GAAG,CAAC,OAAO;;;;;4GA4EnE,CAAA"}
|
package/esm/components/avatar.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Shade, createComponent } from '@furystack/shades';
|
|
2
2
|
import { cssVariableTheme } from '../services/css-variable-theme.js';
|
|
3
|
+
import { Icon } from './icons/icon.js';
|
|
4
|
+
import { user as userIcon } from './icons/icon-definitions.js';
|
|
3
5
|
export const Avatar = Shade({
|
|
4
6
|
shadowDomName: 'shade-avatar',
|
|
5
7
|
css: {
|
|
@@ -47,7 +49,7 @@ export const Avatar = Shade({
|
|
|
47
49
|
});
|
|
48
50
|
if (hasError) {
|
|
49
51
|
return (createComponent("div", { className: "avatar-fallback-container" },
|
|
50
|
-
createComponent("div", { className: "avatar-fallback-icon" }, props.fallback ||
|
|
52
|
+
createComponent("div", { className: "avatar-fallback-icon" }, props.fallback || createComponent(Icon, { icon: userIcon, size: 48 }))));
|
|
51
53
|
}
|
|
52
54
|
return (createComponent("img", { style: {
|
|
53
55
|
width: '100%',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,7 @@ describe('Avatar component', () => {
|
|
|
28
28
|
expect(img?.alt).toBe('avatar image');
|
|
29
29
|
});
|
|
30
30
|
});
|
|
31
|
-
it('should display default fallback
|
|
31
|
+
it('should display default fallback icon when image fails to load', async () => {
|
|
32
32
|
await usingAsync(new Injector(), async (injector) => {
|
|
33
33
|
const rootElement = document.getElementById('root');
|
|
34
34
|
initializeShadeRoot({
|
|
@@ -48,9 +48,9 @@ describe('Avatar component', () => {
|
|
|
48
48
|
// After error, img should be replaced with fallback div
|
|
49
49
|
const fallbackImg = avatar?.querySelector('img');
|
|
50
50
|
expect(fallbackImg).toBeNull();
|
|
51
|
-
// The fallback div should contain the default
|
|
52
|
-
const
|
|
53
|
-
expect(
|
|
51
|
+
// The fallback div should contain the default Icon component (renders an SVG)
|
|
52
|
+
const fallbackIcon = avatar?.querySelector('svg');
|
|
53
|
+
expect(fallbackIcon).not.toBeNull();
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
56
|
it('should display custom fallback when image fails to load and fallback prop is provided', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar.spec.js","sourceRoot":"","sources":["../../src/components/avatar.spec.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,uBAAuB,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IAC9B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAmB,CAAA;YACrE,MAAM,OAAO,GAAG,gCAAgC,CAAA;YAEhD,mBAAmB,CAAC;gBAClB,QAAQ;gBACR,WAAW;gBACX,UAAU,EAAE,gBAAC,MAAM,IAAC,SAAS,EAAE,OAAO,GAAI;aAC3C,CAAC,CAAA;YAEF,MAAM,UAAU,CAAC,EAAE,CAAC,CAAA;YAEpB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YAE7B,MAAM,GAAG,GAAG,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;YACxC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAA;YAC1B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC9B,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"avatar.spec.js","sourceRoot":"","sources":["../../src/components/avatar.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Cache, CacheWithValue } from '@furystack/cache';
|
|
2
|
+
import type { ShadeComponent } from '@furystack/shades';
|
|
3
|
+
/**
|
|
4
|
+
* Props for the CacheView component.
|
|
5
|
+
* @typeParam TData - The type of data stored in the cache
|
|
6
|
+
* @typeParam TArgs - The tuple type of arguments used to identify the cache entry
|
|
7
|
+
*/
|
|
8
|
+
export type CacheViewProps<TData, TArgs extends any[]> = {
|
|
9
|
+
/** The cache instance to observe and control */
|
|
10
|
+
cache: Cache<TData, TArgs>;
|
|
11
|
+
/** The arguments identifying which cache entry to display */
|
|
12
|
+
args: TArgs;
|
|
13
|
+
/** Shades component rendered when a value is available (loaded or obsolete). Receives CacheWithValue<TData>. */
|
|
14
|
+
content: ShadeComponent<{
|
|
15
|
+
data: CacheWithValue<TData>;
|
|
16
|
+
}>;
|
|
17
|
+
/** Optional custom loader element. Default: null (nothing shown when loading). */
|
|
18
|
+
loader?: JSX.Element;
|
|
19
|
+
/**
|
|
20
|
+
* Optional custom error UI. Receives the error and a retry callback.
|
|
21
|
+
* The retry callback calls cache.reload(...args).
|
|
22
|
+
* If not provided, a default Result + retry Button is shown.
|
|
23
|
+
*/
|
|
24
|
+
error?: (error: unknown, retry: () => void) => JSX.Element;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* CacheView renders the state of a cache entry for the given cache + args.
|
|
28
|
+
*
|
|
29
|
+
* It subscribes to the cache observable and handles all states:
|
|
30
|
+
* 1. **Error first** - If the cache entry has failed, shows the error UI with a retry button.
|
|
31
|
+
* 2. **Value next** - If the entry has a value (loaded or obsolete), renders the content component.
|
|
32
|
+
* When obsolete, it also triggers a reload automatically.
|
|
33
|
+
* 3. **Loading last** - If there is no value and no error, shows the loader (or null by default).
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```tsx
|
|
37
|
+
* const MyContent = Shade<{ data: CacheWithValue<User> }>({
|
|
38
|
+
* shadowDomName: 'my-content',
|
|
39
|
+
* render: ({ props }) => <div>{props.data.value.name}</div>,
|
|
40
|
+
* })
|
|
41
|
+
*
|
|
42
|
+
* <CacheView cache={userCache} args={[userId]} content={MyContent} />
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare const CacheView: <TData, TArgs extends any[]>(props: CacheViewProps<TData, TArgs>) => JSX.Element;
|
|
46
|
+
//# sourceMappingURL=cache-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-view.d.ts","sourceRoot":"","sources":["../../src/components/cache-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAMvD;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,EAAE,IAAI;IACvD,gDAAgD;IAChD,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAC1B,6DAA6D;IAC7D,IAAI,EAAE,KAAK,CAAA;IACX,gHAAgH;IAChH,OAAO,EAAE,cAAc,CAAC;QAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,CAAA;KAAE,CAAC,CAAA;IACxD,kFAAkF;IAClF,MAAM,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK,GAAG,CAAC,OAAO,CAAA;CAC3D,CAAA;AAWD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,OA4C/F,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { hasCacheValue, isFailedCacheResult, isObsoleteCacheResult } from '@furystack/cache';
|
|
2
|
+
import { Shade, createComponent } from '@furystack/shades';
|
|
3
|
+
import { Button } from './button.js';
|
|
4
|
+
import { Result } from './result.js';
|
|
5
|
+
const getDefaultErrorUi = (error, retry) => (createComponent(Result, { status: "error", title: "Something went wrong", subtitle: String(error) },
|
|
6
|
+
createComponent(Button, { variant: "outlined", onclick: retry }, "Retry")));
|
|
7
|
+
/**
|
|
8
|
+
* CacheView renders the state of a cache entry for the given cache + args.
|
|
9
|
+
*
|
|
10
|
+
* It subscribes to the cache observable and handles all states:
|
|
11
|
+
* 1. **Error first** - If the cache entry has failed, shows the error UI with a retry button.
|
|
12
|
+
* 2. **Value next** - If the entry has a value (loaded or obsolete), renders the content component.
|
|
13
|
+
* When obsolete, it also triggers a reload automatically.
|
|
14
|
+
* 3. **Loading last** - If there is no value and no error, shows the loader (or null by default).
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const MyContent = Shade<{ data: CacheWithValue<User> }>({
|
|
19
|
+
* shadowDomName: 'my-content',
|
|
20
|
+
* render: ({ props }) => <div>{props.data.value.name}</div>,
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* <CacheView cache={userCache} args={[userId]} content={MyContent} />
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export const CacheView = Shade({
|
|
27
|
+
shadowDomName: 'shade-cache-view',
|
|
28
|
+
render: ({ props, useObservable, useState }) => {
|
|
29
|
+
const { cache, args, content, loader, error } = props;
|
|
30
|
+
const argsKey = JSON.stringify(args);
|
|
31
|
+
const observable = cache.getObservable(...args);
|
|
32
|
+
const [result] = useObservable(`cache-${argsKey}`, observable);
|
|
33
|
+
const [lastReloadedArgsKey, setLastReloadedArgsKey] = useState('lastReloadedArgsKey', null);
|
|
34
|
+
const retry = () => {
|
|
35
|
+
cache.reload(...args).catch(() => {
|
|
36
|
+
/* error state will be set by cache */
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
// 1. Error first
|
|
40
|
+
if (isFailedCacheResult(result)) {
|
|
41
|
+
const errorRenderer = error ?? getDefaultErrorUi;
|
|
42
|
+
return errorRenderer(result.error, retry);
|
|
43
|
+
}
|
|
44
|
+
// 2. Value next
|
|
45
|
+
if (hasCacheValue(result)) {
|
|
46
|
+
if (isObsoleteCacheResult(result)) {
|
|
47
|
+
if (lastReloadedArgsKey !== argsKey) {
|
|
48
|
+
setLastReloadedArgsKey(argsKey);
|
|
49
|
+
cache.reload(...args).catch(() => {
|
|
50
|
+
/* error state will be set by cache */
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else if (lastReloadedArgsKey !== null) {
|
|
55
|
+
setLastReloadedArgsKey(null);
|
|
56
|
+
}
|
|
57
|
+
return createComponent(content, {
|
|
58
|
+
data: result,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// 3. Loading last
|
|
62
|
+
return loader ?? null;
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=cache-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-view.js","sourceRoot":"","sources":["../../src/components/cache-view.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAwBpC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAE,KAAiB,EAAe,EAAE,CAC3E,CACE,gBAAC,MAAM,IAAC,MAAM,EAAC,OAAO,EAAC,KAAK,EAAC,sBAAsB,EAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;IACzE,gBAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,OAAO,EAAE,KAAK,YAEhC,CACF,CACgB,CAAA;AAE7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAqF,KAAK,CAAC;IAC/G,aAAa,EAAE,kBAAkB;IACjC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAsB,EAAE;QACjE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAA;QAE/C,MAAM,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,SAAS,OAAO,EAAE,EAAE,UAAU,CAAC,CAAA;QAE9D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAgB,qBAAqB,EAAE,IAAI,CAAC,CAAA;QAE1G,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC/B,sCAAsC;YACxC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,iBAAiB;QACjB,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,KAAK,IAAI,iBAAiB,CAAA;YAChD,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;QAED,gBAAgB;QAChB,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,IAAI,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClC,IAAI,mBAAmB,KAAK,OAAO,EAAE,CAAC;oBACpC,sBAAsB,CAAC,OAAO,CAAC,CAAA;oBAC/B,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC/B,sCAAsC;oBACxC,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,mBAAmB,KAAK,IAAI,EAAE,CAAC;gBACxC,sBAAsB,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;YACD,OAAO,eAAe,CAAC,OAA4D,EAAE;gBACnF,IAAI,EAAE,MAAM;aACb,CAA2B,CAAA;QAC9B,CAAC;QAED,kBAAkB;QAClB,OAAO,MAAM,IAAI,IAAI,CAAA;IACvB,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-view.spec.d.ts","sourceRoot":"","sources":["../../src/components/cache-view.spec.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Cache } from '@furystack/cache';
|
|
2
|
+
import { Shade, createComponent, flushUpdates } from '@furystack/shades';
|
|
3
|
+
import { sleepAsync } from '@furystack/utils';
|
|
4
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { CacheView } from './cache-view.js';
|
|
6
|
+
const TestContent = Shade({
|
|
7
|
+
shadowDomName: 'test-cache-content',
|
|
8
|
+
render: ({ props }) => createComponent("span", { className: "content-value" }, props.data.value),
|
|
9
|
+
});
|
|
10
|
+
const renderCacheView = async (cache, args, options) => {
|
|
11
|
+
const el = (createComponent("div", null,
|
|
12
|
+
createComponent(CacheView, { cache: cache, args: args, content: TestContent, loader: options?.loader, error: options?.error })));
|
|
13
|
+
const cacheView = el.firstElementChild;
|
|
14
|
+
cacheView.updateComponent();
|
|
15
|
+
await flushUpdates();
|
|
16
|
+
return { container: el, cacheView };
|
|
17
|
+
};
|
|
18
|
+
describe('CacheView', () => {
|
|
19
|
+
it('should be defined', () => {
|
|
20
|
+
expect(CacheView).toBeDefined();
|
|
21
|
+
expect(typeof CacheView).toBe('function');
|
|
22
|
+
});
|
|
23
|
+
it('should create a cache-view element', () => {
|
|
24
|
+
const cache = new Cache({ load: async (key) => key });
|
|
25
|
+
const el = (createComponent(CacheView, { cache: cache, args: ['test'], content: TestContent }));
|
|
26
|
+
expect(el).toBeDefined();
|
|
27
|
+
expect(el.tagName?.toLowerCase()).toBe('shade-cache-view');
|
|
28
|
+
cache[Symbol.dispose]();
|
|
29
|
+
});
|
|
30
|
+
describe('loading state', () => {
|
|
31
|
+
it('should render null by default when loading', async () => {
|
|
32
|
+
const cache = new Cache({
|
|
33
|
+
load: () => new Promise(() => { }),
|
|
34
|
+
});
|
|
35
|
+
const { cacheView } = await renderCacheView(cache, ['test']);
|
|
36
|
+
expect(cacheView.querySelector('test-cache-content')).toBeNull();
|
|
37
|
+
expect(cacheView.querySelector('shade-result')).toBeNull();
|
|
38
|
+
cache[Symbol.dispose]();
|
|
39
|
+
});
|
|
40
|
+
it('should render custom loader when provided', async () => {
|
|
41
|
+
const cache = new Cache({
|
|
42
|
+
load: () => new Promise(() => { }),
|
|
43
|
+
});
|
|
44
|
+
const { cacheView } = await renderCacheView(cache, ['test'], {
|
|
45
|
+
loader: (createComponent("span", { className: "custom-loader" }, "Loading...")),
|
|
46
|
+
});
|
|
47
|
+
const loader = cacheView.querySelector('.custom-loader');
|
|
48
|
+
expect(loader).not.toBeNull();
|
|
49
|
+
expect(loader?.textContent).toBe('Loading...');
|
|
50
|
+
cache[Symbol.dispose]();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('loaded state', () => {
|
|
54
|
+
it('should render content when cache has loaded value', async () => {
|
|
55
|
+
const cache = new Cache({ load: async (key) => `Hello ${key}` });
|
|
56
|
+
await cache.get('world');
|
|
57
|
+
const { cacheView } = await renderCacheView(cache, ['world']);
|
|
58
|
+
const contentEl = cacheView.querySelector('test-cache-content');
|
|
59
|
+
expect(contentEl).not.toBeNull();
|
|
60
|
+
const contentComponent = contentEl;
|
|
61
|
+
contentComponent.updateComponent();
|
|
62
|
+
await flushUpdates();
|
|
63
|
+
const valueEl = contentComponent.querySelector('.content-value');
|
|
64
|
+
expect(valueEl?.textContent).toBe('Hello world');
|
|
65
|
+
cache[Symbol.dispose]();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('failed state', () => {
|
|
69
|
+
it('should render default error UI when cache has failed', async () => {
|
|
70
|
+
const cache = new Cache({
|
|
71
|
+
load: async () => {
|
|
72
|
+
throw new Error('Test failure');
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
await cache.get('test');
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// expected
|
|
80
|
+
}
|
|
81
|
+
const { cacheView } = await renderCacheView(cache, ['test']);
|
|
82
|
+
const resultEl = cacheView.querySelector('shade-result');
|
|
83
|
+
expect(resultEl).not.toBeNull();
|
|
84
|
+
const resultComponent = resultEl;
|
|
85
|
+
resultComponent.updateComponent();
|
|
86
|
+
await flushUpdates();
|
|
87
|
+
expect(resultComponent.querySelector('.result-title')?.textContent).toBe('Something went wrong');
|
|
88
|
+
cache[Symbol.dispose]();
|
|
89
|
+
});
|
|
90
|
+
it('should render custom error UI when error prop is provided', async () => {
|
|
91
|
+
const cache = new Cache({
|
|
92
|
+
load: async () => {
|
|
93
|
+
throw new Error('Custom failure');
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
try {
|
|
97
|
+
await cache.get('test');
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// expected
|
|
101
|
+
}
|
|
102
|
+
const customError = vi.fn((err, _retry) => (createComponent("span", { className: "custom-error" }, String(err))));
|
|
103
|
+
const { cacheView } = await renderCacheView(cache, ['test'], { error: customError });
|
|
104
|
+
expect(customError).toHaveBeenCalledOnce();
|
|
105
|
+
expect(customError.mock.calls[0][0]).toBeInstanceOf(Error);
|
|
106
|
+
const customErrorEl = cacheView.querySelector('.custom-error');
|
|
107
|
+
expect(customErrorEl).not.toBeNull();
|
|
108
|
+
cache[Symbol.dispose]();
|
|
109
|
+
});
|
|
110
|
+
it('should not render content when failed even if stale value exists', async () => {
|
|
111
|
+
const cache = new Cache({ load: async (key) => key });
|
|
112
|
+
await cache.get('test');
|
|
113
|
+
cache.setExplicitValue({
|
|
114
|
+
loadArgs: ['test'],
|
|
115
|
+
value: { status: 'failed', error: new Error('fail'), value: 'stale', updatedAt: new Date() },
|
|
116
|
+
});
|
|
117
|
+
const { cacheView } = await renderCacheView(cache, ['test']);
|
|
118
|
+
expect(cacheView.querySelector('test-cache-content')).toBeNull();
|
|
119
|
+
expect(cacheView.querySelector('shade-result')).not.toBeNull();
|
|
120
|
+
cache[Symbol.dispose]();
|
|
121
|
+
});
|
|
122
|
+
it('should call cache.reload when retry is invoked', async () => {
|
|
123
|
+
const loadFn = vi.fn(async () => {
|
|
124
|
+
throw new Error('fail');
|
|
125
|
+
});
|
|
126
|
+
const cache = new Cache({ load: loadFn });
|
|
127
|
+
try {
|
|
128
|
+
await cache.get('test');
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// expected
|
|
132
|
+
}
|
|
133
|
+
let capturedRetry;
|
|
134
|
+
const customError = (_err, retry) => {
|
|
135
|
+
capturedRetry = retry;
|
|
136
|
+
return (createComponent("span", { className: "custom-error" }, "Error"));
|
|
137
|
+
};
|
|
138
|
+
await renderCacheView(cache, ['test'], { error: customError });
|
|
139
|
+
expect(capturedRetry).toBeDefined();
|
|
140
|
+
loadFn.mockResolvedValueOnce('recovered');
|
|
141
|
+
capturedRetry();
|
|
142
|
+
await sleepAsync(50);
|
|
143
|
+
const observable = cache.getObservable('test');
|
|
144
|
+
const result = observable.getValue();
|
|
145
|
+
expect(result.status).toBe('loaded');
|
|
146
|
+
expect(result.value).toBe('recovered');
|
|
147
|
+
cache[Symbol.dispose]();
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe('obsolete state', () => {
|
|
151
|
+
it('should render content when obsolete and trigger reload', async () => {
|
|
152
|
+
const loadFn = vi.fn(async (key) => `Hello ${key}`);
|
|
153
|
+
const cache = new Cache({ load: loadFn });
|
|
154
|
+
await cache.get('test');
|
|
155
|
+
cache.setObsolete('test');
|
|
156
|
+
const { cacheView } = await renderCacheView(cache, ['test']);
|
|
157
|
+
const contentEl = cacheView.querySelector('test-cache-content');
|
|
158
|
+
expect(contentEl).not.toBeNull();
|
|
159
|
+
await sleepAsync(50);
|
|
160
|
+
// reload should have been called (initial load + obsolete reload)
|
|
161
|
+
expect(loadFn).toHaveBeenCalledTimes(2);
|
|
162
|
+
cache[Symbol.dispose]();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('error takes priority over value', () => {
|
|
166
|
+
it('should show error when failed with value, not content', async () => {
|
|
167
|
+
const cache = new Cache({ load: async (key) => key });
|
|
168
|
+
await cache.get('test');
|
|
169
|
+
const failedWithValue = {
|
|
170
|
+
status: 'failed',
|
|
171
|
+
error: new Error('whoops'),
|
|
172
|
+
value: 'stale-data',
|
|
173
|
+
updatedAt: new Date(),
|
|
174
|
+
};
|
|
175
|
+
cache.setExplicitValue({ loadArgs: ['test'], value: failedWithValue });
|
|
176
|
+
const { cacheView } = await renderCacheView(cache, ['test']);
|
|
177
|
+
expect(cacheView.querySelector('test-cache-content')).toBeNull();
|
|
178
|
+
expect(cacheView.querySelector('shade-result')).not.toBeNull();
|
|
179
|
+
cache[Symbol.dispose]();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
//# sourceMappingURL=cache-view.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-view.spec.js","sourceRoot":"","sources":["../../src/components/cache-view.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -137,4 +137,86 @@ export declare const share: IconDefinition;
|
|
|
137
137
|
export declare const play: IconDefinition;
|
|
138
138
|
/** Pause bars */
|
|
139
139
|
export declare const pause: IconDefinition;
|
|
140
|
+
/** Envelope for email / mail */
|
|
141
|
+
export declare const envelope: IconDefinition;
|
|
142
|
+
/** Bar chart for statistics / analytics */
|
|
143
|
+
export declare const barChart: IconDefinition;
|
|
144
|
+
/** Multiple people for groups / teams */
|
|
145
|
+
export declare const users: IconDefinition;
|
|
146
|
+
/** File with text lines for notes / documents */
|
|
147
|
+
export declare const fileText: IconDefinition;
|
|
148
|
+
/** Exit / logout arrow for sign out */
|
|
149
|
+
export declare const logOut: IconDefinition;
|
|
150
|
+
/** Briefcase for work / professional */
|
|
151
|
+
export declare const briefcase: IconDefinition;
|
|
152
|
+
/** Filled circle / dot for status indicators */
|
|
153
|
+
export declare const circleDot: IconDefinition;
|
|
154
|
+
/** Keyboard for input / shortcuts */
|
|
155
|
+
export declare const keyboard: IconDefinition;
|
|
156
|
+
/** Stacked layers for depth / pages */
|
|
157
|
+
export declare const layers: IconDefinition;
|
|
158
|
+
/** Checked checkbox for completed items */
|
|
159
|
+
export declare const checkSquare: IconDefinition;
|
|
160
|
+
/** Fire / flame for trending / hot */
|
|
161
|
+
export declare const flame: IconDefinition;
|
|
162
|
+
/** Wind / breeze for weather or speed */
|
|
163
|
+
export declare const wind: IconDefinition;
|
|
164
|
+
/** Slider controls for adjustments */
|
|
165
|
+
export declare const sliders: IconDefinition;
|
|
166
|
+
/** Crossing arrows for shuffle / random */
|
|
167
|
+
export declare const shuffle: IconDefinition;
|
|
168
|
+
/** Stop circle for halt / block */
|
|
169
|
+
export declare const stopCircle: IconDefinition;
|
|
170
|
+
/** Left arrow for navigation */
|
|
171
|
+
export declare const arrowLeft: IconDefinition;
|
|
172
|
+
/** Right arrow for navigation */
|
|
173
|
+
export declare const arrowRight: IconDefinition;
|
|
174
|
+
/** Hash / number sign */
|
|
175
|
+
export declare const hash: IconDefinition;
|
|
176
|
+
/** Deciduous tree for nature */
|
|
177
|
+
export declare const treeDeciduous: IconDefinition;
|
|
178
|
+
/** Music note for audio */
|
|
179
|
+
export declare const music: IconDefinition;
|
|
180
|
+
/** Picture frame for images */
|
|
181
|
+
export declare const image: IconDefinition;
|
|
182
|
+
/** Film strip for movies / video */
|
|
183
|
+
export declare const film: IconDefinition;
|
|
184
|
+
/** Party popper for celebration */
|
|
185
|
+
export declare const partyPopper: IconDefinition;
|
|
186
|
+
/** Chat bubble for messages / comments */
|
|
187
|
+
export declare const messageCircle: IconDefinition;
|
|
188
|
+
/** Multiple images for gallery / carousel */
|
|
189
|
+
export declare const images: IconDefinition;
|
|
190
|
+
/** Text / typography letter for fonts */
|
|
191
|
+
export declare const type: IconDefinition;
|
|
192
|
+
/** Rocket for launch / deploy */
|
|
193
|
+
export declare const rocket: IconDefinition;
|
|
194
|
+
/** Alert siren for urgent notifications */
|
|
195
|
+
export declare const siren: IconDefinition;
|
|
196
|
+
/** Light bulb for ideas / tips */
|
|
197
|
+
export declare const lightbulb: IconDefinition;
|
|
198
|
+
/** Flag for milestones / reporting */
|
|
199
|
+
export declare const flag: IconDefinition;
|
|
200
|
+
/** Dollar sign for money / pricing */
|
|
201
|
+
export declare const dollarSign: IconDefinition;
|
|
202
|
+
/** Bidirectional horizontal arrow for exchange / compare */
|
|
203
|
+
export declare const arrowLeftRight: IconDefinition;
|
|
204
|
+
/** Magic wand for transformations */
|
|
205
|
+
export declare const wand: IconDefinition;
|
|
206
|
+
/** Game controller for gaming */
|
|
207
|
+
export declare const gamepad: IconDefinition;
|
|
208
|
+
/** Code brackets for programming */
|
|
209
|
+
export declare const code: IconDefinition;
|
|
210
|
+
/** Puzzle piece for extensions / plugins */
|
|
211
|
+
export declare const puzzle: IconDefinition;
|
|
212
|
+
/** Ruler for layout / measurement */
|
|
213
|
+
export declare const ruler: IconDefinition;
|
|
214
|
+
/** Application window frame */
|
|
215
|
+
export declare const appWindow: IconDefinition;
|
|
216
|
+
/** Electrical plug for connections / integrations */
|
|
217
|
+
export declare const plug: IconDefinition;
|
|
218
|
+
/** Wrench for tools / maintenance */
|
|
219
|
+
export declare const wrench: IconDefinition;
|
|
220
|
+
/** Compass for exploration / navigation */
|
|
221
|
+
export declare const compass: IconDefinition;
|
|
140
222
|
//# sourceMappingURL=icon-definitions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon-definitions.d.ts","sourceRoot":"","sources":["../../../src/components/icons/icon-definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAQrD,yDAAyD;AACzD,eAAO,MAAM,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"icon-definitions.d.ts","sourceRoot":"","sources":["../../../src/components/icons/icon-definitions.ts"],"names":[],"mappings":"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"}
|