@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.
Files changed (150) hide show
  1. package/README.md +39 -5
  2. package/app/composables/bridges/searchkit-server.ts +51 -0
  3. package/app/composables/bridges/searchkit.ts +88 -0
  4. package/app/composables/index.ts +4 -1
  5. package/app/composables/module.ts +41 -0
  6. package/app/composables/utils/health.ts +13 -0
  7. package/app/plugins/search.js +1 -1
  8. package/app/utils/search/client.ts +40 -0
  9. package/dist/app/composables/adapter/meilisearch.d.ts +8 -0
  10. package/dist/app/composables/adapter/meilisearch.js +36 -0
  11. package/dist/app/composables/adapter/mock.d.ts +3 -0
  12. package/dist/app/composables/adapter/mock.js +19 -0
  13. package/dist/app/composables/adapter/opensearch.d.ts +8 -0
  14. package/dist/app/composables/adapter/opensearch.js +46 -0
  15. package/dist/app/composables/adapter/types.d.ts +12 -0
  16. package/dist/app/composables/adapter/types.js +1 -0
  17. package/dist/app/composables/bridges/instantsearch.d.ts +4 -0
  18. package/dist/app/composables/bridges/instantsearch.js +17 -0
  19. package/dist/app/composables/bridges/react.d.ts +12 -0
  20. package/dist/app/composables/bridges/react.js +34 -0
  21. package/dist/app/composables/bridges/vue.d.ts +9 -0
  22. package/dist/app/composables/bridges/vue.js +31 -0
  23. package/dist/app/composables/cli.d.ts +2 -0
  24. package/dist/app/composables/cli.js +69 -0
  25. package/dist/app/composables/config/schema.d.ts +5 -0
  26. package/dist/app/composables/config/schema.js +8 -0
  27. package/dist/app/composables/config.d.ts +7 -0
  28. package/dist/app/composables/config.js +11 -0
  29. package/dist/app/composables/core/Facets.d.ts +17 -0
  30. package/dist/app/composables/core/Facets.js +8 -0
  31. package/dist/app/composables/core/Filters.d.ts +18 -0
  32. package/dist/app/composables/core/Filters.js +11 -0
  33. package/dist/app/composables/core/Normalizers.d.ts +0 -0
  34. package/dist/app/composables/core/Normalizers.js +1 -0
  35. package/dist/app/composables/core/Pipeline.d.ts +8 -0
  36. package/dist/app/composables/core/Pipeline.js +16 -0
  37. package/dist/app/composables/core/QueryBuilder.d.ts +13 -0
  38. package/dist/app/composables/core/QueryBuilder.js +15 -0
  39. package/dist/app/composables/core/SearchContext.d.ts +18 -0
  40. package/dist/app/composables/core/SearchContext.js +38 -0
  41. package/dist/app/composables/core/SearchManager.d.ts +10 -0
  42. package/dist/app/composables/core/SearchManager.js +20 -0
  43. package/dist/app/composables/events.d.ts +11 -0
  44. package/dist/app/composables/events.js +1 -0
  45. package/dist/app/composables/index.d.ts +9 -0
  46. package/dist/app/composables/index.js +9 -0
  47. package/dist/app/composables/module.d.ts +17 -0
  48. package/dist/app/composables/module.js +39 -0
  49. package/dist/app/composables/types/api/global-search.d.ts +8 -0
  50. package/dist/app/composables/types/api/global-search.js +1 -0
  51. package/dist/app/composables/utils/normalizers.d.ts +1 -0
  52. package/dist/app/composables/utils/normalizers.js +6 -0
  53. package/dist/app/utils/search/client.d.ts +3 -0
  54. package/dist/app/utils/search/client.js +31 -0
  55. package/dist/layers/search/app/composables/adapter/meilisearch.d.ts +8 -0
  56. package/dist/layers/search/app/composables/adapter/meilisearch.js +36 -0
  57. package/dist/layers/search/app/composables/adapter/mock.d.ts +3 -0
  58. package/dist/layers/search/app/composables/adapter/mock.js +19 -0
  59. package/dist/layers/search/app/composables/adapter/opensearch.d.ts +8 -0
  60. package/dist/layers/search/app/composables/adapter/opensearch.js +46 -0
  61. package/dist/layers/search/app/composables/adapter/types.d.ts +12 -0
  62. package/dist/layers/search/app/composables/adapter/types.js +1 -0
  63. package/dist/layers/search/app/composables/bridges/instantsearch.d.ts +4 -0
  64. package/dist/layers/search/app/composables/bridges/instantsearch.js +17 -0
  65. package/dist/layers/search/app/composables/bridges/react.d.ts +12 -0
  66. package/dist/layers/search/app/composables/bridges/react.js +34 -0
  67. package/dist/layers/search/app/composables/bridges/searchkit-server.d.ts +3 -0
  68. package/dist/layers/search/app/composables/bridges/searchkit-server.js +44 -0
  69. package/dist/layers/search/app/composables/bridges/searchkit.d.ts +21 -0
  70. package/dist/layers/search/app/composables/bridges/searchkit.js +60 -0
  71. package/dist/layers/search/app/composables/bridges/vue.d.ts +9 -0
  72. package/dist/layers/search/app/composables/bridges/vue.js +31 -0
  73. package/dist/layers/search/app/composables/cli.d.ts +2 -0
  74. package/dist/layers/search/app/composables/cli.js +69 -0
  75. package/dist/layers/search/app/composables/config/schema.d.ts +5 -0
  76. package/dist/layers/search/app/composables/config/schema.js +8 -0
  77. package/dist/layers/search/app/composables/config.d.ts +7 -0
  78. package/dist/layers/search/app/composables/config.js +11 -0
  79. package/dist/layers/search/app/composables/core/Facets.d.ts +17 -0
  80. package/dist/layers/search/app/composables/core/Facets.js +8 -0
  81. package/dist/layers/search/app/composables/core/Filters.d.ts +18 -0
  82. package/dist/layers/search/app/composables/core/Filters.js +11 -0
  83. package/dist/layers/search/app/composables/core/Normalizers.d.ts +0 -0
  84. package/dist/layers/search/app/composables/core/Normalizers.js +1 -0
  85. package/dist/layers/search/app/composables/core/Pipeline.d.ts +8 -0
  86. package/dist/layers/search/app/composables/core/Pipeline.js +16 -0
  87. package/dist/layers/search/app/composables/core/QueryBuilder.d.ts +13 -0
  88. package/dist/layers/search/app/composables/core/QueryBuilder.js +15 -0
  89. package/dist/layers/search/app/composables/core/SearchContext.d.ts +18 -0
  90. package/dist/layers/search/app/composables/core/SearchContext.js +38 -0
  91. package/dist/layers/search/app/composables/core/SearchManager.d.ts +10 -0
  92. package/dist/layers/search/app/composables/core/SearchManager.js +20 -0
  93. package/dist/layers/search/app/composables/events.d.ts +11 -0
  94. package/dist/layers/search/app/composables/events.js +1 -0
  95. package/dist/layers/search/app/composables/index.d.ts +12 -0
  96. package/dist/layers/search/app/composables/index.js +12 -0
  97. package/dist/layers/search/app/composables/module.d.ts +17 -0
  98. package/dist/layers/search/app/composables/module.js +73 -0
  99. package/dist/layers/search/app/composables/types/api/global-search.d.ts +8 -0
  100. package/dist/layers/search/app/composables/types/api/global-search.js +1 -0
  101. package/dist/layers/search/app/composables/utils/health.d.ts +11 -0
  102. package/dist/layers/search/app/composables/utils/health.js +11 -0
  103. package/dist/layers/search/app/composables/utils/normalizers.d.ts +1 -0
  104. package/dist/layers/search/app/composables/utils/normalizers.js +6 -0
  105. package/dist/layers/search/app/utils/search/client.d.ts +3 -0
  106. package/dist/layers/search/app/utils/search/client.js +31 -0
  107. package/dist/layers/search/nuxt.config.d.ts +2 -0
  108. package/dist/layers/search/nuxt.config.js +7 -0
  109. package/dist/layers/search/test/runtime-adapter.spec.d.ts +1 -0
  110. package/dist/layers/search/test/runtime-adapter.spec.js +49 -0
  111. package/dist/nuxt.config.d.ts +2 -0
  112. package/dist/nuxt.config.js +7 -0
  113. package/dist/packages/core/src/adapters/auth.d.ts +9 -0
  114. package/dist/packages/core/src/adapters/auth.js +1 -0
  115. package/dist/packages/core/src/adapters/cart.d.ts +22 -0
  116. package/dist/packages/core/src/adapters/cart.js +1 -0
  117. package/dist/packages/core/src/adapters/catalog.d.ts +17 -0
  118. package/dist/packages/core/src/adapters/catalog.js +1 -0
  119. package/dist/packages/core/src/adapters/common.d.ts +9 -0
  120. package/dist/packages/core/src/adapters/common.js +1 -0
  121. package/dist/packages/core/src/adapters/lists.d.ts +17 -0
  122. package/dist/packages/core/src/adapters/lists.js +1 -0
  123. package/dist/packages/core/src/adapters/search.d.ts +21 -0
  124. package/dist/packages/core/src/adapters/search.js +1 -0
  125. package/dist/packages/core/src/plugins/defineAdapter.d.ts +2 -0
  126. package/dist/packages/core/src/plugins/defineAdapter.js +3 -0
  127. package/dist/packages/core/src/plugins/defineModule.d.ts +2 -0
  128. package/dist/packages/core/src/plugins/defineModule.js +3 -0
  129. package/dist/packages/core/src/plugins/registry.d.ts +14 -0
  130. package/dist/packages/core/src/plugins/registry.js +46 -0
  131. package/dist/packages/core/src/runtime/app.d.ts +2 -0
  132. package/dist/packages/core/src/runtime/app.js +20 -0
  133. package/dist/packages/core/src/runtime/context.d.ts +9 -0
  134. package/dist/packages/core/src/runtime/context.js +11 -0
  135. package/dist/packages/core/src/runtime/hooks.d.ts +5 -0
  136. package/dist/packages/core/src/runtime/hooks.js +18 -0
  137. package/dist/packages/core/src/runtime/lifecycle.d.ts +4 -0
  138. package/dist/packages/core/src/runtime/lifecycle.js +5 -0
  139. package/dist/packages/core/src/types/adapters.d.ts +14 -0
  140. package/dist/packages/core/src/types/adapters.js +1 -0
  141. package/dist/packages/core/src/types/app.d.ts +13 -0
  142. package/dist/packages/core/src/types/app.js +1 -0
  143. package/dist/packages/core/src/types/config.d.ts +8 -0
  144. package/dist/packages/core/src/types/config.js +1 -0
  145. package/dist/packages/core/src/types/events.d.ts +20 -0
  146. package/dist/packages/core/src/types/events.js +22 -0
  147. package/dist/packages/core/src/types/module.d.ts +15 -0
  148. package/dist/packages/core/src/types/module.js +1 -0
  149. package/package.json +9 -4
  150. 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,6 @@
1
+ export function normalizeOpenSearchHit(hit) {
2
+ return {
3
+ id: hit._id,
4
+ ...hit._source
5
+ };
6
+ }
@@ -0,0 +1,3 @@
1
+ import type { SearchClient } from 'instantsearch.js';
2
+ export declare function getIndexName(): string;
3
+ export declare function getSearchClient(): SearchClient;
@@ -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,2 @@
1
+ declare const _default: import("c12").InputConfig<import("@nuxt/schema").NuxtConfig, import("c12").ConfigLayerMeta>;
2
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { defineNuxtConfig } from 'nuxt/config';
2
+ export default defineNuxtConfig({
3
+ $meta: {
4
+ name: 'search',
5
+ },
6
+ runtimeConfig: {}
7
+ });
@@ -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,2 @@
1
+ declare const _default: import("c12").InputConfig<import("@nuxt/schema").NuxtConfig, import("c12").ConfigLayerMeta>;
2
+ export default _default;
@@ -0,0 +1,7 @@
1
+ import { defineNuxtConfig } from 'nuxt/config';
2
+ export default defineNuxtConfig({
3
+ $meta: {
4
+ name: 'search',
5
+ },
6
+ runtimeConfig: {}
7
+ });
@@ -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,9 @@
1
+ export interface BaseAdapterConfig {
2
+ enabled?: boolean;
3
+ timeoutMs?: number;
4
+ }
5
+ export interface BaseAdapter<TConfig extends BaseAdapterConfig = BaseAdapterConfig> {
6
+ id: string;
7
+ type: string;
8
+ config?: TConfig;
9
+ }
@@ -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,2 @@
1
+ import type { BaseAdapter } from '../adapters/common';
2
+ export declare function defineAlternateAdapter<T extends BaseAdapter<any>>(adapter: T): T;
@@ -0,0 +1,3 @@
1
+ export function defineAlternateAdapter(adapter) {
2
+ return adapter;
3
+ }
@@ -0,0 +1,2 @@
1
+ import { AlternateModule } from '../types/module';
2
+ export declare function defineAlternateModule<T extends AlternateModule>(module: T): T;
@@ -0,0 +1,3 @@
1
+ export function defineAlternateModule(module) {
2
+ return module;
3
+ }
@@ -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,2 @@
1
+ import type { AlternateApp, AlternateAppOptions } from '../types/app';
2
+ export declare function createAlternateApp(options: AlternateAppOptions): AlternateApp;
@@ -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,11 @@
1
+ export class AlternateContext {
2
+ config;
3
+ modules;
4
+ constructor(config, modules) {
5
+ this.config = config;
6
+ this.modules = modules;
7
+ }
8
+ getAdapter(key) {
9
+ return this.modules.getAdapter(key);
10
+ }
11
+ }
@@ -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,5 @@
1
+ export async function runAppLifecycle(registry, ctx, bus) {
2
+ // Example lifecycle sequence
3
+ await registry.runLifecycle('onAppInit', ctx);
4
+ bus.emit('app:ready', { context: ctx });
5
+ }
@@ -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,8 @@
1
+ export interface AlternateConfig {
2
+ env: 'development' | 'production' | 'test';
3
+ appName?: string;
4
+ logger?: {
5
+ level?: 'debug' | 'info' | 'warn' | 'error';
6
+ };
7
+ [key: string]: unknown;
8
+ }
@@ -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.6",
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
  }