nitrostack 1.0.0
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/CHANGELOG.md +227 -0
- package/CONTRIBUTING.md +182 -0
- package/LICENSE +201 -0
- package/LICENSE_URLS_UPDATE_COMPLETE.md +388 -0
- package/NOTICE +153 -0
- package/README.md +571 -0
- package/dist/auth/api-key.d.ts +118 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +168 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/client.d.ts +151 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +330 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +30 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +43 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +95 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +260 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/pkce.d.ts +53 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +105 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/quick-setup.d.ts +94 -0
- package/dist/auth/quick-setup.d.ts.map +1 -0
- package/dist/auth/quick-setup.js +210 -0
- package/dist/auth/quick-setup.js.map +1 -0
- package/dist/auth/server-integration.d.ts +97 -0
- package/dist/auth/server-integration.d.ts.map +1 -0
- package/dist/auth/server-integration.js +182 -0
- package/dist/auth/server-integration.js.map +1 -0
- package/dist/auth/server-metadata.d.ts +51 -0
- package/dist/auth/server-metadata.d.ts.map +1 -0
- package/dist/auth/server-metadata.js +106 -0
- package/dist/auth/server-metadata.js.map +1 -0
- package/dist/auth/simple-jwt.d.ts +88 -0
- package/dist/auth/simple-jwt.d.ts.map +1 -0
- package/dist/auth/simple-jwt.js +152 -0
- package/dist/auth/simple-jwt.js.map +1 -0
- package/dist/auth/token-store.d.ts +104 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +205 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-validation.d.ts +47 -0
- package/dist/auth/token-validation.d.ts.map +1 -0
- package/dist/auth/token-validation.js +237 -0
- package/dist/auth/token-validation.js.map +1 -0
- package/dist/auth/types.d.ts +215 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/build.d.ts +6 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +104 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +312 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate-types.d.ts +8 -0
- package/dist/cli/commands/generate-types.d.ts.map +1 -0
- package/dist/cli/commands/generate-types.js +220 -0
- package/dist/cli/commands/generate-types.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +5 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +365 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +365 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.d.ts +6 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +61 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +47 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-dev-wrapper.d.ts +3 -0
- package/dist/cli/mcp-dev-wrapper.d.ts.map +1 -0
- package/dist/cli/mcp-dev-wrapper.js +116 -0
- package/dist/cli/mcp-dev-wrapper.js.map +1 -0
- package/dist/core/apikey-module.d.ts +69 -0
- package/dist/core/apikey-module.d.ts.map +1 -0
- package/dist/core/apikey-module.js +114 -0
- package/dist/core/apikey-module.js.map +1 -0
- package/dist/core/app-decorator.d.ts +58 -0
- package/dist/core/app-decorator.d.ts.map +1 -0
- package/dist/core/app-decorator.js +261 -0
- package/dist/core/app-decorator.js.map +1 -0
- package/dist/core/builders.d.ts +38 -0
- package/dist/core/builders.d.ts.map +1 -0
- package/dist/core/builders.js +129 -0
- package/dist/core/builders.js.map +1 -0
- package/dist/core/component.d.ts +105 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +182 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/config-module.d.ts +55 -0
- package/dist/core/config-module.d.ts.map +1 -0
- package/dist/core/config-module.js +94 -0
- package/dist/core/config-module.js.map +1 -0
- package/dist/core/decorators/cache.decorator.d.ts +61 -0
- package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
- package/dist/core/decorators/cache.decorator.js +115 -0
- package/dist/core/decorators/cache.decorator.js.map +1 -0
- package/dist/core/decorators/health-check.decorator.d.ts +80 -0
- package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
- package/dist/core/decorators/health-check.decorator.js +153 -0
- package/dist/core/decorators/health-check.decorator.js.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts +62 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.js +129 -0
- package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
- package/dist/core/decorators.d.ts +151 -0
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +142 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/di/container.d.ts +42 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/container.js +76 -0
- package/dist/core/di/container.js.map +1 -0
- package/dist/core/di/injectable.decorator.d.ts +35 -0
- package/dist/core/di/injectable.decorator.d.ts.map +1 -0
- package/dist/core/di/injectable.decorator.js +57 -0
- package/dist/core/di/injectable.decorator.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +87 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-emitter.d.ts +50 -0
- package/dist/core/events/event-emitter.d.ts.map +1 -0
- package/dist/core/events/event-emitter.js +94 -0
- package/dist/core/events/event-emitter.js.map +1 -0
- package/dist/core/events/event.decorator.d.ts +48 -0
- package/dist/core/events/event.decorator.d.ts.map +1 -0
- package/dist/core/events/event.decorator.js +68 -0
- package/dist/core/events/event.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
- package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.decorator.js +54 -0
- package/dist/core/filters/exception-filter.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.interface.d.ts +30 -0
- package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.interface.js +2 -0
- package/dist/core/filters/exception-filter.interface.js.map +1 -0
- package/dist/core/guards/apikey.guard.d.ts +22 -0
- package/dist/core/guards/apikey.guard.d.ts.map +1 -0
- package/dist/core/guards/apikey.guard.js +11 -0
- package/dist/core/guards/apikey.guard.js.map +1 -0
- package/dist/core/guards/guard.interface.d.ts +18 -0
- package/dist/core/guards/guard.interface.d.ts.map +1 -0
- package/dist/core/guards/guard.interface.js +2 -0
- package/dist/core/guards/guard.interface.js.map +1 -0
- package/dist/core/guards/jwt.guard.d.ts +18 -0
- package/dist/core/guards/jwt.guard.d.ts.map +1 -0
- package/dist/core/guards/jwt.guard.js +2 -0
- package/dist/core/guards/jwt.guard.js.map +1 -0
- package/dist/core/guards/oauth.guard.d.ts +35 -0
- package/dist/core/guards/oauth.guard.d.ts.map +1 -0
- package/dist/core/guards/oauth.guard.js +2 -0
- package/dist/core/guards/oauth.guard.js.map +1 -0
- package/dist/core/guards/use-guards.decorator.d.ts +25 -0
- package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
- package/dist/core/guards/use-guards.decorator.js +32 -0
- package/dist/core/guards/use-guards.decorator.js.map +1 -0
- package/dist/core/health/health-checks.resource.d.ts +14 -0
- package/dist/core/health/health-checks.resource.d.ts.map +1 -0
- package/dist/core/health/health-checks.resource.js +29 -0
- package/dist/core/health/health-checks.resource.js.map +1 -0
- package/dist/core/index.d.ts +55 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +57 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.js +51 -0
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
- package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.interface.js +2 -0
- package/dist/core/interceptors/interceptor.interface.js.map +1 -0
- package/dist/core/jwt-module.d.ts +51 -0
- package/dist/core/jwt-module.d.ts.map +1 -0
- package/dist/core/jwt-module.js +52 -0
- package/dist/core/jwt-module.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +51 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware/middleware.decorator.d.ts +39 -0
- package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
- package/dist/core/middleware/middleware.decorator.js +53 -0
- package/dist/core/middleware/middleware.decorator.js.map +1 -0
- package/dist/core/middleware/middleware.interface.d.ts +29 -0
- package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
- package/dist/core/middleware/middleware.interface.js +2 -0
- package/dist/core/middleware/middleware.interface.js.map +1 -0
- package/dist/core/module.d.ts +74 -0
- package/dist/core/module.d.ts.map +1 -0
- package/dist/core/module.js +82 -0
- package/dist/core/module.js.map +1 -0
- package/dist/core/oauth-module.d.ts +144 -0
- package/dist/core/oauth-module.d.ts.map +1 -0
- package/dist/core/oauth-module.js +190 -0
- package/dist/core/oauth-module.js.map +1 -0
- package/dist/core/pipes/pipe.decorator.d.ts +55 -0
- package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
- package/dist/core/pipes/pipe.decorator.js +85 -0
- package/dist/core/pipes/pipe.decorator.js.map +1 -0
- package/dist/core/pipes/pipe.interface.d.ts +36 -0
- package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
- package/dist/core/pipes/pipe.interface.js +2 -0
- package/dist/core/pipes/pipe.interface.js.map +1 -0
- package/dist/core/prompt.d.ts +37 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +76 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/resource.d.ts +42 -0
- package/dist/core/resource.d.ts.map +1 -0
- package/dist/core/resource.js +90 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/core/server.d.ts +72 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +406 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/tool.d.ts +78 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +190 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/transports/http-server.d.ts +102 -0
- package/dist/core/transports/http-server.d.ts.map +1 -0
- package/dist/core/transports/http-server.js +265 -0
- package/dist/core/transports/http-server.js.map +1 -0
- package/dist/core/types.d.ts +123 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
- package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
- package/dist/core/widgets/widget-examples.resource.js +28 -0
- package/dist/core/widgets/widget-examples.resource.js.map +1 -0
- package/dist/core/widgets/widget-registry.d.ts +56 -0
- package/dist/core/widgets/widget-registry.d.ts.map +1 -0
- package/dist/core/widgets/widget-registry.js +75 -0
- package/dist/core/widgets/widget-registry.js.map +1 -0
- package/dist/testing/index.d.ts +82 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +164 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/ui-next/index.d.ts +31 -0
- package/dist/ui-next/index.d.ts.map +1 -0
- package/dist/ui-next/index.js +687 -0
- package/dist/ui-next/index.js.map +1 -0
- package/dist/widgets/index.d.ts +9 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +9 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/metadata.d.ts +53 -0
- package/dist/widgets/metadata.d.ts.map +1 -0
- package/dist/widgets/metadata.js +29 -0
- package/dist/widgets/metadata.js.map +1 -0
- package/dist/widgets/withToolData.d.ts +19 -0
- package/dist/widgets/withToolData.d.ts.map +1 -0
- package/dist/widgets/withToolData.js +240 -0
- package/dist/widgets/withToolData.js.map +1 -0
- package/jest.config.js +21 -0
- package/package.json +108 -0
- package/templates/typescript-auth/AI_AGENT_CLI_REFERENCE.md +702 -0
- package/templates/typescript-auth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth/README.md +400 -0
- package/templates/typescript-auth/package.json +44 -0
- package/templates/typescript-auth-api-key/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-auth-api-key/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth-api-key/README.md +483 -0
- package/templates/typescript-auth-api-key/package-lock.json +124 -0
- package/templates/typescript-auth-api-key/package.json +29 -0
- package/templates/typescript-oauth/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-oauth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-oauth/OAUTH_SETUP.md +406 -0
- package/templates/typescript-oauth/README.md +350 -0
- package/templates/typescript-oauth/package.json +30 -0
- package/templates/typescript-starter/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-starter/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-starter/README.md +312 -0
- package/templates/typescript-starter/package.json +32 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Base configuration for MCP server
|
|
4
|
+
*/
|
|
5
|
+
export interface McpServerConfig {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
capabilities?: {
|
|
10
|
+
tools?: boolean;
|
|
11
|
+
resources?: boolean;
|
|
12
|
+
prompts?: boolean;
|
|
13
|
+
};
|
|
14
|
+
logging?: {
|
|
15
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
16
|
+
file?: string;
|
|
17
|
+
};
|
|
18
|
+
rateLimit?: {
|
|
19
|
+
maxRequests: number;
|
|
20
|
+
windowMs: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tool definition with schema validation
|
|
25
|
+
*/
|
|
26
|
+
export interface ToolDefinition<TInput = any, TOutput = any> {
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
inputSchema: z.ZodSchema<TInput>;
|
|
30
|
+
handler: (input: TInput, context: ExecutionContext) => Promise<TOutput>;
|
|
31
|
+
metadata?: {
|
|
32
|
+
category?: string;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
rateLimit?: {
|
|
35
|
+
maxCalls: number;
|
|
36
|
+
windowMs: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resource definition
|
|
42
|
+
*/
|
|
43
|
+
export interface ResourceDefinition {
|
|
44
|
+
uri: string;
|
|
45
|
+
name: string;
|
|
46
|
+
description: string;
|
|
47
|
+
mimeType?: string;
|
|
48
|
+
handler: (context: ExecutionContext) => Promise<ResourceContent>;
|
|
49
|
+
metadata?: {
|
|
50
|
+
cacheable?: boolean;
|
|
51
|
+
cacheMaxAge?: number;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resource content types
|
|
56
|
+
*/
|
|
57
|
+
export type ResourceContent = {
|
|
58
|
+
type: 'text';
|
|
59
|
+
data: string;
|
|
60
|
+
} | {
|
|
61
|
+
type: 'binary';
|
|
62
|
+
data: Buffer;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'json';
|
|
65
|
+
data: any;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Prompt definition
|
|
69
|
+
*/
|
|
70
|
+
export interface PromptDefinition {
|
|
71
|
+
name: string;
|
|
72
|
+
description: string;
|
|
73
|
+
arguments?: PromptArgument[];
|
|
74
|
+
handler: (args: Record<string, any>, context: ExecutionContext) => Promise<PromptMessage[]>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Prompt argument
|
|
78
|
+
*/
|
|
79
|
+
export interface PromptArgument {
|
|
80
|
+
name: string;
|
|
81
|
+
description: string;
|
|
82
|
+
required?: boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Prompt message
|
|
86
|
+
*/
|
|
87
|
+
export interface PromptMessage {
|
|
88
|
+
role: 'user' | 'assistant' | 'system';
|
|
89
|
+
content: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Execution context passed to handlers
|
|
93
|
+
*/
|
|
94
|
+
export interface ExecutionContext {
|
|
95
|
+
requestId: string;
|
|
96
|
+
toolName?: string;
|
|
97
|
+
logger: Logger;
|
|
98
|
+
metadata?: Record<string, any>;
|
|
99
|
+
auth?: {
|
|
100
|
+
subject?: string;
|
|
101
|
+
scopes?: string[];
|
|
102
|
+
[key: string]: any;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Logger interface
|
|
107
|
+
*/
|
|
108
|
+
export interface Logger {
|
|
109
|
+
debug(message: string, meta?: any): void;
|
|
110
|
+
info(message: string, meta?: any): void;
|
|
111
|
+
warn(message: string, meta?: any): void;
|
|
112
|
+
error(message: string, meta?: any): void;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Server statistics
|
|
116
|
+
*/
|
|
117
|
+
export interface ServerStats {
|
|
118
|
+
toolCalls: number;
|
|
119
|
+
resourceReads: number;
|
|
120
|
+
promptExecutions: number;
|
|
121
|
+
errors: number;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget Examples Resource
|
|
3
|
+
*
|
|
4
|
+
* Exposes widget metadata and examples via MCP protocol
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Build widget examples resource
|
|
8
|
+
* Returns resource definition for widget://examples
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildWidgetExamplesResource(): Promise<{
|
|
11
|
+
uri: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
mimeType: string;
|
|
15
|
+
read: () => Promise<string>;
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=widget-examples.resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-examples.resource.d.ts","sourceRoot":"","sources":["../../../src/core/widgets/widget-examples.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC,CAiBD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget Examples Resource
|
|
3
|
+
*
|
|
4
|
+
* Exposes widget metadata and examples via MCP protocol
|
|
5
|
+
*/
|
|
6
|
+
import { getWidgetRegistry } from './widget-registry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Build widget examples resource
|
|
9
|
+
* Returns resource definition for widget://examples
|
|
10
|
+
*/
|
|
11
|
+
export async function buildWidgetExamplesResource() {
|
|
12
|
+
return {
|
|
13
|
+
uri: 'widget://examples',
|
|
14
|
+
name: 'Widget Examples',
|
|
15
|
+
description: 'Provides metadata and examples for all registered UI widgets',
|
|
16
|
+
mimeType: 'application/json',
|
|
17
|
+
read: async () => {
|
|
18
|
+
const registry = getWidgetRegistry();
|
|
19
|
+
const widgets = registry.getAllWidgets();
|
|
20
|
+
return JSON.stringify({
|
|
21
|
+
widgets,
|
|
22
|
+
count: widgets.length,
|
|
23
|
+
loaded: registry.isLoaded(),
|
|
24
|
+
}, null, 2);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=widget-examples.resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-examples.resource.js","sourceRoot":"","sources":["../../../src/core/widgets/widget-examples.resource.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAO/C,OAAO;QACL,GAAG,EAAE,mBAAmB;QACxB,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,kBAAkB;QAC5B,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YAEzC,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO;gBACP,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE;aAC5B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages widget metadata and example resolution
|
|
5
|
+
*/
|
|
6
|
+
export interface WidgetExample {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
data: Record<string, any>;
|
|
10
|
+
}
|
|
11
|
+
export interface WidgetMetadata {
|
|
12
|
+
uri: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
examples: WidgetExample[];
|
|
16
|
+
tags?: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface WidgetManifest {
|
|
19
|
+
version: string;
|
|
20
|
+
widgets: WidgetMetadata[];
|
|
21
|
+
generatedAt: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Widget Registry
|
|
25
|
+
* Loads and manages widget metadata from manifest
|
|
26
|
+
*/
|
|
27
|
+
export declare class WidgetRegistry {
|
|
28
|
+
private widgets;
|
|
29
|
+
private loaded;
|
|
30
|
+
/**
|
|
31
|
+
* Load widget manifest from file
|
|
32
|
+
*/
|
|
33
|
+
loadManifest(manifestPath: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get all widgets
|
|
36
|
+
*/
|
|
37
|
+
getAllWidgets(): WidgetMetadata[];
|
|
38
|
+
/**
|
|
39
|
+
* Get widget by URI
|
|
40
|
+
*/
|
|
41
|
+
getWidget(uri: string): WidgetMetadata | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Get widget example data
|
|
44
|
+
* Returns the first example's data, or undefined if no examples
|
|
45
|
+
*/
|
|
46
|
+
getWidgetExampleData(uri: string): Record<string, any> | undefined;
|
|
47
|
+
/**
|
|
48
|
+
* Check if manifest is loaded
|
|
49
|
+
*/
|
|
50
|
+
isLoaded(): boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the global widget registry instance
|
|
54
|
+
*/
|
|
55
|
+
export declare function getWidgetRegistry(): WidgetRegistry;
|
|
56
|
+
//# sourceMappingURL=widget-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-registry.d.ts","sourceRoot":"","sources":["../../../src/core/widgets/widget-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,MAAM,CAAkB;IAEhC;;OAEG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAuBxC;;OAEG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD;;;OAGG;IACH,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS;IAKlE;;OAEG;IACH,QAAQ,IAAI,OAAO;CAGpB;AAKD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages widget metadata and example resolution
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, existsSync } from 'fs';
|
|
7
|
+
/**
|
|
8
|
+
* Widget Registry
|
|
9
|
+
* Loads and manages widget metadata from manifest
|
|
10
|
+
*/
|
|
11
|
+
export class WidgetRegistry {
|
|
12
|
+
widgets = new Map();
|
|
13
|
+
loaded = false;
|
|
14
|
+
/**
|
|
15
|
+
* Load widget manifest from file
|
|
16
|
+
*/
|
|
17
|
+
loadManifest(manifestPath) {
|
|
18
|
+
if (!existsSync(manifestPath)) {
|
|
19
|
+
// Use stderr to avoid corrupting MCP stdio protocol
|
|
20
|
+
console.error(`[Widget Registry] Manifest not found at ${manifestPath}, skipping widget examples`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const manifestContent = readFileSync(manifestPath, 'utf-8');
|
|
25
|
+
const manifest = JSON.parse(manifestContent);
|
|
26
|
+
for (const widget of manifest.widgets) {
|
|
27
|
+
this.widgets.set(widget.uri, widget);
|
|
28
|
+
}
|
|
29
|
+
this.loaded = true;
|
|
30
|
+
// Use stderr to avoid corrupting MCP stdio protocol
|
|
31
|
+
console.error(`[Widget Registry] Loaded ${this.widgets.size} widget(s) from manifest`);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error(`[Widget Registry] Failed to load widget manifest:`, error.message);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all widgets
|
|
39
|
+
*/
|
|
40
|
+
getAllWidgets() {
|
|
41
|
+
return Array.from(this.widgets.values());
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get widget by URI
|
|
45
|
+
*/
|
|
46
|
+
getWidget(uri) {
|
|
47
|
+
return this.widgets.get(uri);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get widget example data
|
|
51
|
+
* Returns the first example's data, or undefined if no examples
|
|
52
|
+
*/
|
|
53
|
+
getWidgetExampleData(uri) {
|
|
54
|
+
const widget = this.widgets.get(uri);
|
|
55
|
+
return widget?.examples[0]?.data;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if manifest is loaded
|
|
59
|
+
*/
|
|
60
|
+
isLoaded() {
|
|
61
|
+
return this.loaded;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Global registry instance
|
|
65
|
+
let registryInstance = null;
|
|
66
|
+
/**
|
|
67
|
+
* Get the global widget registry instance
|
|
68
|
+
*/
|
|
69
|
+
export function getWidgetRegistry() {
|
|
70
|
+
if (!registryInstance) {
|
|
71
|
+
registryInstance = new WidgetRegistry();
|
|
72
|
+
}
|
|
73
|
+
return registryInstance;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=widget-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-registry.js","sourceRoot":"","sources":["../../../src/core/widgets/widget-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAuB9C;;;GAGG;AACH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAgC,IAAI,GAAG,EAAE,CAAC;IACjD,MAAM,GAAY,KAAK,CAAC;IAEhC;;OAEG;IACH,YAAY,CAAC,YAAoB;QAC/B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,oDAAoD;YACpD,OAAO,CAAC,KAAK,CAAC,2CAA2C,YAAY,4BAA4B,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAmB,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAE7D,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,oDAAoD;YACpD,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,GAAW;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF;AAED,2BAA2B;AAC3B,IAAI,gBAAgB,GAA0B,IAAI,CAAC;AAEnD;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,IAAI,cAAc,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { DIContainer } from '../core/di/container.js';
|
|
3
|
+
import { ExecutionContext, Logger } from '../core/types.js';
|
|
4
|
+
declare global {
|
|
5
|
+
var jest: any | undefined;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Testing utilities for NitroStack
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Mock logger for testing
|
|
12
|
+
*/
|
|
13
|
+
export declare class MockLogger implements Logger {
|
|
14
|
+
logs: {
|
|
15
|
+
level: string;
|
|
16
|
+
message: string;
|
|
17
|
+
meta?: any;
|
|
18
|
+
}[];
|
|
19
|
+
debug(message: string, meta?: any): void;
|
|
20
|
+
info(message: string, meta?: any): void;
|
|
21
|
+
warn(message: string, meta?: any): void;
|
|
22
|
+
error(message: string, meta?: any): void;
|
|
23
|
+
clear(): void;
|
|
24
|
+
hasLog(level: string, message: string): boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a mock execution context for testing
|
|
28
|
+
*/
|
|
29
|
+
export declare function createMockContext(overrides?: Partial<ExecutionContext>): ExecutionContext;
|
|
30
|
+
/**
|
|
31
|
+
* Testing module builder
|
|
32
|
+
*/
|
|
33
|
+
export declare class TestingModule {
|
|
34
|
+
private container;
|
|
35
|
+
private providers;
|
|
36
|
+
private mocks;
|
|
37
|
+
private constructor();
|
|
38
|
+
/**
|
|
39
|
+
* Create a testing module
|
|
40
|
+
*/
|
|
41
|
+
static create(): TestingModule;
|
|
42
|
+
/**
|
|
43
|
+
* Add a provider to the module
|
|
44
|
+
*/
|
|
45
|
+
addProvider(token: any, provider?: any): this;
|
|
46
|
+
/**
|
|
47
|
+
* Add a mock to the module
|
|
48
|
+
*/
|
|
49
|
+
addMock<T = any>(token: any, mock: T): this;
|
|
50
|
+
/**
|
|
51
|
+
* Compile the testing module
|
|
52
|
+
*/
|
|
53
|
+
compile(): CompiledTestingModule;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compiled testing module
|
|
57
|
+
*/
|
|
58
|
+
export declare class CompiledTestingModule {
|
|
59
|
+
private container;
|
|
60
|
+
constructor(container: DIContainer);
|
|
61
|
+
/**
|
|
62
|
+
* Get an instance from the container
|
|
63
|
+
*/
|
|
64
|
+
get<T>(token: any): T;
|
|
65
|
+
/**
|
|
66
|
+
* Cleanup the module
|
|
67
|
+
*/
|
|
68
|
+
cleanup(): void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create a mock function (compatible with Jest)
|
|
72
|
+
*/
|
|
73
|
+
export declare function createMockFn<T extends (...args: any[]) => any>(): any;
|
|
74
|
+
/**
|
|
75
|
+
* Wait for async operations to complete
|
|
76
|
+
*/
|
|
77
|
+
export declare function flushPromises(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Spy on a method
|
|
80
|
+
*/
|
|
81
|
+
export declare function spyOn<T extends object, K extends keyof T>(obj: T, method: K): any;
|
|
82
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,IAAI,EAAE,GAAG,GAAG,SAAS,CAAC;CAC3B;AAED;;GAEG;AAEH;;GAEG;AACH,qBAAa,UAAW,YAAW,MAAM;IACvC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,EAAE,CAAM;IAE5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAIxC,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CAGhD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAUzF;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,KAAK,CAA4B;IAEzC,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,aAAa;IAI9B;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,GAAG,IAAI;IAK7C;;OAEG;IACH,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAK3C;;OAEG;IACH,OAAO,IAAI,qBAAqB;CAkBjC;AAED;;GAEG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,WAAW;IAE1C;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAIrB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,KAAK,GAAG,CAwBrE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EACvD,GAAG,EAAE,CAAC,EACN,MAAM,EAAE,CAAC,GACR,GAAG,CAmBL"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { DIContainer } from '../core/di/container.js';
|
|
3
|
+
/**
|
|
4
|
+
* Testing utilities for NitroStack
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Mock logger for testing
|
|
8
|
+
*/
|
|
9
|
+
export class MockLogger {
|
|
10
|
+
logs = [];
|
|
11
|
+
debug(message, meta) {
|
|
12
|
+
this.logs.push({ level: 'debug', message, meta });
|
|
13
|
+
}
|
|
14
|
+
info(message, meta) {
|
|
15
|
+
this.logs.push({ level: 'info', message, meta });
|
|
16
|
+
}
|
|
17
|
+
warn(message, meta) {
|
|
18
|
+
this.logs.push({ level: 'warn', message, meta });
|
|
19
|
+
}
|
|
20
|
+
error(message, meta) {
|
|
21
|
+
this.logs.push({ level: 'error', message, meta });
|
|
22
|
+
}
|
|
23
|
+
clear() {
|
|
24
|
+
this.logs = [];
|
|
25
|
+
}
|
|
26
|
+
hasLog(level, message) {
|
|
27
|
+
return this.logs.some(log => log.level === level && log.message.includes(message));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a mock execution context for testing
|
|
32
|
+
*/
|
|
33
|
+
export function createMockContext(overrides) {
|
|
34
|
+
const mockLogger = new MockLogger();
|
|
35
|
+
return {
|
|
36
|
+
requestId: 'test-request-id',
|
|
37
|
+
logger: mockLogger,
|
|
38
|
+
metadata: {},
|
|
39
|
+
auth: undefined,
|
|
40
|
+
...overrides,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Testing module builder
|
|
45
|
+
*/
|
|
46
|
+
export class TestingModule {
|
|
47
|
+
container;
|
|
48
|
+
providers = new Map();
|
|
49
|
+
mocks = new Map();
|
|
50
|
+
constructor() {
|
|
51
|
+
this.container = DIContainer.getInstance();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Create a testing module
|
|
55
|
+
*/
|
|
56
|
+
static create() {
|
|
57
|
+
return new TestingModule();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add a provider to the module
|
|
61
|
+
*/
|
|
62
|
+
addProvider(token, provider) {
|
|
63
|
+
this.providers.set(token, provider || token);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Add a mock to the module
|
|
68
|
+
*/
|
|
69
|
+
addMock(token, mock) {
|
|
70
|
+
this.mocks.set(token, mock);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Compile the testing module
|
|
75
|
+
*/
|
|
76
|
+
compile() {
|
|
77
|
+
// Clear existing container
|
|
78
|
+
this.container.clear();
|
|
79
|
+
// Register mocks first (they take precedence)
|
|
80
|
+
for (const [token, mock] of this.mocks.entries()) {
|
|
81
|
+
this.container.registerValue(token, mock);
|
|
82
|
+
}
|
|
83
|
+
// Register providers
|
|
84
|
+
for (const [token, provider] of this.providers.entries()) {
|
|
85
|
+
if (!this.mocks.has(token)) {
|
|
86
|
+
this.container.register(token, provider);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return new CompiledTestingModule(this.container);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Compiled testing module
|
|
94
|
+
*/
|
|
95
|
+
export class CompiledTestingModule {
|
|
96
|
+
container;
|
|
97
|
+
constructor(container) {
|
|
98
|
+
this.container = container;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get an instance from the container
|
|
102
|
+
*/
|
|
103
|
+
get(token) {
|
|
104
|
+
return this.container.resolve(token);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Cleanup the module
|
|
108
|
+
*/
|
|
109
|
+
cleanup() {
|
|
110
|
+
this.container.clear();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a mock function (compatible with Jest)
|
|
115
|
+
*/
|
|
116
|
+
export function createMockFn() {
|
|
117
|
+
// If jest is available, use it
|
|
118
|
+
if (typeof jest !== 'undefined' && jest?.fn) {
|
|
119
|
+
return jest.fn();
|
|
120
|
+
}
|
|
121
|
+
// Otherwise, create a simple mock
|
|
122
|
+
const fn = (...args) => {
|
|
123
|
+
fn.calls.push(args);
|
|
124
|
+
return fn.mockReturnValue;
|
|
125
|
+
};
|
|
126
|
+
fn.calls = [];
|
|
127
|
+
fn.mockReturnValue = undefined;
|
|
128
|
+
fn.mockResolvedValue = (value) => {
|
|
129
|
+
fn.mockReturnValue = Promise.resolve(value);
|
|
130
|
+
return fn;
|
|
131
|
+
};
|
|
132
|
+
fn.mockRejectedValue = (error) => {
|
|
133
|
+
fn.mockReturnValue = Promise.reject(error);
|
|
134
|
+
return fn;
|
|
135
|
+
};
|
|
136
|
+
return fn;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Wait for async operations to complete
|
|
140
|
+
*/
|
|
141
|
+
export async function flushPromises() {
|
|
142
|
+
return new Promise(resolve => setImmediate(resolve));
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Spy on a method
|
|
146
|
+
*/
|
|
147
|
+
export function spyOn(obj, method) {
|
|
148
|
+
if (typeof jest !== 'undefined' && jest?.spyOn) {
|
|
149
|
+
return jest.spyOn(obj, method);
|
|
150
|
+
}
|
|
151
|
+
// Simple spy implementation
|
|
152
|
+
const original = obj[method];
|
|
153
|
+
const spy = (...args) => {
|
|
154
|
+
spy.calls.push(args);
|
|
155
|
+
return original.apply(obj, args);
|
|
156
|
+
};
|
|
157
|
+
spy.calls = [];
|
|
158
|
+
spy.restore = () => {
|
|
159
|
+
obj[method] = original;
|
|
160
|
+
};
|
|
161
|
+
obj[method] = spy;
|
|
162
|
+
return spy;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQtD;;GAEG;AAEH;;GAEG;AACH,MAAM,OAAO,UAAU;IACrB,IAAI,GAAqD,EAAE,CAAC;IAE5D,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAU;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,OAAe;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAqC;IACrE,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE,iBAAiB;QAC5B,MAAM,EAAE,UAAU;QAClB,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,SAAS;QACf,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,SAAS,CAAc;IACvB,SAAS,GAAkB,IAAI,GAAG,EAAE,CAAC;IACrC,KAAK,GAAkB,IAAI,GAAG,EAAE,CAAC;IAEzC;QACE,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAU,EAAE,QAAc;QACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAU,KAAU,EAAE,IAAO;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,OAAO;QACL,2BAA2B;QAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAEvB,8CAA8C;QAC9C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,qBAAqB;QACrB,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACZ;IAApB,YAAoB,SAAsB;QAAtB,cAAS,GAAT,SAAS,CAAa;IAAG,CAAC;IAE9C;;OAEG;IACH,GAAG,CAAI,KAAU;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAI,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,+BAA+B;IAC/B,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,EAAE,EAAS,CAAC;IAC1B,CAAC;IAED,kCAAkC;IAClC,MAAM,EAAE,GAAQ,CAAC,GAAG,IAAW,EAAE,EAAE;QACjC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,EAAE,CAAC,eAAe,CAAC;IAC5B,CAAC,CAAC;IAEF,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;IACd,EAAE,CAAC,eAAe,GAAG,SAAS,CAAC;IAC/B,EAAE,CAAC,iBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE;QACpC,EAAE,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IACF,EAAE,CAAC,iBAAiB,GAAG,CAAC,KAAU,EAAE,EAAE;QACpC,EAAE,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,GAAM,EACN,MAAS;IAET,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAa,CAAC,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAQ,CAAC,GAAG,IAAW,EAAE,EAAE;QAClC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,OAAQ,QAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;QACjB,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;IACzB,CAAC,CAAC;IAEF,GAAG,CAAC,MAAM,CAAC,GAAG,GAAU,CAAC;IACzB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Component } from '../core/component.js';
|
|
2
|
+
import { ExecutionContext } from '../core/types.js';
|
|
3
|
+
export interface CreateNextComponentOptions {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
projectDir: string;
|
|
7
|
+
entryHtml?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
prefersBorder?: boolean;
|
|
10
|
+
csp?: {
|
|
11
|
+
connectDomains?: string[];
|
|
12
|
+
resourceDomains?: string[];
|
|
13
|
+
};
|
|
14
|
+
transformer?: (data: any, context: ExecutionContext) => any;
|
|
15
|
+
build?: boolean;
|
|
16
|
+
buildScript?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Build a Next.js widget and create a NitroStack Component from the exported HTML.
|
|
20
|
+
* Produces a single-file HTML bundle compatible with OpenAI Apps SDK widgets.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createComponentFromNext(opts: CreateNextComponentOptions): Component;
|
|
23
|
+
export declare const uiNext: {
|
|
24
|
+
createComponentFromNext: typeof createComponentFromNext;
|
|
25
|
+
};
|
|
26
|
+
export interface CreateNextRouteOptions extends Omit<CreateNextComponentOptions, 'entryHtml'> {
|
|
27
|
+
routePath: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function createComponentFromNextRoute(routePath: string, options?: Partial<CreateNextRouteOptions>): Component;
|
|
30
|
+
export declare function createComponentFromNextRoute(opts: CreateNextRouteOptions): Component;
|
|
31
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui-next/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAmB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA8DpD,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,KAAK,GAAG,CAAC;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,0BAA0B,GAAG,SAAS,CAwCnF;AAED,eAAO,MAAM,MAAM;;CAA8B,CAAC;AAMlD,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,0BAA0B,EAAE,WAAW,CAAC;IAC3F,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,SAAS,CAAC;AACtH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,CAAC"}
|