@pikku/cli 0.7.0 → 0.7.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.
Files changed (99) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/bin/pikku-all.ts +203 -0
  3. package/bin/pikku-channels-map.ts +55 -0
  4. package/bin/pikku-channels.ts +63 -0
  5. package/bin/pikku-fetch.ts +55 -0
  6. package/bin/pikku-function-types.ts +84 -0
  7. package/bin/pikku-functions.ts +35 -0
  8. package/bin/pikku-http-map.ts +56 -0
  9. package/bin/pikku-http-routes.ts +63 -0
  10. package/bin/pikku-nextjs.test.ts +279 -0
  11. package/bin/pikku-nextjs.ts +152 -0
  12. package/bin/pikku-openapi.ts +76 -0
  13. package/bin/pikku-rpc.ts +22 -0
  14. package/bin/pikku-scheduler.ts +64 -0
  15. package/bin/pikku-schemas.ts +57 -0
  16. package/bin/pikku-websocket.ts +58 -0
  17. package/bin/pikku.ts +26 -0
  18. package/dist/bin/pikku-all.js +3 -0
  19. package/dist/bin/pikku-functions.d.ts +0 -2
  20. package/dist/bin/pikku-functions.js +2 -17
  21. package/dist/bin/pikku-http-map.js +1 -1
  22. package/dist/bin/pikku-openapi.js +2 -2
  23. package/dist/bin/pikku-rpc.d.ts +3 -0
  24. package/dist/bin/pikku-rpc.js +8 -0
  25. package/dist/bin/pikku-schemas.js +2 -2
  26. package/dist/bin/pikku.js +0 -0
  27. package/dist/src/openapi-spec-generator.d.ts +2 -2
  28. package/dist/src/openapi-spec-generator.js +14 -5
  29. package/dist/src/pikku-cli-config.d.ts +1 -0
  30. package/dist/src/pikku-cli-config.js +3 -0
  31. package/dist/src/schema-generator.d.ts +3 -3
  32. package/dist/src/schema-generator.js +15 -34
  33. package/dist/src/serialize-typed-function-map.d.ts +2 -1
  34. package/dist/src/serialize-typed-function-map.js +6 -4
  35. package/dist/src/serialize-typed-http-map.d.ts +2 -1
  36. package/dist/src/serialize-typed-http-map.js +10 -4
  37. package/dist/tsconfig.tsbuildinfo +1 -0
  38. package/package.json +3 -3
  39. package/src/inspector-glob.ts +28 -0
  40. package/src/openapi-spec-generator.ts +246 -0
  41. package/src/pikku-cli-config.ts +240 -0
  42. package/src/schema-generator.ts +118 -0
  43. package/{dist/src/events/http/serialize-fetch-wrapper.js → src/serialize-fetch-wrapper.ts} +4 -4
  44. package/src/serialize-import-map.ts +34 -0
  45. package/{dist/src/nextjs/serialize-nextjs-backend-wrapper.js → src/serialize-nextjs-backend-wrapper.ts} +11 -4
  46. package/{dist/src/nextjs/serialize-nextjs-http-wrapper.js → src/serialize-nextjs-http-wrapper.ts} +7 -4
  47. package/{dist/src/core/serialize-pikku-types.js → src/serialize-pikku-types.ts} +46 -35
  48. package/src/serialize-scheduler-meta.ts +18 -0
  49. package/src/serialize-typed-channel-map.ts +138 -0
  50. package/src/serialize-typed-function-map.ts +161 -0
  51. package/src/serialize-typed-http-map.ts +167 -0
  52. package/{dist/src/channels/serialize-websocket-wrapper.js → src/serialize-websocket-wrapper.ts} +4 -4
  53. package/src/utils.ts +284 -0
  54. package/tsconfig.json +21 -0
  55. package/dist/bin/pikku-http.d.ts +0 -5
  56. package/dist/bin/pikku-http.js +0 -27
  57. package/dist/bin/pikku-routes-map.d.ts +0 -5
  58. package/dist/bin/pikku-routes-map.js +0 -23
  59. package/dist/src/channels/serialize-channels.d.ts +0 -3
  60. package/dist/src/channels/serialize-channels.js +0 -19
  61. package/dist/src/channels/serialize-typed-channel-map.d.ts +0 -3
  62. package/dist/src/channels/serialize-typed-channel-map.js +0 -93
  63. package/dist/src/channels/serialize-websocket-wrapper.d.ts +0 -1
  64. package/dist/src/core/serialize-import-map.d.ts +0 -2
  65. package/dist/src/core/serialize-import-map.js +0 -24
  66. package/dist/src/core/serialize-pikku-types.d.ts +0 -4
  67. package/dist/src/events/channels/serialize-channels.d.ts +0 -3
  68. package/dist/src/events/channels/serialize-channels.js +0 -19
  69. package/dist/src/events/channels/serialize-typed-channel-map.d.ts +0 -3
  70. package/dist/src/events/channels/serialize-typed-channel-map.js +0 -90
  71. package/dist/src/events/channels/serialize-websocket-wrapper.d.ts +0 -1
  72. package/dist/src/events/channels/serialize-websocket-wrapper.js +0 -61
  73. package/dist/src/events/http/serialize-fetch-wrapper.d.ts +0 -1
  74. package/dist/src/events/http/serialize-route-imports.d.ts +0 -1
  75. package/dist/src/events/http/serialize-route-imports.js +0 -13
  76. package/dist/src/events/http/serialize-route-meta.d.ts +0 -2
  77. package/dist/src/events/http/serialize-route-meta.js +0 -6
  78. package/dist/src/events/http/serialize-typed-route-map.d.ts +0 -4
  79. package/dist/src/events/http/serialize-typed-route-map.js +0 -107
  80. package/dist/src/events/scheduler/serialize-schedulers.d.ts +0 -3
  81. package/dist/src/events/scheduler/serialize-schedulers.js +0 -23
  82. package/dist/src/http/serialize-fetch-wrapper.d.ts +0 -1
  83. package/dist/src/http/serialize-fetch-wrapper.js +0 -67
  84. package/dist/src/http/serialize-route-imports.d.ts +0 -1
  85. package/dist/src/http/serialize-route-imports.js +0 -13
  86. package/dist/src/http/serialize-route-meta.d.ts +0 -2
  87. package/dist/src/http/serialize-route-meta.js +0 -6
  88. package/dist/src/http/serialize-typed-route-map.d.ts +0 -4
  89. package/dist/src/http/serialize-typed-route-map.js +0 -107
  90. package/dist/src/nextjs/serialize-nextjs-backend-wrapper.d.ts +0 -1
  91. package/dist/src/nextjs/serialize-nextjs-http-wrapper.d.ts +0 -1
  92. package/dist/src/openapi/openapi-spec-generator.d.ts +0 -79
  93. package/dist/src/openapi/openapi-spec-generator.js +0 -136
  94. package/dist/src/scheduler/serialize-schedulers.d.ts +0 -3
  95. package/dist/src/scheduler/serialize-schedulers.js +0 -23
  96. package/dist/src/schema/schema-generator.d.ts +0 -5
  97. package/dist/src/schema/schema-generator.js +0 -89
  98. package/dist/src/serialize-typed-route-map.d.ts +0 -4
  99. package/dist/src/serialize-typed-route-map.js +0 -107
@@ -0,0 +1,58 @@
1
+ import { Command } from 'commander'
2
+ import {
3
+ getFileImportRelativePath,
4
+ logCommandInfoAndTime,
5
+ logPikkuLogo,
6
+ PikkuCLIOptions,
7
+ writeFileInDir,
8
+ } from '../src/utils.js'
9
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
10
+ import { serializeWebsocketWrapper } from '../src/serialize-websocket-wrapper.js'
11
+
12
+ export const pikkuWebSocket = async ({
13
+ websocketFile,
14
+ channelsMapDeclarationFile,
15
+ packageMappings,
16
+ }: PikkuCLIConfig) => {
17
+ await logCommandInfoAndTime(
18
+ 'Generating websocket wrapper',
19
+ 'Generated websocket wrapper',
20
+ [
21
+ websocketFile === undefined,
22
+ "websocketFile isn't set in the pikku config",
23
+ ],
24
+ async () => {
25
+ if (!websocketFile) {
26
+ throw new Error("fetchFile is isn't set in the pikku config")
27
+ }
28
+
29
+ const channelsMapDeclarationPath = getFileImportRelativePath(
30
+ websocketFile,
31
+ channelsMapDeclarationFile,
32
+ packageMappings
33
+ )
34
+
35
+ const content = [serializeWebsocketWrapper(channelsMapDeclarationPath)]
36
+ await writeFileInDir(websocketFile, content.join('\n'))
37
+ }
38
+ )
39
+ }
40
+
41
+ export const action = async (options: PikkuCLIOptions): Promise<void> => {
42
+ logPikkuLogo()
43
+ const cliConfig = await getPikkuCLIConfig(
44
+ options.config,
45
+ ['rootDir', 'schemaDirectory', 'configDir', 'fetchFile'],
46
+ options.tags,
47
+ true
48
+ )
49
+ await pikkuWebSocket(cliConfig)
50
+ }
51
+
52
+ export const websocket = (program: Command): void => {
53
+ program
54
+ .command('websocket')
55
+ .description('generate websocket wrapper')
56
+ .option('-c | --config <string>', 'The path to pikku cli config file')
57
+ .action(action)
58
+ }
package/bin/pikku.ts ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander'
3
+ import { schemas } from './pikku-schemas.js'
4
+ import { routes } from './pikku-http-routes.js'
5
+ import { nextjs } from './pikku-nextjs.js'
6
+ import { all } from './pikku-all.js'
7
+ import { functionTypes } from './pikku-function-types.js'
8
+ import { routesMap } from './pikku-http-map.js'
9
+ import { fetch } from './pikku-fetch.js'
10
+ import { channels } from './pikku-channels.js'
11
+ import { schedules } from './pikku-scheduler.js'
12
+
13
+ const program = new Command('pikku')
14
+ program.usage('[command]')
15
+
16
+ all(program)
17
+ routes(program)
18
+ routesMap(program)
19
+ functionTypes(program)
20
+ schemas(program)
21
+ nextjs(program)
22
+ fetch(program)
23
+ channels(program)
24
+ schedules(program)
25
+
26
+ program.parse(process.argv)
@@ -15,6 +15,7 @@ import { pikkuWebSocket } from './pikku-websocket.js';
15
15
  import { inspectorGlob } from '../src/inspector-glob.js';
16
16
  import chokidar from 'chokidar';
17
17
  import { pikkuFunctions } from './pikku-functions.js';
18
+ import { pikkuRPC } from './pikku-rpc.js';
18
19
  const runAll = async (cliConfig, options) => {
19
20
  const metaImports = [];
20
21
  const imports = [];
@@ -45,6 +46,8 @@ const runAll = async (cliConfig, options) => {
45
46
  }
46
47
  addImport(cliConfig.functionsMetaFile, 'meta');
47
48
  addImport(cliConfig.functionsFile, 'events');
49
+ await pikkuRPC(cliConfig, visitState);
50
+ addImport(cliConfig.rpcFile, 'meta');
48
51
  const routes = await pikkuHTTP(cliConfig, visitState);
49
52
  if (routes) {
50
53
  await pikkuHTTPMap(cliConfig, visitState);
@@ -1,5 +1,3 @@
1
- import { Command } from 'commander';
2
1
  import { PikkuCLIConfig } from '../src/pikku-cli-config.js';
3
2
  import { InspectorState } from '@pikku/inspector';
4
3
  export declare const pikkuFunctions: (cliConfig: PikkuCLIConfig, visitState: InspectorState) => Promise<boolean>;
5
- export declare const routes: (program: Command) => void;
@@ -1,24 +1,9 @@
1
- import { getPikkuCLIConfig } from '../src/pikku-cli-config.js';
2
- import { logCommandInfoAndTime, logPikkuLogo, serializeFileImports, writeFileInDir, } from '../src/utils.js';
3
- import { inspectorGlob } from '../src/inspector-glob.js';
1
+ import { logCommandInfoAndTime, serializeFileImports, writeFileInDir, } from '../src/utils.js';
4
2
  export const pikkuFunctions = async (cliConfig, visitState) => {
5
3
  return await logCommandInfoAndTime('Finding Pikku functions', 'Found Pikku functions', [visitState.functions.files.size === 0], async () => {
6
4
  const { functionsFile, functionsMetaFile, packageMappings } = cliConfig;
7
5
  const { functions } = visitState;
8
6
  await writeFileInDir(functionsFile, serializeFileImports('addFunction', functionsFile, functions.files, packageMappings));
9
- await writeFileInDir(functionsMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('functions', 'meta', ${JSON.stringify(functions.meta, null, 2)})`);
7
+ await writeFileInDir(functionsMetaFile, `import { pikkuState } from '@pikku/core'\npikkuState('function', 'meta', ${JSON.stringify(functions.meta, null, 2)})`);
10
8
  });
11
9
  };
12
- async function action(cliOptions) {
13
- logPikkuLogo();
14
- const cliConfig = await getPikkuCLIConfig(cliOptions.config, ['rootDir', 'srcDirectories', 'functionsFile'], cliOptions.tags);
15
- const visitState = await inspectorGlob(cliConfig.rootDir, cliConfig.srcDirectories, cliConfig.filters);
16
- await pikkuFunctions(cliConfig, visitState);
17
- }
18
- export const routes = (program) => {
19
- program
20
- .command('functions')
21
- .description('Find all functions to import')
22
- .option('-c | --config <string>', 'The path to pikku cli config file')
23
- .action(action);
24
- };
@@ -4,7 +4,7 @@ import { serializeTypedRoutesMap } from '../src/serialize-typed-http-map.js';
4
4
  import { inspectorGlob } from '../src/inspector-glob.js';
5
5
  export const pikkuHTTPMap = async ({ httpRoutesMapDeclarationFile, packageMappings }, { http, functions }) => {
6
6
  return await logCommandInfoAndTime('Creating HTTP map', 'Created HTTP map', [http.files.size === 0], async () => {
7
- const content = serializeTypedRoutesMap(httpRoutesMapDeclarationFile, packageMappings, functions.typesMap, http.meta, http.metaInputTypes);
7
+ const content = serializeTypedRoutesMap(httpRoutesMapDeclarationFile, packageMappings, functions.typesMap, functions.meta, http.meta, http.metaInputTypes);
8
8
  await writeFileInDir(httpRoutesMapDeclarationFile, content);
9
9
  });
10
10
  };
@@ -9,8 +9,8 @@ export const pikkuOpenAPI = async ({ tsconfig, openAPI }, { http, functions }) =
9
9
  if (!openAPI?.outputFile) {
10
10
  throw new Error('openAPI is required');
11
11
  }
12
- const schemas = await generateSchemas(tsconfig, [http.typesMap, functions.typesMap], http.meta);
13
- const openAPISpec = await generateOpenAPISpec(http.meta, schemas, openAPI.additionalInfo);
12
+ const schemas = await generateSchemas(tsconfig, functions.typesMap, functions.meta, http.meta);
13
+ const openAPISpec = await generateOpenAPISpec(functions.meta, http.meta, schemas, openAPI.additionalInfo);
14
14
  if (openAPI.outputFile.endsWith('.json')) {
15
15
  await writeFileInDir(openAPI.outputFile, JSON.stringify(openAPISpec, null, 2), true);
16
16
  }
@@ -0,0 +1,3 @@
1
+ import { PikkuCLIConfig } from '../src/pikku-cli-config.js';
2
+ import { InspectorState } from '@pikku/inspector';
3
+ export declare const pikkuRPC: (cliConfig: PikkuCLIConfig, visitState: InspectorState) => Promise<boolean>;
@@ -0,0 +1,8 @@
1
+ import { logCommandInfoAndTime, writeFileInDir } from '../src/utils.js';
2
+ export const pikkuRPC = async (cliConfig, visitState) => {
3
+ return await logCommandInfoAndTime('Finding RPCs tasks', 'Found rpcs', [visitState.functions.files.size === 0], async () => {
4
+ const { rpcFile } = cliConfig;
5
+ const { rpc } = visitState;
6
+ await writeFileInDir(rpcFile, `import { pikkuState } from '@pikku/core'\npikkuState('rpc', 'meta', ${JSON.stringify(rpc.meta, null, 2)})`);
7
+ });
8
+ };
@@ -4,8 +4,8 @@ import { logCommandInfoAndTime, logPikkuLogo } from '../src/utils.js';
4
4
  import { inspectorGlob } from '../src/inspector-glob.js';
5
5
  export const pikkuSchemas = async ({ tsconfig, schemaDirectory, supportsImportAttributes }, { functions, http, channels }) => {
6
6
  return await logCommandInfoAndTime('Creating schemas', 'Created schemas', [false], async () => {
7
- const schemas = await generateSchemas(tsconfig, [functions.typesMap, http.typesMap, channels.typesMap], http.meta);
8
- await saveSchemas(schemaDirectory, schemas, functions.typesMap, http.meta, supportsImportAttributes);
7
+ const schemas = await generateSchemas(tsconfig, functions.typesMap, functions.meta, http.meta);
8
+ await saveSchemas(schemaDirectory, schemas, functions.typesMap, functions.meta, supportsImportAttributes);
9
9
  });
10
10
  };
11
11
  async function action({ config }) {
package/dist/bin/pikku.js CHANGED
File without changes
@@ -1,4 +1,4 @@
1
- import { HTTPRoutesMeta } from '@pikku/core';
1
+ import { FunctionsMeta, HTTPRoutesMeta } from '@pikku/core';
2
2
  interface OpenAPISpec {
3
3
  openapi: string;
4
4
  info: {
@@ -75,5 +75,5 @@ export interface OpenAPISpecInfo {
75
75
  [key: string]: any[];
76
76
  }[];
77
77
  }
78
- export declare function generateOpenAPISpec(routeMeta: HTTPRoutesMeta, schemas: Record<string, any>, additionalInfo: OpenAPISpecInfo): Promise<OpenAPISpec>;
78
+ export declare function generateOpenAPISpec(functionsMeta: FunctionsMeta, routeMeta: HTTPRoutesMeta, schemas: Record<string, any>, additionalInfo: OpenAPISpecInfo): Promise<OpenAPISpec>;
79
79
  export {};
@@ -9,9 +9,12 @@ const getErrorResponseForConstructorName = (constructorName) => {
9
9
  }
10
10
  return undefined;
11
11
  };
12
- const convertSchemasToBodyPayloads = async (routesMeta, schemas) => {
12
+ const convertSchemasToBodyPayloads = async (functionsMeta, routesMeta, schemas) => {
13
13
  const requiredSchemas = new Set(routesMeta
14
- .map(({ inputTypes, output }) => [inputTypes?.body, output])
14
+ .map(({ inputTypes, pikkuFuncName }) => {
15
+ const output = functionsMeta[pikkuFuncName]?.outputs?.[0];
16
+ return [inputTypes?.body, output];
17
+ })
15
18
  .flat()
16
19
  .filter((schema) => !!schema));
17
20
  const convertedEntries = await Promise.all(Object.entries(schemas).map(async ([key, schema]) => {
@@ -26,10 +29,16 @@ const convertSchemasToBodyPayloads = async (routesMeta, schemas) => {
26
29
  }));
27
30
  return Object.fromEntries(convertedEntries.filter((s) => !!s));
28
31
  };
29
- export async function generateOpenAPISpec(routeMeta, schemas, additionalInfo) {
32
+ export async function generateOpenAPISpec(functionsMeta, routeMeta, schemas, additionalInfo) {
30
33
  const paths = {};
31
34
  routeMeta.forEach((meta) => {
32
- const { route, method, inputTypes, output, params, query, docs } = meta;
35
+ const { route, method, inputTypes, pikkuFuncName, params, query, docs } = meta;
36
+ const functionMeta = functionsMeta[pikkuFuncName];
37
+ if (!functionMeta) {
38
+ console.error(`• No function metadata found for '${pikkuFuncName}' in route '${route}'.`);
39
+ return;
40
+ }
41
+ const output = functionMeta.outputs ? functionMeta.outputs[0] : undefined;
33
42
  const path = route.replace(/:(\w+)/g, '{$1}'); // Convert ":param" to "{param}"
34
43
  if (!paths[path]) {
35
44
  paths[path] = {};
@@ -103,7 +112,7 @@ export async function generateOpenAPISpec(routeMeta, schemas, additionalInfo) {
103
112
  servers: additionalInfo.servers,
104
113
  paths,
105
114
  components: {
106
- schemas: await convertSchemasToBodyPayloads(routeMeta, schemas),
115
+ schemas: await convertSchemasToBodyPayloads(functionsMeta, routeMeta, schemas),
107
116
  responses: {},
108
117
  parameters: {},
109
118
  examples: {},
@@ -10,6 +10,7 @@ export interface PikkuCLICoreOutputFiles {
10
10
  channelsMetaFile: string;
11
11
  schedulersFile: string;
12
12
  schedulersMetaFile: string;
13
+ rpcFile: string;
13
14
  schemaDirectory: string;
14
15
  typesDeclarationFile: string;
15
16
  httpRoutesMapDeclarationFile: string;
@@ -62,6 +62,9 @@ const _getPikkuCLIConfig = async (configFile = undefined, requiredFields, tags =
62
62
  if (!result.functionsMetaFile) {
63
63
  result.functionsMetaFile = join(result.outDir, 'pikku-functions-meta.gen.ts');
64
64
  }
65
+ if (!result.rpcFile) {
66
+ result.rpcFile = join(result.outDir, 'pikku-rpc.gen.ts');
67
+ }
65
68
  if (!result.httpRoutesFile) {
66
69
  result.httpRoutesFile = join(result.outDir, 'pikku-http-routes.gen.ts');
67
70
  }
@@ -1,5 +1,5 @@
1
- import { JSONValue } from '@pikku/core';
1
+ import { FunctionsMeta, JSONValue } from '@pikku/core';
2
2
  import { HTTPRoutesMeta } from '@pikku/core/http';
3
3
  import { TypesMap } from '@pikku/inspector';
4
- export declare function generateSchemas(tsconfig: string, typesMaps: TypesMap[], httpRoutesMeta: HTTPRoutesMeta): Promise<Record<string, JSONValue>>;
5
- export declare function saveSchemas(schemaParentDir: string, schemas: Record<string, JSONValue>, typesMap: TypesMap, routesMeta: HTTPRoutesMeta, supportsImportAttributes: boolean): Promise<void>;
4
+ export declare function generateSchemas(tsconfig: string, typesMap: TypesMap, functionMeta: FunctionsMeta, httpRoutesMeta: HTTPRoutesMeta): Promise<Record<string, JSONValue>>;
5
+ export declare function saveSchemas(schemaParentDir: string, schemas: Record<string, JSONValue>, typesMap: TypesMap, functionsMeta: FunctionsMeta, supportsImportAttributes: boolean): Promise<void>;
@@ -1,37 +1,18 @@
1
1
  import { createGenerator, RootlessError } from 'ts-json-schema-generator';
2
2
  import { logInfo, writeFileInDir } from './utils.js';
3
3
  import { mkdir, writeFile } from 'fs/promises';
4
- export async function generateSchemas(tsconfig, typesMaps, httpRoutesMeta) {
5
- const schemasSet = new Set(typesMaps.flatMap((tm) => [...tm.customTypes.keys()]));
6
- for (const { input, inputTypes } of httpRoutesMeta) {
7
- if (input) {
8
- let found = false;
9
- for (const typesMap of typesMaps) {
10
- try {
11
- const uniqueName = typesMap.getUniqueName(input);
12
- if (uniqueName) {
13
- found = true;
14
- schemasSet.add(uniqueName);
15
- break;
16
- }
17
- }
18
- catch (e) {
19
- }
20
- }
21
- if (!found) {
22
- console.error('Input type not found in any types map:', input);
4
+ export async function generateSchemas(tsconfig, typesMap, functionMeta, httpRoutesMeta) {
5
+ const schemasSet = new Set(typesMap.customTypes.keys());
6
+ for (const { inputs, outputs } of Object.values(functionMeta)) {
7
+ const types = [...(inputs || []), ...(outputs || [])];
8
+ for (const type of types) {
9
+ const uniqueName = typesMap.getUniqueName(type);
10
+ if (uniqueName) {
11
+ schemasSet.add(uniqueName);
23
12
  }
24
13
  }
25
- // if (output) {
26
- // for (const typesMap of typesMaps) {
27
- // const uniqueName = typesMap.getUniqueName(output)
28
- // if (uniqueName) {
29
- // console.log('Adding output schema:', uniqueName)
30
- // schemasSet.add(uniqueName)
31
- // break
32
- // }
33
- // }
34
- // }
14
+ }
15
+ for (const { inputTypes } of httpRoutesMeta) {
35
16
  if (inputTypes?.body) {
36
17
  schemasSet.add(inputTypes.body);
37
18
  }
@@ -64,13 +45,13 @@ export async function generateSchemas(tsconfig, typesMaps, httpRoutesMeta) {
64
45
  });
65
46
  return schemas;
66
47
  }
67
- export async function saveSchemas(schemaParentDir, schemas, typesMap, routesMeta, supportsImportAttributes) {
48
+ export async function saveSchemas(schemaParentDir, schemas, typesMap, functionsMeta, supportsImportAttributes) {
68
49
  await writeFileInDir(`${schemaParentDir}/register.gen.ts`, 'export const empty = null;');
69
50
  const desiredSchemas = new Set([
70
- ...routesMeta
71
- .map(({ input, output }) => [
72
- input ? typesMap.getUniqueName(input) : undefined,
73
- output ? typesMap.getUniqueName(output) : undefined,
51
+ ...Object.values(functionsMeta)
52
+ .map(({ inputs, outputs }) => [
53
+ inputs?.[0] ? typesMap.getUniqueName(inputs[0]) : undefined,
54
+ outputs?.[0] ? typesMap.getUniqueName(outputs[0]) : undefined,
74
55
  ])
75
56
  .flat()
76
57
  .filter((s) => !!s &&
@@ -1,4 +1,5 @@
1
1
  import { HTTPRoutesMeta } from '@pikku/core/http';
2
2
  import { MetaInputTypes, TypesMap } from '@pikku/inspector';
3
- export declare const serializeTypedRoutesMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, routesMeta: HTTPRoutesMeta, metaTypes: MetaInputTypes) => string;
3
+ import { FunctionsMeta } from '@pikku/core';
4
+ export declare const serializeTypedRoutesMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, functionsMeta: FunctionsMeta, routesMeta: HTTPRoutesMeta, metaTypes: MetaInputTypes) => string;
4
5
  export declare function generateCustomTypes(typesMap: TypesMap, requiredTypes: Set<string>): string;
@@ -1,9 +1,9 @@
1
1
  import { serializeImportMap } from './serialize-import-map.js';
2
- export const serializeTypedRoutesMap = (relativeToPath, packageMappings, typesMap, routesMeta, metaTypes) => {
2
+ export const serializeTypedRoutesMap = (relativeToPath, packageMappings, typesMap, functionsMeta, routesMeta, metaTypes) => {
3
3
  const requiredTypes = new Set();
4
4
  const serializedCustomTypes = generateCustomTypes(typesMap, requiredTypes);
5
5
  const serializedMetaTypes = generateMetaTypes(metaTypes, typesMap);
6
- const serializedRoutes = generateRoutes(routesMeta, typesMap, requiredTypes);
6
+ const serializedRoutes = generateRoutes(functionsMeta, routesMeta, typesMap, requiredTypes);
7
7
  const serializedImportMap = serializeImportMap(relativeToPath, packageMappings, typesMap, requiredTypes);
8
8
  return `/**
9
9
  * This provides the structure needed for typescript to be aware of routes and their return types
@@ -44,11 +44,13 @@ ${Array.from(typesMap.customTypes.entries())
44
44
  })
45
45
  .join('\n')}`;
46
46
  }
47
- function generateRoutes(routesMeta, typesMap, requiredTypes) {
47
+ function generateRoutes(functionsMeta, routesMeta, typesMap, requiredTypes) {
48
48
  // Initialize an object to collect routes
49
49
  const routesObj = {};
50
50
  for (const meta of routesMeta) {
51
- const { route, method, input, output } = meta;
51
+ const { route, method, pikkuFuncName } = meta;
52
+ const input = functionsMeta[pikkuFuncName]?.inputs?.[0];
53
+ const output = functionsMeta[pikkuFuncName]?.outputs?.[0];
52
54
  // Initialize the route entry if it doesn't exist
53
55
  if (!routesObj[route]) {
54
56
  routesObj[route] = {};
@@ -1,4 +1,5 @@
1
1
  import { HTTPRoutesMeta } from '@pikku/core/http';
2
2
  import { MetaInputTypes, TypesMap } from '@pikku/inspector';
3
- export declare const serializeTypedRoutesMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, routesMeta: HTTPRoutesMeta, metaTypes: MetaInputTypes) => string;
3
+ import { FunctionsMeta } from '@pikku/core';
4
+ export declare const serializeTypedRoutesMap: (relativeToPath: string, packageMappings: Record<string, string>, typesMap: TypesMap, functionsMeta: FunctionsMeta, routesMeta: HTTPRoutesMeta, metaTypes: MetaInputTypes) => string;
4
5
  export declare function generateCustomTypes(typesMap: TypesMap, requiredTypes: Set<string>): string;
@@ -1,9 +1,9 @@
1
1
  import { serializeImportMap } from './serialize-import-map.js';
2
- export const serializeTypedRoutesMap = (relativeToPath, packageMappings, typesMap, routesMeta, metaTypes) => {
2
+ export const serializeTypedRoutesMap = (relativeToPath, packageMappings, typesMap, functionsMeta, routesMeta, metaTypes) => {
3
3
  const requiredTypes = new Set();
4
4
  const serializedCustomTypes = generateCustomTypes(typesMap, requiredTypes);
5
5
  const serializedMetaTypes = generateMetaTypes(metaTypes, typesMap);
6
- const serializedRoutes = generateRoutes(routesMeta, typesMap, requiredTypes);
6
+ const serializedRoutes = generateRoutes(routesMeta, functionsMeta, typesMap, requiredTypes);
7
7
  const serializedImportMap = serializeImportMap(relativeToPath, packageMappings, typesMap, requiredTypes);
8
8
  return `/**
9
9
  * This provides the structure needed for typescript to be aware of routes and their return types
@@ -44,11 +44,17 @@ ${Array.from(typesMap.customTypes.entries())
44
44
  })
45
45
  .join('\n')}`;
46
46
  }
47
- function generateRoutes(routesMeta, typesMap, requiredTypes) {
47
+ function generateRoutes(routesMeta, functionsMeta, typesMap, requiredTypes) {
48
48
  // Initialize an object to collect routes
49
49
  const routesObj = {};
50
50
  for (const meta of routesMeta) {
51
- const { route, method, input, output } = meta;
51
+ const { route, method, pikkuFuncName } = meta;
52
+ const functionMeta = functionsMeta[pikkuFuncName];
53
+ if (!functionMeta) {
54
+ throw new Error(`Function ${pikkuFuncName} not found in functionsMeta. Please check your configuration.`);
55
+ }
56
+ const input = functionMeta.inputs ? functionMeta.inputs[0] : undefined;
57
+ const output = functionMeta.outputs ? functionMeta.outputs[0] : undefined;
52
58
  // Initialize the route entry if it doesn't exist
53
59
  if (!routesObj[route]) {
54
60
  routesObj[route] = {};
@@ -0,0 +1 @@
1
+ {"root":["../bin/pikku-all.ts","../bin/pikku-channels-map.ts","../bin/pikku-channels.ts","../bin/pikku-fetch.ts","../bin/pikku-function-types.ts","../bin/pikku-functions.ts","../bin/pikku-http-map.ts","../bin/pikku-http-routes.ts","../bin/pikku-nextjs.ts","../bin/pikku-openapi.ts","../bin/pikku-rpc.ts","../bin/pikku-scheduler.ts","../bin/pikku-schemas.ts","../bin/pikku-websocket.ts","../bin/pikku.ts","../src/inspector-glob.ts","../src/openapi-spec-generator.ts","../src/pikku-cli-config.ts","../src/schema-generator.ts","../src/serialize-fetch-wrapper.ts","../src/serialize-import-map.ts","../src/serialize-nextjs-backend-wrapper.ts","../src/serialize-nextjs-http-wrapper.ts","../src/serialize-pikku-types.ts","../src/serialize-scheduler-meta.ts","../src/serialize-typed-channel-map.ts","../src/serialize-typed-function-map.ts","../src/serialize-typed-http-map.ts","../src/serialize-websocket-wrapper.ts","../src/utils.ts"],"version":"5.7.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pikku/cli",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "author": "yasser.fadl@gmail.com",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -22,8 +22,8 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@openapi-contrib/json-schema-to-openapi-schema": "^3.0.2",
25
- "@pikku/core": "^0.7.0",
26
- "@pikku/inspector": "^0.7.0",
25
+ "@pikku/core": "^0.7.4",
26
+ "@pikku/inspector": "^0.7.4",
27
27
  "@types/cookie": "^0.6.0",
28
28
  "@types/uuid": "^10.0.0",
29
29
  "chalk": "^5.4.1",
@@ -0,0 +1,28 @@
1
+ import * as path from 'path'
2
+ import { glob } from 'tinyglobby'
3
+ import { InspectorFilters, InspectorState, inspect } from '@pikku/inspector'
4
+ import { logCommandInfoAndTime } from './utils.js'
5
+
6
+ export const inspectorGlob = async (
7
+ rootDir: string,
8
+ srcDirectories: string[],
9
+ filters: InspectorFilters
10
+ ) => {
11
+ let result: InspectorState
12
+ await logCommandInfoAndTime(
13
+ 'Inspecting codebase',
14
+ 'Inspected codebase',
15
+ [false],
16
+ async () => {
17
+ const routeFiles = (
18
+ await Promise.all(
19
+ srcDirectories.map((dir) =>
20
+ glob(`${path.join(rootDir, dir)}/**/*.ts`)
21
+ )
22
+ )
23
+ ).flat()
24
+ result = await inspect(routeFiles, filters)
25
+ }
26
+ )
27
+ return result!
28
+ }