@meeovi/layer-search 1.0.6 → 1.0.7
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 -5
- package/app/composables/bridges/searchkit-server.ts +51 -0
- package/app/composables/bridges/searchkit.ts +88 -0
- package/app/composables/index.ts +4 -1
- package/app/composables/module.ts +41 -0
- package/app/composables/utils/health.ts +13 -0
- package/app/plugins/search.js +1 -1
- package/app/utils/search/client.ts +40 -0
- package/dist/app/composables/adapter/meilisearch.d.ts +8 -0
- package/dist/app/composables/adapter/meilisearch.js +36 -0
- package/dist/app/composables/adapter/mock.d.ts +3 -0
- package/dist/app/composables/adapter/mock.js +19 -0
- package/dist/app/composables/adapter/opensearch.d.ts +8 -0
- package/dist/app/composables/adapter/opensearch.js +46 -0
- package/dist/app/composables/adapter/types.d.ts +12 -0
- package/dist/app/composables/adapter/types.js +1 -0
- package/dist/app/composables/bridges/instantsearch.d.ts +4 -0
- package/dist/app/composables/bridges/instantsearch.js +17 -0
- package/dist/app/composables/bridges/react.d.ts +12 -0
- package/dist/app/composables/bridges/react.js +34 -0
- package/dist/app/composables/bridges/vue.d.ts +9 -0
- package/dist/app/composables/bridges/vue.js +31 -0
- package/dist/app/composables/cli.d.ts +2 -0
- package/dist/app/composables/cli.js +69 -0
- package/dist/app/composables/config/schema.d.ts +5 -0
- package/dist/app/composables/config/schema.js +8 -0
- package/dist/app/composables/config.d.ts +7 -0
- package/dist/app/composables/config.js +11 -0
- package/dist/app/composables/core/Facets.d.ts +17 -0
- package/dist/app/composables/core/Facets.js +8 -0
- package/dist/app/composables/core/Filters.d.ts +18 -0
- package/dist/app/composables/core/Filters.js +11 -0
- package/dist/app/composables/core/Normalizers.d.ts +0 -0
- package/dist/app/composables/core/Normalizers.js +1 -0
- package/dist/app/composables/core/Pipeline.d.ts +8 -0
- package/dist/app/composables/core/Pipeline.js +16 -0
- package/dist/app/composables/core/QueryBuilder.d.ts +13 -0
- package/dist/app/composables/core/QueryBuilder.js +15 -0
- package/dist/app/composables/core/SearchContext.d.ts +18 -0
- package/dist/app/composables/core/SearchContext.js +38 -0
- package/dist/app/composables/core/SearchManager.d.ts +10 -0
- package/dist/app/composables/core/SearchManager.js +20 -0
- package/dist/app/composables/events.d.ts +11 -0
- package/dist/app/composables/events.js +1 -0
- package/dist/app/composables/index.d.ts +9 -0
- package/dist/app/composables/index.js +9 -0
- package/dist/app/composables/module.d.ts +17 -0
- package/dist/app/composables/module.js +39 -0
- package/dist/app/composables/types/api/global-search.d.ts +8 -0
- package/dist/app/composables/types/api/global-search.js +1 -0
- package/dist/app/composables/utils/normalizers.d.ts +1 -0
- package/dist/app/composables/utils/normalizers.js +6 -0
- package/dist/app/utils/search/client.d.ts +3 -0
- package/dist/app/utils/search/client.js +31 -0
- package/dist/layers/search/app/composables/adapter/meilisearch.d.ts +8 -0
- package/dist/layers/search/app/composables/adapter/meilisearch.js +36 -0
- package/dist/layers/search/app/composables/adapter/mock.d.ts +3 -0
- package/dist/layers/search/app/composables/adapter/mock.js +19 -0
- package/dist/layers/search/app/composables/adapter/opensearch.d.ts +8 -0
- package/dist/layers/search/app/composables/adapter/opensearch.js +46 -0
- package/dist/layers/search/app/composables/adapter/types.d.ts +12 -0
- package/dist/layers/search/app/composables/adapter/types.js +1 -0
- package/dist/layers/search/app/composables/bridges/instantsearch.d.ts +4 -0
- package/dist/layers/search/app/composables/bridges/instantsearch.js +17 -0
- package/dist/layers/search/app/composables/bridges/react.d.ts +12 -0
- package/dist/layers/search/app/composables/bridges/react.js +34 -0
- package/dist/layers/search/app/composables/bridges/searchkit-server.d.ts +3 -0
- package/dist/layers/search/app/composables/bridges/searchkit-server.js +44 -0
- package/dist/layers/search/app/composables/bridges/searchkit.d.ts +21 -0
- package/dist/layers/search/app/composables/bridges/searchkit.js +60 -0
- package/dist/layers/search/app/composables/bridges/vue.d.ts +9 -0
- package/dist/layers/search/app/composables/bridges/vue.js +31 -0
- package/dist/layers/search/app/composables/cli.d.ts +2 -0
- package/dist/layers/search/app/composables/cli.js +69 -0
- package/dist/layers/search/app/composables/config/schema.d.ts +5 -0
- package/dist/layers/search/app/composables/config/schema.js +8 -0
- package/dist/layers/search/app/composables/config.d.ts +7 -0
- package/dist/layers/search/app/composables/config.js +11 -0
- package/dist/layers/search/app/composables/core/Facets.d.ts +17 -0
- package/dist/layers/search/app/composables/core/Facets.js +8 -0
- package/dist/layers/search/app/composables/core/Filters.d.ts +18 -0
- package/dist/layers/search/app/composables/core/Filters.js +11 -0
- package/dist/layers/search/app/composables/core/Normalizers.d.ts +0 -0
- package/dist/layers/search/app/composables/core/Normalizers.js +1 -0
- package/dist/layers/search/app/composables/core/Pipeline.d.ts +8 -0
- package/dist/layers/search/app/composables/core/Pipeline.js +16 -0
- package/dist/layers/search/app/composables/core/QueryBuilder.d.ts +13 -0
- package/dist/layers/search/app/composables/core/QueryBuilder.js +15 -0
- package/dist/layers/search/app/composables/core/SearchContext.d.ts +18 -0
- package/dist/layers/search/app/composables/core/SearchContext.js +38 -0
- package/dist/layers/search/app/composables/core/SearchManager.d.ts +10 -0
- package/dist/layers/search/app/composables/core/SearchManager.js +20 -0
- package/dist/layers/search/app/composables/events.d.ts +11 -0
- package/dist/layers/search/app/composables/events.js +1 -0
- package/dist/layers/search/app/composables/index.d.ts +12 -0
- package/dist/layers/search/app/composables/index.js +12 -0
- package/dist/layers/search/app/composables/module.d.ts +17 -0
- package/dist/layers/search/app/composables/module.js +73 -0
- package/dist/layers/search/app/composables/types/api/global-search.d.ts +8 -0
- package/dist/layers/search/app/composables/types/api/global-search.js +1 -0
- package/dist/layers/search/app/composables/utils/health.d.ts +11 -0
- package/dist/layers/search/app/composables/utils/health.js +11 -0
- package/dist/layers/search/app/composables/utils/normalizers.d.ts +1 -0
- package/dist/layers/search/app/composables/utils/normalizers.js +6 -0
- package/dist/layers/search/app/utils/search/client.d.ts +3 -0
- package/dist/layers/search/app/utils/search/client.js +31 -0
- package/dist/layers/search/nuxt.config.d.ts +2 -0
- package/dist/layers/search/nuxt.config.js +7 -0
- package/dist/layers/search/test/runtime-adapter.spec.d.ts +1 -0
- package/dist/layers/search/test/runtime-adapter.spec.js +49 -0
- package/dist/nuxt.config.d.ts +2 -0
- package/dist/nuxt.config.js +7 -0
- package/dist/packages/core/src/adapters/auth.d.ts +9 -0
- package/dist/packages/core/src/adapters/auth.js +1 -0
- package/dist/packages/core/src/adapters/cart.d.ts +22 -0
- package/dist/packages/core/src/adapters/cart.js +1 -0
- package/dist/packages/core/src/adapters/catalog.d.ts +17 -0
- package/dist/packages/core/src/adapters/catalog.js +1 -0
- package/dist/packages/core/src/adapters/common.d.ts +9 -0
- package/dist/packages/core/src/adapters/common.js +1 -0
- package/dist/packages/core/src/adapters/lists.d.ts +17 -0
- package/dist/packages/core/src/adapters/lists.js +1 -0
- package/dist/packages/core/src/adapters/search.d.ts +21 -0
- package/dist/packages/core/src/adapters/search.js +1 -0
- package/dist/packages/core/src/plugins/defineAdapter.d.ts +2 -0
- package/dist/packages/core/src/plugins/defineAdapter.js +3 -0
- package/dist/packages/core/src/plugins/defineModule.d.ts +2 -0
- package/dist/packages/core/src/plugins/defineModule.js +3 -0
- package/dist/packages/core/src/plugins/registry.d.ts +14 -0
- package/dist/packages/core/src/plugins/registry.js +46 -0
- package/dist/packages/core/src/runtime/app.d.ts +2 -0
- package/dist/packages/core/src/runtime/app.js +20 -0
- package/dist/packages/core/src/runtime/context.d.ts +9 -0
- package/dist/packages/core/src/runtime/context.js +11 -0
- package/dist/packages/core/src/runtime/hooks.d.ts +5 -0
- package/dist/packages/core/src/runtime/hooks.js +18 -0
- package/dist/packages/core/src/runtime/lifecycle.d.ts +4 -0
- package/dist/packages/core/src/runtime/lifecycle.js +5 -0
- package/dist/packages/core/src/types/adapters.d.ts +14 -0
- package/dist/packages/core/src/types/adapters.js +1 -0
- package/dist/packages/core/src/types/app.d.ts +13 -0
- package/dist/packages/core/src/types/app.js +1 -0
- package/dist/packages/core/src/types/config.d.ts +8 -0
- package/dist/packages/core/src/types/config.js +1 -0
- package/dist/packages/core/src/types/events.d.ts +20 -0
- package/dist/packages/core/src/types/events.js +22 -0
- package/dist/packages/core/src/types/module.d.ts +15 -0
- package/dist/packages/core/src/types/module.js +1 -0
- package/package.json +9 -4
- package/test/runtime-adapter.spec.ts +61 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export async function checkAdapterHealth(adapter) {
|
|
2
|
+
try {
|
|
3
|
+
// perform a minimal search to verify connectivity
|
|
4
|
+
const res = await adapter.search({ term: '', page: 1, pageSize: 1, filters: {} });
|
|
5
|
+
return { ok: true, total: res?.total ?? null };
|
|
6
|
+
}
|
|
7
|
+
catch (e) {
|
|
8
|
+
return { ok: false, error: e?.message || String(e) };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export default checkAdapterHealth;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function normalizeOpenSearchHit(hit: any): any;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function getIndexName() {
|
|
2
|
+
return (process.env.NUXT_PUBLIC_SEARCH_INDEX ||
|
|
3
|
+
process.env.SEARCH_INDEX ||
|
|
4
|
+
'default');
|
|
5
|
+
}
|
|
6
|
+
export function getSearchClient() {
|
|
7
|
+
const host = process.env.NUXT_PUBLIC_SEARCHKIT_HOST || process.env.SEARCHKIT_HOST;
|
|
8
|
+
if (!host) {
|
|
9
|
+
throw new Error('Searchkit host not configured via SEARCHKIT_HOST or NUXT_PUBLIC_SEARCHKIT_HOST');
|
|
10
|
+
}
|
|
11
|
+
// Defer importing heavy searchkit/instantsearch client until runtime.
|
|
12
|
+
// Consumers can replace this implementation with a provider-specific client.
|
|
13
|
+
// Here we attempt to use @searchkit/instantsearch-client if available.
|
|
14
|
+
// If not present, let the import fail so the plugin can fallback.
|
|
15
|
+
// The actual creation API differs between versions; adjust as needed.
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
17
|
+
const createClient = require('@searchkit/instantsearch-client');
|
|
18
|
+
if (!createClient) {
|
|
19
|
+
throw new Error('@searchkit/instantsearch-client is not installed');
|
|
20
|
+
}
|
|
21
|
+
// Create a minimal client. The factory API may vary; this is a best-effort
|
|
22
|
+
// placeholder that should be adapted to your Searchkit configuration.
|
|
23
|
+
// If your Searchkit installation exposes a helper, prefer using that.
|
|
24
|
+
try {
|
|
25
|
+
return createClient({ host });
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
// rethrow with context
|
|
29
|
+
throw new Error('Failed to create Searchkit client: ' + (e?.message || e));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createAlternateApp } from '../../../packages/core/src/runtime/app';
|
|
2
|
+
import { defineAlternateAdapter } from '../../../packages/core/src/plugins/defineAdapter';
|
|
3
|
+
import { defineAlternateModule } from '../../../packages/core/src/plugins/defineModule';
|
|
4
|
+
import { AlternateContext } from '../../../packages/core/src/runtime/context';
|
|
5
|
+
import { ModuleRegistry } from '../../../packages/core/src/plugins/registry';
|
|
6
|
+
import { createEventBus } from '../../../packages/core/src/types/events';
|
|
7
|
+
// Minimal mock search adapter shape matching core types
|
|
8
|
+
const mockSearchAdapter = defineAlternateAdapter({
|
|
9
|
+
id: 'mock-search',
|
|
10
|
+
type: 'search',
|
|
11
|
+
async search() {
|
|
12
|
+
return { items: [], total: 0, page: 1, pageSize: 10 };
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
// A tiny test runner substitute so this file can be executed with `ts-node` or similar.
|
|
16
|
+
async function run() {
|
|
17
|
+
// Build an app with no modules initially
|
|
18
|
+
const app = createAlternateApp({ config: { modules: [] }, modules: [] });
|
|
19
|
+
// Create event bus and registry manually to inspect behavior
|
|
20
|
+
const bus = createEventBus();
|
|
21
|
+
const registry = new ModuleRegistry(bus);
|
|
22
|
+
const ctx = new AlternateContext({}, registry);
|
|
23
|
+
// Register the search module implementation directly (import existing module)
|
|
24
|
+
const searchModule = require('../app/composables/module').default;
|
|
25
|
+
registry.registerModule(searchModule, ctx);
|
|
26
|
+
// At this point no adapter is registered yet, so searchManager should be undefined
|
|
27
|
+
if (ctx.searchManager) {
|
|
28
|
+
throw new Error('Expected searchManager to be undefined before adapter registration');
|
|
29
|
+
}
|
|
30
|
+
// Now register a module that provides the adapter
|
|
31
|
+
const providerModule = defineAlternateModule({
|
|
32
|
+
id: 'provider',
|
|
33
|
+
adapters: {
|
|
34
|
+
search: mockSearchAdapter
|
|
35
|
+
},
|
|
36
|
+
setup() { }
|
|
37
|
+
});
|
|
38
|
+
registry.registerModule(providerModule, ctx);
|
|
39
|
+
// After registration, registry should have emitted adapter:registered and search module
|
|
40
|
+
// should have created the SearchManager
|
|
41
|
+
if (!ctx.searchManager) {
|
|
42
|
+
throw new Error('Expected searchManager to be initialized after adapter registration');
|
|
43
|
+
}
|
|
44
|
+
console.log('OK: searchManager initialized on adapter registration');
|
|
45
|
+
}
|
|
46
|
+
run().catch((err) => {
|
|
47
|
+
console.error(err);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseAdapterConfig } from './common';
|
|
2
|
+
export interface AuthAdapterConfig extends BaseAdapterConfig {
|
|
3
|
+
provider: 'custom' | 'auth0' | 'cognito' | string;
|
|
4
|
+
}
|
|
5
|
+
export interface AuthAdapter {
|
|
6
|
+
login(payload: unknown): Promise<unknown>;
|
|
7
|
+
logout(): Promise<void>;
|
|
8
|
+
getSession(): Promise<unknown | null>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseAdapter, BaseAdapterConfig } from './common';
|
|
2
|
+
export interface CartAdapterConfig extends BaseAdapterConfig {
|
|
3
|
+
provider: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CartItem {
|
|
6
|
+
id: string;
|
|
7
|
+
productId: string;
|
|
8
|
+
quantity: number;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface Cart<TItem extends CartItem = CartItem> {
|
|
12
|
+
id: string;
|
|
13
|
+
items: TItem[];
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface CartAdapter<TItem extends CartItem = CartItem> extends BaseAdapter<CartAdapterConfig> {
|
|
17
|
+
type: 'cart';
|
|
18
|
+
getCart(id: string): Promise<Cart<TItem> | null>;
|
|
19
|
+
addItem(cartId: string, item: TItem): Promise<Cart<TItem>>;
|
|
20
|
+
removeItem(cartId: string, itemId: string): Promise<Cart<TItem>>;
|
|
21
|
+
clearCart(cartId: string): Promise<Cart<TItem>>;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseAdapter, BaseAdapterConfig } from './common';
|
|
2
|
+
export interface CatalogAdapterConfig extends BaseAdapterConfig {
|
|
3
|
+
provider: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CatalogProduct {
|
|
6
|
+
id: string;
|
|
7
|
+
slug: string;
|
|
8
|
+
name: string;
|
|
9
|
+
price: number;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface CatalogAdapter<TProduct extends CatalogProduct = CatalogProduct> extends BaseAdapter<CatalogAdapterConfig> {
|
|
13
|
+
type: 'catalog';
|
|
14
|
+
getProductById(id: string): Promise<TProduct | null>;
|
|
15
|
+
getProductBySlug(slug: string): Promise<TProduct | null>;
|
|
16
|
+
listProducts(params?: Record<string, unknown>): Promise<TProduct[]>;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseAdapter, BaseAdapterConfig } from './common';
|
|
2
|
+
export interface ListsAdapterConfig extends BaseAdapterConfig {
|
|
3
|
+
provider?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ListsAdapter extends BaseAdapter<ListsAdapterConfig> {
|
|
6
|
+
type: 'lists';
|
|
7
|
+
getList(id: string): Promise<any>;
|
|
8
|
+
listLists(params?: Record<string, any>): Promise<any[]>;
|
|
9
|
+
createList(data: Partial<any>): Promise<any>;
|
|
10
|
+
updateList(id: string, data: Partial<any>): Promise<any>;
|
|
11
|
+
deleteList(id: string): Promise<void>;
|
|
12
|
+
addItem(listId: string, item: Partial<any>): Promise<any>;
|
|
13
|
+
updateItem(listId: string, itemId: string, data: Partial<any>): Promise<any>;
|
|
14
|
+
deleteItem(listId: string, itemId: string): Promise<void>;
|
|
15
|
+
reorderItems?(listId: string, itemIds: string[]): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export default ListsAdapter;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseAdapter, BaseAdapterConfig } from './common';
|
|
2
|
+
export interface SearchAdapterConfig extends BaseAdapterConfig {
|
|
3
|
+
provider: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SearchQuery {
|
|
6
|
+
term: string;
|
|
7
|
+
filters?: Record<string, unknown>;
|
|
8
|
+
page?: number;
|
|
9
|
+
pageSize?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface SearchResult<TItem = unknown> {
|
|
12
|
+
items: TItem[];
|
|
13
|
+
total: number;
|
|
14
|
+
page: number;
|
|
15
|
+
pageSize: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SearchAdapter<TItem = unknown> extends BaseAdapter<SearchAdapterConfig> {
|
|
18
|
+
type: 'search';
|
|
19
|
+
search(query: SearchQuery): Promise<SearchResult<TItem>>;
|
|
20
|
+
suggest?(term: string): Promise<string[]>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AlternateModule } from '../types/module';
|
|
2
|
+
import { AlternateContext } from '../runtime/context';
|
|
3
|
+
import { AlternateAdapterKey, AlternateAdapterMap, AlternateAdapterOf } from '../types/adapters';
|
|
4
|
+
import { AlternateEventBus } from '../types/events';
|
|
5
|
+
export declare class ModuleRegistry {
|
|
6
|
+
private modules;
|
|
7
|
+
private adapters;
|
|
8
|
+
private bus;
|
|
9
|
+
constructor(bus?: AlternateEventBus);
|
|
10
|
+
registerModule(module: AlternateModule, ctx: AlternateContext): void;
|
|
11
|
+
getAdapter<K extends AlternateAdapterKey>(key: K): AlternateAdapterOf<K> | undefined;
|
|
12
|
+
registerAdapter<K extends AlternateAdapterKey>(key: K, adapter: AlternateAdapterMap[K]): void;
|
|
13
|
+
runLifecycle(hook: keyof AlternateModule, ctx: AlternateContext): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class ModuleRegistry {
|
|
2
|
+
modules = new Map();
|
|
3
|
+
adapters = new Map();
|
|
4
|
+
bus = null;
|
|
5
|
+
constructor(bus) {
|
|
6
|
+
if (bus)
|
|
7
|
+
this.bus = bus;
|
|
8
|
+
}
|
|
9
|
+
registerModule(module, ctx) {
|
|
10
|
+
if (this.modules.has(module.id))
|
|
11
|
+
return;
|
|
12
|
+
this.modules.set(module.id, module);
|
|
13
|
+
if (module.adapters) {
|
|
14
|
+
for (const [key, adapter] of Object.entries(module.adapters)) {
|
|
15
|
+
const typedKey = key;
|
|
16
|
+
this.registerAdapter(typedKey, adapter);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
module.setup?.(ctx);
|
|
20
|
+
}
|
|
21
|
+
getAdapter(key) {
|
|
22
|
+
return this.adapters.get(key);
|
|
23
|
+
}
|
|
24
|
+
// Register an adapter at runtime. Emits `adapter:registered` so modules
|
|
25
|
+
// depending on adapters can react when new adapters become available.
|
|
26
|
+
registerAdapter(key, adapter) {
|
|
27
|
+
this.adapters.set(key, adapter);
|
|
28
|
+
if (this.bus) {
|
|
29
|
+
try {
|
|
30
|
+
// notify listeners asynchronously
|
|
31
|
+
this.bus.emit('adapter:registered', { key }).catch(() => { });
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
// ignore emit errors
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async runLifecycle(hook, ctx) {
|
|
39
|
+
for (const module of this.modules.values()) {
|
|
40
|
+
const fn = module[hook];
|
|
41
|
+
if (typeof fn === 'function') {
|
|
42
|
+
await fn.call(module, ctx);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AlternateContext } from './context';
|
|
2
|
+
import { ModuleRegistry } from '../plugins/registry';
|
|
3
|
+
import { createEventBus } from '../types/events';
|
|
4
|
+
import { setRuntimeContext } from './hooks';
|
|
5
|
+
import { runAppLifecycle } from './lifecycle';
|
|
6
|
+
export function createAlternateApp(options) {
|
|
7
|
+
const eventBus = createEventBus();
|
|
8
|
+
const registry = new ModuleRegistry(eventBus);
|
|
9
|
+
const context = new AlternateContext(options.config, registry);
|
|
10
|
+
setRuntimeContext(context, eventBus);
|
|
11
|
+
options.modules?.forEach((mod) => registry.registerModule(mod, context));
|
|
12
|
+
return {
|
|
13
|
+
context,
|
|
14
|
+
events: eventBus,
|
|
15
|
+
async start() {
|
|
16
|
+
await runAppLifecycle(registry, context, eventBus);
|
|
17
|
+
return context;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AlternateConfig } from '../types/config';
|
|
2
|
+
import { ModuleRegistry } from '../plugins/registry';
|
|
3
|
+
import { AlternateAdapterKey, AlternateAdapterOf } from '../types/adapters';
|
|
4
|
+
export declare class AlternateContext {
|
|
5
|
+
readonly config: AlternateConfig;
|
|
6
|
+
readonly modules: ModuleRegistry;
|
|
7
|
+
constructor(config: AlternateConfig, modules: ModuleRegistry);
|
|
8
|
+
getAdapter<K extends AlternateAdapterKey>(key: K): AlternateAdapterOf<K> | undefined;
|
|
9
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { AlternateContext } from './context';
|
|
2
|
+
import { AlternateEventBus } from '../types/events';
|
|
3
|
+
export declare function setRuntimeContext(ctx: AlternateContext, bus: AlternateEventBus): void;
|
|
4
|
+
export declare function useAlternateContext(): AlternateContext;
|
|
5
|
+
export declare function useAlternateEventBus(): AlternateEventBus;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
let currentContext = null;
|
|
2
|
+
let currentEventBus = null;
|
|
3
|
+
export function setRuntimeContext(ctx, bus) {
|
|
4
|
+
currentContext = ctx;
|
|
5
|
+
currentEventBus = bus;
|
|
6
|
+
}
|
|
7
|
+
export function useAlternateContext() {
|
|
8
|
+
if (!currentContext) {
|
|
9
|
+
throw new Error('[@meeovi/core] useAlternateContext() called before app initialization');
|
|
10
|
+
}
|
|
11
|
+
return currentContext;
|
|
12
|
+
}
|
|
13
|
+
export function useAlternateEventBus() {
|
|
14
|
+
if (!currentEventBus) {
|
|
15
|
+
throw new Error('[@meeovi/core] useAlternateEventBus() called before app initialization');
|
|
16
|
+
}
|
|
17
|
+
return currentEventBus;
|
|
18
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AlternateContext } from './context';
|
|
2
|
+
import { ModuleRegistry } from '../plugins/registry';
|
|
3
|
+
import { AlternateEventBus } from '../types/events';
|
|
4
|
+
export declare function runAppLifecycle(registry: ModuleRegistry, ctx: AlternateContext, bus: AlternateEventBus): Promise<void>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SearchAdapter } from '../adapters/search';
|
|
2
|
+
import type { ListsAdapter } from '../adapters/lists';
|
|
3
|
+
import type { CatalogAdapter } from '../adapters/catalog';
|
|
4
|
+
import type { CartAdapter } from '../adapters/cart';
|
|
5
|
+
import type { AuthAdapter } from '../adapters/auth';
|
|
6
|
+
export interface AlternateAdapterMap {
|
|
7
|
+
search: SearchAdapter;
|
|
8
|
+
lists: ListsAdapter;
|
|
9
|
+
catalog: CatalogAdapter;
|
|
10
|
+
cart: CartAdapter;
|
|
11
|
+
auth: AuthAdapter;
|
|
12
|
+
}
|
|
13
|
+
export type AlternateAdapterKey = keyof AlternateAdapterMap;
|
|
14
|
+
export type AlternateAdapterOf<K extends AlternateAdapterKey> = AlternateAdapterMap[K];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AlternateConfig } from './config';
|
|
2
|
+
import { AlternateContext } from '../runtime/context';
|
|
3
|
+
import { AlternateEventBus } from './events';
|
|
4
|
+
import { AlternateModule } from './module';
|
|
5
|
+
export interface AlternateApp {
|
|
6
|
+
context: AlternateContext;
|
|
7
|
+
events: AlternateEventBus;
|
|
8
|
+
start(): Promise<AlternateContext>;
|
|
9
|
+
}
|
|
10
|
+
export interface AlternateAppOptions {
|
|
11
|
+
config: AlternateConfig;
|
|
12
|
+
modules?: AlternateModule[];
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { AlternateAdapterKey } from './adapters';
|
|
2
|
+
export interface AlternateEventMap {
|
|
3
|
+
'app:ready': {
|
|
4
|
+
context: unknown;
|
|
5
|
+
};
|
|
6
|
+
'app:error': {
|
|
7
|
+
error: unknown;
|
|
8
|
+
};
|
|
9
|
+
'adapter:registered': {
|
|
10
|
+
key: AlternateAdapterKey;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export type AlternateEventKey = keyof AlternateEventMap;
|
|
14
|
+
export type AlternateEventHandler<K extends AlternateEventKey> = (payload: AlternateEventMap[K]) => void | Promise<void>;
|
|
15
|
+
export interface AlternateEventBus {
|
|
16
|
+
on<K extends AlternateEventKey>(event: K, handler: AlternateEventHandler<K>): void;
|
|
17
|
+
off<K extends AlternateEventKey>(event: K, handler: AlternateEventHandler<K>): void;
|
|
18
|
+
emit<K extends AlternateEventKey>(event: K, payload: AlternateEventMap[K]): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createEventBus(): AlternateEventBus;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function createEventBus() {
|
|
2
|
+
const handlers = new Map();
|
|
3
|
+
return {
|
|
4
|
+
on(event, handler) {
|
|
5
|
+
if (!handlers.has(event)) {
|
|
6
|
+
handlers.set(event, new Set());
|
|
7
|
+
}
|
|
8
|
+
handlers.get(event).add(handler);
|
|
9
|
+
},
|
|
10
|
+
off(event, handler) {
|
|
11
|
+
handlers.get(event)?.delete(handler);
|
|
12
|
+
},
|
|
13
|
+
async emit(event, payload) {
|
|
14
|
+
const set = handlers.get(event);
|
|
15
|
+
if (!set || set.size === 0)
|
|
16
|
+
return;
|
|
17
|
+
for (const handler of set) {
|
|
18
|
+
await handler(payload);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AlternateContext } from '../runtime/context';
|
|
2
|
+
import type { AlternateAdapterKey, AlternateAdapterOf } from './adapters';
|
|
3
|
+
export type AlternateModuleAdapters = Partial<{
|
|
4
|
+
[K in AlternateAdapterKey]: AlternateAdapterOf<K>;
|
|
5
|
+
}>;
|
|
6
|
+
export interface AlternateModuleLifecycle {
|
|
7
|
+
onAppInit?(ctx: AlternateContext): Promise<void> | void;
|
|
8
|
+
onBeforeRequest?(ctx: AlternateContext): Promise<void> | void;
|
|
9
|
+
onAfterRequest?(ctx: AlternateContext): Promise<void> | void;
|
|
10
|
+
}
|
|
11
|
+
export interface AlternateModule extends AlternateModuleLifecycle {
|
|
12
|
+
id: string;
|
|
13
|
+
adapters?: AlternateModuleAdapters;
|
|
14
|
+
setup?(ctx: AlternateContext): void | Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meeovi/layer-search",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Powerful search module for the Alternate Framework.",
|
|
5
5
|
"main": "./nuxt.config.ts",
|
|
6
6
|
"keywords": [
|
|
@@ -11,9 +11,6 @@
|
|
|
11
11
|
"vue",
|
|
12
12
|
"instantsearch"
|
|
13
13
|
],
|
|
14
|
-
"bin": {
|
|
15
|
-
"meeovi-search": "./dist/cli.js"
|
|
16
|
-
},
|
|
17
14
|
"author": "Meeovi",
|
|
18
15
|
"license": "MIT",
|
|
19
16
|
"type": "module",
|
|
@@ -26,6 +23,7 @@
|
|
|
26
23
|
"@types/react": "^19.2.9",
|
|
27
24
|
"react": "^19.2.3",
|
|
28
25
|
"searchkit": "^4.15.0",
|
|
26
|
+
"graphql": "^16.8.0",
|
|
29
27
|
"typescript": "^5.9.3",
|
|
30
28
|
"vue": "^3.2.47",
|
|
31
29
|
"vue-instantsearch": "^4.22.8"
|
|
@@ -34,4 +32,11 @@
|
|
|
34
32
|
"@types/node": "^25.0.10",
|
|
35
33
|
"nuxt": "^4.3.0"
|
|
36
34
|
}
|
|
35
|
+
|
|
36
|
+
,"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"import": "./app/composables/index.ts",
|
|
39
|
+
"require": "./app/composables/index.ts"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
37
42
|
}
|