@pikku/cli 0.7.0 → 0.7.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 +9 -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 +55 -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 +74 -0
  13. package/bin/pikku-rpc.ts +22 -0
  14. package/bin/pikku-scheduler.ts +64 -0
  15. package/bin/pikku-schemas.ts +56 -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-rpc.d.ts +3 -0
  22. package/dist/bin/pikku-rpc.js +8 -0
  23. package/dist/bin/pikku.js +0 -0
  24. package/dist/src/pikku-cli-config.d.ts +1 -0
  25. package/dist/src/pikku-cli-config.js +3 -0
  26. package/dist/src/schema-generator.js +1 -2
  27. package/dist/tsconfig.tsbuildinfo +1 -0
  28. package/package.json +3 -3
  29. package/src/inspector-glob.ts +28 -0
  30. package/src/openapi-spec-generator.ts +227 -0
  31. package/src/pikku-cli-config.ts +240 -0
  32. package/src/schema-generator.ts +136 -0
  33. package/{dist/src/events/http/serialize-fetch-wrapper.js → src/serialize-fetch-wrapper.ts} +4 -4
  34. package/src/serialize-import-map.ts +34 -0
  35. package/{dist/src/nextjs/serialize-nextjs-backend-wrapper.js → src/serialize-nextjs-backend-wrapper.ts} +11 -4
  36. package/{dist/src/nextjs/serialize-nextjs-http-wrapper.js → src/serialize-nextjs-http-wrapper.ts} +7 -4
  37. package/{dist/src/core/serialize-pikku-types.js → src/serialize-pikku-types.ts} +46 -35
  38. package/src/serialize-scheduler-meta.ts +18 -0
  39. package/src/serialize-typed-channel-map.ts +138 -0
  40. package/src/serialize-typed-function-map.ts +151 -0
  41. package/src/serialize-typed-http-map.ts +151 -0
  42. package/{dist/src/channels/serialize-websocket-wrapper.js → src/serialize-websocket-wrapper.ts} +4 -4
  43. package/src/utils.ts +284 -0
  44. package/tsconfig.json +21 -0
  45. package/dist/bin/pikku-http.d.ts +0 -5
  46. package/dist/bin/pikku-http.js +0 -27
  47. package/dist/bin/pikku-routes-map.d.ts +0 -5
  48. package/dist/bin/pikku-routes-map.js +0 -23
  49. package/dist/src/channels/serialize-channels.d.ts +0 -3
  50. package/dist/src/channels/serialize-channels.js +0 -19
  51. package/dist/src/channels/serialize-typed-channel-map.d.ts +0 -3
  52. package/dist/src/channels/serialize-typed-channel-map.js +0 -93
  53. package/dist/src/channels/serialize-websocket-wrapper.d.ts +0 -1
  54. package/dist/src/core/serialize-import-map.d.ts +0 -2
  55. package/dist/src/core/serialize-import-map.js +0 -24
  56. package/dist/src/core/serialize-pikku-types.d.ts +0 -4
  57. package/dist/src/events/channels/serialize-channels.d.ts +0 -3
  58. package/dist/src/events/channels/serialize-channels.js +0 -19
  59. package/dist/src/events/channels/serialize-typed-channel-map.d.ts +0 -3
  60. package/dist/src/events/channels/serialize-typed-channel-map.js +0 -90
  61. package/dist/src/events/channels/serialize-websocket-wrapper.d.ts +0 -1
  62. package/dist/src/events/channels/serialize-websocket-wrapper.js +0 -61
  63. package/dist/src/events/http/serialize-fetch-wrapper.d.ts +0 -1
  64. package/dist/src/events/http/serialize-route-imports.d.ts +0 -1
  65. package/dist/src/events/http/serialize-route-imports.js +0 -13
  66. package/dist/src/events/http/serialize-route-meta.d.ts +0 -2
  67. package/dist/src/events/http/serialize-route-meta.js +0 -6
  68. package/dist/src/events/http/serialize-typed-route-map.d.ts +0 -4
  69. package/dist/src/events/http/serialize-typed-route-map.js +0 -107
  70. package/dist/src/events/scheduler/serialize-schedulers.d.ts +0 -3
  71. package/dist/src/events/scheduler/serialize-schedulers.js +0 -23
  72. package/dist/src/http/serialize-fetch-wrapper.d.ts +0 -1
  73. package/dist/src/http/serialize-fetch-wrapper.js +0 -67
  74. package/dist/src/http/serialize-route-imports.d.ts +0 -1
  75. package/dist/src/http/serialize-route-imports.js +0 -13
  76. package/dist/src/http/serialize-route-meta.d.ts +0 -2
  77. package/dist/src/http/serialize-route-meta.js +0 -6
  78. package/dist/src/http/serialize-typed-route-map.d.ts +0 -4
  79. package/dist/src/http/serialize-typed-route-map.js +0 -107
  80. package/dist/src/nextjs/serialize-nextjs-backend-wrapper.d.ts +0 -1
  81. package/dist/src/nextjs/serialize-nextjs-http-wrapper.d.ts +0 -1
  82. package/dist/src/openapi/openapi-spec-generator.d.ts +0 -79
  83. package/dist/src/openapi/openapi-spec-generator.js +0 -136
  84. package/dist/src/scheduler/serialize-schedulers.d.ts +0 -3
  85. package/dist/src/scheduler/serialize-schedulers.js +0 -23
  86. package/dist/src/schema/schema-generator.d.ts +0 -5
  87. package/dist/src/schema/schema-generator.js +0 -89
  88. package/dist/src/serialize-typed-route-map.d.ts +0 -4
  89. package/dist/src/serialize-typed-route-map.js +0 -107
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @pikku/cli
2
2
 
3
+ ## 0.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 534fdef: feat: adding rpc (locally for now)
8
+ - Updated dependencies [534fdef]
9
+ - @pikku/inspector@0.7.3
10
+ - @pikku/core@0.7.3
11
+
3
12
  ## 0.7.0
4
13
 
5
14
  - Now function first. No breaking changes for end user here, just internals
@@ -0,0 +1,203 @@
1
+ import { Command } from 'commander'
2
+ import {
3
+ getFileImportRelativePath,
4
+ logInfo,
5
+ logPikkuLogo,
6
+ PikkuCLIOptions,
7
+ writeFileInDir,
8
+ } from '../src/utils.js'
9
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
10
+ import { pikkuHTTP } from './pikku-http-routes.js'
11
+ import { pikkuFunctionTypes } from './pikku-function-types.js'
12
+ import { pikkuHTTPMap } from './pikku-http-map.js'
13
+ import { existsSync } from 'fs'
14
+ import { pikkuFetch } from './pikku-fetch.js'
15
+ import { pikkuChannelsMap } from './pikku-channels-map.js'
16
+ import { pikkuChannels } from './pikku-channels.js'
17
+ import { pikkuNext } from './pikku-nextjs.js'
18
+ import { pikkuOpenAPI } from './pikku-openapi.js'
19
+ import { pikkuScheduler } from './pikku-scheduler.js'
20
+ import { pikkuSchemas } from './pikku-schemas.js'
21
+ import { pikkuWebSocket } from './pikku-websocket.js'
22
+ import { inspectorGlob } from '../src/inspector-glob.js'
23
+ import chokidar from 'chokidar'
24
+ import { pikkuFunctions } from './pikku-functions.js'
25
+ import { pikkuRPC } from './pikku-rpc.js'
26
+
27
+ const runAll = async (cliConfig: PikkuCLIConfig, options: PikkuCLIOptions) => {
28
+ const metaImports: string[] = []
29
+ const imports: string[] = []
30
+ const addImport = (from: string, type: 'meta' | 'events' | 'other') => {
31
+ const statement = `import '${getFileImportRelativePath(cliConfig.bootstrapFile, from, cliConfig.packageMappings)}'`
32
+ if (type === 'meta') {
33
+ metaImports.push(statement)
34
+ } else {
35
+ imports.push(statement)
36
+ }
37
+ }
38
+
39
+ let typesDeclarationFileExists = true
40
+ let visitState = await inspectorGlob(
41
+ cliConfig.rootDir,
42
+ cliConfig.srcDirectories,
43
+ cliConfig.filters
44
+ )
45
+
46
+ if (!existsSync(cliConfig.typesDeclarationFile)) {
47
+ typesDeclarationFileExists = false
48
+ }
49
+ await pikkuFunctionTypes(cliConfig, options, visitState)
50
+
51
+ // This is needed since the addHTTPRoute function will add the routes to the visitState
52
+ if (!typesDeclarationFileExists) {
53
+ logInfo(`• Type file first created, inspecting again...\x1b[0m`)
54
+ visitState = await inspectorGlob(
55
+ cliConfig.rootDir,
56
+ cliConfig.srcDirectories,
57
+ cliConfig.filters
58
+ )
59
+ }
60
+
61
+ const functions = pikkuFunctions(cliConfig, visitState)
62
+ if (!functions) {
63
+ logInfo(`• No functions found, skipping remaining steps...\x1b[0m`)
64
+ process.exit(1)
65
+ }
66
+ addImport(cliConfig.functionsMetaFile, 'meta')
67
+ addImport(cliConfig.functionsFile, 'events')
68
+
69
+ await pikkuRPC(cliConfig, visitState)
70
+ addImport(cliConfig.rpcFile, 'meta')
71
+
72
+ const routes = await pikkuHTTP(cliConfig, visitState)
73
+ if (routes) {
74
+ await pikkuHTTPMap(cliConfig, visitState)
75
+ await pikkuFetch(cliConfig)
76
+ addImport(cliConfig.httpRoutesMetaFile, 'meta')
77
+ addImport(cliConfig.httpRoutesFile, 'events')
78
+ }
79
+
80
+ const scheduled = await pikkuScheduler(cliConfig, visitState)
81
+ if (scheduled) {
82
+ addImport(cliConfig.schedulersMetaFile, 'meta')
83
+ addImport(cliConfig.schedulersFile, 'events')
84
+ }
85
+
86
+ const channels = await pikkuChannels(cliConfig, visitState)
87
+ if (channels) {
88
+ await pikkuChannelsMap(cliConfig, visitState)
89
+ await pikkuWebSocket(cliConfig)
90
+ addImport(cliConfig.channelsMetaFile, 'meta')
91
+ addImport(cliConfig.channelsFile, 'events')
92
+ }
93
+
94
+ const schemas = await pikkuSchemas(cliConfig, visitState)
95
+ if (schemas) {
96
+ addImport(`${cliConfig.schemaDirectory}/register.gen.ts`, 'other')
97
+ }
98
+
99
+ if (cliConfig.nextBackendFile || cliConfig.nextHTTPFile) {
100
+ await pikkuNext(cliConfig, visitState, options)
101
+ }
102
+
103
+ if (cliConfig.openAPI) {
104
+ logInfo(`• OpenAPI requires a reinspection to pickup new generated types..`)
105
+ visitState = await inspectorGlob(
106
+ cliConfig.rootDir,
107
+ cliConfig.srcDirectories,
108
+ cliConfig.filters
109
+ )
110
+ await pikkuOpenAPI(cliConfig, visitState)
111
+ }
112
+
113
+ await writeFileInDir(
114
+ cliConfig.bootstrapFile,
115
+ [...metaImports, ...imports].join('\n')
116
+ )
117
+ }
118
+
119
+ const watch = (cliConfig: PikkuCLIConfig, options: PikkuCLIOptions) => {
120
+ const configWatcher = chokidar.watch(cliConfig.srcDirectories, {
121
+ ignoreInitial: true,
122
+ ignored: /.*\.gen\.tsx?/,
123
+ })
124
+
125
+ let watcher = new chokidar.FSWatcher({})
126
+
127
+ const generatorWatcher = () => {
128
+ watcher.close()
129
+
130
+ logInfo(
131
+ `• Watching directories: \n - ${cliConfig.srcDirectories.join('\n - ')}`
132
+ )
133
+ watcher = chokidar.watch(cliConfig.srcDirectories, {
134
+ ignoreInitial: true,
135
+ ignored: /.*\.gen\.ts/,
136
+ })
137
+
138
+ watcher.on('ready', async () => {
139
+ const handle = async () => {
140
+ try {
141
+ await runAll(cliConfig, options)
142
+ } catch (err) {
143
+ console.error(err)
144
+ console.info()
145
+ }
146
+ }
147
+
148
+ await handle()
149
+
150
+ let timeout: ReturnType<typeof setTimeout> | undefined
151
+
152
+ const deduped = (_file: string) => {
153
+ if (timeout) {
154
+ clearTimeout(timeout)
155
+ }
156
+ timeout = setTimeout(handle, 10)
157
+ }
158
+
159
+ watcher.on('change', deduped)
160
+ watcher.on('add', deduped)
161
+ watcher.on('unlink', deduped)
162
+ })
163
+ }
164
+
165
+ configWatcher.on('ready', generatorWatcher)
166
+ configWatcher.on('change', generatorWatcher)
167
+ }
168
+
169
+ export const action = async (options: PikkuCLIOptions): Promise<void> => {
170
+ logPikkuLogo()
171
+
172
+ const cliConfig = await getPikkuCLIConfig(
173
+ options.config,
174
+ [],
175
+ options.tags,
176
+ true
177
+ )
178
+
179
+ if (options.watch) {
180
+ watch(cliConfig, options)
181
+ } else {
182
+ await runAll(cliConfig, options)
183
+ }
184
+ }
185
+
186
+ export const all = (program: Command): void => {
187
+ program
188
+ .command('all', { isDefault: true })
189
+ .description('Generate all the files used by pikku')
190
+ .option('-ct | --pikku-config-type', 'The type of your pikku config object')
191
+ .option(
192
+ '-ss | --singleton-services-factory-type',
193
+ 'The type of your singleton services factory'
194
+ )
195
+ .option(
196
+ '-se | --session-services-factory-type',
197
+ 'The type of your session services factory'
198
+ )
199
+ .option('-c | --config <string>', 'The path to pikku cli config file')
200
+ .option('-t | --tags <tags...>', 'Which tags to filter by')
201
+ .option('-w | --watch', 'Whether to watch file changes')
202
+ .action(action)
203
+ }
@@ -0,0 +1,55 @@
1
+ import { Command } from 'commander'
2
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
3
+ import { InspectorState } from '@pikku/inspector'
4
+ import {
5
+ logCommandInfoAndTime,
6
+ logPikkuLogo,
7
+ PikkuCLIOptions,
8
+ writeFileInDir,
9
+ } from '../src/utils.js'
10
+ import { serializeTypedChannelsMap } from '../src/serialize-typed-channel-map.js'
11
+ import { inspectorGlob } from '../src/inspector-glob.js'
12
+
13
+ export const pikkuChannelsMap = async (
14
+ { channelsMapDeclarationFile, packageMappings }: PikkuCLIConfig,
15
+ state: InspectorState
16
+ ) => {
17
+ return await logCommandInfoAndTime(
18
+ 'Creating channels map',
19
+ 'Created channels map',
20
+ [state.channels.files.size === 0],
21
+ async () => {
22
+ const content = serializeTypedChannelsMap(
23
+ channelsMapDeclarationFile,
24
+ packageMappings,
25
+ state.functions.typesMap,
26
+ state.channels.meta
27
+ )
28
+ await writeFileInDir(channelsMapDeclarationFile, content)
29
+ }
30
+ )
31
+ }
32
+
33
+ async function action(cliOptions: PikkuCLIOptions): Promise<void> {
34
+ logPikkuLogo()
35
+ const cliConfig = await getPikkuCLIConfig(
36
+ cliOptions.config,
37
+ ['rootDir', 'srcDirectories', 'httpRoutesFile'],
38
+ cliOptions.tags,
39
+ false
40
+ )
41
+ const visitState = await inspectorGlob(
42
+ cliConfig.rootDir,
43
+ cliConfig.srcDirectories,
44
+ cliConfig.filters
45
+ )
46
+ await pikkuChannelsMap(cliConfig, visitState)
47
+ }
48
+
49
+ export const channelsMap = (program: Command): void => {
50
+ program
51
+ .command('channels-map')
52
+ .description('Generate a map of all channels to aid in type checking')
53
+ .option('-c | --config <string>', 'The path to pikku cli config file')
54
+ .action(action)
55
+ }
@@ -0,0 +1,63 @@
1
+ import { Command } from 'commander'
2
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
3
+ import { InspectorState } from '@pikku/inspector'
4
+ import {
5
+ logCommandInfoAndTime,
6
+ logPikkuLogo,
7
+ PikkuCLIOptions,
8
+ serializeFileImports,
9
+ writeFileInDir,
10
+ } from '../src/utils.js'
11
+ import { inspectorGlob } from '../src/inspector-glob.js'
12
+
13
+ export const pikkuChannels = async (
14
+ cliConfig: PikkuCLIConfig,
15
+ visitState: InspectorState
16
+ ) => {
17
+ return await logCommandInfoAndTime(
18
+ 'Finding Channels',
19
+ 'Found channels',
20
+ [visitState.channels.files.size === 0],
21
+ async () => {
22
+ const { channelsFile, channelsMetaFile, packageMappings } = cliConfig
23
+ const { channels } = visitState
24
+ await writeFileInDir(
25
+ channelsFile,
26
+ serializeFileImports(
27
+ 'addChannel',
28
+ channelsFile,
29
+ channels.files,
30
+ packageMappings
31
+ )
32
+ )
33
+ await writeFileInDir(
34
+ channelsMetaFile,
35
+ `import { pikkuState } from '@pikku/core'\npikkuState('channel', 'meta', ${JSON.stringify(channels.meta, null, 2)})`
36
+ )
37
+ }
38
+ )
39
+ }
40
+
41
+ async function action(cliOptions: PikkuCLIOptions): Promise<void> {
42
+ logPikkuLogo()
43
+
44
+ const cliConfig = await getPikkuCLIConfig(
45
+ cliOptions.config,
46
+ ['rootDir', 'srcDirectories', 'httpRoutesFile'],
47
+ cliOptions.tags
48
+ )
49
+ const visitState = await inspectorGlob(
50
+ cliConfig.rootDir,
51
+ cliConfig.srcDirectories,
52
+ cliConfig.filters
53
+ )
54
+ await pikkuChannels(cliConfig, visitState)
55
+ }
56
+
57
+ export const channels = (program: Command): void => {
58
+ program
59
+ .command('channels')
60
+ .description('Find all channels to import')
61
+ .option('-c | --config <string>', 'The path to pikku cli config file')
62
+ .action(action)
63
+ }
@@ -0,0 +1,55 @@
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 { serializeFetchWrapper } from '../src/serialize-fetch-wrapper.js'
11
+
12
+ export const pikkuFetch = async ({
13
+ fetchFile,
14
+ httpRoutesMapDeclarationFile,
15
+ packageMappings,
16
+ }: PikkuCLIConfig) => {
17
+ await logCommandInfoAndTime(
18
+ 'Generating fetch wrapper',
19
+ 'Generated fetch wrapper',
20
+ [fetchFile === undefined, "fetchFile isn't set in the pikku config"],
21
+ async () => {
22
+ if (!fetchFile) {
23
+ throw new Error("fetchFile is isn't set in the pikku config")
24
+ }
25
+
26
+ const routesMapDeclarationPath = getFileImportRelativePath(
27
+ fetchFile,
28
+ httpRoutesMapDeclarationFile,
29
+ packageMappings
30
+ )
31
+
32
+ const content = [serializeFetchWrapper(routesMapDeclarationPath)]
33
+ await writeFileInDir(fetchFile, content.join('\n'))
34
+ }
35
+ )
36
+ }
37
+
38
+ export const action = async (options: PikkuCLIOptions): Promise<void> => {
39
+ logPikkuLogo()
40
+ const cliConfig = await getPikkuCLIConfig(
41
+ options.config,
42
+ ['rootDir', 'schemaDirectory', 'configDir', 'fetchFile'],
43
+ options.tags,
44
+ true
45
+ )
46
+ await pikkuFetch(cliConfig)
47
+ }
48
+
49
+ export const fetch = (program: Command): void => {
50
+ program
51
+ .command('fetch')
52
+ .description('generate fetch wrapper')
53
+ .option('-c | --config <string>', 'The path to pikku cli config file')
54
+ .action(action)
55
+ }
@@ -0,0 +1,84 @@
1
+ import { Command } from 'commander'
2
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
3
+ import { InspectorState } from '@pikku/inspector'
4
+ import {
5
+ getFileImportRelativePath,
6
+ getPikkuFilesAndMethods,
7
+ logCommandInfoAndTime,
8
+ logPikkuLogo,
9
+ PikkuCLIOptions,
10
+ writeFileInDir,
11
+ } from '../src/utils.js'
12
+ import { pikkuHTTP } from './pikku-http-routes.js'
13
+ import { inspectorGlob } from '../src/inspector-glob.js'
14
+ import { serializePikkuTypes } from '../src/serialize-pikku-types.js'
15
+
16
+ export const pikkuFunctionTypes = async (
17
+ { typesDeclarationFile: typesFile, packageMappings }: PikkuCLIConfig,
18
+ options: PikkuCLIOptions,
19
+ visitState: InspectorState
20
+ ) => {
21
+ await logCommandInfoAndTime(
22
+ 'Creating api types',
23
+ 'Created api types',
24
+ [false],
25
+ async () => {
26
+ const { userSessionType, sessionServicesType, singletonServicesType } =
27
+ await getPikkuFilesAndMethods(
28
+ visitState,
29
+ packageMappings,
30
+ typesFile,
31
+ options,
32
+ {
33
+ userSessionType: true,
34
+ sessionServiceType: true,
35
+ singletonServicesType: true,
36
+ }
37
+ )
38
+
39
+ const content = serializePikkuTypes(
40
+ `import type { ${userSessionType.type} } from '${getFileImportRelativePath(typesFile, userSessionType.typePath, packageMappings)}'`,
41
+ userSessionType.type,
42
+ `import type { ${singletonServicesType.type} } from '${getFileImportRelativePath(typesFile, singletonServicesType.typePath, packageMappings)}'`,
43
+ singletonServicesType.type,
44
+ `import type { ${sessionServicesType.type} } from '${getFileImportRelativePath(typesFile, sessionServicesType.typePath, packageMappings)}'`,
45
+ sessionServicesType.type
46
+ )
47
+ await writeFileInDir(typesFile, content)
48
+ }
49
+ )
50
+ }
51
+
52
+ async function action(cliOptions: PikkuCLIOptions): Promise<void> {
53
+ logPikkuLogo()
54
+
55
+ const cliConfig = await getPikkuCLIConfig(
56
+ cliOptions.config,
57
+ ['rootDir', 'srcDirectories', 'typesDeclarationFile'],
58
+ cliOptions.tags
59
+ )
60
+
61
+ const visitState = await inspectorGlob(
62
+ cliConfig.rootDir,
63
+ cliConfig.srcDirectories,
64
+ cliConfig.filters
65
+ )
66
+ await pikkuHTTP(cliConfig, visitState)
67
+ }
68
+
69
+ export const functionTypes = (program: Command): void => {
70
+ program
71
+ .command('types')
72
+ .description('Generate the core API')
73
+ .option('-ct | --pikku-config-type', 'The type of your pikku config object')
74
+ .option(
75
+ '-ss | --singleton-services-factory-type',
76
+ 'The type of your singleton services factory'
77
+ )
78
+ .option(
79
+ '-se | --session-services-factory-type',
80
+ 'The type of your session services factory'
81
+ )
82
+ .option('-c | --config <string>', 'The path to pikku cli config file')
83
+ .action(action)
84
+ }
@@ -0,0 +1,35 @@
1
+ import { PikkuCLIConfig } from '../src/pikku-cli-config.js'
2
+ import { InspectorState } from '@pikku/inspector'
3
+ import {
4
+ logCommandInfoAndTime,
5
+ serializeFileImports,
6
+ writeFileInDir,
7
+ } from '../src/utils.js'
8
+
9
+ export const pikkuFunctions = async (
10
+ cliConfig: PikkuCLIConfig,
11
+ visitState: InspectorState
12
+ ) => {
13
+ return await logCommandInfoAndTime(
14
+ 'Finding Pikku functions',
15
+ 'Found Pikku functions',
16
+ [visitState.functions.files.size === 0],
17
+ async () => {
18
+ const { functionsFile, functionsMetaFile, packageMappings } = cliConfig
19
+ const { functions } = visitState
20
+ await writeFileInDir(
21
+ functionsFile,
22
+ serializeFileImports(
23
+ 'addFunction',
24
+ functionsFile,
25
+ functions.files,
26
+ packageMappings
27
+ )
28
+ )
29
+ await writeFileInDir(
30
+ functionsMetaFile,
31
+ `import { pikkuState } from '@pikku/core'\npikkuState('function', 'meta', ${JSON.stringify(functions.meta, null, 2)})`
32
+ )
33
+ }
34
+ )
35
+ }
@@ -0,0 +1,55 @@
1
+ import { Command } from 'commander'
2
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
3
+ import { InspectorState } from '@pikku/inspector'
4
+ import {
5
+ logCommandInfoAndTime,
6
+ logPikkuLogo,
7
+ PikkuCLIOptions,
8
+ writeFileInDir,
9
+ } from '../src/utils.js'
10
+ import { serializeTypedRoutesMap } from '../src/serialize-typed-http-map.js'
11
+ import { inspectorGlob } from '../src/inspector-glob.js'
12
+
13
+ export const pikkuHTTPMap = async (
14
+ { httpRoutesMapDeclarationFile, packageMappings }: PikkuCLIConfig,
15
+ { http, functions }: InspectorState
16
+ ) => {
17
+ return await logCommandInfoAndTime(
18
+ 'Creating HTTP map',
19
+ 'Created HTTP map',
20
+ [http.files.size === 0],
21
+ async () => {
22
+ const content = serializeTypedRoutesMap(
23
+ httpRoutesMapDeclarationFile,
24
+ packageMappings,
25
+ functions.typesMap,
26
+ http.meta,
27
+ http.metaInputTypes
28
+ )
29
+ await writeFileInDir(httpRoutesMapDeclarationFile, content)
30
+ }
31
+ )
32
+ }
33
+
34
+ async function action(cliOptions: PikkuCLIOptions): Promise<void> {
35
+ logPikkuLogo()
36
+ const cliConfig = await getPikkuCLIConfig(
37
+ cliOptions.config,
38
+ ['rootDir', 'srcDirectories', 'httpRoutesFile'],
39
+ cliOptions.tags
40
+ )
41
+ const visitState = await inspectorGlob(
42
+ cliConfig.rootDir,
43
+ cliConfig.srcDirectories,
44
+ cliConfig.filters
45
+ )
46
+ await pikkuHTTPMap(cliConfig, visitState)
47
+ }
48
+
49
+ export const routesMap = (program: Command): void => {
50
+ program
51
+ .command('map')
52
+ .description('Generate a map of all routes to aid in type checking')
53
+ .option('-c | --config <string>', 'The path to pikku cli config file')
54
+ .action(action)
55
+ }
@@ -0,0 +1,63 @@
1
+ import { Command } from 'commander'
2
+ import { getPikkuCLIConfig, PikkuCLIConfig } from '../src/pikku-cli-config.js'
3
+ import { InspectorState } from '@pikku/inspector'
4
+ import {
5
+ logCommandInfoAndTime,
6
+ logPikkuLogo,
7
+ PikkuCLIOptions,
8
+ serializeFileImports,
9
+ writeFileInDir,
10
+ } from '../src/utils.js'
11
+ import { inspectorGlob } from '../src/inspector-glob.js'
12
+
13
+ export const pikkuHTTP = async (
14
+ cliConfig: PikkuCLIConfig,
15
+ visitState: InspectorState
16
+ ) => {
17
+ return await logCommandInfoAndTime(
18
+ 'Finding HTTP routes',
19
+ 'Found HTTP routes',
20
+ [visitState.http.files.size === 0],
21
+ async () => {
22
+ const { httpRoutesFile, httpRoutesMetaFile, packageMappings } = cliConfig
23
+ const { http } = visitState
24
+ await writeFileInDir(
25
+ httpRoutesFile,
26
+ serializeFileImports(
27
+ 'addHTTPRoute',
28
+ httpRoutesFile,
29
+ http.files,
30
+ packageMappings
31
+ )
32
+ )
33
+ await writeFileInDir(
34
+ httpRoutesMetaFile,
35
+ `import { pikkuState } from '@pikku/core'\npikkuState('http', 'meta', ${JSON.stringify(http.meta, null, 2)})`
36
+ )
37
+ }
38
+ )
39
+ }
40
+
41
+ async function action(cliOptions: PikkuCLIOptions): Promise<void> {
42
+ logPikkuLogo()
43
+
44
+ const cliConfig = await getPikkuCLIConfig(
45
+ cliOptions.config,
46
+ ['rootDir', 'srcDirectories', 'httpRoutesFile'],
47
+ cliOptions.tags
48
+ )
49
+ const visitState = await inspectorGlob(
50
+ cliConfig.rootDir,
51
+ cliConfig.srcDirectories,
52
+ cliConfig.filters
53
+ )
54
+ await pikkuHTTP(cliConfig, visitState)
55
+ }
56
+
57
+ export const routes = (program: Command): void => {
58
+ program
59
+ .command('routes')
60
+ .description('Find all routes to import')
61
+ .option('-c | --config <string>', 'The path to pikku cli config file')
62
+ .action(action)
63
+ }