@pikku/cli 0.11.1 → 0.11.2
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/.pikku/channel/pikku-channel-types.gen.ts +11 -12
- package/.pikku/channel/pikku-channels-map.gen.d.ts +8 -8
- package/.pikku/channel/pikku-channels-meta.gen.ts +1 -1
- package/.pikku/channel/pikku-channels.gen.ts +1 -1
- package/.pikku/cli/pikku-cli-channel.ts +2 -2
- package/.pikku/cli/pikku-cli-client.gen.ts +1 -3
- package/.pikku/cli/pikku-cli-types.gen.ts +3 -3
- package/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
- package/.pikku/cli/pikku-cli-wirings-meta.gen.ts +4 -157
- package/.pikku/cli/pikku-cli-wirings.gen.ts +3 -3
- package/.pikku/cli/pikku-cli.gen.ts +3 -3
- package/.pikku/function/pikku-function-types.gen.ts +49 -63
- package/.pikku/function/pikku-functions-meta.gen.json +988 -0
- package/.pikku/function/pikku-functions-meta.gen.ts +4 -970
- package/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
- package/.pikku/function/pikku-functions-meta.min.gen.ts +4 -209
- package/.pikku/http/pikku-http-types.gen.ts +2 -2
- package/.pikku/http/pikku-http-wirings-map.gen.d.ts +8 -8
- package/.pikku/http/pikku-http-wirings-meta.gen.ts +1 -1
- package/.pikku/http/pikku-http-wirings.gen.ts +1 -1
- package/.pikku/mcp/pikku-mcp-types.gen.ts +13 -13
- package/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
- package/.pikku/mcp/pikku-mcp-wirings-meta.gen.ts +6 -4
- package/.pikku/mcp/pikku-mcp-wirings.gen.ts +1 -1
- package/.pikku/pikku-bootstrap.gen.ts +1 -4
- package/.pikku/pikku-services.gen.ts +4 -6
- package/.pikku/pikku-types.gen.ts +1 -1
- package/.pikku/pikku-websocket.gen.ts +1 -1
- package/.pikku/queue/pikku-queue-types.gen.ts +2 -2
- package/.pikku/queue/pikku-queue-workers-wirings-map.gen.d.ts +8 -8
- package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
- package/.pikku/queue/pikku-queue-workers-wirings-meta.gen.ts +5 -7
- package/.pikku/queue/pikku-queue-workers-wirings.gen.ts +1 -1
- package/.pikku/rpc/pikku-remote-rpc-workers.gen.ts +2 -2
- package/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts +8 -8
- package/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts +34 -33
- package/.pikku/scheduler/pikku-scheduler-types.gen.ts +2 -2
- package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
- package/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.ts +5 -2
- package/.pikku/scheduler/pikku-schedulers-wirings.gen.ts +1 -1
- package/.pikku/schemas/register.gen.ts +25 -25
- package/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
- package/.pikku/services/config.gen.json +99 -0
- package/.pikku/services/getInspectorState.gen.json +10 -0
- package/.pikku/services/jwt.gen.json +13 -0
- package/.pikku/services/logger.gen.json +25 -0
- package/.pikku/services/queueService.gen.json +14 -0
- package/.pikku/services/schedulerService.gen.json +17 -0
- package/.pikku/services/schema.gen.json +14 -0
- package/.pikku/services/variables.gen.json +13 -0
- package/.pikku/services/workflowService.gen.json +31 -0
- package/.pikku/workflow/pikku-workflow-map.gen.d.ts +8 -8
- package/.pikku/workflow/pikku-workflow-types.gen.ts +36 -31
- package/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
- package/.pikku/workflow/pikku-workflow-wirings-meta.gen.ts +5 -2
- package/.pikku/workflow/pikku-workflow-wirings.gen.ts +6 -2
- package/CHANGELOG.md +21 -0
- package/bin/pikku.ts +6 -32
- package/build.sh +53 -31
- package/cli.schema.json +1 -1
- package/dist/.pikku/channel/pikku-channel-types.gen.d.ts +6 -7
- package/dist/.pikku/channel/pikku-channel-types.gen.js +1 -1
- package/dist/.pikku/channel/pikku-channels-meta.gen.js +1 -1
- package/dist/.pikku/channel/pikku-channels.gen.d.ts +1 -1
- package/dist/.pikku/channel/pikku-channels.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-channel.js +2 -2
- package/dist/.pikku/cli/pikku-cli-client.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli-client.gen.js +1 -3
- package/dist/.pikku/cli/pikku-cli-types.gen.d.ts +3 -3
- package/dist/.pikku/cli/pikku-cli-types.gen.js +1 -1
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.js +3 -157
- package/dist/.pikku/cli/pikku-cli-wirings-meta.gen.json +146 -0
- package/dist/.pikku/cli/pikku-cli-wirings.gen.d.ts +2 -2
- package/dist/.pikku/cli/pikku-cli-wirings.gen.js +2 -2
- package/dist/.pikku/cli/pikku-cli.gen.d.ts +1 -1
- package/dist/.pikku/cli/pikku-cli.gen.js +3 -3
- package/dist/.pikku/function/pikku-function-types.gen.d.ts +29 -79
- package/dist/.pikku/function/pikku-function-types.gen.js +19 -15
- package/dist/.pikku/function/pikku-functions-meta.gen.js +3 -969
- package/dist/.pikku/function/pikku-functions-meta.gen.json +988 -0
- package/dist/.pikku/function/pikku-functions-meta.min.gen.js +3 -208
- package/dist/.pikku/function/pikku-functions-meta.min.gen.json +212 -0
- package/dist/.pikku/http/pikku-http-types.gen.d.ts +2 -2
- package/dist/.pikku/http/pikku-http-types.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings-meta.gen.js +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.d.ts +1 -1
- package/dist/.pikku/http/pikku-http-wirings.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-types.gen.d.ts +13 -13
- package/dist/.pikku/mcp/pikku-mcp-types.gen.js +1 -1
- package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.js +5 -4
- package/dist/.pikku/mcp/pikku-mcp-wirings-meta.gen.json +5 -0
- package/dist/.pikku/mcp/pikku-mcp-wirings.gen.d.ts +1 -1
- package/dist/.pikku/mcp/pikku-mcp-wirings.gen.js +1 -1
- package/dist/.pikku/pikku-bootstrap.gen.d.ts +1 -4
- package/dist/.pikku/pikku-bootstrap.gen.js +1 -4
- package/dist/.pikku/pikku-services.gen.d.ts +3 -6
- package/dist/.pikku/pikku-services.gen.js +2 -5
- package/dist/.pikku/pikku-types.gen.d.ts +1 -1
- package/dist/.pikku/pikku-types.gen.js +1 -1
- package/dist/.pikku/pikku-websocket.gen.d.ts +1 -1
- package/dist/.pikku/pikku-websocket.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-types.gen.d.ts +2 -2
- package/dist/.pikku/queue/pikku-queue-types.gen.js +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.js +3 -7
- package/dist/.pikku/queue/pikku-queue-workers-wirings-meta.gen.json +1 -0
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/queue/pikku-queue-workers-wirings.gen.js +1 -1
- package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.d.ts +6 -9
- package/dist/.pikku/rpc/pikku-remote-rpc-workers.gen.js +2 -2
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.d.ts +2 -2
- package/dist/.pikku/scheduler/pikku-scheduler-types.gen.js +1 -1
- package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.js +3 -2
- package/dist/.pikku/scheduler/pikku-schedulers-wirings-meta.gen.json +1 -0
- package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.d.ts +1 -1
- package/dist/.pikku/scheduler/pikku-schedulers-wirings.gen.js +1 -1
- package/dist/.pikku/schemas/register.gen.js +15 -15
- package/dist/.pikku/schemas/schemas/PikkuCLIConfig.schema.json +1 -1
- package/dist/.pikku/workflow/pikku-workflow-types.gen.d.ts +29 -25
- package/dist/.pikku/workflow/pikku-workflow-types.gen.js +22 -8
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.js +3 -2
- package/dist/.pikku/workflow/pikku-workflow-wirings-meta.gen.json +1 -0
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.d.ts +6 -2
- package/dist/.pikku/workflow/pikku-workflow-wirings.gen.js +6 -3
- package/dist/bin/pikku.js +5 -26
- package/dist/src/cli.wiring.js +4 -4
- package/dist/src/functions/commands/all.js +82 -42
- package/dist/src/functions/commands/bootstrap.js +22 -10
- package/dist/src/functions/commands/watch.js +6 -3
- package/dist/src/functions/runtimes/nextjs/pikku-command-nextjs.js +12 -7
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.d.ts +1 -1
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.js +42 -4
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.d.ts +1 -1
- package/dist/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.js +40 -2
- package/dist/src/functions/wirings/channels/pikku-channels.js +9 -2
- package/dist/src/functions/wirings/channels/serialize-channel-types.js +10 -11
- package/dist/src/functions/wirings/cli/pikku-command-cli-entry.js +4 -4
- package/dist/src/functions/wirings/cli/pikku-command-cli-types.js +1 -1
- package/dist/src/functions/wirings/cli/pikku-command-cli.js +9 -3
- package/dist/src/functions/wirings/cli/serialize-channel-cli.js +1 -1
- package/dist/src/functions/wirings/cli/serialize-cli-types.js +2 -2
- package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.d.ts +1 -1
- package/dist/src/functions/wirings/cli/serialize-local-cli-bootstrap.js +4 -4
- package/dist/src/functions/wirings/functions/pikku-command-function-types-split.js +4 -4
- package/dist/src/functions/wirings/functions/pikku-command-functions.js +15 -5
- package/dist/src/functions/wirings/functions/pikku-command-services.d.ts +1 -1
- package/dist/src/functions/wirings/functions/pikku-command-services.js +23 -23
- package/dist/src/functions/wirings/functions/schemas.js +1 -1
- package/dist/src/functions/wirings/functions/serialize-function-types.d.ts +1 -1
- package/dist/src/functions/wirings/functions/serialize-function-types.js +50 -64
- package/dist/src/functions/wirings/http/openapi-spec-generator.js +4 -4
- package/dist/src/functions/wirings/http/pikku-http-routes.js +9 -2
- package/dist/src/functions/wirings/http/serialize-http-types.js +1 -1
- package/dist/src/functions/wirings/mcp/pikku-command-mcp.js +18 -4
- package/dist/src/functions/wirings/mcp/serialize-mcp-types.js +12 -12
- package/dist/src/functions/wirings/middleware/pikku-command-middleware.js +26 -2
- package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.d.ts +5 -2
- package/dist/src/functions/wirings/middleware/serialize-middleware-groups-meta.js +5 -13
- package/dist/src/functions/wirings/queue/pikku-command-queue.js +9 -3
- package/dist/src/functions/wirings/queue/pikku-queue.js +9 -3
- package/dist/src/functions/wirings/queue/serialize-queue-meta.d.ts +2 -1
- package/dist/src/functions/wirings/queue/serialize-queue-meta.js +10 -1
- package/dist/src/functions/wirings/queue/serialize-queue-types.js +1 -1
- package/dist/src/functions/wirings/rpc/pikku-command-rpc.js +9 -2
- package/dist/src/functions/wirings/rpc/serialize-public-rpc.js +11 -4
- package/dist/src/functions/wirings/rpc/serialize-remote-rpc.js +1 -1
- package/dist/src/functions/wirings/rpc/serialize-rpc-wrapper.js +3 -3
- package/dist/src/functions/wirings/scheduler/pikku-command-scheduler.js +6 -3
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.d.ts +2 -1
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-meta.js +11 -1
- package/dist/src/functions/wirings/scheduler/serialize-scheduler-types.js +1 -1
- package/dist/src/functions/wirings/services/pikku-command-service-metadata.d.ts +1 -0
- package/dist/src/functions/wirings/services/pikku-command-service-metadata.js +22 -0
- package/dist/src/functions/wirings/workflow/pikku-command-workflow-types.js +3 -1
- package/dist/src/functions/wirings/workflow/pikku-command-workflow.js +12 -8
- package/dist/src/functions/wirings/workflow/serialize-workflow-meta.d.ts +2 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-meta.js +11 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-types.d.ts +1 -1
- package/dist/src/functions/wirings/workflow/serialize-workflow-types.js +36 -31
- package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.d.ts +8 -0
- package/dist/src/functions/wirings/workflow/serialize-workflow-wirings.js +30 -0
- package/dist/src/functions/wirings/workflow/serialize-workflow-workers.js +2 -2
- package/dist/src/middleware/log-command-info-and-time.d.ts +2 -2
- package/dist/src/middleware/log-command-info-and-time.js +1 -4
- package/dist/src/services/cli-logger-forwarder.service.js +1 -1
- package/dist/src/services.d.ts +2 -7
- package/dist/src/services.js +14 -12
- package/dist/src/utils/check-required-types.d.ts +2 -2
- package/dist/src/utils/check-required-types.js +2 -3
- package/dist/src/utils/pikku-cli-config.js +35 -2
- package/dist/src/utils/pikku-files-and-methods.d.ts +2 -2
- package/dist/src/utils/pikku-files-and-methods.js +4 -4
- package/dist/src/utils/schema-generator.d.ts +1 -1
- package/dist/src/utils/schema-generator.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -8
- package/src/cli.wiring.ts +4 -4
- package/src/functions/commands/all.ts +94 -45
- package/src/functions/commands/bootstrap.ts +25 -10
- package/src/functions/commands/watch.ts +6 -3
- package/src/functions/runtimes/nextjs/pikku-command-nextjs.ts +26 -5
- package/src/functions/runtimes/nextjs/serialize-nextjs-backend-wrapper.ts +43 -4
- package/src/functions/runtimes/nextjs/serialize-nextjs-http-wrapper.ts +40 -1
- package/src/functions/wirings/channels/pikku-channels.ts +27 -3
- package/src/functions/wirings/channels/serialize-channel-types.ts +10 -11
- package/src/functions/wirings/cli/pikku-command-cli-entry.ts +4 -4
- package/src/functions/wirings/cli/pikku-command-cli-types.ts +1 -1
- package/src/functions/wirings/cli/pikku-command-cli.ts +26 -3
- package/src/functions/wirings/cli/serialize-channel-cli.ts +1 -1
- package/src/functions/wirings/cli/serialize-cli-types.ts +2 -2
- package/src/functions/wirings/cli/serialize-local-cli-bootstrap.ts +5 -5
- package/src/functions/wirings/functions/pikku-command-function-types-split.ts +6 -6
- package/src/functions/wirings/functions/pikku-command-functions.ts +39 -4
- package/src/functions/wirings/functions/pikku-command-services.ts +25 -25
- package/src/functions/wirings/functions/schemas.ts +2 -2
- package/src/functions/wirings/functions/serialize-function-types.ts +51 -65
- package/src/functions/wirings/http/openapi-spec-generator.ts +14 -5
- package/src/functions/wirings/http/pikku-http-routes.ts +28 -2
- package/src/functions/wirings/http/serialize-http-types.ts +1 -1
- package/src/functions/wirings/mcp/pikku-command-mcp.ts +30 -4
- package/src/functions/wirings/mcp/serialize-mcp-types.ts +12 -12
- package/src/functions/wirings/middleware/pikku-command-middleware.ts +35 -2
- package/src/functions/wirings/middleware/serialize-middleware-groups-meta.ts +4 -19
- package/src/functions/wirings/permissions/pikku-command-permissions.ts +2 -2
- package/src/functions/wirings/queue/pikku-command-queue.ts +27 -2
- package/src/functions/wirings/queue/pikku-queue.ts +27 -2
- package/src/functions/wirings/queue/serialize-queue-meta.ts +15 -1
- package/src/functions/wirings/queue/serialize-queue-types.ts +1 -1
- package/src/functions/wirings/rpc/pikku-command-rpc.ts +25 -2
- package/src/functions/wirings/rpc/serialize-public-rpc.ts +11 -4
- package/src/functions/wirings/rpc/serialize-remote-rpc.ts +1 -1
- package/src/functions/wirings/rpc/serialize-rpc-wrapper.ts +3 -3
- package/src/functions/wirings/scheduler/pikku-command-scheduler.ts +30 -4
- package/src/functions/wirings/scheduler/serialize-scheduler-meta.ts +20 -1
- package/src/functions/wirings/scheduler/serialize-scheduler-types.ts +1 -1
- package/src/functions/wirings/services/pikku-command-service-metadata.ts +25 -0
- package/src/functions/wirings/workflow/pikku-command-workflow-types.ts +8 -1
- package/src/functions/wirings/workflow/pikku-command-workflow.ts +36 -8
- package/src/functions/wirings/workflow/serialize-workflow-meta.ts +18 -1
- package/src/functions/wirings/workflow/serialize-workflow-types.ts +39 -31
- package/src/functions/wirings/workflow/serialize-workflow-wirings.ts +47 -0
- package/src/functions/wirings/workflow/serialize-workflow-workers.ts +2 -2
- package/src/middleware/log-command-info-and-time.ts +3 -6
- package/src/services/cli-logger-forwarder.service.ts +1 -1
- package/src/services.ts +15 -15
- package/src/utils/check-required-types.ts +4 -7
- package/src/utils/pikku-cli-config.ts +69 -2
- package/src/utils/pikku-files-and-methods.ts +10 -13
- package/src/utils/schema-generator.ts +2 -2
- package/types/application-types.d.ts +1 -1
- package/types/config.d.ts +12 -1
- package/.pikku/function/pikku-functions.gen.ts +0 -84
- package/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.ts +0 -47
- package/dist/.pikku/function/pikku-functions.gen.d.ts +0 -1
- package/dist/.pikku/function/pikku-functions.gen.js +0 -83
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.d.ts +0 -1
- package/dist/.pikku/rpc/pikku-rpc-wirings-meta.internal.gen.js +0 -47
- package/dist/.pikku/schemas/schemas/PikkuRemoteInternalRPCInput.schema.json +0 -1
|
@@ -50,7 +50,7 @@ import { pikkuMiddleware } from '${functionTypesPath}'
|
|
|
50
50
|
${imports}
|
|
51
51
|
|
|
52
52
|
// Middleware to close the channel after CLI command completes
|
|
53
|
-
const cliCloseOnComplete = pikkuMiddleware(async (
|
|
53
|
+
const cliCloseOnComplete = pikkuMiddleware(async (_services, { channel }, next) => {
|
|
54
54
|
const closeChannel = () => {
|
|
55
55
|
setTimeout(async () => {
|
|
56
56
|
try {
|
|
@@ -50,7 +50,7 @@ export const pikkuCLIRender = <Data, RequiredServices extends SingletonServices
|
|
|
50
50
|
* CLI command configuration with project-specific types.
|
|
51
51
|
* Uses CoreCLICommandConfig from @pikku/core with local middleware and render types.
|
|
52
52
|
*/
|
|
53
|
-
type CLICommandConfig<Func extends PikkuFunctionConfig<In, Out>, In = any, Out = any, Params extends string = string> = CoreCLICommandConfig<Func, PikkuMiddleware, PikkuCLIRender<any>, Params>
|
|
53
|
+
type CLICommandConfig<Func extends PikkuFunctionConfig<In, Out, 'cli' | 'rpc' | 'session'>, In = any, Out = any, Params extends string = string> = CoreCLICommandConfig<Func, PikkuMiddleware, PikkuCLIRender<any>, Params>
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Type definition for CLI applications with commands and global options.
|
|
@@ -84,7 +84,7 @@ export const wireCLI = <Commands extends Record<string, CoreCLICommandConfig<any
|
|
|
84
84
|
* @returns CLI command configuration with inferred types
|
|
85
85
|
*/
|
|
86
86
|
export const pikkuCLICommand = <
|
|
87
|
-
FuncConfig extends PikkuFunctionConfig<any, any>,
|
|
87
|
+
FuncConfig extends PikkuFunctionConfig<any, any, 'cli' | 'rpc' | 'session'>,
|
|
88
88
|
Params extends string
|
|
89
89
|
>(
|
|
90
90
|
config: CLICommandConfig<FuncConfig, any, any, Params>
|
|
@@ -8,7 +8,7 @@ export declare function serializeLocalCLIBootstrap(programName: string, _program
|
|
|
8
8
|
}, singletonServicesFactory: {
|
|
9
9
|
file: string;
|
|
10
10
|
variable: string;
|
|
11
|
-
},
|
|
11
|
+
}, wireServicesFactory: {
|
|
12
12
|
file: string;
|
|
13
13
|
variable: string;
|
|
14
14
|
}): string;
|
|
@@ -2,18 +2,18 @@ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Serializes the local (in-program) CLI bootstrap code
|
|
4
4
|
*/
|
|
5
|
-
export function serializeLocalCLIBootstrap(programName, _programMeta, bootstrapFile, config, pikkuConfigFactory, singletonServicesFactory,
|
|
5
|
+
export function serializeLocalCLIBootstrap(programName, _programMeta, bootstrapFile, config, pikkuConfigFactory, singletonServicesFactory, wireServicesFactory) {
|
|
6
6
|
const capitalizedName = programName.charAt(0).toUpperCase() + programName.slice(1).replace(/-/g, '');
|
|
7
7
|
// Get relative import paths
|
|
8
8
|
const pikkuConfigPath = getFileImportRelativePath(bootstrapFile, pikkuConfigFactory.file, config.packageMappings);
|
|
9
9
|
const singletonServicesPath = getFileImportRelativePath(bootstrapFile, singletonServicesFactory.file, config.packageMappings);
|
|
10
|
-
const
|
|
10
|
+
const wireServicesPath = getFileImportRelativePath(bootstrapFile, wireServicesFactory.file, config.packageMappings);
|
|
11
11
|
const cliBootstrapPath = getFileImportRelativePath(bootstrapFile, config.bootstrapFile, config.packageMappings);
|
|
12
12
|
return `
|
|
13
13
|
import { executeCLI, CLIError } from '@pikku/core/cli'
|
|
14
14
|
import { ${pikkuConfigFactory.variable} as createConfig } from '${pikkuConfigPath}'
|
|
15
15
|
import { ${singletonServicesFactory.variable} as createSingletonServices } from '${singletonServicesPath}'
|
|
16
|
-
import { ${
|
|
16
|
+
import { ${wireServicesFactory.variable} as createWireServices } from '${wireServicesPath}'
|
|
17
17
|
import '${cliBootstrapPath}'
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -27,7 +27,7 @@ export async function ${capitalizedName}CLI(args: string[]): Promise<void> {
|
|
|
27
27
|
args: args || process.argv.slice(2),
|
|
28
28
|
createConfig,
|
|
29
29
|
createSingletonServices,
|
|
30
|
-
|
|
30
|
+
createWireServices,
|
|
31
31
|
})
|
|
32
32
|
} catch (error) {
|
|
33
33
|
if (error instanceof CLIError) {
|
|
@@ -11,17 +11,17 @@ export const pikkuFunctionTypesSplit = pikkuSessionlessFunc({
|
|
|
11
11
|
// Check for required types
|
|
12
12
|
checkRequiredTypes(visitState.filesAndMethodsErrors, {
|
|
13
13
|
userSessionType: true,
|
|
14
|
-
|
|
14
|
+
wireServiceType: true,
|
|
15
15
|
singletonServicesType: true,
|
|
16
16
|
});
|
|
17
|
-
const { userSessionType,
|
|
18
|
-
if (!userSessionType || !
|
|
17
|
+
const { userSessionType, wireServicesType, singletonServicesType, pikkuConfigType, } = visitState.filesAndMethods;
|
|
18
|
+
if (!userSessionType || !wireServicesType || !singletonServicesType) {
|
|
19
19
|
throw new Error('Required types not found');
|
|
20
20
|
}
|
|
21
21
|
const configTypeImport = pikkuConfigType
|
|
22
22
|
? `import type { ${pikkuConfigType.type} } from '${getFileImportRelativePath(functionTypesFile, pikkuConfigType.typePath, packageMappings)}'`
|
|
23
23
|
: '// Config type not found, will use fallback';
|
|
24
|
-
const content = serializeFunctionTypes(`import type { ${userSessionType.type} } from '${getFileImportRelativePath(functionTypesFile, userSessionType.typePath, packageMappings)}'`, userSessionType.type, `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, singletonServicesType.typePath, packageMappings)}'`, singletonServicesType.type, `import type { ${
|
|
24
|
+
const content = serializeFunctionTypes(`import type { ${userSessionType.type} } from '${getFileImportRelativePath(functionTypesFile, userSessionType.typePath, packageMappings)}'`, userSessionType.type, `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, singletonServicesType.typePath, packageMappings)}'`, singletonServicesType.type, `import type { ${wireServicesType.type} } from '${getFileImportRelativePath(functionTypesFile, wireServicesType.typePath, packageMappings)}'`, wireServicesType.type, `import type { TypedPikkuRPC } from '${getFileImportRelativePath(functionTypesFile, rpcInternalMapDeclarationFile, packageMappings)}'`, `import type { RequiredSingletonServices, RequiredWireServices } from '${getFileImportRelativePath(functionTypesFile, servicesFile, packageMappings)}'`, configTypeImport);
|
|
25
25
|
await writeFileInDir(logger, functionTypesFile, content);
|
|
26
26
|
},
|
|
27
27
|
middleware: [
|
|
@@ -2,15 +2,25 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
|
|
|
2
2
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
3
3
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
4
4
|
import { generateRuntimeMeta, serializeFunctionImports, } from './serialize-function-imports.js';
|
|
5
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
5
6
|
export const pikkuFunctions = pikkuSessionlessFunc({
|
|
6
7
|
func: async ({ logger, config, getInspectorState }) => {
|
|
7
8
|
const { functions, rpc } = await getInspectorState();
|
|
8
|
-
const { functionsMetaFile, functionsMetaMinFile, functionsFile, packageMappings, } = config;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
const { functionsMetaFile, functionsMetaJsonFile, functionsMetaMinFile, functionsMetaMinJsonFile, functionsFile, packageMappings, schema, } = config;
|
|
10
|
+
await writeFileInDir(logger, functionsMetaJsonFile, JSON.stringify(functions.meta, null, 2));
|
|
11
|
+
const fullJsonImportPath = getFileImportRelativePath(functionsMetaFile, functionsMetaJsonFile, packageMappings);
|
|
12
|
+
const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
|
|
13
|
+
const fullImportStatement = supportsImportAttributes
|
|
14
|
+
? `import metaData from '${fullJsonImportPath}' with { type: 'json' }`
|
|
15
|
+
: `import metaData from '${fullJsonImportPath}'`;
|
|
16
|
+
await writeFileInDir(logger, functionsMetaFile, `import { pikkuState, FunctionsMeta } from '@pikku/core'\n${fullImportStatement}\npikkuState('function', 'meta', metaData as FunctionsMeta)`);
|
|
12
17
|
const runtimeMeta = generateRuntimeMeta(functions.meta);
|
|
13
|
-
await writeFileInDir(logger,
|
|
18
|
+
await writeFileInDir(logger, functionsMetaMinJsonFile, JSON.stringify(runtimeMeta, null, 2));
|
|
19
|
+
const minJsonImportPath = getFileImportRelativePath(functionsMetaMinFile, functionsMetaMinJsonFile, packageMappings);
|
|
20
|
+
const minImportStatement = supportsImportAttributes
|
|
21
|
+
? `import metaData from '${minJsonImportPath}' with { type: 'json' }`
|
|
22
|
+
: `import metaData from '${minJsonImportPath}'`;
|
|
23
|
+
await writeFileInDir(logger, functionsMetaMinFile, `import { pikkuState, FunctionsRuntimeMeta } from '@pikku/core'\n${minImportStatement}\npikkuState('function', 'meta', metaData as FunctionsRuntimeMeta)`);
|
|
14
24
|
const hasRPCs = rpc.exposedFiles.size > 0 || rpc.internalFiles.size > 0;
|
|
15
25
|
if (hasRPCs) {
|
|
16
26
|
await writeFileInDir(logger, functionsFile, serializeFunctionImports(functionsFile, rpc.internalFiles, functions.meta, packageMappings));
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const serializeServicesMap: (allSingletonServices: string[],
|
|
1
|
+
export declare const serializeServicesMap: (allSingletonServices: string[], allWireServices: string[], requiredServices: Set<string>, forceRequiredServices: string[] | undefined, servicesImport: string, wireServicesImport: string) => string;
|
|
2
2
|
export declare const pikkuServices: any;
|
|
@@ -3,7 +3,7 @@ import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
|
3
3
|
import { checkRequiredTypes } from '../../../utils/check-required-types.js';
|
|
4
4
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
5
5
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
6
|
-
export const serializeServicesMap = (allSingletonServices,
|
|
6
|
+
export const serializeServicesMap = (allSingletonServices, allWireServices, requiredServices, forceRequiredServices = [], servicesImport, wireServicesImport) => {
|
|
7
7
|
// Use pre-aggregated services from inspector state
|
|
8
8
|
// This includes services from:
|
|
9
9
|
// - Wired functions (HTTP, channels, queues, schedulers, MCP, CLI, RPC)
|
|
@@ -11,7 +11,7 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
|
|
|
11
11
|
// - Permissions used by wired functions
|
|
12
12
|
// - Session factories
|
|
13
13
|
const usedServices = new Set(requiredServices);
|
|
14
|
-
// Internal services that are created internally by the framework (
|
|
14
|
+
// Internal services that are created internally by the framework (PikkuWire)
|
|
15
15
|
// These should not appear in the services maps
|
|
16
16
|
const internalServices = new Set([
|
|
17
17
|
'rpc',
|
|
@@ -37,24 +37,24 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
|
|
|
37
37
|
allSingletonServices.forEach((service) => {
|
|
38
38
|
singletonServicesMap[service] = usedServices.has(service);
|
|
39
39
|
});
|
|
40
|
-
// Create
|
|
41
|
-
// Exclude internal framework services (
|
|
42
|
-
const
|
|
43
|
-
|
|
40
|
+
// Create wire services map: all wire services with true/false based on usage
|
|
41
|
+
// Exclude internal framework services (PikkuWire)
|
|
42
|
+
const wireServicesMap = {};
|
|
43
|
+
allWireServices.forEach((service) => {
|
|
44
44
|
if (!internalServices.has(service)) {
|
|
45
|
-
|
|
45
|
+
wireServicesMap[service] = usedServices.has(service);
|
|
46
46
|
}
|
|
47
47
|
});
|
|
48
48
|
// Get all required service names (those marked as true)
|
|
49
49
|
const requiredSingletonServiceNames = Object.keys(singletonServicesMap)
|
|
50
50
|
.filter((key) => singletonServicesMap[key])
|
|
51
51
|
.sort();
|
|
52
|
-
const
|
|
53
|
-
.filter((key) =>
|
|
52
|
+
const requiredWireServiceNames = Object.keys(wireServicesMap)
|
|
53
|
+
.filter((key) => wireServicesMap[key])
|
|
54
54
|
.sort();
|
|
55
55
|
const code = [
|
|
56
56
|
servicesImport,
|
|
57
|
-
|
|
57
|
+
wireServicesImport,
|
|
58
58
|
'',
|
|
59
59
|
'// Singleton services map: true if required, false if available but unused',
|
|
60
60
|
'export const requiredSingletonServices = {',
|
|
@@ -63,11 +63,11 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
|
|
|
63
63
|
.map((service) => ` '${service}': ${singletonServicesMap[service]},`),
|
|
64
64
|
'} as const',
|
|
65
65
|
'',
|
|
66
|
-
'//
|
|
67
|
-
'export const
|
|
68
|
-
...Object.keys(
|
|
66
|
+
'// Wire services map: true if required, false if available but unused',
|
|
67
|
+
'export const requiredWireServices = {',
|
|
68
|
+
...Object.keys(wireServicesMap)
|
|
69
69
|
.sort()
|
|
70
|
-
.map((service) => ` '${service}': ${
|
|
70
|
+
.map((service) => ` '${service}': ${wireServicesMap[service]},`),
|
|
71
71
|
'} as const',
|
|
72
72
|
'',
|
|
73
73
|
'// Type exports',
|
|
@@ -75,9 +75,9 @@ export const serializeServicesMap = (allSingletonServices, allSessionServices, r
|
|
|
75
75
|
? `export type RequiredSingletonServices = Pick<SingletonServices, ${requiredSingletonServiceNames.map((key) => `'${key}'`).join(' | ')}> & Partial<Omit<SingletonServices, ${requiredSingletonServiceNames.map((key) => `'${key}'`).join(' | ')}>>`
|
|
76
76
|
: 'export type RequiredSingletonServices = Partial<SingletonServices>',
|
|
77
77
|
'',
|
|
78
|
-
|
|
79
|
-
? `export type
|
|
80
|
-
: 'export type
|
|
78
|
+
requiredWireServiceNames.length > 0
|
|
79
|
+
? `export type RequiredWireServices = Pick<Services, ${requiredWireServiceNames.map((key) => `'${key}'`).join(' | ')}> & Partial<Omit<Services, ${requiredWireServiceNames.map((key) => `'${key}'`).join(' | ')}>>`
|
|
80
|
+
: 'export type RequiredWireServices = Partial<Services>',
|
|
81
81
|
'',
|
|
82
82
|
].join('\n');
|
|
83
83
|
return code;
|
|
@@ -87,16 +87,16 @@ export const pikkuServices = pikkuSessionlessFunc({
|
|
|
87
87
|
const visitState = await getInspectorState();
|
|
88
88
|
// Check for required types
|
|
89
89
|
checkRequiredTypes(visitState.filesAndMethodsErrors, {
|
|
90
|
-
|
|
90
|
+
wireServiceType: true,
|
|
91
91
|
singletonServicesType: true,
|
|
92
92
|
});
|
|
93
|
-
const {
|
|
94
|
-
if (!
|
|
95
|
-
throw new Error('Required types not found:
|
|
93
|
+
const { wireServicesType, singletonServicesType } = visitState.filesAndMethods;
|
|
94
|
+
if (!wireServicesType || !singletonServicesType) {
|
|
95
|
+
throw new Error('Required types not found: wireServicesType or singletonServicesType');
|
|
96
96
|
}
|
|
97
97
|
const servicesImport = `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(config.typesDeclarationFile, singletonServicesType.typePath, config.packageMappings)}'`;
|
|
98
|
-
const
|
|
99
|
-
const servicesCode = serializeServicesMap(visitState.serviceAggregation.allSingletonServices, visitState.serviceAggregation.
|
|
98
|
+
const wireServicesImport = `import type { ${wireServicesType.type} } from '${getFileImportRelativePath(config.typesDeclarationFile, wireServicesType.typePath, config.packageMappings)}'`;
|
|
99
|
+
const servicesCode = serializeServicesMap(visitState.serviceAggregation.allSingletonServices, visitState.serviceAggregation.allWireServices, visitState.serviceAggregation.requiredServices, config.forceRequiredServices, servicesImport, wireServicesImport);
|
|
100
100
|
await writeFileInDir(logger, config.servicesFile, servicesCode);
|
|
101
101
|
},
|
|
102
102
|
middleware: [
|
|
@@ -8,7 +8,7 @@ export const pikkuSchemas = pikkuSessionlessFunc({
|
|
|
8
8
|
func: async ({ logger, config, getInspectorState }) => {
|
|
9
9
|
const visitState = await getInspectorState();
|
|
10
10
|
const schemas = await generateSchemas(logger, config.tsconfig, visitState.functions.typesMap, visitState.functions.meta, visitState.http.meta, config.schemasFromTypes, config.schema?.additionalProperties);
|
|
11
|
-
await saveSchemas(logger, config.schemaDirectory, schemas, visitState.functions.typesMap, visitState.functions.meta, config.
|
|
11
|
+
await saveSchemas(logger, config.schemaDirectory, schemas, visitState.functions.typesMap, visitState.functions.meta, config.schema?.supportsImportAttributes || true, config.schemasFromTypes);
|
|
12
12
|
return true;
|
|
13
13
|
},
|
|
14
14
|
middleware: [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generates core function, middleware, and permission type definitions
|
|
3
3
|
*/
|
|
4
|
-
export declare const serializeFunctionTypes: (userSessionTypeImport: string, userSessionTypeName: string, singletonServicesTypeImport: string, singletonServicesTypeName: string,
|
|
4
|
+
export declare const serializeFunctionTypes: (userSessionTypeImport: string, userSessionTypeName: string, singletonServicesTypeImport: string, singletonServicesTypeName: string, wireServicesTypeImport: string, wireServicesTypeName: string, rpcMapTypeImport: string, requiredServicesTypeImport: string, configTypeImport: string) => string;
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generates core function, middleware, and permission type definitions
|
|
3
3
|
*/
|
|
4
|
-
export const serializeFunctionTypes = (userSessionTypeImport, userSessionTypeName, singletonServicesTypeImport, singletonServicesTypeName,
|
|
4
|
+
export const serializeFunctionTypes = (userSessionTypeImport, userSessionTypeName, singletonServicesTypeImport, singletonServicesTypeName, wireServicesTypeImport, wireServicesTypeName, rpcMapTypeImport, requiredServicesTypeImport, configTypeImport) => {
|
|
5
5
|
return `/**
|
|
6
6
|
* Core function, middleware, and permission types for all wirings
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore } from '@pikku/core'
|
|
9
|
+
import { CorePikkuFunctionConfig, CorePikkuPermission, CorePikkuMiddleware, CorePermissionGroup, addMiddleware as addMiddlewareCore, addPermission as addPermissionCore, PikkuWire, PickRequired } from '@pikku/core'
|
|
10
10
|
import { CorePikkuFunction, CorePikkuFunctionSessionless } from '@pikku/core/function'
|
|
11
|
-
import { PikkuChannel } from '@pikku/core/channel'
|
|
12
|
-
import { PikkuMCP } from '@pikku/core/mcp'
|
|
13
11
|
|
|
14
12
|
${userSessionTypeImport}
|
|
15
13
|
${singletonServicesTypeImport}
|
|
16
|
-
${
|
|
14
|
+
${wireServicesTypeImport}
|
|
17
15
|
${configTypeImport}
|
|
18
16
|
${rpcMapTypeImport}
|
|
19
17
|
${requiredServicesTypeImport}
|
|
20
18
|
|
|
21
19
|
${singletonServicesTypeName !== 'SingletonServices' ? `type SingletonServices = ${singletonServicesTypeName}` : ''}
|
|
22
|
-
${
|
|
20
|
+
${wireServicesTypeName !== 'Services' ? `type Services = ${wireServicesTypeName}` : ''}
|
|
23
21
|
${userSessionTypeName !== 'Session' ? `type Session = ${userSessionTypeName}` : ''}
|
|
24
22
|
${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
|
|
25
23
|
|
|
@@ -30,7 +28,7 @@ ${configTypeImport.includes('Config type not found') ? 'type Config = any' : ''}
|
|
|
30
28
|
* @template In - The input type that the permission check will receive
|
|
31
29
|
* @template RequiredServices - The services required for this permission check
|
|
32
30
|
*/
|
|
33
|
-
export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, Session
|
|
31
|
+
export type PikkuPermission<In = unknown, RequiredServices extends Services = Services> = CorePikkuPermission<In, RequiredServices, PikkuWire<In, never, false, Session>>
|
|
34
32
|
|
|
35
33
|
/**
|
|
36
34
|
* Type-safe middleware definition that can access your application's services and session.
|
|
@@ -38,7 +36,7 @@ export type PikkuPermission<In = unknown, RequiredServices extends Services = Se
|
|
|
38
36
|
*
|
|
39
37
|
* @template RequiredServices - The services required for this middleware
|
|
40
38
|
*/
|
|
41
|
-
export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices
|
|
39
|
+
export type PikkuMiddleware<RequiredServices extends SingletonServices = SingletonServices> = CorePikkuMiddleware<RequiredServices>
|
|
42
40
|
|
|
43
41
|
/**
|
|
44
42
|
* Configuration object for creating a permission with metadata
|
|
@@ -59,7 +57,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
|
|
|
59
57
|
* @example
|
|
60
58
|
* \`\`\`typescript
|
|
61
59
|
* // Direct function syntax
|
|
62
|
-
* const permission = pikkuPermission(({ logger }, data, session) => {
|
|
60
|
+
* const permission = pikkuPermission(async ({ logger }, data, { session }) => {
|
|
61
|
+
* const session = await session?.get()
|
|
63
62
|
* return session?.role === 'admin'
|
|
64
63
|
* })
|
|
65
64
|
*
|
|
@@ -67,7 +66,8 @@ export type PikkuPermissionConfig<In = unknown, RequiredServices extends Service
|
|
|
67
66
|
* const adminPermission = pikkuPermission({
|
|
68
67
|
* name: 'Admin Permission',
|
|
69
68
|
* description: 'Checks if user has admin role',
|
|
70
|
-
* func: async ({ logger }, data, session) => {
|
|
69
|
+
* func: async ({ logger }, data, { session }) => {
|
|
70
|
+
* const session = await session?.get()
|
|
71
71
|
* return session?.role === 'admin'
|
|
72
72
|
* }
|
|
73
73
|
* })
|
|
@@ -98,7 +98,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
|
|
|
98
98
|
* @example
|
|
99
99
|
* \`\`\`typescript
|
|
100
100
|
* // Direct function syntax
|
|
101
|
-
* const middleware = pikkuMiddleware(({ logger },
|
|
101
|
+
* const middleware = pikkuMiddleware(({ logger }, wires, next) => {
|
|
102
102
|
* logger.info('Middleware executed')
|
|
103
103
|
* await next()
|
|
104
104
|
* })
|
|
@@ -107,7 +107,7 @@ export type PikkuMiddlewareConfig<RequiredServices extends SingletonServices = S
|
|
|
107
107
|
* const logMiddleware = pikkuMiddleware({
|
|
108
108
|
* name: 'Request Logger',
|
|
109
109
|
* description: 'Logs all incoming requests',
|
|
110
|
-
* func: async ({ logger },
|
|
110
|
+
* func: async ({ logger }, wires, next) => {
|
|
111
111
|
* logger.info('Request started')
|
|
112
112
|
* await next()
|
|
113
113
|
* }
|
|
@@ -130,7 +130,7 @@ export const pikkuMiddleware = <RequiredServices extends SingletonServices = Sin
|
|
|
130
130
|
* message,
|
|
131
131
|
* level = 'info'
|
|
132
132
|
* }) => {
|
|
133
|
-
* return pikkuMiddleware(async ({ logger },
|
|
133
|
+
* return pikkuMiddleware(async ({ logger }, next) => {
|
|
134
134
|
* logger[level](message)
|
|
135
135
|
* await next()
|
|
136
136
|
* })
|
|
@@ -152,8 +152,8 @@ export const pikkuMiddlewareFactory = <In = any>(
|
|
|
152
152
|
* export const requireRole = pikkuPermissionFactory<{ role: string }>(({
|
|
153
153
|
* role
|
|
154
154
|
* }) => {
|
|
155
|
-
* return pikkuPermission(async ({ logger }, data,
|
|
156
|
-
* if (!
|
|
155
|
+
* return pikkuPermission(async ({ logger }, data, { initialSession }) => {
|
|
156
|
+
* if (!initialSession || initialSession.role !== role) {
|
|
157
157
|
* logger.warn(\`Permission denied: required role '\${role}'\`)
|
|
158
158
|
* return false
|
|
159
159
|
* }
|
|
@@ -174,25 +174,19 @@ export const pikkuPermissionFactory = <In = any>(
|
|
|
174
174
|
*
|
|
175
175
|
* @template In - The input type
|
|
176
176
|
* @template Out - The output type that the function returns
|
|
177
|
-
* @template ChannelData - Channel data type (null = optional channel)
|
|
178
|
-
* @template MCPData - MCP data type (null = optional MCP)
|
|
179
177
|
* @template RequiredServices - Services required by this function
|
|
180
178
|
*/
|
|
181
179
|
export type PikkuFunctionSessionless<
|
|
182
180
|
In = unknown,
|
|
183
181
|
Out = never,
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
? { mcp?: PikkuMCP } // Optional MCP
|
|
193
|
-
: { mcp: PikkuMCP } // Required MCP
|
|
194
|
-
)
|
|
195
|
-
> = CorePikkuFunctionSessionless<In, Out, ChannelData, RequiredServices, Session>
|
|
182
|
+
RequiredWires extends keyof PikkuWire = never,
|
|
183
|
+
RequiredServices extends Services = Services
|
|
184
|
+
> = CorePikkuFunctionSessionless<
|
|
185
|
+
In,
|
|
186
|
+
Out,
|
|
187
|
+
RequiredServices,
|
|
188
|
+
PickRequired<PikkuWire<In, Out, false, Session, TypedPikkuRPC, null, any>, RequiredWires>
|
|
189
|
+
>
|
|
196
190
|
|
|
197
191
|
/**
|
|
198
192
|
* A session-aware API function that requires user authentication.
|
|
@@ -200,25 +194,19 @@ export type PikkuFunctionSessionless<
|
|
|
200
194
|
*
|
|
201
195
|
* @template In - The input type
|
|
202
196
|
* @template Out - The output type that the function returns
|
|
203
|
-
* @template ChannelData - Channel data type (null = optional channel)
|
|
204
|
-
* @template MCPData - MCP data type (null = optional MCP)
|
|
205
197
|
* @template RequiredServices - Services required by this function
|
|
206
198
|
*/
|
|
207
199
|
export type PikkuFunction<
|
|
208
200
|
In = unknown,
|
|
209
201
|
Out = never,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
? { mcp?: PikkuMCP } // Optional MCP
|
|
219
|
-
: { mcp: PikkuMCP } // Required MCP
|
|
220
|
-
)
|
|
221
|
-
> = CorePikkuFunction<In, Out, ChannelData, RequiredServices, Session>
|
|
202
|
+
RequiredWires extends keyof PikkuWire = 'session',
|
|
203
|
+
RequiredServices extends Services = Services
|
|
204
|
+
> = CorePikkuFunction<
|
|
205
|
+
In,
|
|
206
|
+
Out,
|
|
207
|
+
RequiredServices,
|
|
208
|
+
PickRequired<PikkuWire<In, Out, true, Session, TypedPikkuRPC, null, any>, RequiredWires>
|
|
209
|
+
>
|
|
222
210
|
|
|
223
211
|
/**
|
|
224
212
|
* Configuration object for Pikku functions with optional middleware, permissions, tags, and documentation.
|
|
@@ -226,16 +214,13 @@ export type PikkuFunction<
|
|
|
226
214
|
*
|
|
227
215
|
* @template In - The input type
|
|
228
216
|
* @template Out - The output type
|
|
229
|
-
* @template ChannelData - Channel data type
|
|
230
|
-
* @template MCPData - MCP data type
|
|
231
217
|
* @template PikkuFunc - The function type (can be narrowed to PikkuFunction or PikkuFunctionSessionless)
|
|
232
218
|
*/
|
|
233
219
|
export type PikkuFunctionConfig<
|
|
234
220
|
In = unknown,
|
|
235
221
|
Out = unknown,
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
PikkuFunc extends PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData> = PikkuFunction<In, Out, ChannelData, MCPData> | PikkuFunctionSessionless<In, Out, ChannelData, MCPData>
|
|
222
|
+
RequiredWires extends keyof PikkuWire = never,
|
|
223
|
+
PikkuFunc extends PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires> = PikkuFunction<In, Out, RequiredWires> | PikkuFunctionSessionless<In, Out, RequiredWires>
|
|
239
224
|
> = CorePikkuFunctionConfig<PikkuFunc, PikkuPermission<In>, PikkuMiddleware>
|
|
240
225
|
|
|
241
226
|
/**
|
|
@@ -250,7 +235,8 @@ export type PikkuFunctionConfig<
|
|
|
250
235
|
* @example
|
|
251
236
|
* \\\`\\\`\\\`typescript
|
|
252
237
|
* const createUser = pikkuFunc<{name: string, email: string}, {id: number, message: string}>({
|
|
253
|
-
* func: async ({db, logger}, input) => {
|
|
238
|
+
* func: async ({db, logger}, input, wire) => {
|
|
239
|
+
* const session = await wire.session.get()
|
|
254
240
|
* logger.info('Creating user', input.name)
|
|
255
241
|
* const user = await db.users.create(input)
|
|
256
242
|
* return {id: user.id, message: \\\`User \\\${input.name} created successfully\\\`}
|
|
@@ -261,8 +247,8 @@ export type PikkuFunctionConfig<
|
|
|
261
247
|
*/
|
|
262
248
|
export const pikkuFunc = <In, Out = unknown>(
|
|
263
249
|
func:
|
|
264
|
-
| PikkuFunction<In, Out>
|
|
265
|
-
|
|
|
250
|
+
| PikkuFunction<In, Out, 'session' | 'rpc'>
|
|
251
|
+
| PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
|
|
266
252
|
) => {
|
|
267
253
|
return typeof func === 'function' ? { func } : func
|
|
268
254
|
}
|
|
@@ -279,7 +265,7 @@ export const pikkuFunc = <In, Out = unknown>(
|
|
|
279
265
|
* @example
|
|
280
266
|
* \\\`\\\`\\\`typescript
|
|
281
267
|
* const healthCheck = pikkuSessionlessFunc<void, {status: string, timestamp: string}>({
|
|
282
|
-
* func: async ({logger}) => {
|
|
268
|
+
* func: async ({logger}, input) => {
|
|
283
269
|
* logger.info('Health check requested')
|
|
284
270
|
* return {status: 'healthy', timestamp: new Date().toISOString()}
|
|
285
271
|
* },
|
|
@@ -289,8 +275,8 @@ export const pikkuFunc = <In, Out = unknown>(
|
|
|
289
275
|
*/
|
|
290
276
|
export const pikkuSessionlessFunc = <In, Out = unknown>(
|
|
291
277
|
func:
|
|
292
|
-
| PikkuFunctionSessionless<In, Out>
|
|
293
|
-
|
|
|
278
|
+
| PikkuFunctionSessionless<In, Out, 'session' | 'rpc'>
|
|
279
|
+
| PikkuFunctionConfig<In, Out, 'session' | 'rpc'>
|
|
294
280
|
) => {
|
|
295
281
|
return typeof func === 'function' ? { func } : func
|
|
296
282
|
}
|
|
@@ -313,8 +299,8 @@ export const pikkuSessionlessFunc = <In, Out = unknown>(
|
|
|
313
299
|
*/
|
|
314
300
|
export const pikkuVoidFunc = (
|
|
315
301
|
func:
|
|
316
|
-
| PikkuFunctionSessionless<void, void>
|
|
317
|
-
|
|
|
302
|
+
| PikkuFunctionSessionless<void, void, 'session' | 'rpc'>
|
|
303
|
+
| PikkuFunctionConfig<void, void, 'session' | 'rpc'>
|
|
318
304
|
) => {
|
|
319
305
|
return typeof func === 'function' ? { func } : func
|
|
320
306
|
}
|
|
@@ -363,27 +349,27 @@ export const pikkuServices = (
|
|
|
363
349
|
) => func
|
|
364
350
|
|
|
365
351
|
/**
|
|
366
|
-
* Creates a Pikku
|
|
352
|
+
* Creates a Pikku wire services factory.
|
|
367
353
|
* Use this to define services that are created per-request/session.
|
|
368
354
|
*
|
|
369
|
-
* @param func -
|
|
370
|
-
* @returns The
|
|
355
|
+
* @param func - Wire services factory function
|
|
356
|
+
* @returns The wire services factory function
|
|
371
357
|
*
|
|
372
358
|
* @example
|
|
373
359
|
* \`\`\`typescript
|
|
374
|
-
* export const
|
|
360
|
+
* export const createWireServices = pikkuWireServices(async (services, wire) => {
|
|
361
|
+
* const session = await wire.session?.get()
|
|
375
362
|
* return {
|
|
376
363
|
* userCache: new UserCache(session?.userId)
|
|
377
364
|
* }
|
|
378
365
|
* })
|
|
379
366
|
* \`\`\`
|
|
380
367
|
*/
|
|
381
|
-
export const
|
|
368
|
+
export const pikkuWireServices = (
|
|
382
369
|
func: (
|
|
383
370
|
services: SingletonServices,
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
) => Promise<RequiredSessionServices>
|
|
371
|
+
wire: any
|
|
372
|
+
) => Promise<RequiredWireServices>
|
|
387
373
|
) => func
|
|
388
374
|
|
|
389
375
|
/**
|
|
@@ -38,7 +38,7 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
38
38
|
const paths = {};
|
|
39
39
|
for (const routeMeta of Object.values(httpMeta)) {
|
|
40
40
|
for (const meta of Object.values(routeMeta)) {
|
|
41
|
-
const { route, method, inputTypes, pikkuFuncName, params, query,
|
|
41
|
+
const { route, method, inputTypes, pikkuFuncName, params, query, errors, description, tags, } = meta;
|
|
42
42
|
const functionMeta = functionsMeta[pikkuFuncName];
|
|
43
43
|
if (!functionMeta) {
|
|
44
44
|
logger.error(`• No function metadata found for '${pikkuFuncName}' in route '${route}'.`);
|
|
@@ -50,7 +50,7 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
50
50
|
paths[path] = {};
|
|
51
51
|
}
|
|
52
52
|
const responses = {};
|
|
53
|
-
|
|
53
|
+
errors?.forEach((error) => {
|
|
54
54
|
const errorResponse = getErrorResponseForConstructorName(error);
|
|
55
55
|
if (errorResponse) {
|
|
56
56
|
responses[errorResponse.status] = {
|
|
@@ -59,9 +59,9 @@ export async function generateOpenAPISpec(logger, functionsMeta, httpMeta, schem
|
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
const operation = {
|
|
62
|
-
description:
|
|
62
|
+
description: description ||
|
|
63
63
|
`This endpoint handles the ${method.toUpperCase()} request for the route ${route}.`,
|
|
64
|
-
tags:
|
|
64
|
+
tags: tags || [route.split('/')[1] || 'default'],
|
|
65
65
|
parameters: [],
|
|
66
66
|
responses: {
|
|
67
67
|
...responses,
|
|
@@ -2,13 +2,20 @@ import { pikkuSessionlessFunc } from '../../../../.pikku/pikku-types.gen.js';
|
|
|
2
2
|
import { serializeFileImports } from '../../../utils/file-imports-serializer.js';
|
|
3
3
|
import { writeFileInDir } from '../../../utils/file-writer.js';
|
|
4
4
|
import { logCommandInfoAndTime } from '../../../middleware/log-command-info-and-time.js';
|
|
5
|
+
import { getFileImportRelativePath } from '../../../utils/file-import-path.js';
|
|
5
6
|
export const pikkuHTTP = pikkuSessionlessFunc({
|
|
6
7
|
func: async ({ logger, config, getInspectorState }) => {
|
|
7
8
|
const visitState = await getInspectorState();
|
|
8
|
-
const { httpWiringsFile, httpWiringMetaFile, packageMappings } = config;
|
|
9
|
+
const { httpWiringsFile, httpWiringMetaFile, httpWiringMetaJsonFile, packageMappings, schema, } = config;
|
|
9
10
|
const { http } = visitState;
|
|
10
11
|
await writeFileInDir(logger, httpWiringsFile, serializeFileImports('wireHTTP', httpWiringsFile, http.files, packageMappings));
|
|
11
|
-
await writeFileInDir(logger,
|
|
12
|
+
await writeFileInDir(logger, httpWiringMetaJsonFile, JSON.stringify(http.meta, null, 2));
|
|
13
|
+
const jsonImportPath = getFileImportRelativePath(httpWiringMetaFile, httpWiringMetaJsonFile, packageMappings);
|
|
14
|
+
const supportsImportAttributes = schema?.supportsImportAttributes ?? false;
|
|
15
|
+
const importStatement = supportsImportAttributes
|
|
16
|
+
? `import metaData from '${jsonImportPath}' with { type: 'json' }`
|
|
17
|
+
: `import metaData from '${jsonImportPath}'`;
|
|
18
|
+
await writeFileInDir(logger, httpWiringMetaFile, `import { pikkuState, HTTPWiringsMeta } from '@pikku/core'\n${importStatement}\npikkuState('http', 'meta', metaData as HTTPWiringsMeta)`);
|
|
12
19
|
return true;
|
|
13
20
|
},
|
|
14
21
|
middleware: [
|
|
@@ -18,7 +18,7 @@ import type { CoreHTTPFunctionWiring } from '@pikku/core/http'
|
|
|
18
18
|
* @template Out - Output type for the HTTP wiring
|
|
19
19
|
* @template Route - String literal type for the HTTP path (e.g., "/users/:id")
|
|
20
20
|
*/
|
|
21
|
-
type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out>, PikkuFunctionSessionless<In, Out>, PikkuPermission<In>, PikkuMiddleware>
|
|
21
|
+
type HTTPWiring<In, Out, Route extends string> = CoreHTTPFunctionWiring<In, Out, Route, PikkuFunction<In, Out, 'rpc' | 'session'>, PikkuFunctionSessionless<In, Out, 'rpc' | 'session'>, PikkuPermission<In>, PikkuMiddleware>
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Registers an HTTP wiring with the Pikku framework.
|