every-plugin 0.7.0 ā 0.8.1
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/dist/build/rspack/dev-server-middleware.cjs.map +1 -1
- package/dist/build/rspack/dev-server-middleware.mjs.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.mjs +1 -1
- package/dist/package.mjs.map +1 -1
- package/dist/plugin.cjs +10 -9
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.d.cts +17 -15
- package/dist/plugin.d.cts.map +1 -1
- package/dist/plugin.d.mts +17 -15
- package/dist/plugin.d.mts.map +1 -1
- package/dist/plugin.mjs +10 -9
- package/dist/plugin.mjs.map +1 -1
- package/dist/runtime/index.cjs +6 -4
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.d.cts +1 -1
- package/dist/runtime/index.d.cts.map +1 -1
- package/dist/runtime/index.d.mts +1 -1
- package/dist/runtime/index.d.mts.map +1 -1
- package/dist/runtime/index.mjs +6 -4
- package/dist/runtime/index.mjs.map +1 -1
- package/dist/types.d.cts +20 -12
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +20 -12
- package/dist/types.d.mts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-middleware.cjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n const { onError } = await import('every-plugin/orpc');\n\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remote: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\nš“ ${context} Error: ${error.message || 'Unknown error'}`];\n\n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\nš Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` āā Code: ${issue.code || 'unknown'}`);\n lines.push(` āā Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` āā Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` āā Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` āā (end)`);\n }\n });\n }\n\n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\nš Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n\n if (error.cause?.data) {\n lines.push('\\nš¦ Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n\n if (error.code) {\n lines.push(`\\nā ļø Error Code: ${error.code}`);\n }\n\n if (error.status) {\n lines.push(`š Status: ${error.status}`);\n }\n\n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā ā
Plugin dev server ready: `);\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā š” RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`ā š Docs: http://localhost:${port}/api`);\n console.log(`ā š Health: http://localhost:${port}/`);\n console.log(`ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('ā Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-server-middleware.cjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n const { onError } = await import('every-plugin/orpc');\n\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remote: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n // @ts-expect-error we don't know the plugin id\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\nš“ ${context} Error: ${error.message || 'Unknown error'}`];\n\n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\nš Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` āā Code: ${issue.code || 'unknown'}`);\n lines.push(` āā Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` āā Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` āā Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` āā (end)`);\n }\n });\n }\n\n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\nš Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n\n if (error.cause?.data) {\n lines.push('\\nš¦ Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n\n if (error.code) {\n lines.push(`\\nā ļø Error Code: ${error.code}`);\n }\n\n if (error.status) {\n lines.push(`š Status: ${error.status}`);\n }\n\n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā ā
Plugin dev server ready: `);\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā š” RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`ā š Docs: http://localhost:${port}/api`);\n console.log(`ā š Health: http://localhost:${port}/`);\n console.log(`ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('ā Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server-middleware.mjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n const { onError } = await import('every-plugin/orpc');\n\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remote: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\nš“ ${context} Error: ${error.message || 'Unknown error'}`];\n\n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\nš Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` āā Code: ${issue.code || 'unknown'}`);\n lines.push(` āā Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` āā Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` āā Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` āā (end)`);\n }\n });\n }\n\n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\nš Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n\n if (error.cause?.data) {\n lines.push('\\nš¦ Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n\n if (error.code) {\n lines.push(`\\nā ļø Error Code: ${error.code}`);\n }\n\n if (error.status) {\n lines.push(`š Status: ${error.status}`);\n }\n\n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā ā
Plugin dev server ready: `);\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā š” RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`ā š Docs: http://localhost:${port}/api`);\n console.log(`ā š Health: http://localhost:${port}/`);\n console.log(`ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('ā Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev-server-middleware.mjs","names":["handlers: { rpc: any, api: any }","cleanup: (() => Promise<void>) | null","lines: string[]"],"sources":["../../../src/build/rspack/dev-server-middleware.ts"],"sourcesContent":["import type { PluginInfo } from './utils';\n\nconst corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',\n 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization'\n};\n\nconst applyCorsHeaders = (res: any) => {\n Object.entries(corsHeaders).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n};\n\nconst normalizePrefix = (prefix?: string): string => {\n if (!prefix) return '';\n const cleaned = prefix.replace(/^\\/+|\\/+$/g, '');\n return cleaned ? `/${cleaned}` : '';\n};\n\nexport function setupPluginMiddleware(devServer: any, pluginInfo: PluginInfo, devConfig: any, port: number) {\n const rpcPrefix = normalizePrefix(devConfig?.prefix);\n let handlers: { rpc: any, api: any } = { rpc: null, api: null };\n let cleanup: (() => Promise<void>) | null = null;\n\n const performCleanup = async () => {\n if (cleanup) {\n await cleanup();\n cleanup = null;\n }\n };\n\n (async () => {\n await performCleanup();\n\n try {\n const { createPluginRuntime } = await import('every-plugin');\n const { RPCHandler } = await import('@orpc/server/fetch');\n const { OpenAPIHandler } = await import('@orpc/openapi/fetch');\n const { OpenAPIReferencePlugin } = await import('@orpc/openapi/plugins');\n const { ZodToJsonSchemaConverter } = await import('@orpc/zod/zod4');\n const { onError } = await import('every-plugin/orpc');\n\n\n const pluginId = devConfig?.pluginId || pluginInfo.normalizedName;\n\n const runtime = createPluginRuntime({\n registry: {\n [pluginId]: {\n remote: `http://localhost:${port}/remoteEntry.js`\n }\n }\n });\n\n // @ts-expect-error we don't know the plugin id\n const loaded = await runtime.usePlugin(pluginId, devConfig?.config);\n\n cleanup = async () => {\n if (loaded && typeof (loaded as any).dispose === 'function') {\n await (loaded as any).dispose();\n }\n if (runtime && typeof (runtime as any).cleanup === 'function') {\n await (runtime as any).cleanup();\n }\n handlers.rpc = null;\n handlers.api = null;\n if (devServer.app.locals.handlers) {\n devServer.app.locals.handlers = null;\n }\n };\n\n const formatError = (error: any, context: string) => {\n const lines: string[] = [`\\nš“ ${context} Error: ${error.message || 'Unknown error'}`];\n\n if (error.cause?.issues && Array.isArray(error.cause.issues)) {\n lines.push('\\nš Validation Issues:');\n error.cause.issues.forEach((issue: any, index: number) => {\n lines.push(` ${index + 1}. ${issue.path?.join('.') || 'root'}`);\n lines.push(` āā Code: ${issue.code || 'unknown'}`);\n lines.push(` āā Message: ${issue.message || 'No message'}`);\n if (issue.expected !== undefined) {\n lines.push(` āā Expected: ${JSON.stringify(issue.expected)}`);\n }\n if (issue.received !== undefined) {\n lines.push(` āā Received: ${JSON.stringify(issue.received)}`);\n } else {\n lines.push(` āā (end)`);\n }\n });\n }\n\n if (error.data && typeof error.data === 'object' && Object.keys(error.data).length > 0) {\n lines.push('\\nš Error Data:');\n try {\n const dataStr = JSON.stringify(error.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.data)}`);\n }\n }\n\n if (error.cause?.data) {\n lines.push('\\nš¦ Request Data:');\n try {\n const dataStr = JSON.stringify(error.cause.data, null, 2);\n dataStr.split('\\n').forEach(line => {\n lines.push(` ${line}`);\n });\n } catch {\n lines.push(` ${String(error.cause.data)}`);\n }\n }\n\n if (error.code) {\n lines.push(`\\nā ļø Error Code: ${error.code}`);\n }\n\n if (error.status) {\n lines.push(`š Status: ${error.status}`);\n }\n\n lines.push('');\n console.error(lines.join('\\n'));\n };\n\n handlers.rpc = new RPCHandler(loaded.router, {\n interceptors: [\n onError((error: any) => {\n formatError(error, 'RPC');\n }),\n ]\n });\n\n handlers.api = new OpenAPIHandler(loaded.router, {\n plugins: [\n new OpenAPIReferencePlugin({\n schemaConverters: [new ZodToJsonSchemaConverter()],\n }),\n ],\n interceptors: [\n onError((error: any) => {\n formatError(error, 'OpenAPI');\n }),\n ]\n });\n\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā ā
Plugin dev server ready: `);\n console.log(`āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n console.log(`ā š” RPC: http://localhost:${port}/api/rpc${rpcPrefix}`);\n console.log(`ā š Docs: http://localhost:${port}/api`);\n console.log(`ā š Health: http://localhost:${port}/`);\n console.log(`ā°āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā`);\n\n devServer.app.locals.handlers = handlers;\n\n if (devServer.server) {\n devServer.server.once('close', async () => {\n await performCleanup();\n });\n }\n } catch (error) {\n console.error('ā Failed to load plugin:', error);\n await performCleanup();\n }\n })();\n\n process.once('SIGINT', async () => {\n await performCleanup();\n });\n process.once('SIGTERM', async () => {\n await performCleanup();\n });\n\n devServer.app.options('*', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.status(200).end();\n });\n\n devServer.app.get('/', (req: any, res: any) => {\n applyCorsHeaders(res);\n res.json({\n ok: true,\n plugin: pluginInfo.normalizedName,\n version: pluginInfo.version,\n status: devServer.app.locals.handlers?.rpc ? 'ready' : 'loading',\n endpoints: {\n health: '/',\n docs: '/api',\n rpc: `/api/rpc${rpcPrefix}`\n }\n });\n });\n\n // OpenAPI documentation and REST endpoints at /api and /api/*\n const handleApiRequest = async (req: any, res: any) => {\n applyCorsHeaders(res);\n const apiHandler = devServer.app.locals.handlers?.api;\n if (!apiHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await apiHandler.handle(webRequest, {\n prefix: '/api',\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('OpenAPI error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n };\n\n devServer.app.all(`/api/rpc${rpcPrefix}/*`, async (req: any, res: any) => {\n applyCorsHeaders(res);\n const rpcHandler = devServer.app.locals.handlers?.rpc;\n if (!rpcHandler) {\n return res.status(503).json({ error: 'Plugin still loading...' });\n }\n\n try {\n const url = `http://${req.headers.host}${req.url}`;\n const webRequest = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== 'GET' && req.method !== 'HEAD' ? req : undefined,\n duplex: req.method !== 'GET' && req.method !== 'HEAD' ? 'half' : undefined\n } as RequestInit);\n\n const result = await rpcHandler.handle(webRequest, {\n prefix: `/api/rpc${rpcPrefix}`,\n context: {}\n });\n\n if (result.response) {\n res.status(result.response.status);\n result.response.headers.forEach((value: string, key: string) => {\n res.setHeader(key, value);\n });\n const text = await result.response.text();\n res.send(text);\n } else {\n res.status(404).send('Not Found');\n }\n } catch (error) {\n console.error('RPC error:', error);\n res.status(500).json({ error: (error as Error).message });\n }\n });\n\n devServer.app.all('/api', handleApiRequest);\n devServer.app.all('/api/*', handleApiRequest);\n}\n"],"mappings":"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"}
|
package/dist/package.cjs
CHANGED
package/dist/package.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n\t\"name\": \"every-plugin\",\n\t\"version\": \"0.
|
|
1
|
+
{"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n\t\"name\": \"every-plugin\",\n\t\"version\": \"0.8.1\",\n\t\"type\": \"module\",\n\t\"main\": \"./dist/index.cjs\",\n\t\"module\": \"./dist/index.mjs\",\n\t\"types\": \"./dist/index.d.mts\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"require\": \"./dist/index.cjs\"\n\t\t},\n\t\t\"./runtime\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/runtime/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/runtime/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/runtime/index.mjs\",\n\t\t\t\"require\": \"./dist/runtime/index.cjs\"\n\t\t},\n\t\t\"./testing\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/testing/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/testing/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/testing/index.mjs\",\n\t\t\t\"require\": \"./dist/testing/index.cjs\"\n\t\t},\n\t\t\"./normalize\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/runtime/services/normalize.d.mts\",\n\t\t\t\t\"require\": \"./dist/runtime/services/normalize.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/runtime/services/normalize.mjs\",\n\t\t\t\"require\": \"./dist/runtime/services/normalize.cjs\"\n\t\t},\n\t\t\"./effect\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/effect.d.mts\",\n\t\t\t\t\"require\": \"./dist/effect.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/effect.mjs\",\n\t\t\t\"require\": \"./dist/effect.cjs\"\n\t\t},\n\t\t\"./zod\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/zod.d.mts\",\n\t\t\t\t\"require\": \"./dist/zod.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/zod.mjs\",\n\t\t\t\"require\": \"./dist/zod.cjs\"\n\t\t},\n\t\t\"./zod/v4/core\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/zod-core.d.mts\",\n\t\t\t\t\"require\": \"./dist/zod-core.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/zod-core.mjs\",\n\t\t\t\"require\": \"./dist/zod-core.cjs\"\n\t\t},\n\t\t\"./orpc\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/orpc.d.mts\",\n\t\t\t\t\"require\": \"./dist/orpc.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/orpc.mjs\",\n\t\t\t\"require\": \"./dist/orpc.cjs\"\n\t\t},\n\t\t\"./errors\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/errors.d.mts\",\n\t\t\t\t\"require\": \"./dist/errors.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/errors.mjs\",\n\t\t\t\"require\": \"./dist/errors.cjs\"\n\t\t},\n\t\t\"./types\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/types.d.mts\",\n\t\t\t\t\"require\": \"./dist/types.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/types.mjs\",\n\t\t\t\"require\": \"./dist/types.cjs\"\n\t\t},\n\t\t\"./build/rspack\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/build/rspack/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/build/rspack/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/build/rspack/index.mjs\",\n\t\t\t\"require\": \"./dist/build/rspack/index.cjs\"\n\t\t},\n\t\t\"./package.json\": \"./package.json\"\n\t},\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"tsdown\",\n\t\t\"build:test\": \"cd tests/fixtures/test-plugin && bun run build\",\n\t\t\"test\": \"vitest run --config vitest.config.ts\",\n\t\t\"test:unit\": \"vitest run --config vitest.config.ts\",\n\t\t\"test:integration\": \"bun run build:test && vitest run --config vitest.integration.config.ts\",\n\t\t\"test:all\": \"bun run test:unit && bun run test:integration\",\n\t\t\"test:watch\": \"vitest --config vitest.config.ts --watch\",\n\t\t\"typecheck\": \"tsc --noEmit\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@rspack/core\": \"1.6.7\",\n\t\t\"typescript\": \"^5.6.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@effect/language-service\": \"^0.62.0\",\n\t\t\"@effect/vitest\": \"^0.27.0\",\n\t\t\"@orpc/client\": \"^1.12.2\",\n\t\t\"@orpc/openapi\": \"^1.12.2\",\n\t\t\"@rspack/cli\": \"^1.6.7\",\n\t\t\"@types/bun\": \"^1.3.4\",\n\t\t\"@types/node\": \"^25.0.0\",\n\t\t\"@vitest/ui\": \"4.0.15\",\n\t\t\"bun-types\": \"^1.3.4\",\n\t\t\"sirv\": \"^3.0.2\",\n\t\t\"tsdown\": \"^0.17.2\",\n\t\t\"vite-tsconfig-paths\": \"^5.1.4\",\n\t\t\"vitest\": \"^4.0.15\"\n\t},\n\t\"dependencies\": {\n\t\t\"@module-federation/enhanced\": \"^0.21.6\",\n\t\t\"@module-federation/node\": \"^2.7.25\",\n\t\t\"@module-federation/runtime-core\": \"^0.21.6\",\n\t\t\"@orpc/contract\": \"^1.12.2\",\n\t\t\"@orpc/experimental-publisher\": \"^1.12.2\",\n\t\t\"@orpc/server\": \"^1.12.2\",\n\t\t\"@orpc/zod\": \"^1.12.2\",\n\t\t\"effect\": \"3.19.11\",\n\t\t\"zod\": \"4.1.13\"\n\t},\n\t\"keywords\": [\n\t\t\"plugin\",\n\t\t\"module-federation\",\n\t\t\"orpc\",\n\t\t\"zod\",\n\t\t\"typescript\"\n\t],\n\t\"author\": \"plugin.every.near\",\n\t\"license\": \"MIT\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/near-everything/every-plugin.git\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/near-everything/every-plugin/issues\"\n\t},\n\t\"homepage\": \"https://plugin.everything.dev\",\n\t\"workspaces\": [\n\t\t\"tests/fixtures/*\"\n\t]\n}\n"],"mappings":";;cAEY;mBAgIK;CACf,+BAA+B;CAC/B,2BAA2B;CAC3B,mCAAmC;CACnC,kBAAkB;CAClB,gCAAgC;CAChC,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,OAAO;CACP"}
|
package/dist/package.mjs
CHANGED
package/dist/package.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n\t\"name\": \"every-plugin\",\n\t\"version\": \"0.
|
|
1
|
+
{"version":3,"file":"package.mjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n\t\"name\": \"every-plugin\",\n\t\"version\": \"0.8.1\",\n\t\"type\": \"module\",\n\t\"main\": \"./dist/index.cjs\",\n\t\"module\": \"./dist/index.mjs\",\n\t\"types\": \"./dist/index.d.mts\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"require\": \"./dist/index.cjs\"\n\t\t},\n\t\t\"./runtime\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/runtime/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/runtime/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/runtime/index.mjs\",\n\t\t\t\"require\": \"./dist/runtime/index.cjs\"\n\t\t},\n\t\t\"./testing\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/testing/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/testing/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/testing/index.mjs\",\n\t\t\t\"require\": \"./dist/testing/index.cjs\"\n\t\t},\n\t\t\"./normalize\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/runtime/services/normalize.d.mts\",\n\t\t\t\t\"require\": \"./dist/runtime/services/normalize.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/runtime/services/normalize.mjs\",\n\t\t\t\"require\": \"./dist/runtime/services/normalize.cjs\"\n\t\t},\n\t\t\"./effect\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/effect.d.mts\",\n\t\t\t\t\"require\": \"./dist/effect.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/effect.mjs\",\n\t\t\t\"require\": \"./dist/effect.cjs\"\n\t\t},\n\t\t\"./zod\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/zod.d.mts\",\n\t\t\t\t\"require\": \"./dist/zod.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/zod.mjs\",\n\t\t\t\"require\": \"./dist/zod.cjs\"\n\t\t},\n\t\t\"./zod/v4/core\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/zod-core.d.mts\",\n\t\t\t\t\"require\": \"./dist/zod-core.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/zod-core.mjs\",\n\t\t\t\"require\": \"./dist/zod-core.cjs\"\n\t\t},\n\t\t\"./orpc\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/orpc.d.mts\",\n\t\t\t\t\"require\": \"./dist/orpc.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/orpc.mjs\",\n\t\t\t\"require\": \"./dist/orpc.cjs\"\n\t\t},\n\t\t\"./errors\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/errors.d.mts\",\n\t\t\t\t\"require\": \"./dist/errors.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/errors.mjs\",\n\t\t\t\"require\": \"./dist/errors.cjs\"\n\t\t},\n\t\t\"./types\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/types.d.mts\",\n\t\t\t\t\"require\": \"./dist/types.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/types.mjs\",\n\t\t\t\"require\": \"./dist/types.cjs\"\n\t\t},\n\t\t\"./build/rspack\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/build/rspack/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/build/rspack/index.d.cts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/build/rspack/index.mjs\",\n\t\t\t\"require\": \"./dist/build/rspack/index.cjs\"\n\t\t},\n\t\t\"./package.json\": \"./package.json\"\n\t},\n\t\"files\": [\n\t\t\"dist\"\n\t],\n\t\"scripts\": {\n\t\t\"build\": \"tsdown\",\n\t\t\"build:test\": \"cd tests/fixtures/test-plugin && bun run build\",\n\t\t\"test\": \"vitest run --config vitest.config.ts\",\n\t\t\"test:unit\": \"vitest run --config vitest.config.ts\",\n\t\t\"test:integration\": \"bun run build:test && vitest run --config vitest.integration.config.ts\",\n\t\t\"test:all\": \"bun run test:unit && bun run test:integration\",\n\t\t\"test:watch\": \"vitest --config vitest.config.ts --watch\",\n\t\t\"typecheck\": \"tsc --noEmit\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@rspack/core\": \"1.6.7\",\n\t\t\"typescript\": \"^5.6.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@effect/language-service\": \"^0.62.0\",\n\t\t\"@effect/vitest\": \"^0.27.0\",\n\t\t\"@orpc/client\": \"^1.12.2\",\n\t\t\"@orpc/openapi\": \"^1.12.2\",\n\t\t\"@rspack/cli\": \"^1.6.7\",\n\t\t\"@types/bun\": \"^1.3.4\",\n\t\t\"@types/node\": \"^25.0.0\",\n\t\t\"@vitest/ui\": \"4.0.15\",\n\t\t\"bun-types\": \"^1.3.4\",\n\t\t\"sirv\": \"^3.0.2\",\n\t\t\"tsdown\": \"^0.17.2\",\n\t\t\"vite-tsconfig-paths\": \"^5.1.4\",\n\t\t\"vitest\": \"^4.0.15\"\n\t},\n\t\"dependencies\": {\n\t\t\"@module-federation/enhanced\": \"^0.21.6\",\n\t\t\"@module-federation/node\": \"^2.7.25\",\n\t\t\"@module-federation/runtime-core\": \"^0.21.6\",\n\t\t\"@orpc/contract\": \"^1.12.2\",\n\t\t\"@orpc/experimental-publisher\": \"^1.12.2\",\n\t\t\"@orpc/server\": \"^1.12.2\",\n\t\t\"@orpc/zod\": \"^1.12.2\",\n\t\t\"effect\": \"3.19.11\",\n\t\t\"zod\": \"4.1.13\"\n\t},\n\t\"keywords\": [\n\t\t\"plugin\",\n\t\t\"module-federation\",\n\t\t\"orpc\",\n\t\t\"zod\",\n\t\t\"typescript\"\n\t],\n\t\"author\": \"plugin.every.near\",\n\t\"license\": \"MIT\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/near-everything/every-plugin.git\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/near-everything/every-plugin/issues\"\n\t},\n\t\"homepage\": \"https://plugin.everything.dev\",\n\t\"workspaces\": [\n\t\t\"tests/fixtures/*\"\n\t]\n}\n"],"mappings":";cAEY;mBAgIK;CACf,+BAA+B;CAC/B,2BAA2B;CAC3B,mCAAmC;CACnC,kBAAkB;CAClB,gCAAgC;CAChC,gBAAgB;CAChB,aAAa;CACb,UAAU;CACV,OAAO;CACP"}
|
package/dist/plugin.cjs
CHANGED
|
@@ -9,28 +9,29 @@ let effect = require("effect");
|
|
|
9
9
|
function createPlugin(config) {
|
|
10
10
|
const configSchema = {
|
|
11
11
|
variables: config.variables,
|
|
12
|
-
secrets: config.secrets
|
|
12
|
+
secrets: config.secrets,
|
|
13
|
+
context: config.context
|
|
13
14
|
};
|
|
14
15
|
class CreatedPlugin {
|
|
15
16
|
/** set during instantiation - registry key */
|
|
16
17
|
id;
|
|
17
18
|
contract = config.contract;
|
|
18
19
|
configSchema = configSchema;
|
|
19
|
-
|
|
20
|
+
_deps = null;
|
|
20
21
|
initialize(pluginConfig) {
|
|
21
|
-
return (config.initialize ?? (() => effect.Effect.succeed({})))(pluginConfig).pipe(effect.Effect.tap((
|
|
22
|
-
this.
|
|
23
|
-
})), effect.Effect.map(() => this.
|
|
22
|
+
return (config.initialize ?? (() => effect.Effect.succeed({})))(pluginConfig).pipe(effect.Effect.tap((deps) => effect.Effect.sync(() => {
|
|
23
|
+
this._deps = deps;
|
|
24
|
+
})), effect.Effect.map(() => this._deps), effect.Effect.mapError((error) => error));
|
|
24
25
|
}
|
|
25
26
|
shutdown() {
|
|
26
27
|
const self = this;
|
|
27
28
|
return effect.Effect.gen(function* () {
|
|
28
|
-
if (config.shutdown && self.
|
|
29
|
+
if (config.shutdown && self._deps) yield* config.shutdown(self._deps).pipe(effect.Effect.catchAll(() => effect.Effect.void));
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
|
-
createRouter(
|
|
32
|
+
createRouter(deps) {
|
|
32
33
|
const builder = (0, __orpc_server.implement)(config.contract).$context();
|
|
33
|
-
return config.createRouter(
|
|
34
|
+
return config.createRouter(deps, builder);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
36
37
|
const PluginConstructor = CreatedPlugin;
|
|
@@ -38,7 +39,7 @@ function createPlugin(config) {
|
|
|
38
39
|
contract: config.contract,
|
|
39
40
|
variables: config.variables,
|
|
40
41
|
secrets: config.secrets,
|
|
41
|
-
context:
|
|
42
|
+
context: config.context
|
|
42
43
|
};
|
|
43
44
|
return PluginConstructor;
|
|
44
45
|
}
|
package/dist/plugin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs","names":["configSchema: PluginConfigFor<V, S>","Effect"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {\n\tvariables: V;\n\tsecrets: S;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\
|
|
1
|
+
{"version":3,"file":"plugin.cjs","names":["configSchema: PluginConfigFor<V, S, TRequestContext>","Effect"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\ntype ContextOutput<T> = T extends AnySchema ? InferSchemaOutput<T> : {};\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema | undefined> = {\n\tvariables: V;\n\tsecrets: S;\n\tcontext: TRequestContext;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema | undefined,\n\tTDeps extends Context = Record<never, never>\n> {\n\tnew(): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;\n\tbinding: {\n\t\tcontract: TContract;\n\t\tvariables: TVariables;\n\t\tsecrets: TSecrets;\n\t\tcontext: TRequestContext;\n\t};\n}\n\n/**\n * Plugin interface\n */\nexport interface Plugin<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema | undefined,\n\tTDeps extends Context = Record<never, never>\n> {\n\treadonly id: string;\n\treadonly contract: TContract;\n\treadonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;\n\n\t// Plugin lifecycle\n\tinitialize(\n\t\tconfig: { variables: InferSchemaOutput<TVariables>; secrets: InferSchemaOutput<TSecrets> }\n\t): Effect.Effect<TDeps, unknown, Scope.Scope>;\n\n\tshutdown(): Effect.Effect<void, never>;\n\n\t/**\n\t * Creates the strongly-typed oRPC router for this plugin.\n\t * The router's procedure types are inferred directly from the contract.\n\t * @param deps The initialized plugin dependencies\n\t * @returns A router with procedures matching the plugin's contract\n\t */\n\tcreateRouter(deps: TDeps): Router<TContract, any>;\n}\n\n/**\n * Factory function to create plugins\n */\nexport function createPlugin<\n\tV extends AnySchema,\n\tS extends AnySchema,\n\tTContract extends AnyContractRouter,\n\tTRequestContext extends AnySchema | undefined = undefined,\n\tTDeps extends Context = Record<never, never>\n>(config: {\n\tvariables: V;\n\tsecrets: S;\n\tcontract: TContract;\n\tcontext?: TRequestContext;\n\tinitialize?: (\n\t\tconfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t) => Effect.Effect<TDeps, Error, Scope.Scope>;\n\tcreateRouter: (\n\t\tdeps: TDeps,\n\t\tbuilder: Implementer<TContract, ContextOutput<TRequestContext>, ContextOutput<TRequestContext>>\n\t) => Router<TContract, any>;\n\tshutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;\n}) {\n\tconst configSchema: PluginConfigFor<V, S, TRequestContext> = {\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context as TRequestContext\n\t};\n\n\tclass CreatedPlugin implements Plugin<TContract, V, S, TRequestContext, TDeps> {\n\t\t/** set during instantiation - registry key */\n\t\tid!: string;\n\t\treadonly contract = config.contract;\n\t\treadonly configSchema = configSchema;\n\n\t\tprivate _deps: TDeps | null = null;\n\n\t\tinitialize(\n\t\t\tpluginConfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t\t): Effect.Effect<TDeps, unknown, Scope.Scope> {\n\t\t\tconst init = config.initialize ?? (() => Effect.succeed({} as TDeps));\n\n\t\t\treturn init(pluginConfig).pipe(\n\t\t\t\tEffect.tap((deps) => Effect.sync(() => { this._deps = deps; })),\n\t\t\t\tEffect.map(() => this._deps as TDeps),\n\t\t\t\tEffect.mapError((error) => error as unknown)\n\t\t\t);\n\t\t}\n\n\t\tshutdown(): Effect.Effect<void, never> {\n\t\t\tconst self = this;\n\t\t\treturn Effect.gen(function* () {\n\t\t\t\tif (config.shutdown && self._deps) {\n\t\t\t\t\tyield* config.shutdown(self._deps).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcreateRouter(deps: TDeps): Router<TContract, any> {\n\t\t\tconst builder = implement(config.contract).$context<ContextOutput<TRequestContext>>();\n\t\t\tconst router = config.createRouter(deps, builder);\n\t\t\treturn router as Router<TContract, any>;\n\t\t}\n\t}\n\n\tconst PluginConstructor = CreatedPlugin as unknown as {\n\t\tnew(): Plugin<TContract, V, S, TRequestContext, TDeps>;\n\t\tbinding: {\n\t\t\tcontract: TContract;\n\t\t\tvariables: V;\n\t\t\tsecrets: S;\n\t\t\tcontext: TRequestContext;\n\t\t};\n\t};\n\n\tPluginConstructor.binding = {\n\t\tcontract: config.contract,\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context as TRequestContext\n\t};\n\n\treturn PluginConstructor as LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;\n}\n"],"mappings":";;;;;;;;AAoEA,SAAgB,aAMd,QAaC;CACF,MAAMA,eAAuD;EAC5D,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;CAED,MAAM,cAAyE;;EAE9E;EACA,AAAS,WAAW,OAAO;EAC3B,AAAS,eAAe;EAExB,AAAQ,QAAsB;EAE9B,WACC,cAC6C;AAG7C,WAFa,OAAO,qBAAqBC,cAAO,QAAQ,EAAE,CAAU,GAExD,aAAa,CAAC,KACzBA,cAAO,KAAK,SAASA,cAAO,WAAW;AAAE,SAAK,QAAQ;KAAQ,CAAC,EAC/DA,cAAO,UAAU,KAAK,MAAe,EACrCA,cAAO,UAAU,UAAU,MAAiB,CAC5C;;EAGF,WAAuC;GACtC,MAAM,OAAO;AACb,UAAOA,cAAO,IAAI,aAAa;AAC9B,QAAI,OAAO,YAAY,KAAK,MAC3B,QAAO,OAAO,SAAS,KAAK,MAAM,CAAC,KAClCA,cAAO,eAAeA,cAAO,KAAK,CAClC;KAED;;EAGH,aAAa,MAAqC;GACjD,MAAM,uCAAoB,OAAO,SAAS,CAAC,UAA0C;AAErF,UADe,OAAO,aAAa,MAAM,QAAQ;;;CAKnD,MAAM,oBAAoB;AAU1B,mBAAkB,UAAU;EAC3B,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;AAED,QAAO"}
|
package/dist/plugin.d.cts
CHANGED
|
@@ -3,60 +3,62 @@ import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract"
|
|
|
3
3
|
import { Context as Context$1, Implementer, Router } from "@orpc/server";
|
|
4
4
|
|
|
5
5
|
//#region src/plugin.d.ts
|
|
6
|
-
|
|
6
|
+
type ContextOutput<T> = T extends AnySchema ? InferSchemaOutput<T> : {};
|
|
7
7
|
/**
|
|
8
8
|
* Helper type that correctly constructs the config schema type
|
|
9
9
|
*/
|
|
10
|
-
type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {
|
|
10
|
+
type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema | undefined> = {
|
|
11
11
|
variables: V;
|
|
12
12
|
secrets: S;
|
|
13
|
+
context: TRequestContext;
|
|
13
14
|
};
|
|
14
15
|
/**
|
|
15
16
|
* Loaded plugin with static binding property
|
|
16
17
|
*/
|
|
17
|
-
interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema,
|
|
18
|
-
new (): Plugin<TContract, TVariables, TSecrets,
|
|
18
|
+
interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Context$1 = Record<never, never>> {
|
|
19
|
+
new (): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;
|
|
19
20
|
binding: {
|
|
20
21
|
contract: TContract;
|
|
21
22
|
variables: TVariables;
|
|
22
23
|
secrets: TSecrets;
|
|
23
|
-
context:
|
|
24
|
+
context: TRequestContext;
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
28
|
* Plugin interface
|
|
28
29
|
*/
|
|
29
|
-
interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema,
|
|
30
|
+
interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Context$1 = Record<never, never>> {
|
|
30
31
|
readonly id: string;
|
|
31
32
|
readonly contract: TContract;
|
|
32
|
-
readonly configSchema: PluginConfigFor<TVariables, TSecrets>;
|
|
33
|
+
readonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;
|
|
33
34
|
initialize(config: {
|
|
34
35
|
variables: InferSchemaOutput<TVariables>;
|
|
35
36
|
secrets: InferSchemaOutput<TSecrets>;
|
|
36
|
-
}): Effect.Effect<
|
|
37
|
+
}): Effect.Effect<TDeps, unknown, Scope.Scope>;
|
|
37
38
|
shutdown(): Effect.Effect<void, never>;
|
|
38
39
|
/**
|
|
39
40
|
* Creates the strongly-typed oRPC router for this plugin.
|
|
40
41
|
* The router's procedure types are inferred directly from the contract.
|
|
41
|
-
* @param
|
|
42
|
+
* @param deps The initialized plugin dependencies
|
|
42
43
|
* @returns A router with procedures matching the plugin's contract
|
|
43
44
|
*/
|
|
44
|
-
createRouter(
|
|
45
|
+
createRouter(deps: TDeps): Router<TContract, any>;
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
48
|
* Factory function to create plugins
|
|
48
49
|
*/
|
|
49
|
-
declare function createPlugin<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter,
|
|
50
|
+
declare function createPlugin<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TRequestContext extends AnySchema | undefined = undefined, TDeps extends Context$1 = Record<never, never>>(config: {
|
|
50
51
|
variables: V;
|
|
51
52
|
secrets: S;
|
|
52
53
|
contract: TContract;
|
|
54
|
+
context?: TRequestContext;
|
|
53
55
|
initialize?: (config: {
|
|
54
56
|
variables: InferSchemaOutput<V>;
|
|
55
57
|
secrets: InferSchemaOutput<S>;
|
|
56
|
-
}) => Effect.Effect<
|
|
57
|
-
createRouter: (
|
|
58
|
-
shutdown?: (
|
|
59
|
-
}): LoadedPluginWithBinding<TContract, V, S,
|
|
58
|
+
}) => Effect.Effect<TDeps, Error, Scope.Scope>;
|
|
59
|
+
createRouter: (deps: TDeps, builder: Implementer<TContract, ContextOutput<TRequestContext>, ContextOutput<TRequestContext>>) => Router<TContract, any>;
|
|
60
|
+
shutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;
|
|
61
|
+
}): LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;
|
|
60
62
|
//#endregion
|
|
61
63
|
export { LoadedPluginWithBinding, Plugin, PluginConfigFor, createPlugin };
|
|
62
64
|
//# sourceMappingURL=plugin.d.cts.map
|
package/dist/plugin.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.cts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":";;;;;KAKK,mBAAmB,UAAU,YAAY,kBAAkB;;AAFpB;;AAEV,KAKtB,eALsB,CAAA,UAKI,SALJ,EAAA,UAKyB,SALzB,EAAA,wBAK4D,SAL5D,GAAA,SAAA,CAAA,GAAA;EAA8B,SAAA,EAMpD,CANoD;EAAlB,OAAA,EAOpC,CAPoC;EAAiB,OAAA,EAQrD,eARqD;AAK/D,CAAA;;;;AACY,UAQK,uBARL,CAAA,kBASO,iBATP,EAAA,mBAUQ,SAVR,EAAA,iBAWM,SAXN,EAAA,wBAYa,SAZb,GAAA,SAAA,EAAA,cAaG,SAbH,GAaa,MAbb,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EACF,MAAA,EAcF,MAdE,CAcK,SAdL,EAcgB,UAdhB,EAc4B,QAd5B,EAcsC,eAdtC,EAcuD,KAdvD,CAAA;EACA,OAAA,EAAA;IAAe,QAAA,EAeb,SAfa;IAMR,SAAA,EAUJ,UAVI;IACE,OAAA,EAUR,QAVQ;IACC,OAAA,EAUT,eAVS;EACF,CAAA;;;;;AAIQ,UAYT,MAZS,CAAA,kBAaP,iBAbO,EAAA,mBAcN,SAdM,EAAA,iBAeR,SAfQ,EAAA,wBAgBD,SAhBC,GAAA,SAAA,EAAA,cAiBX,SAjBW,GAiBD,MAjBC,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;EAAY,SAAA,EAAA,EAAA,MAAA;EAAU,SAAA,QAAA,EAoB5B,SApB4B;EAAiB,SAAA,YAAA,EAqBzC,eArByC,CAqBzB,UArByB,EAqBb,QArBa,EAqBH,eArBG,CAAA;EAAzD,UAAA,CAAA,MAAA,EAAA;IAEI,SAAA,EAuBW,iBAvBX,CAuB6B,UAvB7B,CAAA;IACC,OAAA,EAsBkD,iBAtBlD,CAsBoE,QAtBpE,CAAA;EACF,CAAA,CAAA,EAsBP,MAAA,CAAO,MAtBA,CAsBO,KAtBP,EAAA,OAAA,EAsBuB,KAAA,CAAM,KAtB7B,CAAA;EACA,QAAA,EAAA,EAuBE,MAAA,CAAO,MAvBT,CAAA,IAAA,EAAA,KAAA,CAAA;EAAe;AAO1B;;;;;EAKe,YAAA,CAAA,IAAA,EAmBK,KAnBL,CAAA,EAmBa,MAnBb,CAmBoB,SAnBpB,EAAA,GAAA,CAAA;;;;;AAI+C,iBAqB9C,YArB8C,CAAA,UAsBnD,SAtBmD,EAAA,UAuBnD,SAvBmD,EAAA,kBAwB3C,iBAxB2C,EAAA,wBAyBrC,SAzBqC,GAAA,SAAA,GAAA,SAAA,EAAA,cA0B/C,SA1B+C,GA0BrC,MA1BqC,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA,MAAA,EAAA;EAAtC,SAAA,EA4BZ,CA5BY;EAIiB,OAAA,EAyB/B,CAzB+B;EAAlB,QAAA,EA0BZ,SA1BY;EAA0D,OAAA,CAAA,EA2BtE,eA3BsE;EAAlB,UAAA,CAAA,EAAA,CAAA,MAAA,EAAA;IAC7C,SAAA,EA4BK,iBA5BL,CA4BuB,CA5BvB,CAAA;IAAsB,OAAA,EA4Bc,iBA5Bd,CA4BgC,CA5BhC,CAAA;EAApC,CAAA,EAAA,GA6BE,MAAA,CAAO,MA7BF,CA6BS,KA7BT,EA6BgB,KA7BhB,EA6BuB,KAAA,CAAM,KA7B7B,CAAA;EAEE,YAAO,EAAA,CAAA,IAAA,EA6BZ,KA7BY,EAAA,OAAA,EA8BT,WA9BS,CA8BG,SA9BH,EA8Bc,aA9Bd,CA8B4B,eA9B5B,CAAA,EA8B8C,aA9B9C,CA8B4D,eA9B5D,CAAA,CAAA,EAAA,GA+Bd,MA/Bc,CA+BP,SA/BO,EAAA,GAAA,CAAA;EAQA,QAAA,CAAA,EAAA,CAAA,IAAA,EAwBD,KAxBC,EAAA,GAwBS,MAAA,CAAO,MAxBhB,CAAA,IAAA,EAwB6B,KAxB7B,EAAA,KAAA,CAAA;CAAe,CAAA,EAuFN,uBAvFM,CAuFkB,SAvFlB,EAuF6B,CAvF7B,EAuFgC,CAvFhC,EAuFmC,eAvFnC,EAuFoD,KAvFpD,CAAA"}
|
package/dist/plugin.d.mts
CHANGED
|
@@ -3,60 +3,62 @@ import { Effect, Scope } from "effect";
|
|
|
3
3
|
import { AnyContractRouter, AnySchema, InferSchemaOutput } from "@orpc/contract";
|
|
4
4
|
|
|
5
5
|
//#region src/plugin.d.ts
|
|
6
|
-
|
|
6
|
+
type ContextOutput<T> = T extends AnySchema ? InferSchemaOutput<T> : {};
|
|
7
7
|
/**
|
|
8
8
|
* Helper type that correctly constructs the config schema type
|
|
9
9
|
*/
|
|
10
|
-
type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {
|
|
10
|
+
type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema | undefined> = {
|
|
11
11
|
variables: V;
|
|
12
12
|
secrets: S;
|
|
13
|
+
context: TRequestContext;
|
|
13
14
|
};
|
|
14
15
|
/**
|
|
15
16
|
* Loaded plugin with static binding property
|
|
16
17
|
*/
|
|
17
|
-
interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema,
|
|
18
|
-
new (): Plugin<TContract, TVariables, TSecrets,
|
|
18
|
+
interface LoadedPluginWithBinding<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Context = Record<never, never>> {
|
|
19
|
+
new (): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;
|
|
19
20
|
binding: {
|
|
20
21
|
contract: TContract;
|
|
21
22
|
variables: TVariables;
|
|
22
23
|
secrets: TSecrets;
|
|
23
|
-
context:
|
|
24
|
+
context: TRequestContext;
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
27
28
|
* Plugin interface
|
|
28
29
|
*/
|
|
29
|
-
interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema,
|
|
30
|
+
interface Plugin<TContract extends AnyContractRouter, TVariables extends AnySchema, TSecrets extends AnySchema, TRequestContext extends AnySchema | undefined, TDeps extends Context = Record<never, never>> {
|
|
30
31
|
readonly id: string;
|
|
31
32
|
readonly contract: TContract;
|
|
32
|
-
readonly configSchema: PluginConfigFor<TVariables, TSecrets>;
|
|
33
|
+
readonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;
|
|
33
34
|
initialize(config: {
|
|
34
35
|
variables: InferSchemaOutput<TVariables>;
|
|
35
36
|
secrets: InferSchemaOutput<TSecrets>;
|
|
36
|
-
}): Effect.Effect<
|
|
37
|
+
}): Effect.Effect<TDeps, unknown, Scope.Scope>;
|
|
37
38
|
shutdown(): Effect.Effect<void, never>;
|
|
38
39
|
/**
|
|
39
40
|
* Creates the strongly-typed oRPC router for this plugin.
|
|
40
41
|
* The router's procedure types are inferred directly from the contract.
|
|
41
|
-
* @param
|
|
42
|
+
* @param deps The initialized plugin dependencies
|
|
42
43
|
* @returns A router with procedures matching the plugin's contract
|
|
43
44
|
*/
|
|
44
|
-
createRouter(
|
|
45
|
+
createRouter(deps: TDeps): Router<TContract, any>;
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
48
|
* Factory function to create plugins
|
|
48
49
|
*/
|
|
49
|
-
declare function createPlugin<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter,
|
|
50
|
+
declare function createPlugin<V extends AnySchema, S extends AnySchema, TContract extends AnyContractRouter, TRequestContext extends AnySchema | undefined = undefined, TDeps extends Context = Record<never, never>>(config: {
|
|
50
51
|
variables: V;
|
|
51
52
|
secrets: S;
|
|
52
53
|
contract: TContract;
|
|
54
|
+
context?: TRequestContext;
|
|
53
55
|
initialize?: (config: {
|
|
54
56
|
variables: InferSchemaOutput<V>;
|
|
55
57
|
secrets: InferSchemaOutput<S>;
|
|
56
|
-
}) => Effect.Effect<
|
|
57
|
-
createRouter: (
|
|
58
|
-
shutdown?: (
|
|
59
|
-
}): LoadedPluginWithBinding<TContract, V, S,
|
|
58
|
+
}) => Effect.Effect<TDeps, Error, Scope.Scope>;
|
|
59
|
+
createRouter: (deps: TDeps, builder: Implementer<TContract, ContextOutput<TRequestContext>, ContextOutput<TRequestContext>>) => Router<TContract, any>;
|
|
60
|
+
shutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;
|
|
61
|
+
}): LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;
|
|
60
62
|
//#endregion
|
|
61
63
|
export { LoadedPluginWithBinding, Plugin, PluginConfigFor, createPlugin };
|
|
62
64
|
//# sourceMappingURL=plugin.d.mts.map
|
package/dist/plugin.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.mts","names":[],"sources":["../src/plugin.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/plugin.mjs
CHANGED
|
@@ -8,28 +8,29 @@ import { Effect } from "effect";
|
|
|
8
8
|
function createPlugin(config) {
|
|
9
9
|
const configSchema = {
|
|
10
10
|
variables: config.variables,
|
|
11
|
-
secrets: config.secrets
|
|
11
|
+
secrets: config.secrets,
|
|
12
|
+
context: config.context
|
|
12
13
|
};
|
|
13
14
|
class CreatedPlugin {
|
|
14
15
|
/** set during instantiation - registry key */
|
|
15
16
|
id;
|
|
16
17
|
contract = config.contract;
|
|
17
18
|
configSchema = configSchema;
|
|
18
|
-
|
|
19
|
+
_deps = null;
|
|
19
20
|
initialize(pluginConfig) {
|
|
20
|
-
return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig).pipe(Effect.tap((
|
|
21
|
-
this.
|
|
22
|
-
})), Effect.map(() => this.
|
|
21
|
+
return (config.initialize ?? (() => Effect.succeed({})))(pluginConfig).pipe(Effect.tap((deps) => Effect.sync(() => {
|
|
22
|
+
this._deps = deps;
|
|
23
|
+
})), Effect.map(() => this._deps), Effect.mapError((error) => error));
|
|
23
24
|
}
|
|
24
25
|
shutdown() {
|
|
25
26
|
const self = this;
|
|
26
27
|
return Effect.gen(function* () {
|
|
27
|
-
if (config.shutdown && self.
|
|
28
|
+
if (config.shutdown && self._deps) yield* config.shutdown(self._deps).pipe(Effect.catchAll(() => Effect.void));
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
|
-
createRouter(
|
|
31
|
+
createRouter(deps) {
|
|
31
32
|
const builder = implement(config.contract).$context();
|
|
32
|
-
return config.createRouter(
|
|
33
|
+
return config.createRouter(deps, builder);
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
36
|
const PluginConstructor = CreatedPlugin;
|
|
@@ -37,7 +38,7 @@ function createPlugin(config) {
|
|
|
37
38
|
contract: config.contract,
|
|
38
39
|
variables: config.variables,
|
|
39
40
|
secrets: config.secrets,
|
|
40
|
-
context:
|
|
41
|
+
context: config.context
|
|
41
42
|
};
|
|
42
43
|
return PluginConstructor;
|
|
43
44
|
}
|
package/dist/plugin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.mjs","names":["configSchema: PluginConfigFor<V, S>"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema> = {\n\tvariables: V;\n\tsecrets: S;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\
|
|
1
|
+
{"version":3,"file":"plugin.mjs","names":["configSchema: PluginConfigFor<V, S, TRequestContext>"],"sources":["../src/plugin.ts"],"sourcesContent":["import type { AnyContractRouter, AnySchema, InferSchemaOutput } from \"@orpc/contract\";\nimport type { Context, Implementer, Router } from \"@orpc/server\";\nimport { implement } from \"@orpc/server\";\nimport { Effect, type Scope } from \"effect\";\n\ntype ContextOutput<T> = T extends AnySchema ? InferSchemaOutput<T> : {};\n\n/**\n * Helper type that correctly constructs the config schema type\n */\nexport type PluginConfigFor<V extends AnySchema, S extends AnySchema, TRequestContext extends AnySchema | undefined> = {\n\tvariables: V;\n\tsecrets: S;\n\tcontext: TRequestContext;\n};\n\n/**\n * Loaded plugin with static binding property\n */\nexport interface LoadedPluginWithBinding<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema | undefined,\n\tTDeps extends Context = Record<never, never>\n> {\n\tnew(): Plugin<TContract, TVariables, TSecrets, TRequestContext, TDeps>;\n\tbinding: {\n\t\tcontract: TContract;\n\t\tvariables: TVariables;\n\t\tsecrets: TSecrets;\n\t\tcontext: TRequestContext;\n\t};\n}\n\n/**\n * Plugin interface\n */\nexport interface Plugin<\n\tTContract extends AnyContractRouter,\n\tTVariables extends AnySchema,\n\tTSecrets extends AnySchema,\n\tTRequestContext extends AnySchema | undefined,\n\tTDeps extends Context = Record<never, never>\n> {\n\treadonly id: string;\n\treadonly contract: TContract;\n\treadonly configSchema: PluginConfigFor<TVariables, TSecrets, TRequestContext>;\n\n\t// Plugin lifecycle\n\tinitialize(\n\t\tconfig: { variables: InferSchemaOutput<TVariables>; secrets: InferSchemaOutput<TSecrets> }\n\t): Effect.Effect<TDeps, unknown, Scope.Scope>;\n\n\tshutdown(): Effect.Effect<void, never>;\n\n\t/**\n\t * Creates the strongly-typed oRPC router for this plugin.\n\t * The router's procedure types are inferred directly from the contract.\n\t * @param deps The initialized plugin dependencies\n\t * @returns A router with procedures matching the plugin's contract\n\t */\n\tcreateRouter(deps: TDeps): Router<TContract, any>;\n}\n\n/**\n * Factory function to create plugins\n */\nexport function createPlugin<\n\tV extends AnySchema,\n\tS extends AnySchema,\n\tTContract extends AnyContractRouter,\n\tTRequestContext extends AnySchema | undefined = undefined,\n\tTDeps extends Context = Record<never, never>\n>(config: {\n\tvariables: V;\n\tsecrets: S;\n\tcontract: TContract;\n\tcontext?: TRequestContext;\n\tinitialize?: (\n\t\tconfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t) => Effect.Effect<TDeps, Error, Scope.Scope>;\n\tcreateRouter: (\n\t\tdeps: TDeps,\n\t\tbuilder: Implementer<TContract, ContextOutput<TRequestContext>, ContextOutput<TRequestContext>>\n\t) => Router<TContract, any>;\n\tshutdown?: (deps: TDeps) => Effect.Effect<void, Error, never>;\n}) {\n\tconst configSchema: PluginConfigFor<V, S, TRequestContext> = {\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context as TRequestContext\n\t};\n\n\tclass CreatedPlugin implements Plugin<TContract, V, S, TRequestContext, TDeps> {\n\t\t/** set during instantiation - registry key */\n\t\tid!: string;\n\t\treadonly contract = config.contract;\n\t\treadonly configSchema = configSchema;\n\n\t\tprivate _deps: TDeps | null = null;\n\n\t\tinitialize(\n\t\t\tpluginConfig: { variables: InferSchemaOutput<V>; secrets: InferSchemaOutput<S> }\n\t\t): Effect.Effect<TDeps, unknown, Scope.Scope> {\n\t\t\tconst init = config.initialize ?? (() => Effect.succeed({} as TDeps));\n\n\t\t\treturn init(pluginConfig).pipe(\n\t\t\t\tEffect.tap((deps) => Effect.sync(() => { this._deps = deps; })),\n\t\t\t\tEffect.map(() => this._deps as TDeps),\n\t\t\t\tEffect.mapError((error) => error as unknown)\n\t\t\t);\n\t\t}\n\n\t\tshutdown(): Effect.Effect<void, never> {\n\t\t\tconst self = this;\n\t\t\treturn Effect.gen(function* () {\n\t\t\t\tif (config.shutdown && self._deps) {\n\t\t\t\t\tyield* config.shutdown(self._deps).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcreateRouter(deps: TDeps): Router<TContract, any> {\n\t\t\tconst builder = implement(config.contract).$context<ContextOutput<TRequestContext>>();\n\t\t\tconst router = config.createRouter(deps, builder);\n\t\t\treturn router as Router<TContract, any>;\n\t\t}\n\t}\n\n\tconst PluginConstructor = CreatedPlugin as unknown as {\n\t\tnew(): Plugin<TContract, V, S, TRequestContext, TDeps>;\n\t\tbinding: {\n\t\t\tcontract: TContract;\n\t\t\tvariables: V;\n\t\t\tsecrets: S;\n\t\t\tcontext: TRequestContext;\n\t\t};\n\t};\n\n\tPluginConstructor.binding = {\n\t\tcontract: config.contract,\n\t\tvariables: config.variables,\n\t\tsecrets: config.secrets,\n\t\tcontext: config.context as TRequestContext\n\t};\n\n\treturn PluginConstructor as LoadedPluginWithBinding<TContract, V, S, TRequestContext, TDeps>;\n}\n"],"mappings":";;;;;;;AAoEA,SAAgB,aAMd,QAaC;CACF,MAAMA,eAAuD;EAC5D,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;CAED,MAAM,cAAyE;;EAE9E;EACA,AAAS,WAAW,OAAO;EAC3B,AAAS,eAAe;EAExB,AAAQ,QAAsB;EAE9B,WACC,cAC6C;AAG7C,WAFa,OAAO,qBAAqB,OAAO,QAAQ,EAAE,CAAU,GAExD,aAAa,CAAC,KACzB,OAAO,KAAK,SAAS,OAAO,WAAW;AAAE,SAAK,QAAQ;KAAQ,CAAC,EAC/D,OAAO,UAAU,KAAK,MAAe,EACrC,OAAO,UAAU,UAAU,MAAiB,CAC5C;;EAGF,WAAuC;GACtC,MAAM,OAAO;AACb,UAAO,OAAO,IAAI,aAAa;AAC9B,QAAI,OAAO,YAAY,KAAK,MAC3B,QAAO,OAAO,SAAS,KAAK,MAAM,CAAC,KAClC,OAAO,eAAe,OAAO,KAAK,CAClC;KAED;;EAGH,aAAa,MAAqC;GACjD,MAAM,UAAU,UAAU,OAAO,SAAS,CAAC,UAA0C;AAErF,UADe,OAAO,aAAa,MAAM,QAAQ;;;CAKnD,MAAM,oBAAoB;AAU1B,mBAAkB,UAAU;EAC3B,UAAU,OAAO;EACjB,WAAW,OAAO;EAClB,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB;AAED,QAAO"}
|
package/dist/runtime/index.cjs
CHANGED
|
@@ -48,10 +48,12 @@ var PluginRuntime = class {
|
|
|
48
48
|
this.pluginCache.set(cacheKey, cachedPlugin);
|
|
49
49
|
}
|
|
50
50
|
const initialized = await this.runPromise(cachedPlugin);
|
|
51
|
-
const
|
|
51
|
+
const createClient = (context) => {
|
|
52
|
+
return (0, __orpc_server.createRouterClient)(initialized.plugin.createRouter(initialized.context), { context: context ?? {} });
|
|
53
|
+
};
|
|
52
54
|
return {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
createClient,
|
|
56
|
+
router: initialized.plugin.createRouter(initialized.context),
|
|
55
57
|
metadata: initialized.metadata,
|
|
56
58
|
initialized
|
|
57
59
|
};
|
|
@@ -141,7 +143,7 @@ function normalizeRegistry(registry) {
|
|
|
141
143
|
* });
|
|
142
144
|
*
|
|
143
145
|
* // Types are automatically inferred from module entries!
|
|
144
|
-
* const {
|
|
146
|
+
* const { router } = await runtime.usePlugin("telegram", config);
|
|
145
147
|
* ```
|
|
146
148
|
*/
|
|
147
149
|
function createPluginRuntime(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","Hash","Effect","PluginRuntimeError","effect","Exit","Cause","Option","PluginService","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>","ManagedRuntime"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load ā Instantiate ā Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\tconst client = createRouterClient(router);\n\n\t\treturn {\n\t\t\trouter: router as PluginRouterType<R[K]>,\n\t\t\tclient: client as PluginClientType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { client } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","Hash","Effect","PluginRuntimeError","effect","Exit","Cause","Option","PluginService","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>","ManagedRuntime"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load ā Instantiate ā Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\n\t\t// Create client factory that accepts request context\n\t\tconst createClient = (context?: any) => {\n\t\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\t\treturn createRouterClient(router, { context: context ?? {} });\n\t\t};\n\n\t\treturn {\n\t\t\tcreateClient: createClient as any,\n\t\t\trouter: initialized.plugin.createRouter(initialized.context) as PluginRouterType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { router } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
|
package/dist/runtime/index.d.cts
CHANGED
|
@@ -34,7 +34,7 @@ declare class PluginRuntime<R = RegisteredPlugins> {
|
|
|
34
34
|
* });
|
|
35
35
|
*
|
|
36
36
|
* // Types are automatically inferred from module entries!
|
|
37
|
-
* const {
|
|
37
|
+
* const { router } = await runtime.usePlugin("telegram", config);
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
40
|
declare function createPluginRuntime<TRegistry extends Record<string, PluginRegistryEntry>>(config: PluginRuntimeConfig<TRegistry>): PluginRuntime<InferRegistryFromEntries<TRegistry>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAsCM,CAtCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAuChB,CAvCgB,CAAA,EAwCxB,OAxCwB,CAwChB,YAxCgB,CAwCH,gBAxCG,CAwCc,CAxCd,EAwCiB,CAxCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MAgDW,CAhDX,GAAA,MAAA,CAAA,CAAA,QAAA,EAiDlB,CAjDkB,EAAA,YAAA,EAkDd,YAlDc,CAkDD,gBAlDC,CAkDgB,CAlDhB,EAkDmB,CAlDnB,CAAA,CAAA,CAAA,EAmD1B,OAnD0B,CAmDlB,cAnDkB,CAmDH,gBAnDG,CAmDc,CAnDd,EAmDiB,CAnDjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UA2DwB,SA3DxB,CAAA,CAAA,QAAA,EA4DE,cA5DF,CA4DiB,CA5DjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA8DN,OA9DM,CA8DE,iBA9DF,CA8DoB,CA9DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAqET,OArES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MA6EI,CA7EJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA8EnB,CA9EmB,EAAA,MAAA,EA+ErB,iBA/EqB,CA+EH,CA/EG,CA+ED,CA/EC,CAAA,CAAA,CAAA,EAgF3B,OAhF2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AAkD3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
|
package/dist/runtime/index.d.mts
CHANGED
|
@@ -34,7 +34,7 @@ declare class PluginRuntime<R = RegisteredPlugins> {
|
|
|
34
34
|
* });
|
|
35
35
|
*
|
|
36
36
|
* // Types are automatically inferred from module entries!
|
|
37
|
-
* const {
|
|
37
|
+
* const { router } = await runtime.usePlugin("telegram", config);
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
40
|
declare function createPluginRuntime<TRegistry extends Record<string, PluginRegistryEntry>>(config: PluginRuntimeConfig<TRegistry>): PluginRuntime<InferRegistryFromEntries<TRegistry>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":[],"mappings":";;;;;cAsBa,kBAAkB;;EAAlB,QAAA,QAAa;EAAK,UAAA,gBAAA,EAAA,EACA,CADA;EACA,QAAA,WAAA;EAKkB,WAAA,CAAA,OAAA,EAA9B,cAAA,CAAe,cAAe,CAAA,aAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAC7B,cAD6B;EAA9B,QAAA,gBAAe;EACd,QAAA,gBAAA;EAsCa,QAAA,UAAA;EACrB,SAAA,CAAA,UAAA,MADqB,CACrB,GAAA,MAAA,CAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EACF,iBADE,CACgB,CADhB,CACkB,CADlB,CAAA,CAAA,CAAA,EAER,OAFQ,CAEA,eAFA,CAEgB,CAFhB,EAEmB,CAFnB,CAAA,CAAA;EACgB,UAAA,CAAA,UAAA,MAsCM,CAtCN,GAAA,MAAA,CAAA,CAAA,QAAA,EAuChB,CAvCgB,CAAA,EAwCxB,OAxCwB,CAwChB,YAxCgB,CAwCH,gBAxCG,CAwCc,CAxCd,EAwCiB,CAxCjB,CAAA,CAAA,CAAA;EAAE,iBAAA,CAAA,UAAA,MAgDW,CAhDX,GAAA,MAAA,CAAA,CAAA,QAAA,EAiDlB,CAjDkB,EAAA,YAAA,EAkDd,YAlDc,CAkDD,gBAlDC,CAkDgB,CAlDhB,EAkDmB,CAlDnB,CAAA,CAAA,CAAA,EAmD1B,OAnD0B,CAmDlB,cAnDkB,CAmDH,gBAnDG,CAmDc,CAnDd,EAmDiB,CAnDjB,CAAA,CAAA,CAAA;EAApB,gBAAA,CAAA,UA2DwB,SA3DxB,CAAA,CAAA,QAAA,EA4DE,cA5DF,CA4DiB,CA5DjB,CAAA,EAAA,MAAA,EAAA,GAAA,CAAA,EA8DN,OA9DM,CA8DE,iBA9DF,CA8DoB,CA9DpB,CAAA,CAAA;EACkB,QAAA,CAAA,CAAA,EAqET,OArES,CAAA,IAAA,CAAA;EAAG,WAAA,CAAA,UAAA,MA6EI,CA7EJ,GAAA,MAAA,CAAA,CAAA,QAAA,EA8EnB,CA9EmB,EAAA,MAAA,EA+ErB,iBA/EqB,CA+EH,CA/EG,CA+ED,CA/EC,CAAA,CAAA,CAAA,EAgF3B,OAhF2B,CAAA,IAAA,CAAA;;;;;;;;;;;;;;;;;;;;AAkD3B,iBA0HY,mBA1HZ,CAAA,kBA2He,MA3Hf,CAAA,MAAA,EA2H8B,mBA3H9B,CAAA,CAAA,CAAA,MAAA,EA6HK,mBA7HL,CA6HyB,SA7HzB,CAAA,CAAA,EA8HD,aA9HC,CA8Ha,wBA9Hb,CA8HsC,SA9HtC,CAAA,CAAA"}
|
package/dist/runtime/index.mjs
CHANGED
|
@@ -47,10 +47,12 @@ var PluginRuntime = class {
|
|
|
47
47
|
this.pluginCache.set(cacheKey, cachedPlugin);
|
|
48
48
|
}
|
|
49
49
|
const initialized = await this.runPromise(cachedPlugin);
|
|
50
|
-
const
|
|
50
|
+
const createClient = (context) => {
|
|
51
|
+
return createRouterClient(initialized.plugin.createRouter(initialized.context), { context: context ?? {} });
|
|
52
|
+
};
|
|
51
53
|
return {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
createClient,
|
|
55
|
+
router: initialized.plugin.createRouter(initialized.context),
|
|
54
56
|
metadata: initialized.metadata,
|
|
55
57
|
initialized
|
|
56
58
|
};
|
|
@@ -140,7 +142,7 @@ function normalizeRegistry(registry) {
|
|
|
140
142
|
* });
|
|
141
143
|
*
|
|
142
144
|
* // Types are automatically inferred from module entries!
|
|
143
|
-
* const {
|
|
145
|
+
* const { router } = await runtime.usePlugin("telegram", config);
|
|
144
146
|
* ```
|
|
145
147
|
*/
|
|
146
148
|
function createPluginRuntime(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load ā Instantiate ā Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\tconst client = createRouterClient(router);\n\n\t\treturn {\n\t\t\trouter: router as PluginRouterType<R[K]>,\n\t\t\tclient: client as PluginClientType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { client } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["runtime: ManagedRuntime.ManagedRuntime<PluginService, never>","registry: PluginRegistry","pluginMap: Record<string, AnyPluginConstructor>","normalized: Record<string, PluginRegistryEntry>"],"sources":["../../src/runtime/index.ts"],"sourcesContent":["import { createRouterClient } from \"@orpc/server\";\nimport { Cause, Effect, Exit, Hash, ManagedRuntime, Option } from \"effect\";\nimport type {\n\tAnyPlugin,\n\tAnyPluginConstructor,\n\tInferRegistryFromEntries,\n\tInitializedPlugin,\n\tLoadedPlugin,\n\tPluginClientType,\n\tPluginConfigInput,\n\tPluginInstance,\n\tPluginRegistry,\n\tPluginRegistryEntry,\n\tPluginRouterType,\n\tPluginRuntimeConfig,\n\tRegisteredPlugin,\n\tRegisteredPlugins,\n\tUsePluginResult\n} from \"../types\";\nimport { PluginRuntimeError } from \"./errors\";\nimport { PluginService } from \"./services/plugin.service\";\n\nexport class PluginRuntime<R = RegisteredPlugins> {\n\treadonly ['__registryType']?: R;\n\t\n\tprivate pluginCache = new Map<string, Effect.Effect<InitializedPlugin<AnyPlugin>, PluginRuntimeError>>();\n\n\tconstructor(\n\t\tprivate runtime: ManagedRuntime.ManagedRuntime<PluginService, never>,\n\t\tprivate registry: PluginRegistry\n\t) { }\n\n\tprivate generateCacheKey(pluginId: string, config: unknown): string {\n\t\tconst configHash = Hash.structure(config as object).toString();\n\t\treturn `${pluginId}:${configHash}`;\n\t}\n\n\tprivate validatePluginId(\n\t\tpluginId: string\n\t): Effect.Effect<string, PluginRuntimeError> {\n\t\tif (!(pluginId in this.registry)) {\n\t\t\treturn Effect.fail(new PluginRuntimeError({\n\t\t\t\tpluginId: String(pluginId),\n\t\t\t\toperation: \"validate-plugin-id\",\n\t\t\t\tcause: new Error(`Plugin ID '${String(pluginId)}' not found in registry.`),\n\t\t\t\tretryable: false,\n\t\t\t}));\n\t\t}\n\t\treturn Effect.succeed(String(pluginId));\n\t}\n\n\tprivate async runPromise<A, E>(\n\t\teffect: Effect.Effect<A, E, PluginService>\n\t): Promise<A> {\n\t\tconst exit = await this.runtime.runPromiseExit(effect);\n\n\t\tif (Exit.isFailure(exit)) {\n\t\t\tconst error = Cause.failureOption(exit.cause);\n\t\t\tif (Option.isSome(error)) {\n\t\t\t\tthrow error.value;\n\t\t\t}\n\t\t\tthrow Cause.squash(exit.cause);\n\t\t}\n\n\t\treturn exit.value;\n\t}\n\n\tasync usePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<UsePluginResult<K, R>> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tlet cachedPlugin = this.pluginCache.get(cacheKey);\n\t\tif (!cachedPlugin) {\n\t\t\tconst operation = Effect.gen(this, function* () {\n\t\t\t\tconst pluginService = yield* PluginService;\n\t\t\t\tconst validatedId = yield* this.validatePluginId(pluginId);\n\n\t\t\t\t// Load ā Instantiate ā Initialize\n\t\t\t\tconst ctor = yield* pluginService.loadPlugin(validatedId);\n\t\t\t\tconst instance = yield* pluginService.instantiatePlugin(pluginId, ctor);\n\t\t\t\tconst initialized = yield* pluginService.initializePlugin(instance, config);\n\n\t\t\t\treturn initialized;\n\t\t\t}).pipe(Effect.provide(this.runtime));\n\n\t\t\tcachedPlugin = Effect.cached(operation).pipe(Effect.flatten);\n\t\t\tthis.pluginCache.set(cacheKey, cachedPlugin);\n\t\t}\n\n\t\tconst initialized = await this.runPromise(cachedPlugin);\n\n\t\t// Create client factory that accepts request context\n\t\tconst createClient = (context?: any) => {\n\t\t\tconst router = initialized.plugin.createRouter(initialized.context);\n\t\t\treturn createRouterClient(router, { context: context ?? {} });\n\t\t};\n\n\t\treturn {\n\t\t\tcreateClient: createClient as any,\n\t\t\trouter: initialized.plugin.createRouter(initialized.context) as PluginRouterType<R[K]>,\n\t\t\tmetadata: initialized.metadata,\n\t\t\tinitialized: initialized as InitializedPlugin<RegisteredPlugin<K, R>>\n\t\t} as UsePluginResult<K, R>;\n\t}\n\n\tasync loadPlugin<K extends keyof R & string>(\n\t\tpluginId: K\n\t): Promise<LoadedPlugin<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.loadPlugin(pluginId);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<LoadedPlugin<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync instantiatePlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tloadedPlugin: LoadedPlugin<RegisteredPlugin<K, R>>\n\t): Promise<PluginInstance<RegisteredPlugin<K, R>>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.instantiatePlugin(pluginId, loadedPlugin);\n\t\t});\n\t\treturn this.runPromise(effect) as Promise<PluginInstance<RegisteredPlugin<K, R>>>;\n\t}\n\n\tasync initializePlugin<T extends AnyPlugin>(\n\t\tinstance: PluginInstance<T>,\n\t\tconfig: any\n\t): Promise<InitializedPlugin<T>> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\treturn yield* pluginService.initializePlugin(instance, config);\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tconst effect = Effect.gen(function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tyield* pluginService.cleanup();\n\t\t});\n\t\treturn this.runPromise(effect);\n\t}\n\n\tasync evictPlugin<K extends keyof R & string>(\n\t\tpluginId: K,\n\t\tconfig: PluginConfigInput<R[K]>\n\t): Promise<void> {\n\t\tconst cacheKey = this.generateCacheKey(pluginId, config);\n\n\t\tconst effect = Effect.gen(this, function* () {\n\t\t\tconst pluginService = yield* PluginService;\n\t\t\tconst cachedPlugin = this.pluginCache.get(cacheKey);\n\n\t\t\tif (cachedPlugin) {\n\t\t\t\tthis.pluginCache.delete(cacheKey);\n\n\t\t\t\tconst pluginResult = yield* cachedPlugin.pipe(\n\t\t\t\t\tEffect.catchAll(() => Effect.succeed(null))\n\t\t\t\t);\n\n\t\t\t\tif (pluginResult) {\n\t\t\t\t\tyield* pluginService.shutdownPlugin(pluginResult).pipe(\n\t\t\t\t\t\tEffect.catchAll(() => Effect.void)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}).pipe(Effect.catchAll(() => Effect.void));\n\n\t\treturn this.runPromise(effect);\n\t}\n}\n\n/**\n * Normalizes a remote URL to ensure it points to remoteEntry.js\n * If the URL doesn't end with a file extension, appends /remoteEntry.js\n */\nfunction normalizeRemoteUrl(url: string): string {\n\tif (!url) return url;\n\tif (url.endsWith('.js')) return url;\n\treturn `${url.endsWith('/') ? url.slice(0, -1) : url}/remoteEntry.js`;\n}\n\n/**\n * Extract plugin map (module constructors) from registry entries\n */\nfunction extractPluginMap(registry: Record<string, PluginRegistryEntry>): Record<string, AnyPluginConstructor> {\n\tconst pluginMap: Record<string, AnyPluginConstructor> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry && entry.module) {\n\t\t\tpluginMap[pluginId] = entry.module;\n\t\t}\n\t}\n\t\n\treturn pluginMap;\n}\n\n/**\n * Normalize registry entries - ensure remote URLs are properly formatted\n */\nfunction normalizeRegistry(registry: Record<string, PluginRegistryEntry>): PluginRegistry {\n\tconst normalized: Record<string, PluginRegistryEntry> = {};\n\t\n\tfor (const [pluginId, entry] of Object.entries(registry)) {\n\t\tif (\"module\" in entry) {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: entry.remote ? normalizeRemoteUrl(entry.remote) : undefined,\n\t\t\t};\n\t\t} else {\n\t\t\tnormalized[pluginId] = {\n\t\t\t\t...entry,\n\t\t\t\tremote: normalizeRemoteUrl(entry.remote),\n\t\t\t};\n\t\t}\n\t}\n\t\n\treturn normalized as PluginRegistry;\n}\n\n/**\n * Creates a plugin runtime with support for both module and remote plugin entries.\n * \n * @example\n * ```typescript\n * // With module entries (types inferred automatically)\n * const runtime = createPluginRuntime({\n * registry: {\n * telegram: { module: TelegramPlugin },\n * gopher: { remote: \"https://cdn.example.com/gopher/remoteEntry.js\" }\n * },\n * secrets: { API_KEY: \"...\" }\n * });\n * \n * // Types are automatically inferred from module entries!\n * const { router } = await runtime.usePlugin(\"telegram\", config);\n * ```\n */\nexport function createPluginRuntime<\n\tTRegistry extends Record<string, PluginRegistryEntry>\n>(\n\tconfig: PluginRuntimeConfig<TRegistry>\n): PluginRuntime<InferRegistryFromEntries<TRegistry>> {\n\tconst secrets = config.secrets || {};\n\tconst normalizedRegistry = normalizeRegistry(config.registry);\n\tconst pluginMap = extractPluginMap(config.registry);\n\n\tconst layer = PluginService.Live(normalizedRegistry, secrets, pluginMap);\n\tconst runtime = ManagedRuntime.make(layer);\n\n\treturn new PluginRuntime(runtime, normalizedRegistry) as PluginRuntime<InferRegistryFromEntries<TRegistry>>;\n}\n"],"mappings":"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"}
|
package/dist/types.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Plugin } from "./plugin.cjs";
|
|
2
2
|
import { Scope } from "effect";
|
|
3
3
|
import { AnyContractRouter, AnySchema, InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
|
|
4
|
-
import {
|
|
4
|
+
import { Router, RouterClient } from "@orpc/server";
|
|
5
5
|
|
|
6
6
|
//#region src/types.d.ts
|
|
7
7
|
|
|
@@ -21,7 +21,7 @@ interface RegisteredPlugins {}
|
|
|
21
21
|
/**
|
|
22
22
|
* Base type for any plugin instance.
|
|
23
23
|
*/
|
|
24
|
-
type AnyPlugin = Plugin<AnyContractRouter, AnySchema, AnySchema, any>;
|
|
24
|
+
type AnyPlugin = Plugin<AnyContractRouter, AnySchema, AnySchema, AnySchema, any>;
|
|
25
25
|
/**
|
|
26
26
|
* Loaded plugin constructor with binding information
|
|
27
27
|
*/
|
|
@@ -31,7 +31,7 @@ type AnyPluginConstructor = {
|
|
|
31
31
|
contract: AnyContractRouter;
|
|
32
32
|
variables: AnySchema;
|
|
33
33
|
secrets: AnySchema;
|
|
34
|
-
context:
|
|
34
|
+
context: AnySchema;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
@@ -84,11 +84,11 @@ type PluginSecrets<T> = T extends {
|
|
|
84
84
|
};
|
|
85
85
|
} ? S : never;
|
|
86
86
|
/**
|
|
87
|
-
* Extract context type from plugin binding
|
|
87
|
+
* Extract context schema type from plugin binding
|
|
88
88
|
*/
|
|
89
89
|
type PluginContext<T> = T extends {
|
|
90
90
|
binding: {
|
|
91
|
-
context: infer C extends
|
|
91
|
+
context: infer C extends AnySchema;
|
|
92
92
|
};
|
|
93
93
|
} ? C : never;
|
|
94
94
|
/**
|
|
@@ -111,8 +111,16 @@ type RegisteredPlugin<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] exten
|
|
|
111
111
|
contract: infer C extends AnyContractRouter;
|
|
112
112
|
variables: infer V extends AnySchema;
|
|
113
113
|
secrets: infer S extends AnySchema;
|
|
114
|
-
context: infer
|
|
115
|
-
} ? Plugin<C, V, S,
|
|
114
|
+
context: infer TRequestContext extends AnySchema;
|
|
115
|
+
} ? Plugin<C, V, S, TRequestContext, any> : never : never;
|
|
116
|
+
/**
|
|
117
|
+
* Extract plugin constructor type from registry entry
|
|
118
|
+
*/
|
|
119
|
+
type PluginConstructor<K$1 extends keyof R, R = RegisteredPlugins> = RegisteredPlugin<K$1, R>;
|
|
120
|
+
/**
|
|
121
|
+
* Extract context input type from plugin binding (for client creation)
|
|
122
|
+
*/
|
|
123
|
+
type PluginContextInput<T> = InferSchemaInput<PluginContext<T>>;
|
|
116
124
|
/**
|
|
117
125
|
* Extract config input type from plugin binding
|
|
118
126
|
*/
|
|
@@ -121,9 +129,9 @@ type PluginConfigInput<T> = {
|
|
|
121
129
|
secrets: InferSchemaInput<PluginSecrets<T>>;
|
|
122
130
|
};
|
|
123
131
|
/**
|
|
124
|
-
* Extract context type from plugin instance
|
|
132
|
+
* Extract deps context type from plugin instance (used for initialization)
|
|
125
133
|
*/
|
|
126
|
-
type ContextOf<T extends AnyPlugin> = T extends Plugin<AnyContractRouter, AnySchema, AnySchema, infer
|
|
134
|
+
type ContextOf<T extends AnyPlugin> = T extends Plugin<AnyContractRouter, AnySchema, AnySchema, AnySchema, infer TDeps> ? TDeps : never;
|
|
127
135
|
/**
|
|
128
136
|
* Plugin metadata for remote loading
|
|
129
137
|
*/
|
|
@@ -183,7 +191,7 @@ type VerifyPluginBinding<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] ex
|
|
|
183
191
|
contract: AnyContractRouter;
|
|
184
192
|
variables: AnySchema;
|
|
185
193
|
secrets: AnySchema;
|
|
186
|
-
context:
|
|
194
|
+
context: AnySchema;
|
|
187
195
|
} ? true : `ā Plugin "${K$1 & string}" is not properly registered. Ensure it extends plugin binding layout { contract, variables, secrets, context }.` : `ā Plugin "${K$1 & string}" is not properly registered. Missing binding property.`;
|
|
188
196
|
/**
|
|
189
197
|
* Result of runtime.usePlugin() call
|
|
@@ -191,7 +199,7 @@ type VerifyPluginBinding<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] ex
|
|
|
191
199
|
* @param R - The registry type (defaults to RegisteredPlugins for module augmentation pattern)
|
|
192
200
|
*/
|
|
193
201
|
type UsePluginResult<K$1 extends keyof R, R = RegisteredPlugins> = VerifyPluginBinding<K$1, R> extends true ? {
|
|
194
|
-
readonly
|
|
202
|
+
readonly createClient: (context?: PluginContextInput<R[K$1]>) => PluginClientType<R[K$1]>;
|
|
195
203
|
readonly router: PluginRouterType<R[K$1]>;
|
|
196
204
|
readonly metadata: PluginMetadata;
|
|
197
205
|
readonly initialized: InitializedPlugin<RegisteredPlugin<K$1, R>>;
|
|
@@ -257,5 +265,5 @@ interface LegacyPluginRuntimeConfig {
|
|
|
257
265
|
options?: RuntimeOptions;
|
|
258
266
|
}
|
|
259
267
|
//#endregion
|
|
260
|
-
export { AnyPlugin, AnyPluginConstructor, ContextOf, EveryPlugin, ExtractPluginType, InferRegistryFromEntries, InitializedPlugin, LegacyPluginRuntimeConfig, LoadedPlugin, PluginClientType, PluginConfigInput, PluginContext, PluginContract, PluginInstance, PluginMetadata, PluginMetadataRegistry, PluginRegistry, PluginRegistryEntry, PluginRouterType, PluginRuntimeConfig, PluginSecrets, PluginVariables, RegisteredPlugin, RegisteredPlugins, RuntimeOptions, SecretsConfig, UsePluginResult };
|
|
268
|
+
export { AnyPlugin, AnyPluginConstructor, ContextOf, EveryPlugin, ExtractPluginType, InferRegistryFromEntries, InitializedPlugin, LegacyPluginRuntimeConfig, LoadedPlugin, PluginClientType, PluginConfigInput, PluginConstructor, PluginContext, PluginContextInput, PluginContract, PluginInstance, PluginMetadata, PluginMetadataRegistry, PluginRegistry, PluginRegistryEntry, PluginRouterType, PluginRuntimeConfig, PluginSecrets, PluginVariables, RegisteredPlugin, RegisteredPlugins, RuntimeOptions, SecretsConfig, UsePluginResult };
|
|
261
269
|
//# sourceMappingURL=types.d.cts.map
|
package/dist/types.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAkBA;AAKA
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/types.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Plugin } from "./plugin.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { Router, RouterClient } from "@orpc/server";
|
|
3
3
|
import { Scope } from "effect";
|
|
4
4
|
import { AnyContractRouter, AnySchema, InferSchemaInput, InferSchemaOutput } from "@orpc/contract";
|
|
5
5
|
|
|
@@ -21,7 +21,7 @@ interface RegisteredPlugins {}
|
|
|
21
21
|
/**
|
|
22
22
|
* Base type for any plugin instance.
|
|
23
23
|
*/
|
|
24
|
-
type AnyPlugin = Plugin<AnyContractRouter, AnySchema, AnySchema, any>;
|
|
24
|
+
type AnyPlugin = Plugin<AnyContractRouter, AnySchema, AnySchema, AnySchema, any>;
|
|
25
25
|
/**
|
|
26
26
|
* Loaded plugin constructor with binding information
|
|
27
27
|
*/
|
|
@@ -31,7 +31,7 @@ type AnyPluginConstructor = {
|
|
|
31
31
|
contract: AnyContractRouter;
|
|
32
32
|
variables: AnySchema;
|
|
33
33
|
secrets: AnySchema;
|
|
34
|
-
context:
|
|
34
|
+
context: AnySchema;
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
@@ -84,11 +84,11 @@ type PluginSecrets<T> = T extends {
|
|
|
84
84
|
};
|
|
85
85
|
} ? S : never;
|
|
86
86
|
/**
|
|
87
|
-
* Extract context type from plugin binding
|
|
87
|
+
* Extract context schema type from plugin binding
|
|
88
88
|
*/
|
|
89
89
|
type PluginContext<T> = T extends {
|
|
90
90
|
binding: {
|
|
91
|
-
context: infer C extends
|
|
91
|
+
context: infer C extends AnySchema;
|
|
92
92
|
};
|
|
93
93
|
} ? C : never;
|
|
94
94
|
/**
|
|
@@ -111,8 +111,16 @@ type RegisteredPlugin<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] exten
|
|
|
111
111
|
contract: infer C extends AnyContractRouter;
|
|
112
112
|
variables: infer V extends AnySchema;
|
|
113
113
|
secrets: infer S extends AnySchema;
|
|
114
|
-
context: infer
|
|
115
|
-
} ? Plugin<C, V, S,
|
|
114
|
+
context: infer TRequestContext extends AnySchema;
|
|
115
|
+
} ? Plugin<C, V, S, TRequestContext, any> : never : never;
|
|
116
|
+
/**
|
|
117
|
+
* Extract plugin constructor type from registry entry
|
|
118
|
+
*/
|
|
119
|
+
type PluginConstructor<K$1 extends keyof R, R = RegisteredPlugins> = RegisteredPlugin<K$1, R>;
|
|
120
|
+
/**
|
|
121
|
+
* Extract context input type from plugin binding (for client creation)
|
|
122
|
+
*/
|
|
123
|
+
type PluginContextInput<T> = InferSchemaInput<PluginContext<T>>;
|
|
116
124
|
/**
|
|
117
125
|
* Extract config input type from plugin binding
|
|
118
126
|
*/
|
|
@@ -121,9 +129,9 @@ type PluginConfigInput<T> = {
|
|
|
121
129
|
secrets: InferSchemaInput<PluginSecrets<T>>;
|
|
122
130
|
};
|
|
123
131
|
/**
|
|
124
|
-
* Extract context type from plugin instance
|
|
132
|
+
* Extract deps context type from plugin instance (used for initialization)
|
|
125
133
|
*/
|
|
126
|
-
type ContextOf<T extends AnyPlugin> = T extends Plugin<AnyContractRouter, AnySchema, AnySchema, infer
|
|
134
|
+
type ContextOf<T extends AnyPlugin> = T extends Plugin<AnyContractRouter, AnySchema, AnySchema, AnySchema, infer TDeps> ? TDeps : never;
|
|
127
135
|
/**
|
|
128
136
|
* Plugin metadata for remote loading
|
|
129
137
|
*/
|
|
@@ -183,7 +191,7 @@ type VerifyPluginBinding<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] ex
|
|
|
183
191
|
contract: AnyContractRouter;
|
|
184
192
|
variables: AnySchema;
|
|
185
193
|
secrets: AnySchema;
|
|
186
|
-
context:
|
|
194
|
+
context: AnySchema;
|
|
187
195
|
} ? true : `ā Plugin "${K$1 & string}" is not properly registered. Ensure it extends plugin binding layout { contract, variables, secrets, context }.` : `ā Plugin "${K$1 & string}" is not properly registered. Missing binding property.`;
|
|
188
196
|
/**
|
|
189
197
|
* Result of runtime.usePlugin() call
|
|
@@ -191,7 +199,7 @@ type VerifyPluginBinding<K$1 extends keyof R, R = RegisteredPlugins> = R[K$1] ex
|
|
|
191
199
|
* @param R - The registry type (defaults to RegisteredPlugins for module augmentation pattern)
|
|
192
200
|
*/
|
|
193
201
|
type UsePluginResult<K$1 extends keyof R, R = RegisteredPlugins> = VerifyPluginBinding<K$1, R> extends true ? {
|
|
194
|
-
readonly
|
|
202
|
+
readonly createClient: (context?: PluginContextInput<R[K$1]>) => PluginClientType<R[K$1]>;
|
|
195
203
|
readonly router: PluginRouterType<R[K$1]>;
|
|
196
204
|
readonly metadata: PluginMetadata;
|
|
197
205
|
readonly initialized: InitializedPlugin<RegisteredPlugin<K$1, R>>;
|
|
@@ -257,5 +265,5 @@ interface LegacyPluginRuntimeConfig {
|
|
|
257
265
|
options?: RuntimeOptions;
|
|
258
266
|
}
|
|
259
267
|
//#endregion
|
|
260
|
-
export { AnyPlugin, AnyPluginConstructor, ContextOf, EveryPlugin, ExtractPluginType, InferRegistryFromEntries, InitializedPlugin, LegacyPluginRuntimeConfig, LoadedPlugin, PluginClientType, PluginConfigInput, PluginContext, PluginContract, PluginInstance, PluginMetadata, PluginMetadataRegistry, PluginRegistry, PluginRegistryEntry, PluginRouterType, PluginRuntimeConfig, PluginSecrets, PluginVariables, RegisteredPlugin, RegisteredPlugins, RuntimeOptions, SecretsConfig, UsePluginResult };
|
|
268
|
+
export { AnyPlugin, AnyPluginConstructor, ContextOf, EveryPlugin, ExtractPluginType, InferRegistryFromEntries, InitializedPlugin, LegacyPluginRuntimeConfig, LoadedPlugin, PluginClientType, PluginConfigInput, PluginConstructor, PluginContext, PluginContextInput, PluginContract, PluginInstance, PluginMetadata, PluginMetadataRegistry, PluginRegistry, PluginRegistryEntry, PluginRouterType, PluginRuntimeConfig, PluginSecrets, PluginVariables, RegisteredPlugin, RegisteredPlugins, RuntimeOptions, SecretsConfig, UsePluginResult };
|
|
261
269
|
//# sourceMappingURL=types.d.mts.map
|
package/dist/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAkBA;AAKA
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":"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"}
|