Skip to content

Commit b418ace

Browse files
authored
improve plugin exports (#135)
1 parent 97469ae commit b418ace

File tree

10 files changed

+81
-27
lines changed

10 files changed

+81
-27
lines changed

docs/client-packages-react.md

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ Ensure the GitHub package registry is configured (see [Registry Setup](./client-
1010
pnpm add @edufeed-org/oer-finder-plugin-react
1111
```
1212

13-
This package depends on `@edufeed-org/oer-finder-plugin` internally — you do not need to install the base plugin separately.
13+
The base plugin (`@edufeed-org/oer-finder-plugin`) is installed automatically as a dependency — you do not need to install it separately. All necessary imports (components, types, and adapter registration) are available directly from this React package.
14+
15+
> **Important:** Do not install `@edufeed-org/oer-finder-plugin` as a direct dependency alongside the React package. Doing so can result in two separate copies on disk, each with its own adapter registry. Adapters registered via one copy would be invisible to components from the other, causing searches to silently return zero results. Always import from `@edufeed-org/oer-finder-plugin-react` instead.
1416
1517
## Operating Modes
1618

@@ -48,15 +50,14 @@ You **must register adapters** before the component renders. Call the registrati
4850

4951
```typescript
5052
// Register all built-in adapters
51-
import { registerAllBuiltInAdapters } from '@edufeed-org/oer-finder-plugin/adapters';
53+
import { registerAllBuiltInAdapters } from '@edufeed-org/oer-finder-plugin-react/adapters';
5254
registerAllBuiltInAdapters();
5355
```
5456

55-
Or register only the adapters you need to reduce bundle size:
57+
Or register only the adapters you need:
5658

5759
```typescript
58-
import { registerOpenverseAdapter } from '@edufeed-org/oer-finder-plugin/adapter/openverse';
59-
import { registerArasaacAdapter } from '@edufeed-org/oer-finder-plugin/adapter/arasaac';
60+
import { registerOpenverseAdapter, registerArasaacAdapter } from '@edufeed-org/oer-finder-plugin-react/adapters';
6061
registerOpenverseAdapter();
6162
registerArasaacAdapter();
6263
```
@@ -93,9 +94,11 @@ import {
9394

9495
// Configure available sources (checked: true sets the pre-selected sources)
9596
const SOURCES: SourceConfig[] = [
96-
{ id: 'nostr', label: 'Nostr', checked: true },
97+
{ id: 'nostr-amb-relay', label: 'Nostr AMB Relay', checked: true },
9798
{ id: 'openverse', label: 'Openverse' },
9899
{ id: 'arasaac', label: 'ARASAAC' },
100+
{ id: 'rpi-virtuell', label: 'RPI-Virtuell' },
101+
{ id: 'wikimedia', label: 'Wikimedia Commons' },
99102
];
100103

101104
function OerFinder() {
@@ -183,8 +186,7 @@ The component code is identical to the [server-proxy example above](#server-prox
183186
**1. Register adapters once at your app entry point (e.g., `main.tsx`):**
184187

185188
```tsx
186-
import { registerOpenverseAdapter } from '@edufeed-org/oer-finder-plugin/adapter/openverse';
187-
import { registerArasaacAdapter } from '@edufeed-org/oer-finder-plugin/adapter/arasaac';
189+
import { registerOpenverseAdapter, registerArasaacAdapter } from '@edufeed-org/oer-finder-plugin-react/adapters';
188190
registerOpenverseAdapter();
189191
registerArasaacAdapter();
190192
```
@@ -289,6 +291,31 @@ If you render `OerLoadMore` outside of `OerSearch`, the event will not bubble to
289291
|------|-------------------|-------------|
290292
| `onLoadMore` | `(event: CustomEvent<void>) => void` | Fired when the "Load more" button is clicked. When slotted inside `OerSearch`, this event bubbles up automatically to trigger the next page fetch — no manual handler needed. |
291293

294+
## Available Adapters
295+
296+
The following built-in adapters are available for direct client mode:
297+
298+
| Adapter ID | Source | Notes |
299+
|------------|--------|-------|
300+
| `openverse` | Openverse (Flickr, Wikimedia, etc.) | Images, license filter |
301+
| `arasaac` | ARASAAC pictograms API | Images only |
302+
| `nostr-amb-relay` | Nostr AMB relay (WebSocket) | Requires `baseUrl` with WebSocket URL(s) in `SourceConfig` |
303+
| `rpi-virtuell` | RPI-Virtuell Materialpool (GraphQL) | German educational resources |
304+
| `wikimedia` | Wikimedia Commons API | Images |
305+
306+
Register all at once or selectively — all functions are available from a single import path:
307+
308+
```typescript
309+
// All adapters
310+
import { registerAllBuiltInAdapters } from '@edufeed-org/oer-finder-plugin-react/adapters';
311+
registerAllBuiltInAdapters();
312+
313+
// Or selectively
314+
import { registerOpenverseAdapter, registerWikimediaAdapter } from '@edufeed-org/oer-finder-plugin-react/adapters';
315+
registerOpenverseAdapter();
316+
registerWikimediaAdapter();
317+
```
318+
292319
## Key Types
293320

294321
All types are importable from `@edufeed-org/oer-finder-plugin-react`:
@@ -309,13 +336,26 @@ import {
309336

310337
// Data types
311338
type OerItem, // Normalized AMB metadata for a single resource
339+
type OerMetadata, // Metadata structure on OerItem
340+
type OerListResponse, // Full list response shape from the API
312341
type LoadMoreMeta, // { total: number, shown: number, hasMore: boolean }
313342
type SourceConfig, // { id: string, label: string, baseUrl?: string, checked?: boolean }
314343
type SupportedLanguage, // 'en' | 'de'
344+
type SearchParams, // Search parameter structure
345+
type SourceOption, // Source option type for UI display
346+
347+
// Adapter types
348+
type AdapterFactory, // Factory function type for custom adapters
349+
350+
// Underlying web component types (for advanced use)
351+
type OerSearchElement, // <oer-search> element class
352+
type OerListElement, // <oer-list> element class
353+
type OerCardElement, // <oer-card> element class
354+
type LoadMoreElement, // <oer-load-more> element class
315355

316-
// API client types (re-exported from oer-finder-api-client)
317-
type OerMetadata,
318-
type OerListResponse,
356+
// Adapter registry API
357+
registerAdapter, // Register a custom adapter factory
358+
getAdapterFactory, // Retrieve a registered adapter factory by ID
319359
} from '@edufeed-org/oer-finder-plugin-react';
320360
```
321361

docs/creating-a-new-adapter.md

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,14 @@ export function register<Name>Adapter(): void {
187187
}
188188
```
189189

190-
**f)** Import and call the new function in `packages/oer-finder-plugin/src/built-in-registrations.ts`:
190+
**f)** Import, export, and call the new function in `packages/oer-finder-plugin/src/built-in-registrations.ts`:
191191
```typescript
192192
import { register<Name>Adapter } from './adapter/<name>.js';
193-
// ... inside registerAllBuiltInAdapters():
193+
194+
// Add to the named exports block (this is how the React package picks it up automatically):
195+
export { register<Name>Adapter };
196+
197+
// Add inside registerAllBuiltInAdapters():
194198
register<Name>Adapter();
195199
```
196200

@@ -209,32 +213,36 @@ register<Name>Adapter();
209213

210214
**i)** Add to source configs in `packages/oer-finder-plugin-example/src/main.ts`.
211215

216+
**j)** Add to source configs in `packages/oer-finder-plugin-react-example/src/App.tsx`.
217+
218+
> **Note:** The React package (`oer-finder-plugin-react`) automatically re-exports all adapter registration functions from the base plugin via `export * from '@edufeed-org/oer-finder-plugin/adapters'`. No changes to the React package are needed — new adapters are picked up automatically once added to the base plugin's `built-in-registrations.ts`.
219+
212220
#### Docker
213221

214-
**j)** Add a COPY line in the `Dockerfile` (in the `production` stage):
222+
**k)** Add a COPY line in the `Dockerfile` (in the `production` stage):
215223
```dockerfile
216224
COPY --chown=node:node packages/oer-adapter-<name> $APP_PATH/packages/oer-adapter-<name>/
217225
```
218226

219227
#### CI/CD Workflows (all three required)
220228

221-
**k)** `.github/workflows/ci.yml``oer-adapters` job: add a test step:
229+
**l)** `.github/workflows/ci.yml``oer-adapters` job: add a test step:
222230
```yaml
223231
- name: Test adapter <name>
224232
run: pnpm --filter @edufeed-org/oer-adapter-<name> run test
225233
```
226234
227-
**l)** `.github/workflows/ci.yml` — `oer-finder-plugin` job: add a build step inside "Build dependencies":
235+
**m)** `.github/workflows/ci.yml` — `oer-finder-plugin` job: add a build step inside "Build dependencies":
228236
```yaml
229237
pnpm --filter @edufeed-org/oer-adapter-<name> run build
230238
```
231239

232-
**m)** `.github/workflows/release.yml` — `publish-npm-packages` job: add a build step inside "Build dependencies":
240+
**n)** `.github/workflows/release.yml` — `publish-npm-packages` job: add a build step inside "Build dependencies":
233241
```yaml
234242
pnpm --filter @edufeed-org/oer-adapter-<name> run build
235243
```
236244

237-
> **Warning:** Forgetting the release workflow step (m) will cause the release build to fail with `[commonjs--resolver] Failed to resolve entry for package`. The plugin bundles all adapters — if yours isn't built before the plugin build runs, Vite cannot resolve it.
245+
> **Warning:** Forgetting the release workflow step (n) will cause the release build to fail with `[commonjs--resolver] Failed to resolve entry for package`. The plugin bundles all adapters — if yours isn't built before the plugin build runs, Vite cannot resolve it.
238246

239247
### 6. Export Your Public API
240248

@@ -304,6 +312,7 @@ readonly capabilities: AdapterCapabilities = {
304312
- [ ] Entry point in `packages/oer-finder-plugin/vite.config.ts`
305313
- [ ] Sub-path export in `packages/oer-finder-plugin/package.json`
306314
- [ ] Source config in `packages/oer-finder-plugin-example/src/main.ts`
315+
- [ ] Source config in `packages/oer-finder-plugin-react-example/src/App.tsx`
307316
- [ ] COPY line in `Dockerfile`
308317
- [ ] Test step in `.github/workflows/ci.yml` (`oer-adapters` job)
309318
- [ ] Build step in `.github/workflows/ci.yml` (`oer-finder-plugin` job)

packages/oer-finder-plugin-react-example/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
"format": "echo 'Format not configured yet'"
1919
},
2020
"dependencies": {
21-
"@edufeed-org/oer-finder-plugin": "workspace:*",
2221
"@edufeed-org/oer-finder-plugin-react": "workspace:*",
2322
"react": "^19.0.0",
2423
"react-dom": "^19.0.0"

packages/oer-finder-plugin-react-example/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ const SERVER_SOURCES: SourceConfig[] = [
3030
{ id: 'openverse', label: 'Openverse' },
3131
{ id: 'arasaac', label: 'ARASAAC' },
3232
{ id: 'rpi-virtuell', label: 'RPI-Virtuell' },
33+
{ id: 'wikimedia', label: 'Wikimedia Commons' },
3334
];
3435

3536
const DIRECT_SOURCES: SourceConfig[] = [
3637
{ id: 'openverse', label: 'Openverse', checked: true },
3738
{ id: 'arasaac', label: 'ARASAAC', checked: true },
3839
{ id: 'nostr-amb-relay', label: 'Nostr AMB Relay', baseUrl: 'wss://amb-relay.edufeed.org' },
3940
{ id: 'rpi-virtuell', label: 'RPI-Virtuell' },
41+
{ id: 'wikimedia', label: 'Wikimedia Commons' },
4042
];
4143

4244
interface SearchDemoProps {

packages/oer-finder-plugin-react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@edufeed-org/oer-finder-plugin-react",
3-
"version": "0.1.1",
3+
"version": "0.2.0",
44
"description": "React components for OER Finder Plugin",
55
"author": "B310 Digital GmbH",
66
"license": "MIT",
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
export { registerAllBuiltInAdapters } from '@edufeed-org/oer-finder-plugin/adapters';
1+
export * from '@edufeed-org/oer-finder-plugin/adapters';

packages/oer-finder-plugin-react/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export {
7474
* }}
7575
* >
7676
* <OerList oers={oers} loading={loading} onCardClick={(e) => handleCardClick(e.detail.oer)} />
77-
* <OerLoadMore metadata={metadata} loading={loading} shownCount={oers.length} />
77+
* <OerLoadMore metadata={metadata} loading={loading} />
7878
* </OerSearch>
7979
* ```
8080
*/
@@ -150,7 +150,6 @@ export const OerCard = createComponent({
150150
* ```tsx
151151
* <OerLoadMore
152152
* metadata={metadata}
153-
* shownCount={oers.length}
154153
* loading={isLoading}
155154
* language="en"
156155
* />

packages/oer-finder-plugin/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@edufeed-org/oer-finder-plugin",
3-
"version": "0.2.1",
3+
"version": "0.2.2",
44
"description": "Web Components plugin for OER Proxy",
55
"author": "B310 Digital GmbH",
66
"license": "MIT",

packages/oer-finder-plugin/src/built-in-registrations.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@ import { registerNostrAmbRelayAdapter } from './adapter/nostr-amb-relay.js';
44
import { registerRpiVirtuellAdapter } from './adapter/rpi-virtuell.js';
55
import { registerWikimediaAdapter } from './adapter/wikimedia.js';
66

7+
export {
8+
registerOpenverseAdapter,
9+
registerArasaacAdapter,
10+
registerNostrAmbRelayAdapter,
11+
registerRpiVirtuellAdapter,
12+
registerWikimediaAdapter,
13+
};
14+
715
/**
816
* Register all built-in adapter factories.
917
* Convenience helper for consumers who want all adapters.

pnpm-lock.yaml

Lines changed: 0 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)