vovk-cli 0.0.1-draft.99 → 0.0.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 (164) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +24 -16
  3. package/client-templates/jsBase/index.d.ts.ejs +21 -0
  4. package/client-templates/jsBase/index.js.ejs +18 -0
  5. package/client-templates/mixins/mixins.d.ts.ejs +64 -0
  6. package/client-templates/mixins/mixins.json.ejs +1 -0
  7. package/client-templates/openapiJs/openapi.d.ts.ejs +4 -0
  8. package/client-templates/openapiJs/openapi.js.ejs +4 -0
  9. package/client-templates/openapiJson/openapi.json.ejs +1 -0
  10. package/client-templates/openapiTs/openapi.ts.ejs +4 -0
  11. package/client-templates/packageJson/package.json.ejs +1 -0
  12. package/client-templates/readme/README.md.ejs +39 -0
  13. package/client-templates/schemaJs/schema.d.ts.ejs +10 -0
  14. package/client-templates/schemaJs/schema.js.ejs +29 -0
  15. package/client-templates/schemaJson/schema.json.ejs +1 -0
  16. package/client-templates/schemaTs/schema.ts.ejs +28 -0
  17. package/client-templates/tsBase/index.ts.ejs +27 -0
  18. package/dist/bundle/index.d.mts +8 -0
  19. package/dist/bundle/index.mjs +76 -0
  20. package/dist/dev/{diffSchema.d.mts → diffSegmentSchema.d.mts} +3 -3
  21. package/dist/dev/{diffSchema.mjs → diffSegmentSchema.mjs} +1 -1
  22. package/dist/dev/ensureSchemaFiles.d.mts +1 -1
  23. package/dist/dev/ensureSchemaFiles.mjs +16 -47
  24. package/dist/dev/index.d.mts +2 -0
  25. package/dist/dev/index.mjs +113 -64
  26. package/dist/dev/logDiffResult.d.mts +2 -2
  27. package/dist/dev/logDiffResult.mjs +6 -6
  28. package/dist/dev/writeMetaJson.d.mts +2 -0
  29. package/dist/dev/writeMetaJson.mjs +19 -0
  30. package/dist/dev/writeOneSegmentSchemaFile.d.mts +12 -0
  31. package/dist/dev/{writeOneSchemaFile.mjs → writeOneSegmentSchemaFile.mjs} +11 -8
  32. package/dist/generate/ensureClient.d.mts +2 -4
  33. package/dist/generate/ensureClient.mjs +26 -28
  34. package/dist/generate/generate.d.mts +13 -0
  35. package/dist/generate/generate.mjs +306 -0
  36. package/dist/generate/getClientTemplateFiles.d.mts +20 -0
  37. package/dist/generate/getClientTemplateFiles.mjs +85 -0
  38. package/dist/generate/getProjectFullSchema.d.mts +9 -0
  39. package/dist/generate/getProjectFullSchema.mjs +64 -0
  40. package/dist/generate/getTemplateClientImports.d.mts +18 -0
  41. package/dist/generate/getTemplateClientImports.mjs +36 -0
  42. package/dist/generate/index.d.mts +32 -12
  43. package/dist/generate/index.mjs +177 -85
  44. package/dist/generate/writeOneClientFile.d.mts +43 -0
  45. package/dist/generate/writeOneClientFile.mjs +150 -0
  46. package/dist/getProjectInfo/getConfig/getConfigAbsolutePaths.d.mts +5 -0
  47. package/dist/getProjectInfo/{getConfigAbsolutePaths.mjs → getConfig/getConfigAbsolutePaths.mjs} +4 -1
  48. package/dist/getProjectInfo/getConfig/getRelativeSrcRoot.d.mts +3 -0
  49. package/dist/getProjectInfo/{getRelativeSrcRoot.mjs → getConfig/getRelativeSrcRoot.mjs} +3 -3
  50. package/dist/getProjectInfo/getConfig/getTemplateDefs.d.mts +25 -0
  51. package/dist/getProjectInfo/getConfig/getTemplateDefs.mjs +168 -0
  52. package/dist/getProjectInfo/getConfig/getUserConfig.d.mts +9 -0
  53. package/dist/getProjectInfo/getConfig/getUserConfig.mjs +143 -0
  54. package/dist/getProjectInfo/getConfig/index.d.mts +15 -0
  55. package/dist/getProjectInfo/getConfig/index.mjs +92 -0
  56. package/dist/getProjectInfo/getMetaSchema.d.mts +4 -0
  57. package/dist/getProjectInfo/getMetaSchema.mjs +12 -0
  58. package/dist/getProjectInfo/index.d.mts +12 -16
  59. package/dist/getProjectInfo/index.mjs +23 -29
  60. package/dist/index.d.mts +3 -3
  61. package/dist/index.mjs +119 -40
  62. package/dist/init/checkTSConfigForExperimentalDecorators.d.mts +1 -1
  63. package/dist/init/checkTSConfigForExperimentalDecorators.mjs +2 -2
  64. package/dist/init/createConfig.d.mts +5 -3
  65. package/dist/init/createConfig.mjs +77 -27
  66. package/dist/init/index.d.mts +2 -2
  67. package/dist/init/index.mjs +117 -102
  68. package/dist/init/installDependencies.d.mts +8 -6
  69. package/dist/init/installDependencies.mjs +7 -5
  70. package/dist/init/logUpdateDependenciesError.d.mts +6 -6
  71. package/dist/init/logUpdateDependenciesError.mjs +8 -4
  72. package/dist/init/updateDependenciesWithoutInstalling.d.mts +2 -2
  73. package/dist/init/updateDependenciesWithoutInstalling.mjs +41 -11
  74. package/dist/init/updateNPMScripts.d.mts +6 -1
  75. package/dist/init/updateNPMScripts.mjs +9 -5
  76. package/dist/init/updateTypeScriptConfig.d.mts +4 -1
  77. package/dist/init/updateTypeScriptConfig.mjs +12 -8
  78. package/dist/new/addClassToSegmentCode.d.mts +1 -1
  79. package/dist/new/addClassToSegmentCode.mjs +3 -3
  80. package/dist/new/addCommonTerms.d.mts +1 -1
  81. package/dist/new/addCommonTerms.mjs +1 -1
  82. package/dist/new/index.d.mts +2 -1
  83. package/dist/new/index.mjs +6 -5
  84. package/dist/new/newModule.d.mts +5 -3
  85. package/dist/new/newModule.mjs +31 -25
  86. package/dist/new/newSegment.d.mts +5 -2
  87. package/dist/new/newSegment.mjs +23 -16
  88. package/dist/new/render.d.mts +6 -3
  89. package/dist/new/render.mjs +15 -14
  90. package/dist/types.d.mts +64 -61
  91. package/dist/utils/chalkHighlightThing.d.mts +1 -1
  92. package/dist/utils/chalkHighlightThing.mjs +1 -1
  93. package/dist/utils/compileJSONSchemaToTypeScriptType.d.mts +5 -0
  94. package/dist/utils/compileJSONSchemaToTypeScriptType.mjs +9 -0
  95. package/dist/utils/compileTs.d.mts +12 -0
  96. package/dist/utils/compileTs.mjs +261 -0
  97. package/dist/utils/debounceWithArgs.d.mts +1 -2
  98. package/dist/utils/debounceWithArgs.mjs +2 -1
  99. package/dist/utils/formatLoggedSegmentName.d.mts +3 -1
  100. package/dist/utils/formatLoggedSegmentName.mjs +4 -3
  101. package/dist/utils/generateFnName.d.mts +23 -0
  102. package/dist/utils/generateFnName.mjs +76 -0
  103. package/dist/utils/getAvailablePort.d.mts +1 -2
  104. package/dist/utils/getAvailablePort.mjs +1 -2
  105. package/dist/utils/getFileSystemEntryType.d.mts +1 -1
  106. package/dist/utils/getFileSystemEntryType.mjs +1 -1
  107. package/dist/utils/getLogger.d.mts +1 -1
  108. package/dist/utils/getLogger.mjs +1 -1
  109. package/dist/utils/getNPMPackageMetadata.d.mts +1 -1
  110. package/dist/utils/getNPMPackageMetadata.mjs +1 -1
  111. package/dist/utils/getPackageJson.d.mts +3 -0
  112. package/dist/utils/getPackageJson.mjs +23 -0
  113. package/dist/utils/getPublicModuleNameFromPath.d.mts +4 -0
  114. package/dist/utils/getPublicModuleNameFromPath.mjs +9 -0
  115. package/dist/utils/locateSegments.d.mts +12 -0
  116. package/dist/{locateSegments.mjs → utils/locateSegments.mjs} +14 -7
  117. package/dist/utils/normalizeOpenAPIMixin.d.mts +15 -0
  118. package/dist/utils/normalizeOpenAPIMixin.mjs +96 -0
  119. package/dist/utils/pickSegmentFullSchema.d.mts +3 -0
  120. package/dist/utils/pickSegmentFullSchema.mjs +15 -0
  121. package/dist/utils/prettify.d.mts +1 -1
  122. package/dist/utils/prettify.mjs +1 -1
  123. package/dist/utils/removeUnlistedDirectories.d.mts +9 -0
  124. package/dist/utils/removeUnlistedDirectories.mjs +60 -0
  125. package/dist/utils/resolveAbsoluteModulePath.d.mts +2 -0
  126. package/dist/utils/resolveAbsoluteModulePath.mjs +32 -0
  127. package/dist/utils/updateConfigProperty.d.mts +2 -0
  128. package/dist/utils/updateConfigProperty.mjs +132 -0
  129. package/module-templates/arktype/controller.ts.ejs +90 -0
  130. package/module-templates/type/controller.ts.ejs +80 -0
  131. package/module-templates/type/service.ts.ejs +43 -0
  132. package/module-templates/valibot/controller.ts.ejs +91 -0
  133. package/module-templates/zod/controller.ts.ejs +98 -0
  134. package/package.json +50 -25
  135. package/client-templates/main/main.cjs.ejs +0 -15
  136. package/client-templates/main/main.d.cts.ejs +0 -14
  137. package/client-templates/module/module.d.mts.ejs +0 -14
  138. package/client-templates/module/module.mjs.ejs +0 -24
  139. package/client-templates/python/__init__.py +0 -276
  140. package/client-templates/ts/index.ts.ejs +0 -25
  141. package/dist/dev/isSchemaEmpty.d.mts +0 -2
  142. package/dist/dev/isSchemaEmpty.mjs +0 -4
  143. package/dist/dev/writeOneSchemaFile.d.mts +0 -12
  144. package/dist/generate/getClientTemplates.d.mts +0 -16
  145. package/dist/generate/getClientTemplates.mjs +0 -42
  146. package/dist/getProjectInfo/getConfig.d.mts +0 -11
  147. package/dist/getProjectInfo/getConfig.mjs +0 -35
  148. package/dist/getProjectInfo/getConfigAbsolutePaths.d.mts +0 -4
  149. package/dist/getProjectInfo/getRelativeSrcRoot.d.mts +0 -3
  150. package/dist/getProjectInfo/getUserConfig.d.mts +0 -9
  151. package/dist/getProjectInfo/getUserConfig.mjs +0 -27
  152. package/dist/getProjectInfo/importUncachedModule.d.mts +0 -3
  153. package/dist/getProjectInfo/importUncachedModule.mjs +0 -40
  154. package/dist/getProjectInfo/importUncachedModuleWorker.d.mts +0 -1
  155. package/dist/getProjectInfo/importUncachedModuleWorker.mjs +0 -25
  156. package/dist/init/getTemplateFilesFromPackage.d.mts +0 -7
  157. package/dist/init/getTemplateFilesFromPackage.mjs +0 -59
  158. package/dist/initProgram.d.mts +0 -2
  159. package/dist/initProgram.mjs +0 -22
  160. package/dist/locateSegments.d.mts +0 -11
  161. package/dist/postinstall.d.mts +0 -1
  162. package/dist/postinstall.mjs +0 -21
  163. package/templates/controller.ejs +0 -50
  164. package/templates/service.ejs +0 -27
@@ -1,2 +0,0 @@
1
- import type { VovkSchema } from 'vovk';
2
- export default function isSchemaEmpty(schema: VovkSchema): boolean;
@@ -1,4 +0,0 @@
1
- import isEmpty from 'lodash/isEmpty.js';
2
- export default function isSchemaEmpty(schema) {
3
- return isEmpty(schema.controllers);
4
- }
@@ -1,12 +0,0 @@
1
- import type { VovkSchema } from 'vovk';
2
- import { type DiffResult } from './diffSchema.mjs';
3
- export declare const ROOT_SEGMENT_SCHEMA_NAME = "_root";
4
- export declare const JSON_DIR_NAME = "json";
5
- export default function writeOneSchemaFile({ schemaJsonOutAbsolutePath, schema, skipIfExists, }: {
6
- schemaJsonOutAbsolutePath: string;
7
- schema: VovkSchema;
8
- skipIfExists?: boolean;
9
- }): Promise<{
10
- isCreated: boolean;
11
- diffResult: DiffResult | null;
12
- }>;
@@ -1,16 +0,0 @@
1
- import type { VovkStrictConfig } from '../types.mjs';
2
- interface ClientTemplate {
3
- templateName: string;
4
- templatePath: string;
5
- outPath: string;
6
- fullSchema?: string | boolean;
7
- }
8
- export default function getClientTemplates({ config, cwd, generateFrom, }: {
9
- config: VovkStrictConfig;
10
- cwd: string;
11
- generateFrom?: VovkStrictConfig['generateFrom'];
12
- }): {
13
- clientOutDirAbsolutePath: string;
14
- templateFiles: ClientTemplate[];
15
- };
16
- export {};
@@ -1,42 +0,0 @@
1
- import path from 'node:path';
2
- export default function getClientTemplates({ config, cwd, generateFrom = [], }) {
3
- const templatesDir = path.join(import.meta.dirname, '../..', 'client-templates');
4
- const clientOutDirAbsolutePath = path.resolve(cwd, config.clientOutDir);
5
- const mapper = (dir) => (name) => ({
6
- templateName: dir,
7
- templatePath: path.resolve(templatesDir, dir, name),
8
- outPath: path.join(clientOutDirAbsolutePath, name.replace('.ejs', '')),
9
- });
10
- const builtInTemplatesMap = {
11
- ts: ['index.ts.ejs'].map(mapper('ts')),
12
- main: ['main.cjs.ejs', 'main.d.cts.ejs'].map(mapper('main')),
13
- module: ['module.mjs.ejs', 'module.d.mts.ejs'].map(mapper('module')),
14
- python: ['__init__.py'].map(mapper('python')),
15
- };
16
- const templateFiles = (generateFrom ?? config.generateFrom).reduce((acc, template) => {
17
- if (typeof template === 'string') {
18
- if (template in builtInTemplatesMap) {
19
- return [...acc, ...builtInTemplatesMap[template]];
20
- }
21
- return [
22
- ...acc,
23
- {
24
- templateName: template,
25
- templatePath: path.resolve(cwd, template),
26
- outPath: path.join(clientOutDirAbsolutePath, path.basename(template).replace('.ejs', '')),
27
- },
28
- ];
29
- }
30
- const outDirAbsolutePath = template.outDir ? path.resolve(cwd, template.outDir) : clientOutDirAbsolutePath;
31
- return [
32
- ...acc,
33
- {
34
- templateName: template.templateName ?? template.templatePath,
35
- templatePath: path.resolve(cwd, template.templatePath),
36
- outPath: path.join(outDirAbsolutePath, path.basename(template.templatePath).replace('.ejs', '')),
37
- fullSchema: template.fullSchema,
38
- },
39
- ];
40
- }, []);
41
- return { clientOutDirAbsolutePath, templateFiles };
42
- }
@@ -1,11 +0,0 @@
1
- import type { VovkStrictConfig } from '../types.mjs';
2
- export default function getConfig({ clientOutDir, cwd }: {
3
- clientOutDir?: string;
4
- cwd: string;
5
- }): Promise<{
6
- config: VovkStrictConfig;
7
- srcRoot: string;
8
- configAbsolutePaths: string[];
9
- userConfig: import("../types.mjs").VovkConfig | null;
10
- error: Error | undefined;
11
- }>;
@@ -1,35 +0,0 @@
1
- import getUserConfig from './getUserConfig.mjs';
2
- import getRelativeSrcRoot from './getRelativeSrcRoot.mjs';
3
- export default async function getConfig({ clientOutDir, cwd }) {
4
- const env = process.env;
5
- const { configAbsolutePaths, error, userConfig } = await getUserConfig({ cwd });
6
- const conf = userConfig ?? {};
7
- const srcRoot = await getRelativeSrcRoot({ cwd });
8
- const validateOnClientImport = env.VOVK_VALIDATE_ON_CLIENT_PATH ?? conf.validateOnClientImport ?? null;
9
- const fetcherImport = env.VOVK_FETCHER_PATH ?? conf.fetcherImport ?? 'vovk/dist/client/defaultFetcher.js';
10
- const createRPCImport = env.VOVK_CREATE_RPC_PATH ?? conf.createRPCImport ?? 'vovk/dist/client/createRPC.js';
11
- const defaultClientTemplates = ['ts', 'module', 'main'];
12
- const config = {
13
- modulesDir: env.VOVK_MODULES_DIR ?? conf.modulesDir ?? './' + [srcRoot, 'modules'].filter(Boolean).join('/'),
14
- validateOnClientImport: typeof validateOnClientImport === 'string' ? [validateOnClientImport] : validateOnClientImport,
15
- fetcherImport: typeof fetcherImport === 'string' ? [fetcherImport] : fetcherImport,
16
- createRPCImport: typeof createRPCImport === 'string' ? [createRPCImport] : createRPCImport,
17
- schemaOutDir: env.VOVK_SCHEMA_OUT_DIR ?? conf.schemaOutDir ?? './.vovk-schema',
18
- clientOutDir: clientOutDir ?? env.VOVK_CLIENT_OUT_DIR ?? conf.clientOutDir ?? './node_modules/.vovk-client',
19
- origin: (env.VOVK_ORIGIN ?? conf.origin ?? '').replace(/\/$/, ''), // Remove trailing slash
20
- rootEntry: env.VOVK_ROOT_ENTRY ?? conf.rootEntry ?? 'api',
21
- rootSegmentModulesDirName: env.VOVK_ROOT_SEGMENT_MODULES_DIR_NAME ?? conf.rootSegmentModulesDirName ?? '',
22
- logLevel: env.VOVK_LOG_LEVEL ?? conf.logLevel ?? 'info',
23
- prettifyClient: (env.VOVK_PRETTIFY_CLIENT ? !!env.VOVK_PRETTIFY_CLIENT : null) ?? conf.prettifyClient ?? false,
24
- devHttps: (env.VOVK_DEV_HTTPS ? !!env.VOVK_DEV_HTTPS : null) ?? conf.devHttps ?? false,
25
- generateFrom: typeof conf.generateFrom === 'function'
26
- ? conf.generateFrom(defaultClientTemplates)
27
- : (conf.generateFrom ?? ['ts', 'module', 'main']),
28
- templates: {
29
- service: 'vovk-cli/templates/service.ejs',
30
- controller: 'vovk-cli/templates/controller.ejs',
31
- ...conf.templates,
32
- },
33
- };
34
- return { config, srcRoot, configAbsolutePaths, userConfig, error };
35
- }
@@ -1,4 +0,0 @@
1
- export default function getConfigAbsolutePaths({ cwd, relativePath, }: {
2
- cwd: string;
3
- relativePath?: string;
4
- }): Promise<string[]>;
@@ -1,3 +0,0 @@
1
- export default function getRelativeSrcRoot({ cwd }: {
2
- cwd: string;
3
- }): Promise<"." | "./src">;
@@ -1,9 +0,0 @@
1
- import type { VovkConfig } from '../types.mjs';
2
- declare function getUserConfig({ cwd, }: {
3
- cwd: string;
4
- }): Promise<{
5
- userConfig: VovkConfig | null;
6
- configAbsolutePaths: string[];
7
- error?: Error;
8
- }>;
9
- export default getUserConfig;
@@ -1,27 +0,0 @@
1
- import { pathToFileURL } from 'node:url';
2
- import getConfigAbsolutePaths from './getConfigAbsolutePaths.mjs';
3
- import importUncachedModule from './importUncachedModule.mjs';
4
- async function getUserConfig({ cwd, }) {
5
- const configAbsolutePaths = await getConfigAbsolutePaths({ cwd });
6
- let userConfig;
7
- if (!configAbsolutePaths.length) {
8
- return { userConfig: null, configAbsolutePaths, error: new Error('No config file found') };
9
- }
10
- const configPath = configAbsolutePaths[0];
11
- // TODO explain
12
- try {
13
- userConfig = await importUncachedModule(configPath);
14
- }
15
- catch {
16
- try {
17
- const cacheBuster = Date.now();
18
- const configPathUrl = pathToFileURL(configPath).href;
19
- ({ default: userConfig } = (await import(`${configPathUrl}?cache=${cacheBuster}`)));
20
- }
21
- catch (e) {
22
- return { userConfig: null, configAbsolutePaths, error: e };
23
- }
24
- }
25
- return { userConfig, configAbsolutePaths };
26
- }
27
- export default getUserConfig;
@@ -1,3 +0,0 @@
1
- import './importUncachedModuleWorker.mjs';
2
- declare function importUncachedModule<T>(modulePath: string): Promise<T>;
3
- export default importUncachedModule;
@@ -1,40 +0,0 @@
1
- // importUncachedModule.js
2
- import { Worker } from 'node:worker_threads';
3
- import path from 'node:path';
4
- import { fileURLToPath } from 'node:url';
5
- import './importUncachedModuleWorker.mjs'; // required for TS compilation
6
- function importUncachedModule(modulePath) {
7
- return new Promise((resolve, reject) => {
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = path.dirname(__filename);
10
- // Resolve the path to the worker script
11
- const workerPath = path.resolve(__dirname, 'importUncachedModuleWorker.mjs');
12
- // Initialize the worker thread
13
- const worker = new Worker(workerPath, {
14
- workerData: { modulePath },
15
- });
16
- // Listen for messages from the worker
17
- worker.on('message', (d) => {
18
- const data = d;
19
- if (data.success) {
20
- resolve(data.exportDefault);
21
- }
22
- else {
23
- reject(new Error(data.error));
24
- }
25
- void worker.terminate();
26
- });
27
- // Handle errors from the worker
28
- worker.on('error', (err) => {
29
- reject(err);
30
- void worker.terminate();
31
- });
32
- // Handle worker exit
33
- worker.on('exit', (code) => {
34
- if (code !== 0) {
35
- reject(new Error(`Worker stopped with exit code ${code}`));
36
- }
37
- });
38
- });
39
- }
40
- export default importUncachedModule;
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { parentPort, workerData as wData } from 'node:worker_threads';
2
- import { pathToFileURL } from 'node:url';
3
- void (async () => {
4
- if (!parentPort)
5
- return;
6
- const workerData = wData;
7
- try {
8
- // Convert the module path to a file URL
9
- const moduleUrl = pathToFileURL(workerData.modulePath).href;
10
- // Dynamically import the module
11
- const importedModule = (await import(moduleUrl));
12
- // Send the module's exports back to the main thread
13
- parentPort?.postMessage({
14
- success: true,
15
- exportDefault: importedModule.default,
16
- });
17
- }
18
- catch (error) {
19
- // Send the error back to the main thread
20
- parentPort?.postMessage({
21
- success: false,
22
- error: error.message,
23
- });
24
- }
25
- })();
@@ -1,7 +0,0 @@
1
- import { InitOptions } from '../types.mjs';
2
- /**
3
- * Retrieves a list of files in the 'templates' folder of an NPM package.
4
- * @param packageName - The name of the NPM package.
5
- * @returns A promise that resolves to an array of file paths.
6
- */
7
- export default function getTemplateFilesFromPackage(packageName: string, channel?: InitOptions['channel']): Promise<Record<string, string>>;
@@ -1,59 +0,0 @@
1
- import { Readable } from 'node:stream';
2
- import { createGunzip } from 'node:zlib';
3
- import tar from 'tar-stream';
4
- import getNPMPackageMetadata from '../utils/getNPMPackageMetadata.mjs';
5
- // Crereated with AI
6
- /**
7
- * Retrieves a list of files in the 'templates' folder of an NPM package.
8
- * @param packageName - The name of the NPM package.
9
- * @returns A promise that resolves to an array of file paths.
10
- */
11
- export default async function getTemplateFilesFromPackage(packageName, channel = 'latest') {
12
- const metadata = await getNPMPackageMetadata(packageName);
13
- const latestVersion = metadata['dist-tags'][channel];
14
- const tarballUrl = metadata.versions[latestVersion].dist.tarball;
15
- // Fetch the tarball
16
- const tarballResponse = await fetch(tarballUrl);
17
- if (!tarballResponse.ok) {
18
- throw new Error(`Failed to fetch tarball: ${tarballResponse.statusText}`);
19
- }
20
- const tarballArrayBuffer = await tarballResponse.arrayBuffer();
21
- const tarballBuffer = Buffer.from(tarballArrayBuffer);
22
- // Extract the tarball in memory and collect template files
23
- const templateFiles = await extractTemplatesFromTarball(tarballBuffer);
24
- const entries = templateFiles
25
- .filter((fileName) => fileName.startsWith('templates/') && !fileName.endsWith('/') && fileName.endsWith('.ejs'))
26
- .map((fileName) => [fileName.substring('templates/'.length).replace(/\.ejs$/, ''), `${packageName}/${fileName}`]);
27
- return Object.fromEntries(entries);
28
- }
29
- /**
30
- * Extracts the templates from the tarball buffer.
31
- * @param tarballBuffer - The tarball data as a Buffer.
32
- * @returns A promise that resolves to an array of template file paths.
33
- */
34
- function extractTemplatesFromTarball(tarballBuffer) {
35
- return new Promise((resolve, reject) => {
36
- const extract = tar.extract();
37
- const files = [];
38
- extract.on('entry', (header, stream, next) => {
39
- const filePath = header.name;
40
- // Check if the file is in the 'templates' folder
41
- if (filePath.startsWith('package/templates/')) {
42
- files.push(filePath.replace('package/', ''));
43
- }
44
- stream.on('end', () => next());
45
- stream.resume();
46
- });
47
- extract.on('finish', () => {
48
- resolve(files);
49
- });
50
- extract.on('error', (err) => {
51
- reject(err);
52
- });
53
- // Decompress and extract the tarball buffer
54
- const gunzip = createGunzip();
55
- gunzip.on('error', reject);
56
- const tarballStream = Readable.from(tarballBuffer);
57
- tarballStream.pipe(gunzip).pipe(extract);
58
- });
59
- }
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export default function initProgram(program: Command): Command;
@@ -1,22 +0,0 @@
1
- import { Init } from './init/index.mjs';
2
- // reused at vovk-init
3
- export default function initProgram(program) {
4
- return program
5
- .argument('[prefix]', 'directory to initialize project in', '.')
6
- .description('Initialize Vovk.ts project')
7
- .option('-y, --yes', 'skip all prompts and use default values')
8
- .option('--log-level <level>', 'set log level', 'info')
9
- .option('--use-npm', 'use npm as package manager')
10
- .option('--use-yarn', 'use yarn as package manager')
11
- .option('--use-pnpm', 'use pnpm as package manager')
12
- .option('--use-bun', 'use bun as package manager')
13
- .option('--skip-install', 'skip installing dependencies')
14
- .option('--update-ts-config', 'update tsconfig.json')
15
- .option('--update-scripts <mode>', 'update package.json scripts ("implicit" or "explicit")')
16
- .option('--validation-library <library>', 'validation library to use ("vovk-zod", "vovk-yup", "vovk-dto" or another); set to "none" to skip')
17
- .option('--validate-on-client', 'path to validateOnClient file')
18
- .option('--react-query', 'use @tanstack/react-query for data fetching inside components')
19
- .option('--channel <channel>', 'channel to use for fetching packages', 'latest')
20
- .option('--dry-run', 'do not write files to disk')
21
- .action((prefix = '.', options) => new Init().main(prefix, options));
22
- }
@@ -1,11 +0,0 @@
1
- import type { VovkConfig } from './types.mjs';
2
- export type Segment = {
3
- routeFilePath: string;
4
- segmentName: string;
5
- segmentImportPath: string;
6
- };
7
- export default function locateSegments({ dir, rootDir, config, }: {
8
- dir: string;
9
- rootDir?: string;
10
- config: Required<VovkConfig> | null;
11
- }): Promise<Segment[]>;
@@ -1 +0,0 @@
1
- export {};
@@ -1,21 +0,0 @@
1
- import fs from 'node:fs/promises';
2
- import path from 'node:path';
3
- import getFileSystemEntryType from './utils/getFileSystemEntryType.mjs';
4
- async function postinstall() {
5
- // TODO: The function doesn't consider client templates, how to do that?
6
- const vovk = path.join(import.meta.dirname, '../../.vovk-client');
7
- const js = path.join(vovk, 'compiled.js');
8
- const ts = path.join(vovk, 'compiled.d.ts');
9
- const index = path.join(vovk, 'index.ts');
10
- await fs.mkdir(vovk, { recursive: true });
11
- if (!(await getFileSystemEntryType(js))) {
12
- await fs.writeFile(js, '/* postinstall */');
13
- }
14
- if (!(await getFileSystemEntryType(ts))) {
15
- await fs.writeFile(ts, '/* postinstall */');
16
- }
17
- if (!(await getFileSystemEntryType(index))) {
18
- await fs.writeFile(index, '/* postinstall */');
19
- }
20
- }
21
- void postinstall();
@@ -1,50 +0,0 @@
1
- <% const vars = {
2
- ControllerName: t.TheThing + 'Controller',
3
- ServiceName: t.TheThing + 'Service',
4
- }; %>
5
- ---
6
- dir: <%= t.defaultDir %>
7
- fileName: <%= vars.ControllerName + '.ts' %>
8
- sourceName: <%= vars.ControllerName %>
9
- compiledName: <%= t.TheThing + 'RPC' %>
10
- ---
11
-
12
- import { prefix, get, put, post, del, type VovkRequest } from 'vovk';
13
- <% if(t.withService) { %>
14
- import <%= vars.ServiceName %> from './<%= vars.ServiceName %>';
15
- <% } %>
16
-
17
- @prefix('<%= t['the-things'] %>')
18
- export default class <%= vars.ControllerName %> {
19
- @get()
20
- static get<%= t.TheThings %> = async (req: VovkRequest<null, { search: string }>) => {
21
- const search = req.nextUrl.searchParams.get('search');
22
- <% if(t.withService) { %>
23
- return <%= vars.ServiceName %>.get<%= t.TheThings %>(search);
24
- <% } else { %>
25
- return { results: [], search };
26
- <% } %>
27
- }
28
-
29
- @put(':id')
30
- static update<%= t.TheThing %> = async (req: VovkRequest<{ foo: 'bar' | 'baz' }, { q: string }>, params: { id: string }) => {
31
- const { id } = params;
32
- const body = await req.json();
33
- const q = req.nextUrl.searchParams.get('q');
34
- <% if(t.withService) { %>
35
- return <%= vars.ServiceName %>.update<%= t.TheThing %>(id, q, body);
36
- <% } else { %>
37
- return { id, body, q };
38
- <% } %>
39
- };
40
-
41
- @post()
42
- static create<%= t.TheThing %> = () => {
43
- // ...
44
- };
45
-
46
- @del(':id')
47
- static delete<%= t.TheThing %> = () => {
48
- // ...
49
- };
50
- }
@@ -1,27 +0,0 @@
1
- <% const vars = {
2
- ControllerName: t.TheThing + 'Controller',
3
- ServiceName: t.TheThing + 'Service',
4
- }; %>
5
- ---
6
- dir: <%= t.defaultDir %>
7
- fileName: <%= vars.ServiceName + '.ts' %>
8
- ---
9
-
10
- import type { VovkControllerBody, VovkControllerQuery } from 'vovk';
11
- import type <%= vars.ControllerName %> from './<%= vars.ControllerName %>';
12
-
13
- export default class <%= vars.ServiceName %> {
14
- static get<%= t.TheThings %> = (search: VovkControllerQuery<typeof <%= vars.ControllerName %>.get<%= t.TheThings %>>['search']) => {
15
- return { results: [], search };
16
- };
17
-
18
- static update<%= t.TheThing %> = (
19
- id: string,
20
- q: VovkControllerQuery<typeof <%= vars.ControllerName %>.update<%= t.TheThing %>>['q'],
21
- body: VovkControllerBody<typeof <%= vars.ControllerName %>.update<%= t.TheThing %>>
22
- ) => {
23
- return { id, q, body };
24
- };
25
-
26
- // ...
27
- }