@happyvertical/smrt-svelte 0.43.1 → 0.43.3
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/AGENTS.md +1 -0
- package/README.md +18 -0
- package/dist/web/__tests__/remote-query-harness.svelte +27 -0
- package/dist/web/__tests__/remote-query-harness.svelte.d.ts +11 -0
- package/dist/web/__tests__/remote-query-harness.svelte.d.ts.map +1 -0
- package/dist/web/__tests__/remote-query.svelte.test.js +100 -0
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +1 -0
- package/dist/web/remote-query.svelte.d.ts +26 -0
- package/dist/web/remote-query.svelte.d.ts.map +1 -0
- package/dist/web/remote-query.svelte.js +57 -0
- package/package.json +5 -5
package/AGENTS.md
CHANGED
|
@@ -15,6 +15,7 @@ subpath you are editing. This file keeps what holds in every module.
|
|
|
15
15
|
| `src/test-support/` + `__tests__/` | the golden-test harness and pattern for Svelte component tests | [agents/testing.md](agents/testing.md) |
|
|
16
16
|
| `src/components/settings/` (`./settings`) | `SettingsCatalog`, `paginateSettingsCatalog`, and the summary-vs-detail scalability contract | [agents/settings.md](agents/settings.md) |
|
|
17
17
|
| `src/components/workspace/` (`./workspace` + `./web`) | the AdminShell family and its principles, the legacy ToolsDock surface, the `./web` activity-feed and `updateAvailable` adapters, and server-side dock gates | [agents/workspace.md](agents/workspace.md) |
|
|
18
|
+
| `src/web/remote-query.svelte.ts` | Svelte 5 binding for query-shaped remote pages: rows, page, totals, loading/refreshing/stale/error, retry, last-updated, and query-scoped live subscriptions (#2445) | — |
|
|
18
19
|
|
|
19
20
|
## The UI split — primitive-adoption contract (#1589)
|
|
20
21
|
|
package/README.md
CHANGED
|
@@ -60,6 +60,24 @@ state.
|
|
|
60
60
|
|
|
61
61
|
## Usage
|
|
62
62
|
|
|
63
|
+
### Query-backed data surfaces
|
|
64
|
+
|
|
65
|
+
Use the web binding when a table should render one remote page instead of
|
|
66
|
+
hydrating its whole collection. It exposes `rows`, `page`, `total`,
|
|
67
|
+
`loading`, `refreshing`, `stale`, `error`, `retry`, and `lastUpdated`.
|
|
68
|
+
|
|
69
|
+
```svelte
|
|
70
|
+
<script lang="ts">
|
|
71
|
+
import { remoteQuery } from '@happyvertical/smrt-svelte/web';
|
|
72
|
+
const view = remoteQuery(collection, transport);
|
|
73
|
+
// Failures remain available as view.error for reactive rendering.
|
|
74
|
+
void view.execute(request).catch(() => undefined);
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
{#if view.loading}<p>Loading…</p>{/if}
|
|
78
|
+
{#each view.rows as row (row.id)}<div>{row.name}</div>{/each}
|
|
79
|
+
```
|
|
80
|
+
|
|
63
81
|
### Provider Setup
|
|
64
82
|
|
|
65
83
|
```svelte
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type {
|
|
3
|
+
SmrtWebCollection,
|
|
4
|
+
SmrtWebQueryTransport,
|
|
5
|
+
} from '@happyvertical/smrt-web';
|
|
6
|
+
import {
|
|
7
|
+
type RemoteQueryBinding,
|
|
8
|
+
remoteQuery,
|
|
9
|
+
} from '../remote-query.svelte.js';
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
collection: SmrtWebCollection<Record<string, unknown>>;
|
|
13
|
+
transport: SmrtWebQueryTransport;
|
|
14
|
+
onReady: (view: RemoteQueryBinding<Record<string, unknown>>) => void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const props: Props = $props();
|
|
18
|
+
// The harness intentionally creates one binding for its component lifetime.
|
|
19
|
+
// svelte-ignore state_referenced_locally
|
|
20
|
+
const view = remoteQuery(props.collection, props.transport);
|
|
21
|
+
// svelte-ignore state_referenced_locally
|
|
22
|
+
props.onReady(view);
|
|
23
|
+
</script>
|
|
24
|
+
|
|
25
|
+
<output data-testid="remote-query-state">
|
|
26
|
+
{view.request?.requestId ?? 'none'}:{view.rows.map((row) => row.id).join(',')}
|
|
27
|
+
</output>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SmrtWebCollection, SmrtWebQueryTransport } from '@happyvertical/smrt-web';
|
|
2
|
+
import { type RemoteQueryBinding } from '../remote-query.svelte.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
collection: SmrtWebCollection<Record<string, unknown>>;
|
|
5
|
+
transport: SmrtWebQueryTransport;
|
|
6
|
+
onReady: (view: RemoteQueryBinding<Record<string, unknown>>) => void;
|
|
7
|
+
}
|
|
8
|
+
declare const RemoteQueryHarness: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type RemoteQueryHarness = ReturnType<typeof RemoteQueryHarness>;
|
|
10
|
+
export default RemoteQueryHarness;
|
|
11
|
+
//# sourceMappingURL=remote-query-harness.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-query-harness.svelte.d.ts","sourceRoot":"","sources":["../../../src/web/__tests__/remote-query-harness.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,2BAA2B,CAAC;AAGnC,UAAU,KAAK;IACb,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CACtE;AAoBD,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createSmrtCollection, } from '@happyvertical/smrt-web';
|
|
2
|
+
import { flushSync, mount, unmount } from 'svelte';
|
|
3
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
+
import Harness from './remote-query-harness.svelte';
|
|
5
|
+
const definition = {
|
|
6
|
+
name: 'remote-query-svelte-products',
|
|
7
|
+
className: 'Product',
|
|
8
|
+
endpoint: '/products',
|
|
9
|
+
idField: 'id',
|
|
10
|
+
actions: ['list'],
|
|
11
|
+
fields: { name: { type: 'text' } },
|
|
12
|
+
};
|
|
13
|
+
const request = {
|
|
14
|
+
version: 1,
|
|
15
|
+
requestId: 'svelte-request',
|
|
16
|
+
mode: 'rows',
|
|
17
|
+
page: { kind: 'offset', offset: 0, limit: 10 },
|
|
18
|
+
};
|
|
19
|
+
function envelope(received, name) {
|
|
20
|
+
return {
|
|
21
|
+
version: 1,
|
|
22
|
+
requestId: received.requestId,
|
|
23
|
+
queryFingerprint: 'dq1_svelte_products',
|
|
24
|
+
identityField: 'id',
|
|
25
|
+
rows: [{ id: name, name }],
|
|
26
|
+
page: { kind: 'offset', offset: 0, limit: 10, hasMore: false },
|
|
27
|
+
total: { kind: 'exact', value: 1 },
|
|
28
|
+
freshness: { state: 'fresh' },
|
|
29
|
+
warnings: [],
|
|
30
|
+
truncated: false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function mountView(collection, transport) {
|
|
34
|
+
const target = document.createElement('div');
|
|
35
|
+
document.body.appendChild(target);
|
|
36
|
+
let view = undefined;
|
|
37
|
+
const component = mount(Harness, {
|
|
38
|
+
target,
|
|
39
|
+
props: {
|
|
40
|
+
collection: collection,
|
|
41
|
+
transport,
|
|
42
|
+
onReady: (next) => {
|
|
43
|
+
view = next;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
return {
|
|
48
|
+
target,
|
|
49
|
+
view,
|
|
50
|
+
teardown: () => {
|
|
51
|
+
unmount(component);
|
|
52
|
+
target.remove();
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
describe('remoteQuery', () => {
|
|
57
|
+
it('renders request and rows reactively through the Svelte binding', async () => {
|
|
58
|
+
const collection = createSmrtCollection(definition, {
|
|
59
|
+
fetchers: { list: async () => [], create: async () => ({}) },
|
|
60
|
+
});
|
|
61
|
+
const mounted = mountView(collection, {
|
|
62
|
+
query: async (received) => envelope(received, 'Ada'),
|
|
63
|
+
});
|
|
64
|
+
await mounted.view.execute(request);
|
|
65
|
+
flushSync();
|
|
66
|
+
expect(mounted.target.textContent).toContain('svelte-request:Ada');
|
|
67
|
+
mounted.teardown();
|
|
68
|
+
await collection.cleanup();
|
|
69
|
+
});
|
|
70
|
+
it('disposes an in-flight refresh and live subscription when unmounted', async () => {
|
|
71
|
+
let calls = 0;
|
|
72
|
+
let unsubscribed = false;
|
|
73
|
+
const collection = createSmrtCollection(definition, {
|
|
74
|
+
fetchers: { list: async () => [], create: async () => ({}) },
|
|
75
|
+
});
|
|
76
|
+
const mounted = mountView(collection, {
|
|
77
|
+
query: async (received, options) => {
|
|
78
|
+
calls += 1;
|
|
79
|
+
if (calls === 1)
|
|
80
|
+
return envelope(received, 'initial');
|
|
81
|
+
return await new Promise((_resolve, reject) => {
|
|
82
|
+
options?.signal?.addEventListener('abort', () => reject(options.signal?.reason), { once: true });
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
subscribe: () => ({
|
|
86
|
+
unsubscribe: () => {
|
|
87
|
+
unsubscribed = true;
|
|
88
|
+
},
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
await mounted.view.execute(request);
|
|
92
|
+
mounted.view.subscribeLive();
|
|
93
|
+
const refresh = mounted.view.refresh();
|
|
94
|
+
await vi.waitFor(() => expect(calls).toBe(2));
|
|
95
|
+
mounted.teardown();
|
|
96
|
+
await expect(refresh).rejects.toMatchObject({ name: 'AbortError' });
|
|
97
|
+
expect(unsubscribed).toBe(true);
|
|
98
|
+
await collection.cleanup();
|
|
99
|
+
});
|
|
100
|
+
});
|
package/dist/web/index.d.ts
CHANGED
|
@@ -16,5 +16,6 @@
|
|
|
16
16
|
*/
|
|
17
17
|
export { type ActivityFeedHandle, type ActivityFeedMap, type ActivityFeedOptions, activityFeed, type ShellActivityInput, } from './activity-feed.svelte.js';
|
|
18
18
|
export { type LiveCollection, type LiveCollectionMutation, type LiveCollectionOptions, type LiveCollectionStatus, liveCollection, } from './live-collection.svelte.js';
|
|
19
|
+
export { type RemoteQueryBinding, remoteQuery, } from './remote-query.svelte.js';
|
|
19
20
|
export { type UpdateAvailableView, type UseUpdateAvailableOptions, useUpdateAvailable, } from './update-available.svelte.js';
|
|
20
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/web/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,YAAY,EACZ,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC"}
|
package/dist/web/index.js
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SmrtWebCollection, type SmrtWebDataQueryRequest, type SmrtWebDataQueryResult, type SmrtWebQueryLiveSubscription, type SmrtWebQueryRunOptions, type SmrtWebQueryState, type SmrtWebQueryTransport } from '@happyvertical/smrt-web';
|
|
2
|
+
export interface RemoteQueryBinding<TData extends object = object> {
|
|
3
|
+
readonly rows: ReadonlyArray<TData>;
|
|
4
|
+
readonly page: SmrtWebQueryState<TData>['page'];
|
|
5
|
+
readonly total: SmrtWebQueryState<TData>['total'];
|
|
6
|
+
readonly loading: boolean;
|
|
7
|
+
readonly refreshing: boolean;
|
|
8
|
+
readonly stale: boolean;
|
|
9
|
+
readonly error: unknown;
|
|
10
|
+
readonly lastUpdated: number | undefined;
|
|
11
|
+
readonly request: SmrtWebDataQueryRequest | undefined;
|
|
12
|
+
execute(request: SmrtWebDataQueryRequest, options?: SmrtWebQueryRunOptions): Promise<SmrtWebDataQueryResult>;
|
|
13
|
+
refresh(options?: Omit<SmrtWebQueryRunOptions, 'mode' | 'force'>): Promise<SmrtWebDataQueryResult | undefined>;
|
|
14
|
+
retry(): Promise<SmrtWebDataQueryResult | undefined>;
|
|
15
|
+
subscribeLive(): SmrtWebQueryLiveSubscription | undefined;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Bind a canonical remote query to Svelte 5 state. The binding is query
|
|
20
|
+
* shaped: rows are only the requested page and never the entire collection.
|
|
21
|
+
* Call during component initialization so cleanup follows the component.
|
|
22
|
+
*/
|
|
23
|
+
export declare function remoteQuery<TData extends object>(collection: SmrtWebCollection<TData>, transport: SmrtWebQueryTransport, options?: {
|
|
24
|
+
staleTimeMs?: number;
|
|
25
|
+
}): RemoteQueryBinding<TData>;
|
|
26
|
+
//# sourceMappingURL=remote-query.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-query.svelte.d.ts","sourceRoot":"","sources":["../../src/web/remote-query.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAE3B,KAAK,4BAA4B,EACjC,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,kBAAkB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM;IAC/D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACtD,OAAO,CACL,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnC,OAAO,CACL,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,GAAG,OAAO,CAAC,GACvD,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IAC/C,KAAK,IAAI,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAAC;IACrD,aAAa,IAAI,4BAA4B,GAAG,SAAS,CAAC;IAC1D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAS,MAAM,EAC9C,UAAU,EAAE,iBAAiB,CAAC,KAAK,CAAC,EACpC,SAAS,EAAE,qBAAqB,EAChC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,kBAAkB,CAAC,KAAK,CAAC,CAwD3B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { createSmrtWebQuery, } from '@happyvertical/smrt-web';
|
|
2
|
+
/**
|
|
3
|
+
* Bind a canonical remote query to Svelte 5 state. The binding is query
|
|
4
|
+
* shaped: rows are only the requested page and never the entire collection.
|
|
5
|
+
* Call during component initialization so cleanup follows the component.
|
|
6
|
+
*/
|
|
7
|
+
export function remoteQuery(collection, transport, options) {
|
|
8
|
+
const query = createSmrtWebQuery(collection, transport, options);
|
|
9
|
+
let snapshot = $state(query.state);
|
|
10
|
+
let activeRequest = $state(query.request);
|
|
11
|
+
const unsubscribe = query.subscribe((next) => {
|
|
12
|
+
snapshot = next;
|
|
13
|
+
activeRequest = query.request;
|
|
14
|
+
});
|
|
15
|
+
$effect(() => () => {
|
|
16
|
+
unsubscribe();
|
|
17
|
+
query.dispose();
|
|
18
|
+
});
|
|
19
|
+
const binding = {
|
|
20
|
+
get rows() {
|
|
21
|
+
return snapshot.rows;
|
|
22
|
+
},
|
|
23
|
+
get page() {
|
|
24
|
+
return snapshot.page;
|
|
25
|
+
},
|
|
26
|
+
get total() {
|
|
27
|
+
return snapshot.total;
|
|
28
|
+
},
|
|
29
|
+
get loading() {
|
|
30
|
+
return snapshot.loading;
|
|
31
|
+
},
|
|
32
|
+
get refreshing() {
|
|
33
|
+
return snapshot.refreshing;
|
|
34
|
+
},
|
|
35
|
+
get stale() {
|
|
36
|
+
return snapshot.stale;
|
|
37
|
+
},
|
|
38
|
+
get error() {
|
|
39
|
+
return snapshot.error;
|
|
40
|
+
},
|
|
41
|
+
get lastUpdated() {
|
|
42
|
+
return snapshot.lastUpdated;
|
|
43
|
+
},
|
|
44
|
+
get request() {
|
|
45
|
+
return activeRequest;
|
|
46
|
+
},
|
|
47
|
+
execute: (request, runOptions) => query.execute(request, runOptions),
|
|
48
|
+
refresh: (runOptions) => query.refresh(runOptions),
|
|
49
|
+
retry: () => query.retry(),
|
|
50
|
+
subscribeLive: () => query.subscribeLive(),
|
|
51
|
+
dispose: () => {
|
|
52
|
+
unsubscribe();
|
|
53
|
+
query.dispose();
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
return binding;
|
|
57
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happyvertical/smrt-svelte",
|
|
3
|
-
"version": "0.43.
|
|
3
|
+
"version": "0.43.3",
|
|
4
4
|
"description": "Svelte 5 components for SMRT user management - auth, users, tenants, roles, permissions, groups",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"smrtRawPrimitives": "strict",
|
|
@@ -123,10 +123,10 @@
|
|
|
123
123
|
"@tanstack/db": "^0.6.14",
|
|
124
124
|
"@tanstack/svelte-db": "^0.1.91",
|
|
125
125
|
"esm-env": "^1.2.2",
|
|
126
|
-
"@happyvertical/smrt-types": "0.43.
|
|
127
|
-
"@happyvertical/smrt-web": "0.43.
|
|
128
|
-
"@happyvertical/smrt-
|
|
129
|
-
"@happyvertical/smrt-
|
|
126
|
+
"@happyvertical/smrt-types": "0.43.3",
|
|
127
|
+
"@happyvertical/smrt-web": "0.43.3",
|
|
128
|
+
"@happyvertical/smrt-ui": "0.43.3",
|
|
129
|
+
"@happyvertical/smrt-languages": "0.43.3"
|
|
130
130
|
},
|
|
131
131
|
"peerDependencies": {
|
|
132
132
|
"@huggingface/transformers": ">=3.8.1",
|