@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.
- package/CHANGELOG.md +18 -0
- package/bin/pikku-all.ts +203 -0
- package/bin/pikku-channels-map.ts +55 -0
- package/bin/pikku-channels.ts +63 -0
- package/bin/pikku-fetch.ts +55 -0
- package/bin/pikku-function-types.ts +84 -0
- package/bin/pikku-functions.ts +35 -0
- package/bin/pikku-http-map.ts +56 -0
- package/bin/pikku-http-routes.ts +63 -0
- package/bin/pikku-nextjs.test.ts +279 -0
- package/bin/pikku-nextjs.ts +152 -0
- package/bin/pikku-openapi.ts +76 -0
- package/bin/pikku-rpc.ts +22 -0
- package/bin/pikku-scheduler.ts +64 -0
- package/bin/pikku-schemas.ts +57 -0
- package/bin/pikku-websocket.ts +58 -0
- package/bin/pikku.ts +26 -0
- package/dist/bin/pikku-all.js +3 -0
- package/dist/bin/pikku-functions.d.ts +0 -2
- package/dist/bin/pikku-functions.js +2 -17
- package/dist/bin/pikku-http-map.js +1 -1
- package/dist/bin/pikku-openapi.js +2 -2
- package/dist/bin/pikku-rpc.d.ts +3 -0
- package/dist/bin/pikku-rpc.js +8 -0
- package/dist/bin/pikku-schemas.js +2 -2
- package/dist/bin/pikku.js +0 -0
- package/dist/src/openapi-spec-generator.d.ts +2 -2
- package/dist/src/openapi-spec-generator.js +14 -5
- package/dist/src/pikku-cli-config.d.ts +1 -0
- package/dist/src/pikku-cli-config.js +3 -0
- package/dist/src/schema-generator.d.ts +3 -3
- package/dist/src/schema-generator.js +15 -34
- package/dist/src/serialize-typed-function-map.d.ts +2 -1
- package/dist/src/serialize-typed-function-map.js +6 -4
- package/dist/src/serialize-typed-http-map.d.ts +2 -1
- package/dist/src/serialize-typed-http-map.js +10 -4
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/src/inspector-glob.ts +28 -0
- package/src/openapi-spec-generator.ts +246 -0
- package/src/pikku-cli-config.ts +240 -0
- package/src/schema-generator.ts +118 -0
- package/{dist/src/events/http/serialize-fetch-wrapper.js → src/serialize-fetch-wrapper.ts} +4 -4
- package/src/serialize-import-map.ts +34 -0
- package/{dist/src/nextjs/serialize-nextjs-backend-wrapper.js → src/serialize-nextjs-backend-wrapper.ts} +11 -4
- package/{dist/src/nextjs/serialize-nextjs-http-wrapper.js → src/serialize-nextjs-http-wrapper.ts} +7 -4
- package/{dist/src/core/serialize-pikku-types.js → src/serialize-pikku-types.ts} +46 -35
- package/src/serialize-scheduler-meta.ts +18 -0
- package/src/serialize-typed-channel-map.ts +138 -0
- package/src/serialize-typed-function-map.ts +161 -0
- package/src/serialize-typed-http-map.ts +167 -0
- package/{dist/src/channels/serialize-websocket-wrapper.js → src/serialize-websocket-wrapper.ts} +4 -4
- package/src/utils.ts +284 -0
- package/tsconfig.json +21 -0
- package/dist/bin/pikku-http.d.ts +0 -5
- package/dist/bin/pikku-http.js +0 -27
- package/dist/bin/pikku-routes-map.d.ts +0 -5
- package/dist/bin/pikku-routes-map.js +0 -23
- package/dist/src/channels/serialize-channels.d.ts +0 -3
- package/dist/src/channels/serialize-channels.js +0 -19
- package/dist/src/channels/serialize-typed-channel-map.d.ts +0 -3
- package/dist/src/channels/serialize-typed-channel-map.js +0 -93
- package/dist/src/channels/serialize-websocket-wrapper.d.ts +0 -1
- package/dist/src/core/serialize-import-map.d.ts +0 -2
- package/dist/src/core/serialize-import-map.js +0 -24
- package/dist/src/core/serialize-pikku-types.d.ts +0 -4
- package/dist/src/events/channels/serialize-channels.d.ts +0 -3
- package/dist/src/events/channels/serialize-channels.js +0 -19
- package/dist/src/events/channels/serialize-typed-channel-map.d.ts +0 -3
- package/dist/src/events/channels/serialize-typed-channel-map.js +0 -90
- package/dist/src/events/channels/serialize-websocket-wrapper.d.ts +0 -1
- package/dist/src/events/channels/serialize-websocket-wrapper.js +0 -61
- package/dist/src/events/http/serialize-fetch-wrapper.d.ts +0 -1
- package/dist/src/events/http/serialize-route-imports.d.ts +0 -1
- package/dist/src/events/http/serialize-route-imports.js +0 -13
- package/dist/src/events/http/serialize-route-meta.d.ts +0 -2
- package/dist/src/events/http/serialize-route-meta.js +0 -6
- package/dist/src/events/http/serialize-typed-route-map.d.ts +0 -4
- package/dist/src/events/http/serialize-typed-route-map.js +0 -107
- package/dist/src/events/scheduler/serialize-schedulers.d.ts +0 -3
- package/dist/src/events/scheduler/serialize-schedulers.js +0 -23
- package/dist/src/http/serialize-fetch-wrapper.d.ts +0 -1
- package/dist/src/http/serialize-fetch-wrapper.js +0 -67
- package/dist/src/http/serialize-route-imports.d.ts +0 -1
- package/dist/src/http/serialize-route-imports.js +0 -13
- package/dist/src/http/serialize-route-meta.d.ts +0 -2
- package/dist/src/http/serialize-route-meta.js +0 -6
- package/dist/src/http/serialize-typed-route-map.d.ts +0 -4
- package/dist/src/http/serialize-typed-route-map.js +0 -107
- package/dist/src/nextjs/serialize-nextjs-backend-wrapper.d.ts +0 -1
- package/dist/src/nextjs/serialize-nextjs-http-wrapper.d.ts +0 -1
- package/dist/src/openapi/openapi-spec-generator.d.ts +0 -79
- package/dist/src/openapi/openapi-spec-generator.js +0 -136
- package/dist/src/scheduler/serialize-schedulers.d.ts +0 -3
- package/dist/src/scheduler/serialize-schedulers.js +0 -23
- package/dist/src/schema/schema-generator.d.ts +0 -5
- package/dist/src/schema/schema-generator.js +0 -89
- package/dist/src/serialize-typed-route-map.d.ts +0 -4
- 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)
|
package/dist/bin/pikku-all.js
CHANGED
|
@@ -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 {
|
|
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('
|
|
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,
|
|
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,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,
|
|
8
|
-
await saveSchemas(schemaDirectory, schemas, functions.typesMap,
|
|
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,
|
|
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,
|
|
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: {},
|
|
@@ -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,
|
|
5
|
-
export declare function saveSchemas(schemaParentDir: string, schemas: Record<string, JSONValue>, typesMap: TypesMap,
|
|
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,
|
|
5
|
-
const schemasSet = new Set(
|
|
6
|
-
for (const {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
26
|
-
|
|
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,
|
|
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
|
-
...
|
|
71
|
-
.map(({
|
|
72
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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.
|
|
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.
|
|
26
|
-
"@pikku/inspector": "^0.7.
|
|
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
|
+
}
|