@pikku/cli 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/bin/pikku-all.ts +6 -1
  3. package/dist/bin/pikku-all.js +6 -1
  4. package/dist/bin/pikku.js +0 -0
  5. package/dist/src/utils.d.ts +5 -1
  6. package/dist/src/utils.js +17 -6
  7. package/package.json +3 -3
  8. package/src/utils.ts +26 -6
  9. package/dist/src/events/channels/pikku-channels.d.ts +0 -2
  10. package/dist/src/events/channels/pikku-channels.js +0 -9
  11. package/dist/src/events/channels/pikku-command-channels-map.d.ts +0 -2
  12. package/dist/src/events/channels/pikku-command-channels-map.js +0 -8
  13. package/dist/src/events/channels/pikku-command-channels.d.ts +0 -2
  14. package/dist/src/events/channels/pikku-command-channels.js +0 -9
  15. package/dist/src/events/channels/pikku-command-websocket-typed.d.ts +0 -2
  16. package/dist/src/events/channels/pikku-command-websocket-typed.js +0 -15
  17. package/dist/src/events/channels/serialize-typed-channel-map.d.ts +0 -4
  18. package/dist/src/events/channels/serialize-typed-channel-map.js +0 -111
  19. package/dist/src/events/channels/serialize-websocket-wrapper.d.ts +0 -1
  20. package/dist/src/events/channels/serialize-websocket-wrapper.js +0 -75
  21. package/dist/src/events/fetch/index.d.ts +0 -2
  22. package/dist/src/events/fetch/index.js +0 -12
  23. package/dist/src/events/functions/pikku-command-function-types.d.ts +0 -2
  24. package/dist/src/events/functions/pikku-command-function-types.js +0 -13
  25. package/dist/src/events/functions/pikku-command-functions.d.ts +0 -6
  26. package/dist/src/events/functions/pikku-command-functions.js +0 -35
  27. package/dist/src/events/functions/pikku-command-services.d.ts +0 -3
  28. package/dist/src/events/functions/pikku-command-services.js +0 -73
  29. package/dist/src/events/functions/pikku-function-types.d.ts +0 -2
  30. package/dist/src/events/functions/pikku-function-types.js +0 -13
  31. package/dist/src/events/functions/pikku-functions.d.ts +0 -6
  32. package/dist/src/events/functions/pikku-functions.js +0 -35
  33. package/dist/src/events/http/openapi-spec-generator.d.ts +0 -79
  34. package/dist/src/events/http/openapi-spec-generator.js +0 -145
  35. package/dist/src/events/http/pikku-command-http-map.d.ts +0 -2
  36. package/dist/src/events/http/pikku-command-http-map.js +0 -8
  37. package/dist/src/events/http/pikku-command-http-routes.d.ts +0 -2
  38. package/dist/src/events/http/pikku-command-http-routes.js +0 -9
  39. package/dist/src/events/http/pikku-command-nextjs.d.ts +0 -2
  40. package/dist/src/events/http/pikku-command-nextjs.js +0 -36
  41. package/dist/src/events/http/pikku-command-openapi.d.ts +0 -2
  42. package/dist/src/events/http/pikku-command-openapi.js +0 -20
  43. package/dist/src/events/http/pikku-http-routes.d.ts +0 -2
  44. package/dist/src/events/http/pikku-http-routes.js +0 -9
  45. package/dist/src/events/http/serialize-fetch-wrapper.d.ts +0 -1
  46. package/dist/src/events/http/serialize-fetch-wrapper.js +0 -67
  47. package/dist/src/events/http/serialize-typed-http-map.d.ts +0 -4
  48. package/dist/src/events/http/serialize-typed-http-map.js +0 -100
  49. package/dist/src/events/mcp/pikku-command-mcp-json.d.ts +0 -2
  50. package/dist/src/events/mcp/pikku-command-mcp-json.js +0 -13
  51. package/dist/src/events/mcp/pikku-command-mcp.d.ts +0 -2
  52. package/dist/src/events/mcp/pikku-command-mcp.js +0 -54
  53. package/dist/src/events/mcp/serialize-mcp-json.d.ts +0 -5
  54. package/dist/src/events/mcp/serialize-mcp-json.js +0 -101
  55. package/dist/src/events/queue/pikku-command-queue-map.d.ts +0 -2
  56. package/dist/src/events/queue/pikku-command-queue-map.js +0 -8
  57. package/dist/src/events/queue/pikku-command-queue-service.d.ts +0 -2
  58. package/dist/src/events/queue/pikku-command-queue-service.js +0 -12
  59. package/dist/src/events/queue/pikku-command-queue.d.ts +0 -2
  60. package/dist/src/events/queue/pikku-command-queue.js +0 -10
  61. package/dist/src/events/queue/pikku-queue-map.d.ts +0 -2
  62. package/dist/src/events/queue/pikku-queue-map.js +0 -8
  63. package/dist/src/events/queue/pikku-queue.d.ts +0 -2
  64. package/dist/src/events/queue/pikku-queue.js +0 -10
  65. package/dist/src/events/queue/serialize-queue-map.d.ts +0 -4
  66. package/dist/src/events/queue/serialize-queue-map.js +0 -77
  67. package/dist/src/events/queue/serialize-queue-meta.d.ts +0 -2
  68. package/dist/src/events/queue/serialize-queue-meta.js +0 -6
  69. package/dist/src/events/queue/serialize-queue-wrapper.d.ts +0 -1
  70. package/dist/src/events/queue/serialize-queue-wrapper.js +0 -35
  71. package/dist/src/events/rpc/index.d.ts +0 -2
  72. package/dist/src/events/rpc/index.js +0 -12
  73. package/dist/src/events/rpc/pikku-command-rpc-client.d.ts +0 -2
  74. package/dist/src/events/rpc/pikku-command-rpc-client.js +0 -12
  75. package/dist/src/events/rpc/pikku-command-rpc-map.d.ts +0 -2
  76. package/dist/src/events/rpc/pikku-command-rpc-map.js +0 -8
  77. package/dist/src/events/rpc/pikku-command-rpc.d.ts +0 -2
  78. package/dist/src/events/rpc/pikku-command-rpc.js +0 -6
  79. package/dist/src/events/rpc/pikku-rpc.d.ts +0 -2
  80. package/dist/src/events/rpc/pikku-rpc.js +0 -6
  81. package/dist/src/events/rpc/serialize-rpc-wrapper.d.ts +0 -1
  82. package/dist/src/events/rpc/serialize-rpc-wrapper.js +0 -68
  83. package/dist/src/events/rpc/serialize-typed-rpc-map.d.ts +0 -4
  84. package/dist/src/events/rpc/serialize-typed-rpc-map.js +0 -66
  85. package/dist/src/events/scheduler/pikku-command-scheduler.d.ts +0 -2
  86. package/dist/src/events/scheduler/pikku-command-scheduler.js +0 -10
  87. package/dist/src/events/scheduler/serialize-scheduler-meta.d.ts +0 -2
  88. package/dist/src/events/scheduler/serialize-scheduler-meta.js +0 -10
  89. package/lcov.info +0 -582
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuMCPJSON: PikkuCommand;
@@ -1,13 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- import { serializeMCPJson } from './serialize-mcp-json.js';
3
- export const pikkuMCPJSON = async (logger, { mcpJsonFile, schemaDirectory }, { mcpEndpoints, functions }) => {
4
- return await logCommandInfoAndTime(logger, 'Generating MCP JSON', 'Generated MCP JSON', [mcpEndpoints.files.size === 0 || !mcpJsonFile], async () => {
5
- // Generate MCP JSON file
6
- if (mcpJsonFile) {
7
- const mcpJson = await serializeMCPJson(logger, schemaDirectory, functions.meta, functions.typesMap, mcpEndpoints.resourcesMeta, mcpEndpoints.toolsMeta, mcpEndpoints.promptsMeta);
8
- await writeFileInDir(logger, mcpJsonFile, mcpJson, {
9
- ignoreModifyComment: true,
10
- });
11
- }
12
- });
13
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuMCP: PikkuCommand;
@@ -1,54 +0,0 @@
1
- import { logCommandInfoAndTime, serializeFileImports, writeFileInDir, } from '../../utils.js';
2
- import { readFile } from 'fs/promises';
3
- import { join } from 'path';
4
- // Helper function to generate arguments from schema
5
- const generateArgumentsFromSchema = async (inputSchema, schemaDirectory, typesMap, logger) => {
6
- if (!inputSchema)
7
- return [];
8
- if (['boolean', 'string', 'number', 'null', 'undefined', 'void'].includes(inputSchema)) {
9
- return [];
10
- }
11
- const uniqueName = typesMap.getUniqueName(inputSchema);
12
- if (!uniqueName)
13
- return [];
14
- try {
15
- const schemaPath = join(schemaDirectory, 'schemas', `${uniqueName}.schema.json`);
16
- const schemaContent = await readFile(schemaPath, 'utf-8');
17
- const schema = JSON.parse(schemaContent);
18
- const argumentsArray = [];
19
- if (schema && typeof schema === 'object' && schema.properties) {
20
- const properties = schema.properties;
21
- const required = schema.required || [];
22
- for (const [propName, propSchema] of Object.entries(properties)) {
23
- argumentsArray.push({
24
- name: propName,
25
- description: propSchema.description || `${propName} parameter`,
26
- required: required.includes(propName),
27
- });
28
- }
29
- }
30
- return argumentsArray;
31
- }
32
- catch (e) {
33
- logger.warn(`Could not load schema for type: ${uniqueName}`);
34
- return [];
35
- }
36
- };
37
- export const pikkuMCP = async (logger, { mcpWiringsFile, mcpWiringsMetaFile, packageMappings, schemaDirectory }, { mcpEndpoints, functions }) => {
38
- return await logCommandInfoAndTime(logger, 'Finding MCP endpoints', 'Found MCP endpoints', [mcpEndpoints.files.size === 0], async () => {
39
- await writeFileInDir(logger, mcpWiringsFile, serializeFileImports('wireMCPResource or wireMCPTool', mcpWiringsFile, mcpEndpoints.files, packageMappings));
40
- // Populate arguments for prompts meta before serializing
41
- const promptsMetaWithArguments = { ...mcpEndpoints.promptsMeta };
42
- for (const promptMeta of Object.values(promptsMetaWithArguments)) {
43
- const functionMeta = functions.meta[promptMeta.pikkuFuncName];
44
- if (functionMeta) {
45
- const inputType = functionMeta.inputs?.[0];
46
- promptMeta.arguments = await generateArgumentsFromSchema(inputType || null, schemaDirectory || '', functions.typesMap, logger);
47
- }
48
- }
49
- await writeFileInDir(logger, mcpWiringsMetaFile, `import { pikkuState } from '@pikku/core'
50
- pikkuState('mcp', 'resourcesMeta', ${JSON.stringify(mcpEndpoints.resourcesMeta, null, 2)})
51
- pikkuState('mcp', 'toolsMeta', ${JSON.stringify(mcpEndpoints.toolsMeta, null, 2)})
52
- pikkuState('mcp', 'promptsMeta', ${JSON.stringify(promptsMetaWithArguments, null, 2)})`);
53
- });
54
- };
@@ -1,5 +0,0 @@
1
- import { MCPResourceMeta, MCPToolMeta, MCPPromptMeta } from '@pikku/core';
2
- import { FunctionsMeta } from '@pikku/core';
3
- import { TypesMap } from '@pikku/inspector';
4
- import { CLILogger } from '../../utils.js';
5
- export declare const serializeMCPJson: (logger: CLILogger, schemaDirectory: string, functionsMeta: FunctionsMeta, typesMap: TypesMap, mcpResourceMeta: MCPResourceMeta, mcpToolMeta: MCPToolMeta, mcpPromptMeta: MCPPromptMeta) => Promise<string>;
@@ -1,101 +0,0 @@
1
- import { readFile } from 'fs/promises';
2
- import { join } from 'path';
3
- export const serializeMCPJson = async (logger, schemaDirectory, functionsMeta, typesMap, mcpResourceMeta, mcpToolMeta, mcpPromptMeta) => {
4
- const tools = [];
5
- const resources = [];
6
- const prompts = [];
7
- // Helper function to load schema from file
8
- const loadSchema = async (typeName) => {
9
- if (!typeName ||
10
- ['boolean', 'string', 'number', 'null', 'undefined', 'void'].includes(typeName)) {
11
- return undefined;
12
- }
13
- const uniqueName = typesMap.getUniqueName(typeName);
14
- if (!uniqueName) {
15
- return undefined;
16
- }
17
- try {
18
- const schemaPath = join(schemaDirectory, 'schemas', `${uniqueName}.schema.json`);
19
- const schemaContent = await readFile(schemaPath, 'utf-8');
20
- return JSON.parse(schemaContent);
21
- }
22
- catch (e) {
23
- logger.warn(`Could not load schema for type: ${uniqueName}`);
24
- return undefined;
25
- }
26
- };
27
- // Process MCP resources
28
- for (const [name, endpointMeta] of Object.entries(mcpResourceMeta)) {
29
- const functionMeta = functionsMeta[endpointMeta.pikkuFuncName];
30
- if (!functionMeta) {
31
- logger.warn(`Function ${endpointMeta.pikkuFuncName} not found in functionsMeta. Skipping resource ${name}.`);
32
- continue;
33
- }
34
- const inputType = functionMeta.inputs?.[0];
35
- const outputType = functionMeta.outputs?.[0];
36
- const parameters = await loadSchema(inputType);
37
- const returns = await loadSchema(outputType);
38
- const endpoint = {
39
- uri: name,
40
- name,
41
- description: endpointMeta.description,
42
- ...(parameters && { parameters }),
43
- ...(returns && { returns }),
44
- ...(endpointMeta.streaming && { streaming: true }),
45
- };
46
- resources.push(endpoint);
47
- }
48
- // Process MCP tools
49
- for (const [name, endpointMeta] of Object.entries(mcpToolMeta)) {
50
- const functionMeta = functionsMeta[endpointMeta.pikkuFuncName];
51
- if (!functionMeta) {
52
- logger.warn(`Function ${endpointMeta.pikkuFuncName} not found in functionsMeta. Skipping tool ${name}.`);
53
- continue;
54
- }
55
- const inputType = functionMeta.inputs?.[0];
56
- const outputType = functionMeta.outputs?.[0];
57
- const parameters = await loadSchema(inputType);
58
- const returns = await loadSchema(outputType);
59
- const endpoint = {
60
- name,
61
- description: endpointMeta.description,
62
- ...(parameters && { parameters }),
63
- ...(returns && { returns }),
64
- ...(endpointMeta.streaming && { streaming: true }),
65
- };
66
- tools.push(endpoint);
67
- }
68
- // Process MCP prompts
69
- for (const [name, endpointMeta] of Object.entries(mcpPromptMeta)) {
70
- const functionMeta = functionsMeta[endpointMeta.pikkuFuncName];
71
- if (!functionMeta) {
72
- logger.warn(`Function ${endpointMeta.pikkuFuncName} not found in functionsMeta. Skipping prompt ${name}.`);
73
- continue;
74
- }
75
- const inputType = functionMeta.inputs?.[0];
76
- // TODO: this needs to be a json schema type, not any
77
- const inputSchema = await loadSchema(inputType);
78
- // Generate arguments from input schema
79
- const argumentsArray = [];
80
- if (inputSchema &&
81
- typeof inputSchema === 'object' &&
82
- inputSchema.properties) {
83
- const properties = inputSchema.properties;
84
- const required = inputSchema.required || [];
85
- for (const [propName, propSchema] of Object.entries(properties)) {
86
- argumentsArray.push({
87
- name: propName,
88
- description: propSchema.description || `${propName} parameter`,
89
- required: required.includes(propName),
90
- });
91
- }
92
- }
93
- const prompt = {
94
- name,
95
- description: endpointMeta.description,
96
- arguments: argumentsArray,
97
- };
98
- prompts.push(prompt);
99
- }
100
- return JSON.stringify({ tools, resources, prompts }, null, 2);
101
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuQueueMap: PikkuCommand;
@@ -1,8 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- import { serializeQueueMap } from './serialize-queue-map.js';
3
- export const pikkuQueueMap = async (logger, { queueMapDeclarationFile, packageMappings }, { queueWorkers, functions }) => {
4
- return await logCommandInfoAndTime(logger, 'Creating Queue map', 'Created Queue map', [queueWorkers.files.size === 0], async () => {
5
- const content = serializeQueueMap(queueMapDeclarationFile, packageMappings, functions.typesMap, functions.meta, queueWorkers.meta);
6
- await writeFileInDir(logger, queueMapDeclarationFile, content);
7
- });
8
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommandWithoutState } from '../../types.js';
2
- export declare const pikkuQueueService: PikkuCommandWithoutState;
@@ -1,12 +0,0 @@
1
- import { serializeQueueWrapper } from './serialize-queue-wrapper.js';
2
- import { getFileImportRelativePath, logCommandInfoAndTime, writeFileInDir, } from '../../utils.js';
3
- export const pikkuQueueService = async (logger, { queueWiringsFile, queueMapDeclarationFile, packageMappings }) => {
4
- return await logCommandInfoAndTime(logger, 'Generating queue service wrapper', 'Generated queue service wrapper', [queueWiringsFile === undefined, "queueWiringsFile isn't set in the pikku config"], async () => {
5
- if (!queueWiringsFile) {
6
- throw new Error("queueWiringsFile is isn't set in the pikku config");
7
- }
8
- const queueMapDeclarationPath = getFileImportRelativePath(queueWiringsFile, queueMapDeclarationFile, packageMappings);
9
- const content = [serializeQueueWrapper(queueMapDeclarationPath)];
10
- await writeFileInDir(logger, queueWiringsFile, content.join('\n'));
11
- });
12
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuQueue: PikkuCommand;
@@ -1,10 +0,0 @@
1
- import { logCommandInfoAndTime, serializeFileImports, writeFileInDir, } from '../../utils.js';
2
- import { serializeQueueMeta } from './serialize-queue-meta.js';
3
- export const pikkuQueue = async (logger, cliConfig, visitState) => {
4
- return await logCommandInfoAndTime(logger, 'Finding queues', 'Found queue', [visitState.queueWorkers.files.size === 0], async () => {
5
- const { queueWorkersWiringFile, queueWorkersWiringMetaFile, packageMappings } = cliConfig;
6
- const { queueWorkers } = visitState;
7
- await writeFileInDir(logger, queueWorkersWiringMetaFile, serializeQueueMeta(queueWorkers.meta));
8
- await writeFileInDir(logger, queueWorkersWiringFile, serializeFileImports('addQueueWorkers', queueWorkersWiringFile, queueWorkers.files, packageMappings));
9
- });
10
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuQueueMap: PikkuCommand;
@@ -1,8 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- import { serializeQueueMap } from './serialize-queue-map.js';
3
- export const pikkuQueueMap = async (logger, { queueMapDeclarationFile, packageMappings }, { queueWorkers, functions }) => {
4
- return await logCommandInfoAndTime(logger, 'Creating Queue map', 'Created Queue map', [queueWorkers.files.size === 0], async () => {
5
- const content = serializeQueueMap(queueMapDeclarationFile, packageMappings, functions.typesMap, functions.meta, queueWorkers.meta);
6
- await writeFileInDir(logger, queueMapDeclarationFile, content);
7
- });
8
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuQueue: PikkuCommand;
@@ -1,10 +0,0 @@
1
- import { logCommandInfoAndTime, serializeFileImports, writeFileInDir, } from '../../utils.js';
2
- import { serializeQueueMeta } from './serialize-queue-meta.js';
3
- export const pikkuQueue = async (logger, cliConfig, visitState) => {
4
- return await logCommandInfoAndTime(logger, 'Finding queues', 'Found queue', [visitState.queueWorkers.files.size === 0], async () => {
5
- const { queueWorkersWiringFile, queueWorkersWiringMetaFile, packageMappings } = cliConfig;
6
- const { queueWorkers } = visitState;
7
- await writeFileInDir(logger, queueWorkersWiringMetaFile, serializeQueueMeta(queueWorkers.meta));
8
- await writeFileInDir(logger, queueWorkersWiringFile, serializeFileImports('addQueueWorkers', queueWorkersWiringFile, queueWorkers.files, packageMappings));
9
- });
10
- };
@@ -1,4 +0,0 @@
1
- import type { queueWorkersMeta } from '@pikku/core/queue';
2
- import { TypesMap } from '@pikku/inspector';
3
- import { FunctionsMeta } from '@pikku/core';
4
- export declare const serializeQueueMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, functionsMeta: FunctionsMeta, queueWorkersMeta: queueWorkersMeta) => string;
@@ -1,77 +0,0 @@
1
- import { serializeImportMap } from '../../serialize-import-map.js';
2
- import { generateCustomTypes } from '../../utils.js';
3
- export const serializeQueueMap = (relativeToPath, packageMappings, typesMap, functionsMeta, queueWorkersMeta) => {
4
- const requiredTypes = new Set();
5
- const serializedCustomTypes = generateCustomTypes(typesMap, requiredTypes);
6
- const serializedQueues = generateQueues(queueWorkersMeta, functionsMeta, typesMap, requiredTypes);
7
- const serializedImportMap = serializeImportMap(relativeToPath, packageMappings, typesMap, requiredTypes);
8
- return `/**
9
- * This provides the structure needed for typescript to be aware of Queue workers and their input/output types
10
- */
11
-
12
- ${serializedImportMap}
13
- ${serializedCustomTypes}
14
-
15
- import type { QueueJob } from '@pikku/core/queue'
16
-
17
- interface QueueHandler<I, O> {
18
- input: I;
19
- output: O;
20
- }
21
-
22
- ${serializedQueues}
23
-
24
- type QueueAdd = <Name extends keyof QueueMap>(
25
- name: Name,
26
- data: QueueMap[Name]['input'],
27
- options?: {
28
- priority?: number
29
- delay?: number
30
- attempts?: number
31
- removeOnComplete?: number
32
- removeOnFail?: number
33
- jobId?: string
34
- }
35
- ) => Promise<string>
36
-
37
- type QueueGetJob = <Name extends keyof QueueMap>(
38
- name: Name,
39
- jobId: string
40
- ) => Promise<QueueJob<QueueMap[Name]['input'], QueueMap[Name]['output']> | null>
41
-
42
- export type TypedPikkuQueue = {
43
- add: QueueAdd;
44
- getJob: QueueGetJob;
45
- }
46
- `;
47
- };
48
- function generateQueues(queueWorkersMeta, functionsMeta, typesMap, requiredTypes) {
49
- // Initialize an object to collect queues
50
- const queuesObj = {};
51
- // Iterate through Queue metadata
52
- for (const [queueName, { pikkuFuncName }] of Object.entries(queueWorkersMeta)) {
53
- const functionMeta = functionsMeta[pikkuFuncName];
54
- if (!functionMeta) {
55
- throw new Error(`Function ${queueName} not found in functionsMeta. Please check your configuration.`);
56
- }
57
- const input = functionMeta.inputs ? functionMeta.inputs[0] : undefined;
58
- const output = functionMeta.outputs ? functionMeta.outputs[0] : undefined;
59
- // Store the input and output types for QueueHandler
60
- const inputType = input ? typesMap.getTypeMeta(input).uniqueName : 'null';
61
- const outputType = output ? typesMap.getTypeMeta(output).uniqueName : 'null';
62
- requiredTypes.add(inputType);
63
- requiredTypes.add(outputType);
64
- // Add Queue entry
65
- queuesObj[queueName] = {
66
- inputType,
67
- outputType,
68
- };
69
- }
70
- // Build the Queues object as a string
71
- let queuesStr = 'export type QueueMap = {\n';
72
- for (const [queueName, handler] of Object.entries(queuesObj)) {
73
- queuesStr += ` readonly '${queueName}': QueueHandler<${handler.inputType}, ${handler.outputType}>,\n`;
74
- }
75
- queuesStr += '};\n';
76
- return queuesStr;
77
- }
@@ -1,2 +0,0 @@
1
- import { queueWorkersMeta } from '@pikku/core';
2
- export declare const serializeQueueMeta: (queueWorkersMeta: queueWorkersMeta) => string;
@@ -1,6 +0,0 @@
1
- export const serializeQueueMeta = (queueWorkersMeta) => {
2
- const serializedOutput = [];
3
- serializedOutput.push("import { pikkuState } from '@pikku/core'");
4
- serializedOutput.push(`pikkuState('queue', 'meta', ${JSON.stringify(queueWorkersMeta, null, 2)})`);
5
- return serializedOutput.join('\n');
6
- };
@@ -1 +0,0 @@
1
- export declare const serializeQueueWrapper: (queueMapPath: string) => string;
@@ -1,35 +0,0 @@
1
- export const serializeQueueWrapper = (queueMapPath) => {
2
- return `
3
- import type { QueueService, QueueJob } from '@pikku/core/queue'
4
- import type { QueueMap, TypedPikkuQueue } from '${queueMapPath}'
5
-
6
- export class PikkuQueue implements TypedPikkuQueue {
7
- constructor(private queueService: QueueService) {}
8
-
9
- public async add<Name extends keyof QueueMap>(
10
- queueName: Name,
11
- data: QueueMap[Name]['input'],
12
- options?: {
13
- priority?: number
14
- delay?: number
15
- attempts?: number
16
- removeOnComplete?: number
17
- removeOnFail?: number
18
- jobId?: string
19
- }
20
- ): Promise<string> {
21
- return this.queueService.add(queueName as string, data, options);
22
- }
23
-
24
- public async getJob<Name extends keyof QueueMap>(
25
- queueName: Name,
26
- jobId: string
27
- ): Promise<QueueJob<QueueMap[Name]['input'], QueueMap[Name]['output']> | null> {
28
- return this.queueService.getJob<QueueMap[Name]['input'], QueueMap[Name]['output']>(
29
- queueName as string,
30
- jobId
31
- );
32
- }
33
- }
34
- `;
35
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommandWithoutState } from '../../types.js';
2
- export declare const pikkuRPCClient: PikkuCommandWithoutState;
@@ -1,12 +0,0 @@
1
- import { serializeRPCWrapper } from './serialize-rpc-wrapper.js';
2
- import { getFileImportRelativePath, logCommandInfoAndTime, writeFileInDir, } from '../../utils.js';
3
- export const pikkuRPCClient = async (logger, { rpcFile, rpcMapDeclarationFile, packageMappings }) => {
4
- return await logCommandInfoAndTime(logger, 'Generating RPC wrapper', 'Generated RPC wrapper', [rpcFile === undefined, "rpcFile isn't set in the pikku config"], async () => {
5
- if (!rpcFile) {
6
- throw new Error("rpcFile isn't set in the pikku config");
7
- }
8
- const rpcMapDeclarationPath = getFileImportRelativePath(rpcFile, rpcMapDeclarationFile, packageMappings);
9
- const content = [serializeRPCWrapper(rpcMapDeclarationPath)];
10
- await writeFileInDir(logger, rpcFile, content.join('\n'));
11
- });
12
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommandWithoutState } from '../../types.js';
2
- export declare const pikkuRPCClient: PikkuCommandWithoutState;
@@ -1,12 +0,0 @@
1
- import { serializeRPCWrapper } from './serialize-rpc-wrapper.js';
2
- import { getFileImportRelativePath, logCommandInfoAndTime, writeFileInDir, } from '../../utils.js';
3
- export const pikkuRPCClient = async (logger, { rpcWiringsFile, rpcMapDeclarationFile, packageMappings }) => {
4
- return await logCommandInfoAndTime(logger, 'Generating RPC wrapper', 'Generated RPC wrapper', [rpcWiringsFile === undefined, "rpcWiringsFile isn't set in the pikku config"], async () => {
5
- if (!rpcWiringsFile) {
6
- throw new Error("rpcWiringsFile isn't set in the pikku config");
7
- }
8
- const rpcMapDeclarationPath = getFileImportRelativePath(rpcWiringsFile, rpcMapDeclarationFile, packageMappings);
9
- const content = [serializeRPCWrapper(rpcMapDeclarationPath)];
10
- await writeFileInDir(logger, rpcWiringsFile, content.join('\n'));
11
- });
12
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuRPCMap: PikkuCommand;
@@ -1,8 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- import { serializeTypedRPCMap } from './serialize-typed-rpc-map.js';
3
- export const pikkuRPCMap = async (logger, { rpcMapDeclarationFile, packageMappings }, { functions, rpc }) => {
4
- return await logCommandInfoAndTime(logger, 'Creating RPC map', 'Created RPC map', [false], async () => {
5
- const content = serializeTypedRPCMap(rpcMapDeclarationFile, packageMappings, functions.typesMap, functions.meta, rpc.meta);
6
- await writeFileInDir(logger, rpcMapDeclarationFile, content);
7
- });
8
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuRPC: PikkuCommand;
@@ -1,6 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- export const pikkuRPC = async (logger, { rpcWiringMetaFile }, { rpc }) => {
3
- return await logCommandInfoAndTime(logger, 'Finding RPCs tasks', 'Found RPCs', [false], async () => {
4
- await writeFileInDir(logger, rpcWiringMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('rpc', 'meta', ${JSON.stringify(rpc.meta, null, 2)})`);
5
- });
6
- };
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuRPC: PikkuCommand;
@@ -1,6 +0,0 @@
1
- import { logCommandInfoAndTime, writeFileInDir } from '../../utils.js';
2
- export const pikkuRPC = async (logger, { rpcWiringMetaFile }, { rpc }) => {
3
- return await logCommandInfoAndTime(logger, 'Finding RPCs tasks', 'Found RPCs', [false], async () => {
4
- await writeFileInDir(logger, rpcWiringMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('rpc', 'meta', ${JSON.stringify(rpc.meta, null, 2)})`);
5
- });
6
- };
@@ -1 +0,0 @@
1
- export declare const serializeRPCWrapper: (rpcMapPath: string) => string;
@@ -1,68 +0,0 @@
1
- export const serializeRPCWrapper = (rpcMapPath) => {
2
- return `
3
- import { PikkuFetch } from "./pikku-fetch.gen.js"
4
- import type { RPCInvoke } from '${rpcMapPath}'
5
-
6
- /**
7
- * PikkuRPC provides a type-safe client for making Remote Procedure Calls (RPC)
8
- * to your Pikku server. It wraps the underlying HTTP client and provides a
9
- * simple interface for invoking server-side functions.
10
- */
11
- export class PikkuRPC {
12
- /** The underlying HTTP client used for making RPC calls */
13
- pikkuFetch = new PikkuFetch()
14
-
15
- /**
16
- * Sets a custom PikkuFetch instance to use for RPC calls.
17
- * This allows you to configure custom settings or use a shared client instance.
18
- *
19
- * @param pikkuFetch - The PikkuFetch instance to use
20
- */
21
- setPikkuFetch(pikkuFetch: PikkuFetch): void {
22
- this.pikkuFetch = pikkuFetch
23
- }
24
-
25
- /**
26
- * Sets the base server URL for all RPC calls.
27
- *
28
- * @param serverUrl - The base URL of your Pikku server (e.g., 'https://api.example.com')
29
- */
30
- setServerUrl(serverUrl: string): void {
31
- this.pikkuFetch.setServerUrl(serverUrl)
32
- }
33
-
34
- /**
35
- * Sets the JWT token for authorization on all RPC calls.
36
- *
37
- * @param jwt - The JWT token to use for authorization, or null to remove authorization
38
- */
39
- setAuthorizationJWT(jwt: string | null): void {
40
- this.pikkuFetch.setAuthorizationJWT(jwt)
41
- }
42
-
43
- /**
44
- * Sets the API key for authorization on all RPC calls.
45
- *
46
- * @param apiKey - The API key to use for authorization, or null to remove the API key
47
- */
48
- setAPIKey(apiKey: string | null): void {
49
- this.pikkuFetch.setAPIKey(apiKey)
50
- }
51
-
52
- /**
53
- * Invokes a remote procedure call on the server.
54
- * This is a generic method that routes to the appropriate server function
55
- * based on the function name and passes the provided data.
56
- *
57
- * @param name - The name of the server function to invoke
58
- * @param data - The data to pass to the server function
59
- * @returns A promise that resolves with the function's return value
60
- */
61
- invoke: RPCInvoke = async (name, data) => {
62
- return await this.pikkuFetch.post('/rpc', { name, data })
63
- }
64
- }
65
-
66
- export const pikkuRPC = new PikkuRPC();
67
- `;
68
- };
@@ -1,4 +0,0 @@
1
- import type { RPCMeta } from '@pikku/core/rpc';
2
- import { TypesMap } from '@pikku/inspector';
3
- import { FunctionsMeta } from '@pikku/core';
4
- export declare const serializeTypedRPCMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, functionsMeta: FunctionsMeta, rpcMeta: Record<string, RPCMeta>) => string;
@@ -1,66 +0,0 @@
1
- import { serializeImportMap } from '../../serialize-import-map.js';
2
- import { generateCustomTypes } from '../../utils.js';
3
- export const serializeTypedRPCMap = (relativeToPath, packageMappings, typesMap, functionsMeta, rpcMeta) => {
4
- const requiredTypes = new Set();
5
- const serializedCustomTypes = generateCustomTypes(typesMap, requiredTypes);
6
- const serializedRPCs = generateRPCs(rpcMeta, functionsMeta, typesMap, requiredTypes);
7
- const serializedImportMap = serializeImportMap(relativeToPath, packageMappings, typesMap, requiredTypes);
8
- return `/**
9
- * This provides the structure needed for typescript to be aware of RPCs and their return types
10
- */
11
-
12
- ${serializedImportMap}
13
- ${serializedCustomTypes}
14
-
15
- interface RPCHandler<I, O> {
16
- input: I;
17
- output: O;
18
- }
19
-
20
- ${serializedRPCs}
21
-
22
- export type RPCInvoke = <Name extends keyof RPCMap>(
23
- name: Name,
24
- data: RPCMap[Name]['input'],
25
- options?: {
26
- location?: 'local' | 'remote' | 'auto'
27
- }
28
- ) => Promise<RPCMap[Name]['output']>
29
-
30
- export type TypedPikkuRPC = {
31
- depth: number;
32
- global: boolean;
33
- invoke: RPCInvoke;
34
- }
35
- `;
36
- };
37
- function generateRPCs(rpcMeta, functionsMeta, typesMap, requiredTypes) {
38
- // Initialize an object to collect RPCs
39
- const rpcsObj = {};
40
- // Iterate through RPC metadata
41
- for (const [funcName, { pikkuFuncName }] of Object.entries(rpcMeta)) {
42
- const functionMeta = functionsMeta[pikkuFuncName];
43
- if (!functionMeta) {
44
- throw new Error(`Function ${funcName} not found in functionsMeta. Please check your configuration.`);
45
- }
46
- const input = functionMeta.inputs ? functionMeta.inputs[0] : undefined;
47
- const output = functionMeta.outputs ? functionMeta.outputs[0] : undefined;
48
- // Store the input and output types for RPCHandler
49
- const inputType = input ? typesMap.getTypeMeta(input).uniqueName : 'null';
50
- const outputType = output ? typesMap.getTypeMeta(output).uniqueName : 'null';
51
- requiredTypes.add(inputType);
52
- requiredTypes.add(outputType);
53
- // Add RPC entry
54
- rpcsObj[funcName] = {
55
- inputType,
56
- outputType,
57
- };
58
- }
59
- // Build the RPCs object as a string
60
- let rpcsStr = 'export type RPCMap = {\n';
61
- for (const [funcName, handler] of Object.entries(rpcsObj)) {
62
- rpcsStr += ` readonly '${funcName}': RPCHandler<${handler.inputType}, ${handler.outputType}>,\n`;
63
- }
64
- rpcsStr += '};\n';
65
- return rpcsStr;
66
- }
@@ -1,2 +0,0 @@
1
- import { PikkuCommand } from '../../types.js';
2
- export declare const pikkuScheduler: PikkuCommand;
@@ -1,10 +0,0 @@
1
- import { logCommandInfoAndTime, serializeFileImports, writeFileInDir, } from '../../utils.js';
2
- import { serializeSchedulerMeta } from './serialize-scheduler-meta.js';
3
- export const pikkuScheduler = async (logger, cliConfig, visitState) => {
4
- return await logCommandInfoAndTime(logger, 'Finding scheduled tasks', 'Found scheduled tasks', [visitState.scheduledTasks.files.size === 0], async () => {
5
- const { schedulersWiringFile, schedulersWiringMetaFile, packageMappings } = cliConfig;
6
- const { scheduledTasks } = visitState;
7
- await writeFileInDir(logger, schedulersWiringMetaFile, serializeSchedulerMeta(scheduledTasks.meta));
8
- await writeFileInDir(logger, schedulersWiringFile, serializeFileImports('addScheduledTasks', schedulersWiringFile, scheduledTasks.files, packageMappings));
9
- });
10
- };
@@ -1,2 +0,0 @@
1
- import { ScheduledTasksMeta } from '@pikku/core/scheduler';
2
- export declare const serializeSchedulerMeta: (scheduledTasksMeta: ScheduledTasksMeta) => string;