wormajs 0.0.1 → 0.0.2-beta.0

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 (34) hide show
  1. package/README.md +96 -49
  2. package/dist/core/loader/astLoader/generates/group.js +6 -1
  3. package/dist/core/loader/astLoader/generates/interface.js +5 -1
  4. package/dist/core/loader/astLoader/normalize/rules/mergeAnyOf.js +66 -16
  5. package/dist/core/loader/astLoader/parsers/const.js +28 -0
  6. package/dist/core/loader/astLoader/parsers/forward/const.js +13 -0
  7. package/dist/core/loader/astLoader/parsers/forward/index.js +9 -1
  8. package/dist/core/loader/astLoader/parsers/index.js +2 -1
  9. package/dist/core/parser/openApiParser/helper.js +31 -10
  10. package/dist/plugins/presets/platform.js +1 -1
  11. package/dist/readConfig.js +2 -2
  12. package/dist/template/presets/alova/common/helper.cjs.handlebars +5 -3
  13. package/dist/template/presets/alova/common/services/{tag}.d.cts.handlebars +2 -2
  14. package/dist/template/presets/alova/module/helper.js.handlebars +5 -3
  15. package/dist/template/presets/alova/partials/typed-body.handlebars +1 -1
  16. package/dist/template/presets/alova-globals/common/apiDefinitions.cjs.handlebars +12 -12
  17. package/dist/template/presets/alova-globals/partials/globals-d-ts.handlebars +2 -2
  18. package/dist/template/presets/axios/common/helper.cjs.handlebars +7 -0
  19. package/dist/template/presets/axios/common/services/{tag}.d.cts.handlebars +1 -1
  20. package/dist/template/presets/axios/module/helper.js.handlebars +7 -0
  21. package/dist/template/presets/axios/typescript/services/{tag}.ts.handlebars +1 -1
  22. package/dist/template/presets/config/common/worma.config.js.handlebars +2 -2
  23. package/dist/template/presets/config/module/worma.config.js.handlebars +2 -2
  24. package/dist/template/presets/config/typescript/worma.config.ts.handlebars +2 -2
  25. package/dist/template/presets/fetch/common/helper.cjs.handlebars +7 -0
  26. package/dist/template/presets/fetch/common/services/{tag}.d.cts.handlebars +1 -1
  27. package/dist/template/presets/fetch/module/helper.js.handlebars +7 -0
  28. package/dist/template/presets/ky/module/#index.js.handlebars +14 -14
  29. package/dist/template/presets/ky/module/helper.js.handlebars +7 -0
  30. package/dist/template/presets/ky/typescript/#index.ts.handlebars +14 -14
  31. package/dist/tsconfig.build.tsbuildinfo +1 -1
  32. package/dist/utils/base.js +2 -2
  33. package/package.json +4 -3
  34. package/typings/plugins.d.ts +1 -1
package/README.md CHANGED
@@ -1,49 +1,96 @@
1
- # Worma - A modern OpenAPI code generator
2
-
3
- <p align="center">
4
- <img width="200px" src="https://alova.js.org/img/logo-text-vertical.svg" />
5
- </p>
6
-
7
- <p align="center"><b>Workflow-Streamlined next-generation request tools.<br />Extremely improve your API using efficiency and save brainpower Just one step</b></p>
8
-
9
- ---
10
-
11
- ## Usage
12
-
13
- This is a more modern openAPI generating solution for alova.js.
14
-
15
- Please to [worma documentation](https://alova.js.org/api/worma) for more details.
16
-
17
- ## Join the community
18
-
19
- - [Follow us on X to get the latest updates](https://x.com/alovajs)
20
-
21
- - [Join the Discord](https://discord.gg/S47QGJgkVb)
22
-
23
- - [Join the WeChat group](https://alova.js.org/img/wechat_qrcode.jpg)
24
-
25
- ## We need your support
26
-
27
- If you like alova, we are very grateful for giving us a star in the upper right corner, which is a recognition and encouragement for our work.
28
-
29
- ## Welcome to contribute
30
-
31
- We are honored to receive active participation from developers around the world in Issues and Discussions.
32
-
33
- We hope to make alova a common project for everyone who is willing to participate, rather than the alova team. We encourage everyone to become a contributor to the alova community with an open and inclusive attitude. Even if you are a junior developer, as long as your ideas meet the development guidelines of alova, please participate generously.
34
-
35
- Effective contributions will win you a certain reputation in the Alova community. Before contributing, please be sure to read the [Contribution Guide](https://github.com/alovajs/alova/blob/main/CONTRIBUTING.md) in detail to ensure your contribution is effective.
36
-
37
- ## Changelog
38
-
39
- [Link](https://github.com/alovajs/alova/releases)
40
-
41
- ## Contributors
42
-
43
- <a href="https://github.com/alovajs/alova/graphs/contributors">
44
- <img src="https://contrib.rocks/image?repo=alovajs/alova&max=30&columns=10" />
45
- </a>
46
-
47
- ## LICENSE
48
-
49
- [MIT](https://en.wikipedia.org/wiki/MIT_License)
1
+ # worma - A Universal OpenAPI Code Generator
2
+
3
+ <p align="center">
4
+ <img width="200px" src="https://alova.js.org/img/logo-text-vertical.svg" />
5
+ </p>
6
+
7
+ <p align="center"><b>One OpenAPI spec. Code for developers, knowledge for AI.<br />Generate API calling functions, TypeScript types, documentation, and AI Skills in a single command.</b></p>
8
+
9
+ ---
10
+
11
+ ## What is worma?
12
+
13
+ worma is a universal OpenAPI code generator that works with any backend language and any frontend request library. Provide an OpenAPI spec, and worma generates:
14
+
15
+ - **API calling functions** — ready to import and use in your project
16
+ - **TypeScript type definitions** — full type safety for request/response
17
+ - **In-editor documentation** — hover docs, sidebar API explorer via VSCode extension
18
+ - **AI Skills** — structured API knowledge for coding agents (Cursor, Copilot, etc.)
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ npm i wormajs -D
24
+ ```
25
+
26
+ ## Quick Start
27
+
28
+ ```bash
29
+ # Initialize configuration
30
+ npx worma init
31
+
32
+ # Generate API code
33
+ npx worma gen
34
+ ```
35
+
36
+ ## Templates
37
+
38
+ worma ships with pre-built templates for popular request libraries:
39
+
40
+ | Template | Library | Notes |
41
+ | -------------- | ------------ | ------------------------------------- |
42
+ | `alova` | alova@3 | Functional, tree-shakeable |
43
+ | `alovaGlobals` | alova@3 | Global `Apis.xxx`, migration-friendly |
44
+ | `axios` | axios | Most popular HTTP client |
45
+ | `fetch` | native fetch | Zero dependencies |
46
+ | `ky` | ky | Lightweight fetch wrapper |
47
+
48
+ Custom Handlebars templates are also supported.
49
+
50
+ ## Plugins
51
+
52
+ Built-in plugins include: `aiDoc`, `apifox`, `filterApi`, `importType`, `payloadModifier`, `platform`, `rename`, `tagModifier`.
53
+
54
+ ## Documentation
55
+
56
+ Please refer to the [worma documentation](https://worma.js.org) for full details.
57
+
58
+ ## Migration from @alova/wormhole
59
+
60
+ ```bash
61
+ npx skills add alovajs/skills --skill worma-guidelines
62
+ ```
63
+
64
+ Then ask your coding agent: "Please migrate this project from @alova/wormhole to worma."
65
+
66
+ ## Join the community
67
+
68
+ - [Follow us on X to get the latest updates](https://x.com/alovajs)
69
+ - [Join the Discord](https://discord.gg/S47QGJgkVb)
70
+ - [Join the WeChat group](https://alova.js.org/img/wechat_qrcode.jpg)
71
+
72
+ ## We need your support
73
+
74
+ If you like worma, please give us a star! It's a recognition and encouragement for our work.
75
+
76
+ ## Welcome to contribute
77
+
78
+ We are honored to receive active participation from developers around the world in Issues and Discussions.
79
+
80
+ We hope to make worma a common project for everyone who is willing to participate. We encourage everyone to become a contributor to the worma community with an open and inclusive attitude. Even if you are a junior developer, as long as your ideas meet the development guidelines, please participate generously.
81
+
82
+ Effective contributions will win you a certain reputation in the worma community. Before contributing, please be sure to read the [Contribution Guide](https://github.com/alovajs/alova/blob/main/CONTRIBUTING.md) in detail.
83
+
84
+ ## Changelog
85
+
86
+ [Link](https://github.com/alovajs/alova/releases)
87
+
88
+ ## Contributors
89
+
90
+ <a href="https://github.com/alovajs/alova/graphs/contributors">
91
+ <img src="https://contrib.rocks/image?repo=alovajs/alova&max=30&columns=10" />
92
+ </a>
93
+
94
+ ## LICENSE
95
+
96
+ [MIT](https://en.wikipedia.org/wiki/MIT_License)
@@ -20,7 +20,12 @@ function groupTypeGenerator(ast, ctx) {
20
20
  // In UNION (|), INTERSECTION members do NOT need parens because `&` already binds tighter
21
21
  const memberTsStr = (0, utils_1.getValue)(nextValue, ctx.options);
22
22
  const producesUnionLike = item.type === type_1.ASTType.UNION || item.type === type_1.ASTType.ENUM;
23
- const needsParens = ast.type === type_1.ASTType.INTERSECTION && producesUnionLike;
23
+ let needsParens = ast.type === type_1.ASTType.INTERSECTION && producesUnionLike;
24
+ // In UNION (|), wrap block-like members that contain const discriminators
25
+ // (key:"value" literal properties) so discriminated union branches are clearly
26
+ // delimited (see issue #824).
27
+ if (!needsParens && ast.type === type_1.ASTType.UNION && /\w+:"[^"]*"/.test(memberTsStr))
28
+ needsParens = true;
24
29
  groups.push(needsParens ? `(${memberTsStr})` : memberTsStr);
25
30
  });
26
31
  switch (ast.type) {
@@ -36,7 +36,11 @@ function normalInterfaceGenerator(ast, ctx) {
36
36
  ctx.pathKey = keyName;
37
37
  const nextResult = ctx.next(param.ast, ctx.options);
38
38
  const value = (0, utils_1.getValue)(nextResult, ctx.options);
39
- `${nextResult.comment ?? ''}${keyName}${optionalFlag}: ${value}`.split('\n').forEach(line => lines.push(` ${line}`));
39
+ // Literal (const) properties are rendered without a space after the colon
40
+ // so the generated property keeps the form key:"value" (see issue #824).
41
+ const sep = param.ast.type === type_1.ASTType.LITERAL ? ':' : ': ';
42
+ const propLine = `${nextResult.comment ?? ''}${keyName}${optionalFlag}${sep}${value}`;
43
+ propLine.split('\n').forEach(line => lines.push(` ${line}`));
40
44
  });
41
45
  if (ast.addParams) {
42
46
  ctx.pathKey = '[key: string]';
@@ -1,6 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = mergeAnyOf;
4
+ /**
5
+ * 检测两个 schema 在某个共享属性上是否构成判别式。
6
+ * 当不同分支对同一字段使用不同的 const 或 enum 时,合并这些分支会
7
+ * 丢掉判别信息,因此应保留为独立的联合分支。
8
+ */
9
+ function hasDiscriminatorConflict(a, b) {
10
+ const aProps = (a.properties ?? {});
11
+ const bProps = (b.properties ?? {});
12
+ for (const key of Object.keys(aProps)) {
13
+ if (!(key in bProps)) {
14
+ continue;
15
+ }
16
+ const ap = aProps[key];
17
+ const bp = bProps[key];
18
+ // 不同的 const 值 → 判别式
19
+ if (ap.const !== undefined && bp.const !== undefined && ap.const !== bp.const) {
20
+ return true;
21
+ }
22
+ // 一个 const、一个 enum → 判别式
23
+ if ((ap.const !== undefined && bp.enum) || (bp.const !== undefined && ap.enum)) {
24
+ return true;
25
+ }
26
+ // 不同的 enum 值 → 判别式
27
+ if (ap.enum && bp.enum) {
28
+ const aKey = JSON.stringify([...ap.enum].sort());
29
+ const bKey = JSON.stringify([...bp.enum].sort());
30
+ if (aKey !== bKey) {
31
+ return true;
32
+ }
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ /**
38
+ * 组内任意两个分支存在判别式冲突即视为有冲突。
39
+ */
40
+ function groupHasDiscriminatorConflict(group) {
41
+ for (let i = 0; i < group.length; i++) {
42
+ for (let j = i + 1; j < group.length; j++) {
43
+ if (hasDiscriminatorConflict(group[i], group[j])) {
44
+ return true;
45
+ }
46
+ }
47
+ }
48
+ return false;
49
+ }
4
50
  function mergeAnyOf(schema) {
5
51
  if (!schema.anyOf || schema.anyOf.length < 2) {
6
52
  return;
@@ -17,26 +63,30 @@ function mergeAnyOf(schema) {
17
63
  for (const group of typeMap.values()) {
18
64
  if (group.length === 1) {
19
65
  mergedAnyOf.push(group[0]);
66
+ continue;
20
67
  }
21
- else {
22
- const merged = { type: group[0].type };
23
- for (const sub of group) {
24
- for (const [key, value] of Object.entries(sub)) {
25
- if (key === 'type')
26
- continue;
27
- if (merged[key] === undefined) {
28
- merged[key] = value;
29
- }
30
- else if (Array.isArray(merged[key]) && Array.isArray(value)) {
31
- merged[key] = Array.from(new Set([...merged[key], ...value]));
32
- }
33
- else if (typeof merged[key] === 'object' && typeof value === 'object') {
34
- merged[key] = { ...merged[key], ...value };
35
- }
68
+ // 组内分支之间只要存在判别式冲突,就保留原始分支不做合并
69
+ if (groupHasDiscriminatorConflict(group)) {
70
+ mergedAnyOf.push(...group);
71
+ continue;
72
+ }
73
+ const merged = { type: group[0].type };
74
+ for (const sub of group) {
75
+ for (const [key, value] of Object.entries(sub)) {
76
+ if (key === 'type')
77
+ continue;
78
+ if (merged[key] === undefined) {
79
+ merged[key] = value;
80
+ }
81
+ else if (Array.isArray(merged[key]) && Array.isArray(value)) {
82
+ merged[key] = Array.from(new Set([...merged[key], ...value]));
83
+ }
84
+ else if (typeof merged[key] === 'object' && typeof value === 'object') {
85
+ merged[key] = { ...merged[key], ...value };
36
86
  }
37
87
  }
38
- mergedAnyOf.push(merged);
39
88
  }
89
+ mergedAnyOf.push(merged);
40
90
  }
41
91
  if (mergedAnyOf.length === schema.anyOf.length && mergedAnyOf.every((s, i) => s === schema.anyOf[i])) {
42
92
  return;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.constTypeParser = constTypeParser;
4
+ const type_1 = require("../../../../type");
5
+ const utils_1 = require("./utils");
6
+ /**
7
+ * 将带有 const 关键字的 JSON Schema 解析为字面量 AST 节点。
8
+ * 例如:
9
+ * { "type": "string", "const": "email" } -> "email"
10
+ * { "type": "number", "const": 1 } -> 1
11
+ * { "const": true } -> true
12
+ * { "const": "authorization_code" } -> "authorization_code"
13
+ *
14
+ * 参考:JSON Schema draft-04+ 允许 `const` 与 `type` 同时出现,
15
+ * 表示该字段必须等于 `const` 的值,对应到 TypeScript 即字面量类型。
16
+ */
17
+ function constTypeParser(schema, ctx) {
18
+ const result = {
19
+ ...(0, utils_1.initAST)(schema, ctx),
20
+ type: type_1.ASTType.LITERAL,
21
+ params: schema.const,
22
+ };
23
+ return result;
24
+ }
25
+ exports.default = {
26
+ type: 'const',
27
+ parse: constTypeParser,
28
+ };
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * 带有 const 关键字的 schema 优先路由到 const 解析器,
5
+ * 即使 schema 同时声明了 type(如 `{ "type": "string", "const": "email" }`),
6
+ * 也能正确产出字面量类型。
7
+ */
8
+ exports.default = {
9
+ is(schema) {
10
+ return schema && schema.const !== undefined && schema.const !== null;
11
+ },
12
+ to: 'const',
13
+ };
@@ -6,11 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.forwarders = void 0;
7
7
  exports.forward = forward;
8
8
  const array_1 = __importDefault(require("./array"));
9
+ const const_1 = __importDefault(require("./const"));
9
10
  const enum_1 = __importDefault(require("./enum"));
10
11
  const group_1 = __importDefault(require("./group"));
11
12
  const object_1 = __importDefault(require("./object"));
12
13
  const tuple_1 = __importDefault(require("./tuple"));
13
- exports.forwarders = [object_1.default, enum_1.default, tuple_1.default, array_1.default, group_1.default];
14
+ exports.forwarders = [
15
+ object_1.default,
16
+ enum_1.default,
17
+ tuple_1.default,
18
+ array_1.default,
19
+ const_1.default,
20
+ group_1.default,
21
+ ];
14
22
  function forward(schema) {
15
23
  for (const forwarder of exports.forwarders) {
16
24
  if (forwarder.is(schema)) {
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.astParse = astParse;
21
21
  const type_1 = require("../../../../type");
22
22
  const array_1 = __importDefault(require("./array"));
23
+ const const_1 = __importDefault(require("./const"));
23
24
  const enum_1 = __importDefault(require("./enum"));
24
25
  const group_1 = __importDefault(require("./group"));
25
26
  const object_1 = __importDefault(require("./object"));
@@ -33,7 +34,7 @@ function astParse(schema, options) {
33
34
  const value = (0, utils_1.parse)(schema, {
34
35
  type: (0, utils_1.getParserSchemaType)(schema),
35
36
  ctx,
36
- parsers: [array_1.default, object_1.default, enum_1.default, simple_1.default, reference_1.default, tuple_1.default, group_1.default],
37
+ parsers: [array_1.default, object_1.default, enum_1.default, const_1.default, simple_1.default, reference_1.default, tuple_1.default, group_1.default],
37
38
  });
38
39
  if (!value) {
39
40
  return {
@@ -9,6 +9,7 @@ const node_fs_1 = require("node:fs");
9
9
  const promises_1 = __importDefault(require("node:fs/promises"));
10
10
  const node_path_1 = __importDefault(require("node:path"));
11
11
  const js_yaml_1 = __importDefault(require("js-yaml"));
12
+ const swagger2openapi_1 = __importDefault(require("swagger2openapi"));
12
13
  const poolManager_1 = require("../../../core/workerPool/poolManager");
13
14
  const helper_1 = require("../../../helper");
14
15
  const utils_1 = require("../../../utils");
@@ -16,28 +17,48 @@ const supportedExtname = ['json', 'yaml'];
16
17
  function isSwagger2(data) {
17
18
  return !!data?.swagger;
18
19
  }
19
- /** 9.3.4: Run CPU-heavy Swagger2→OpenAPI3 conversion via PoolManager */
20
+ /** Main-thread Swagger2→OpenAPI3 conversion used as a fallback when the worker pool is unavailable. */
21
+ function convertSwagger2OnMainThread(data) {
22
+ return swagger2openapi_1.default
23
+ .convertObj(data, { warnOnly: true })
24
+ .then(result => result.openapi);
25
+ }
26
+ /**
27
+ * 9.3.4: Run CPU-heavy Swagger2→OpenAPI3 conversion via PoolManager (worker thread).
28
+ * If the worker pool cannot be created or fails at runtime (e.g. test/CI environments
29
+ * where the `.ts` worker cannot be loaded as a worker, or worker_threads is unavailable),
30
+ * gracefully fall back to the main-thread conversion so generation still succeeds.
31
+ */
20
32
  function convertSwagger2Async(data) {
21
- return new Promise((resolve, reject) => {
22
- // Resolve worker path: .js for production, .ts for vitest/dev
23
- // In mocked filesystem envs, existsSync may return false — fall back to trying both paths
24
- const jsPath = node_path_1.default.resolve(__dirname, '../../workerPool/swagger2Worker.js');
25
- const tsPath = node_path_1.default.resolve(__dirname, '../../workerPool/swagger2Worker.ts');
26
- const workerScript = (0, node_fs_1.existsSync)(jsPath) ? jsPath : tsPath;
27
- const pool = poolManager_1.PoolManager.getInstance().get({
33
+ // Resolve worker path: .js for production, .ts for vitest/dev
34
+ // In mocked filesystem envs, existsSync may return false — fall back to trying both paths
35
+ const jsPath = node_path_1.default.resolve(__dirname, '../../workerPool/swagger2Worker.js');
36
+ const tsPath = node_path_1.default.resolve(__dirname, '../../workerPool/swagger2Worker.ts');
37
+ const workerScript = (0, node_fs_1.existsSync)(jsPath) ? jsPath : tsPath;
38
+ let pool;
39
+ try {
40
+ pool = poolManager_1.PoolManager.getInstance().get({
28
41
  key: 'swagger2Worker',
29
42
  workerScript,
30
43
  sharedContext: {},
31
44
  poolSize: 1,
32
45
  });
46
+ }
47
+ catch {
48
+ return convertSwagger2OnMainThread(data);
49
+ }
50
+ return new Promise((resolve, reject) => {
33
51
  pool.processBatch([data]).then((results) => {
34
52
  if (results.length > 0 && results[0].openapi) {
35
53
  resolve(results[0].openapi);
36
54
  }
37
55
  else {
38
- reject(new Error('Empty result from swagger2 conversion'));
56
+ convertSwagger2OnMainThread(data).then(resolve, reject);
39
57
  }
40
- }).catch(reject);
58
+ }).catch(() => {
59
+ // Worker failed (script load error, thread crash, etc.) — fall back to main thread
60
+ convertSwagger2OnMainThread(data).then(resolve, reject);
61
+ });
41
62
  });
42
63
  }
43
64
  // Parse local openapi files
@@ -44,7 +44,7 @@ function resolvePlatformUrls(baseUrl, platformType) {
44
44
  *
45
45
  * @example
46
46
  * ```ts
47
- * import { platform, alovaGlobals } from 'worma/plugin';
47
+ * import { platform, alovaGlobals } from 'wormajs/plugin';
48
48
  *
49
49
  * defineConfig({
50
50
  * generator: [{
@@ -41,8 +41,8 @@ async function readConfig(projectPath = process.cwd()) {
41
41
  const userDependencies = await (0, utils_1.getUserInstalledDependencies)(projectPath);
42
42
  // 始终将 worma 自身作为外部依赖,防止 esbuild 打包 worma 源码进入临时文件
43
43
  // 否则 __dirname 会指向用户项目目录,导致预设模板路径解析失败
44
- // monorepo 子包可能不直接依赖 worma,但 config 文件会 import from 'worma'
45
- const allExternals = [...new Set([...userDependencies, 'worma', 'worma/plugin'])];
44
+ // monorepo 子包可能不直接依赖 wormajs,但 config 文件会 import from 'wormajs'
45
+ const allExternals = [...new Set([...userDependencies, 'worma', 'wormajs/plugin'])];
46
46
  const configTmpFileName = `alova_tmp_${Date.now()}.cjs`;
47
47
  // 使用绝对路径:esbuild 写入相对 outfile 时按 cwd 解析,
48
48
  // 而 require() 解析相对路径时基于调用模块所在目录,二者不一致会导致 require 失败。
@@ -4,9 +4,11 @@ function buildPayload(url, defaultConfig, apiName, config) {
4
4
  }
5
5
 
6
6
  /**
7
- * @param {Record<string, any>} _ - tagged api map (unused at runtime)
8
- * @param {Record<string, any>} configMap - default config per api name
9
- * @returns {Record<string, any>}
7
+ * @template {Record<string, (config: any) => any>} TagedMap
8
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
9
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
10
+ * @param {ConfigMap} configMap - default config per api name
11
+ * @returns {ConfigMap}
10
12
  */
11
13
  const setMethodDefaultConfig = (_, configMap) => configMap;
12
14
 
@@ -1,8 +1,8 @@
1
- import type { Alova2Method, Alova2MethodConfig } from '../typed';
1
+ import type { Alova2Method, Alova2MethodConfig } from '../typed.d.cts';
2
2
  {{#each tagedApis}}
3
3
  import type { {{{tagName}}}DefaultConfig } from '.';
4
4
  {{/each}}
5
- import type * as ComponentTypes from '../components';
5
+ import type * as ComponentTypes from '../components.d.cts';
6
6
 
7
7
  {{#each tagedApis}}
8
8
  {{> extract-responded}}
@@ -4,8 +4,10 @@ export function buildPayload(url, defaultConfig, apiName, config) {
4
4
  }
5
5
 
6
6
  /**
7
- * @param {Record<string, any>} _ - tagged api map (unused at runtime)
8
- * @param {Record<string, any>} configMap - default config per api name
9
- * @returns {Record<string, any>}
7
+ * @template {Record<string, (config: any) => any>} TagedMap
8
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
9
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
10
+ * @param {ConfigMap} configMap - default config per api name
11
+ * @returns {ConfigMap}
10
12
  */
11
13
  export const setMethodDefaultConfig = (_, configMap) => configMap;
@@ -1,4 +1,4 @@
1
- import type { alovaInstance } from './index';
1
+ import type { alovaInstance } from './index{{#if (eq type "commonjs")}}.cjs{{/if}}';
2
2
  import type { Alova, AlovaGenerics, AlovaMethodCreateConfig, Method } from 'alova';
3
3
 
4
4
  type CollapsedAlova = typeof alovaInstance;
@@ -1,12 +1,12 @@
1
- {{> comment}}
2
- {{#if config.useImportType}}/// <reference types='./globals.d.ts' />{{else}}/// <reference types='./globals.d.ts' />{{/if}}
3
-
4
- const apiDefinitions = {
5
- {{#each tagedApis}}
6
- {{#apis}}
7
- '{{{tag}}}.{{{name}}}': ['{{method}}', '{{{path}}}'],
8
- {{/apis}}
9
- {{/each}}
10
- };
11
-
12
- module.exports = apiDefinitions;
1
+ {{> comment}}
2
+ {{#if config.useImportType}}/// <reference types='./globals.d.cts' />{{else}}/// <reference types='./globals.d.cts' />{{/if}}
3
+
4
+ const apiDefinitions = {
5
+ {{#each tagedApis}}
6
+ {{#apis}}
7
+ '{{{tag}}}.{{{name}}}': ['{{method}}', '{{{path}}}'],
8
+ {{/apis}}
9
+ {{/each}}
10
+ };
11
+
12
+ module.exports = apiDefinitions;
@@ -1,6 +1,6 @@
1
1
  import type { Alova, AlovaMethodCreateConfig, AlovaGenerics, Method } from 'alova';
2
- import type { alovaInstance, $$userConfigMap } from './index';
3
- import type apiDefinitions from './apiDefinitions';
2
+ import type { alovaInstance, $$userConfigMap } from './index{{#if (eq type "commonjs")}}.cjs{{/if}}';
3
+ import type apiDefinitions from './apiDefinitions{{#if (eq type "commonjs")}}.cjs{{/if}}';
4
4
 
5
5
  type CollapsedAlova = typeof alovaInstance;
6
6
  type UserMethodConfigMap = typeof $$userConfigMap;
@@ -22,6 +22,13 @@ function buildPayload(url, defaultConfig, apiName, config) {
22
22
  return { url: resolvedUrl, mergedConfig };
23
23
  }
24
24
 
25
+ /**
26
+ * @template {Record<string, (config: any) => any>} TagedMap
27
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
28
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
29
+ * @param {ConfigMap} configMap - default config per api name
30
+ * @returns {ConfigMap}
31
+ */
25
32
  const setDefaultConfig = (_, configMap) => configMap;
26
33
 
27
34
  module.exports = { buildPayload, setDefaultConfig };
@@ -1,5 +1,5 @@
1
1
  import type { AxiosRequestConfig } from 'axios';
2
- import type * as ComponentTypes from '../components';
2
+ import type * as ComponentTypes from '../components.d.cts';
3
3
 
4
4
  {{#each tagedApis}}
5
5
  {{#each apis}}
@@ -22,4 +22,11 @@ export function buildPayload(url, defaultConfig, apiName, config) {
22
22
  return { url: resolvedUrl, mergedConfig };
23
23
  }
24
24
 
25
+ /**
26
+ * @template {Record<string, (config: any) => any>} TagedMap
27
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
28
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
29
+ * @param {ConfigMap} configMap - default config per api name
30
+ * @returns {ConfigMap}
31
+ */
25
32
  export const setDefaultConfig = (_, configMap) => configMap;
@@ -24,7 +24,7 @@ export function {{{name}}}(config: {{{name}}}ExtraConfig): Promise<{{{name}}}Res
24
24
  url,
25
25
  ...mergedConfig,{{#if (eq response "Blob")}}
26
26
  responseType: 'blob',{{/if}}
27
- }){{#if (eq response "Blob")}}.then((data: any) => data instanceof Blob ? data : new Blob([data])){{/if}} as Promise<{{{name}}}Response>;
27
+ }){{#if (eq response "Blob")}}.then((data: any) => data instanceof Blob ? data : new Blob([data])){{/if}};
28
28
  }
29
29
 
30
30
  {{/each}}
@@ -1,5 +1,5 @@
1
- const { defineConfig } = require('worma');
2
- const { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } = require('worma/plugin');
1
+ const { defineConfig } = require('wormajs');
2
+ const { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } = require('wormajs/plugin');
3
3
 
4
4
  // For more config detailed visit:
5
5
  // https://github.com/alovajs/devtools
@@ -1,5 +1,5 @@
1
- import { defineConfig } from 'worma';
2
- import { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } from 'worma/plugin';
1
+ import { defineConfig } from 'wormajs';
2
+ import { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } from 'wormajs/plugin';
3
3
 
4
4
  // For more config detailed visit:
5
5
  // https://github.com/alovajs/devtools
@@ -1,5 +1,5 @@
1
- import { defineConfig } from 'worma';
2
- import { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } from 'worma/plugin';
1
+ import { defineConfig } from 'wormajs';
2
+ import { platform, aiDoc{{#if templateImport}}, {{{templateImport}}}{{/if}} } from 'wormajs/plugin';
3
3
 
4
4
  // For more config detailed visit:
5
5
  // https://github.com/alovajs/devtools
@@ -22,6 +22,13 @@ function buildPayload(url, defaultConfig, apiName, config) {
22
22
  return { url: resolvedUrl, mergedConfig };
23
23
  }
24
24
 
25
+ /**
26
+ * @template {Record<string, (config: any) => any>} TagedMap
27
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
28
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
29
+ * @param {ConfigMap} configMap - default config per api name
30
+ * @returns {ConfigMap}
31
+ */
25
32
  const setDefaultConfig = (_, configMap) => configMap;
26
33
 
27
34
  module.exports = { buildPayload, setDefaultConfig };
@@ -1,4 +1,4 @@
1
- import type * as ComponentTypes from '../components';
1
+ import type * as ComponentTypes from '../components.d.cts';
2
2
 
3
3
  {{#each tagedApis}}
4
4
  {{#each apis}}
@@ -22,4 +22,11 @@ export function buildPayload(url, defaultConfig, apiName, config) {
22
22
  return { url: resolvedUrl, mergedConfig };
23
23
  }
24
24
 
25
+ /**
26
+ * @template {Record<string, (config: any) => any>} TagedMap
27
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
28
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
29
+ * @param {ConfigMap} configMap - default config per api name
30
+ * @returns {ConfigMap}
31
+ */
25
32
  export const setDefaultConfig = (_, configMap) => configMap;
@@ -1,14 +1,14 @@
1
- {{> comment}}
2
- import ky from 'ky';
3
-
4
- export const kyInstance = ky.create({
5
- prefix: '{{{baseUrl}}}/',
6
- hooks: {
7
- beforeRequest: [
8
- _state => { },
9
- ],
10
- afterResponse: [
11
- _state => { },
12
- ],
13
- },
14
- });
1
+ {{> comment}}
2
+ import ky from 'ky';
3
+
4
+ export const kyInstance = ky.create({
5
+ prefix: '{{{baseUrl}}}/',
6
+ hooks: {
7
+ beforeRequest: [
8
+ _state => { },
9
+ ],
10
+ afterResponse: [
11
+ _state => { },
12
+ ],
13
+ },
14
+ });
@@ -24,4 +24,11 @@ export function buildPayload(url, defaultConfig, apiName, config) {
24
24
  return { url: resolvedUrl, mergedConfig };
25
25
  }
26
26
 
27
+ /**
28
+ * @template {Record<string, (config: any) => any>} TagedMap
29
+ * @template \{{ [K in keyof TagedMap]?: Partial<Parameters<TagedMap[K]>[0]> }} ConfigMap
30
+ * @param {TagedMap} _ - tagged api map (unused at runtime)
31
+ * @param {ConfigMap} configMap - default config per api name
32
+ * @returns {ConfigMap}
33
+ */
27
34
  export const setDefaultConfig = (_, configMap) => configMap;
@@ -1,14 +1,14 @@
1
- {{> comment}}
2
- import ky from 'ky';
3
-
4
- export const kyInstance = ky.create({
5
- prefix: '{{{baseUrl}}}/',
6
- hooks: {
7
- beforeRequest: [
8
- _state => { },
9
- ],
10
- afterResponse: [
11
- _state => { },
12
- ],
13
- },
14
- });
1
+ {{> comment}}
2
+ import ky from 'ky';
3
+
4
+ export const kyInstance = ky.create({
5
+ prefix: '{{{baseUrl}}}/',
6
+ hooks: {
7
+ beforeRequest: [
8
+ _state => { },
9
+ ],
10
+ afterResponse: [
11
+ _state => { },
12
+ ],
13
+ },
14
+ });
@@ -1 +1 @@
1
- {"root":["../src/config.ts","../src/constant.ts","../src/createConfig.ts","../src/defineConfig.ts","../src/generate.ts","../src/index.ts","../src/readConfig.ts","../src/resolveWorkspaces.ts","../src/bin/actions.ts","../src/bin/cli.ts","../src/bin/progressRenderer.ts","../src/bin/renderer.ts","../src/bin/theme.ts","../src/core/WorkerPool.ts","../src/core/loader/index.ts","../src/core/loader/astLoader/helper.ts","../src/core/loader/astLoader/index.ts","../src/core/loader/astLoader/generates/array.ts","../src/core/loader/astLoader/generates/enum.ts","../src/core/loader/astLoader/generates/group.ts","../src/core/loader/astLoader/generates/index.ts","../src/core/loader/astLoader/generates/interface.ts","../src/core/loader/astLoader/generates/simple.ts","../src/core/loader/astLoader/generates/tuple.ts","../src/core/loader/astLoader/generates/type.ts","../src/core/loader/astLoader/generates/utils.ts","../src/core/loader/astLoader/normalize/index.ts","../src/core/loader/astLoader/normalize/normalizer.ts","../src/core/loader/astLoader/normalize/rules/convertTypeArray.ts","../src/core/loader/astLoader/normalize/rules/handleEmptyType.ts","../src/core/loader/astLoader/normalize/rules/inferType.ts","../src/core/loader/astLoader/normalize/rules/mergeAnyOf.ts","../src/core/loader/astLoader/normalize/rules/normalizeCombiningKeywords.ts","../src/core/loader/astLoader/normalize/rules/normalizeEnum.ts","../src/core/loader/astLoader/normalize/rules/normalizeNullType.ts","../src/core/loader/astLoader/normalize/rules/removeRedundantKeywords.ts","../src/core/loader/astLoader/normalize/rules/simplifySingleType.ts","../src/core/loader/astLoader/normalize/rules/validateSchema.ts","../src/core/loader/astLoader/parsers/array.ts","../src/core/loader/astLoader/parsers/enum.ts","../src/core/loader/astLoader/parsers/group.ts","../src/core/loader/astLoader/parsers/index.ts","../src/core/loader/astLoader/parsers/object.ts","../src/core/loader/astLoader/parsers/reference.ts","../src/core/loader/astLoader/parsers/simple.ts","../src/core/loader/astLoader/parsers/tuple.ts","../src/core/loader/astLoader/parsers/type.ts","../src/core/loader/astLoader/parsers/utils.ts","../src/core/loader/astLoader/parsers/forward/array.ts","../src/core/loader/astLoader/parsers/forward/enum.ts","../src/core/loader/astLoader/parsers/forward/group.ts","../src/core/loader/astLoader/parsers/forward/index.ts","../src/core/loader/astLoader/parsers/forward/object.ts","../src/core/loader/astLoader/parsers/forward/tuple.ts","../src/core/loader/astLoader/parsers/forward/type.ts","../src/core/loader/callingCodeLoader/helper.ts","../src/core/loader/callingCodeLoader/index.ts","../src/core/loader/schemaLoader/index.ts","../src/core/loader/standardLoader/helper.ts","../src/core/loader/standardLoader/index.ts","../src/core/loader/standardLoader/standards.ts","../src/core/parser/index.ts","../src/core/parser/openApiParser/helper.ts","../src/core/parser/openApiParser/index.ts","../src/core/parser/templateParser/helper.ts","../src/core/parser/templateParser/index.ts","../src/core/workerPool/index.ts","../src/core/workerPool/poolManager.ts","../src/core/workerPool/swagger2Worker.ts","../src/core/workerPool/worker.ts","../src/functions/getAutoTemplateType.ts","../src/functions/getFrameworkTag.ts","../src/functions/prepareConfig.ts","../src/functions/readWormaRc.ts","../src/functions/wormaJson.ts","../src/helper/PluginDriver.ts","../src/helper/comment.ts","../src/helper/index.ts","../src/helper/progress.ts","../src/helper/config/ConfigHelper.ts","../src/helper/config/ConfigManager.ts","../src/helper/config/GeneratorHelper.ts","../src/helper/config/index.ts","../src/helper/config/type.ts","../src/helper/config/zType.ts","../src/helper/document/index.ts","../src/helper/logger/index.ts","../src/helper/template/index.ts","../src/plugins/createPlugin.ts","../src/plugins/index.ts","../src/plugins/presets/aiDoc.ts","../src/plugins/presets/apifox.ts","../src/plugins/presets/filterApi.ts","../src/plugins/presets/importType.ts","../src/plugins/presets/platform.ts","../src/plugins/presets/rename.ts","../src/plugins/presets/tagModifier.ts","../src/plugins/presets/utils.ts","../src/plugins/presets/payloadModifier/hepler.ts","../src/plugins/presets/payloadModifier/index.ts","../src/plugins/presets/payloadModifier/type.ts","../src/template/index.ts","../src/type/api.ts","../src/type/ast.ts","../src/type/base.ts","../src/type/index.ts","../src/type/lib.ts","../src/type/openapi.ts","../src/utils/base.ts","../src/utils/format.ts","../src/utils/index.ts","../src/utils/openapi.ts","../src/utils/readPackageJson.ts","../src/utils/template.ts"],"version":"5.9.3"}
1
+ {"root":["../src/config.ts","../src/constant.ts","../src/createConfig.ts","../src/defineConfig.ts","../src/generate.ts","../src/index.ts","../src/readConfig.ts","../src/resolveWorkspaces.ts","../src/bin/actions.ts","../src/bin/cli.ts","../src/bin/progressRenderer.ts","../src/bin/renderer.ts","../src/bin/theme.ts","../src/core/WorkerPool.ts","../src/core/loader/index.ts","../src/core/loader/astLoader/helper.ts","../src/core/loader/astLoader/index.ts","../src/core/loader/astLoader/generates/array.ts","../src/core/loader/astLoader/generates/enum.ts","../src/core/loader/astLoader/generates/group.ts","../src/core/loader/astLoader/generates/index.ts","../src/core/loader/astLoader/generates/interface.ts","../src/core/loader/astLoader/generates/simple.ts","../src/core/loader/astLoader/generates/tuple.ts","../src/core/loader/astLoader/generates/type.ts","../src/core/loader/astLoader/generates/utils.ts","../src/core/loader/astLoader/normalize/index.ts","../src/core/loader/astLoader/normalize/normalizer.ts","../src/core/loader/astLoader/normalize/rules/convertTypeArray.ts","../src/core/loader/astLoader/normalize/rules/handleEmptyType.ts","../src/core/loader/astLoader/normalize/rules/inferType.ts","../src/core/loader/astLoader/normalize/rules/mergeAnyOf.ts","../src/core/loader/astLoader/normalize/rules/normalizeCombiningKeywords.ts","../src/core/loader/astLoader/normalize/rules/normalizeEnum.ts","../src/core/loader/astLoader/normalize/rules/normalizeNullType.ts","../src/core/loader/astLoader/normalize/rules/removeRedundantKeywords.ts","../src/core/loader/astLoader/normalize/rules/simplifySingleType.ts","../src/core/loader/astLoader/normalize/rules/validateSchema.ts","../src/core/loader/astLoader/parsers/array.ts","../src/core/loader/astLoader/parsers/const.ts","../src/core/loader/astLoader/parsers/enum.ts","../src/core/loader/astLoader/parsers/group.ts","../src/core/loader/astLoader/parsers/index.ts","../src/core/loader/astLoader/parsers/object.ts","../src/core/loader/astLoader/parsers/reference.ts","../src/core/loader/astLoader/parsers/simple.ts","../src/core/loader/astLoader/parsers/tuple.ts","../src/core/loader/astLoader/parsers/type.ts","../src/core/loader/astLoader/parsers/utils.ts","../src/core/loader/astLoader/parsers/forward/array.ts","../src/core/loader/astLoader/parsers/forward/const.ts","../src/core/loader/astLoader/parsers/forward/enum.ts","../src/core/loader/astLoader/parsers/forward/group.ts","../src/core/loader/astLoader/parsers/forward/index.ts","../src/core/loader/astLoader/parsers/forward/object.ts","../src/core/loader/astLoader/parsers/forward/tuple.ts","../src/core/loader/astLoader/parsers/forward/type.ts","../src/core/loader/callingCodeLoader/helper.ts","../src/core/loader/callingCodeLoader/index.ts","../src/core/loader/schemaLoader/index.ts","../src/core/loader/standardLoader/helper.ts","../src/core/loader/standardLoader/index.ts","../src/core/loader/standardLoader/standards.ts","../src/core/parser/index.ts","../src/core/parser/openApiParser/helper.ts","../src/core/parser/openApiParser/index.ts","../src/core/parser/templateParser/helper.ts","../src/core/parser/templateParser/index.ts","../src/core/workerPool/index.ts","../src/core/workerPool/poolManager.ts","../src/core/workerPool/swagger2Worker.ts","../src/core/workerPool/worker.ts","../src/functions/getAutoTemplateType.ts","../src/functions/getFrameworkTag.ts","../src/functions/prepareConfig.ts","../src/functions/readWormaRc.ts","../src/functions/wormaJson.ts","../src/helper/PluginDriver.ts","../src/helper/comment.ts","../src/helper/index.ts","../src/helper/progress.ts","../src/helper/config/ConfigHelper.ts","../src/helper/config/ConfigManager.ts","../src/helper/config/GeneratorHelper.ts","../src/helper/config/index.ts","../src/helper/config/type.ts","../src/helper/config/zType.ts","../src/helper/document/index.ts","../src/helper/logger/index.ts","../src/helper/template/index.ts","../src/plugins/createPlugin.ts","../src/plugins/index.ts","../src/plugins/presets/aiDoc.ts","../src/plugins/presets/apifox.ts","../src/plugins/presets/filterApi.ts","../src/plugins/presets/importType.ts","../src/plugins/presets/platform.ts","../src/plugins/presets/rename.ts","../src/plugins/presets/tagModifier.ts","../src/plugins/presets/utils.ts","../src/plugins/presets/payloadModifier/hepler.ts","../src/plugins/presets/payloadModifier/index.ts","../src/plugins/presets/payloadModifier/type.ts","../src/template/index.ts","../src/type/api.ts","../src/type/ast.ts","../src/type/base.ts","../src/type/index.ts","../src/type/lib.ts","../src/type/openapi.ts","../src/utils/base.ts","../src/utils/format.ts","../src/utils/index.ts","../src/utils/openapi.ts","../src/utils/readPackageJson.ts","../src/utils/template.ts"],"version":"5.9.3"}
@@ -118,13 +118,13 @@ async function resolveConfigFile(projectPath) {
118
118
  for (const ext of extensions) {
119
119
  const configFile = node_path_1.default.join(projectPath, `worma.config.${ext}`);
120
120
  if (await existsPromise(configFile)) {
121
- return configFile;
121
+ return configFile.replace(/\\/g, '/');
122
122
  }
123
123
  }
124
124
  // Fallback to .wormarc if no worma.config.* found
125
125
  const rcFile = node_path_1.default.join(projectPath, '.wormarc');
126
126
  if (await existsPromise(rcFile)) {
127
- return rcFile;
127
+ return rcFile.replace(/\\/g, '/');
128
128
  }
129
129
  return null;
130
130
  }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "wormajs",
3
- "version": "0.0.1",
3
+ "version": "0.0.2-beta.0",
4
4
  "description": "A modern OpenAPI code generator - Generate type-safe API clients from OpenAPI specs",
5
- "author": "alova",
5
+ "author": "worma",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/alovajs/devtools",
8
8
  "repository": {
@@ -37,7 +37,8 @@
37
37
  "main": "./dist/index.js",
38
38
  "types": "./typings/index.d.ts",
39
39
  "bin": {
40
- "worma": "dist/bin/cli.js"
40
+ "worma": "dist/bin/cli.js",
41
+ "wormajs": "dist/bin/cli.js"
41
42
  },
42
43
  "files": [
43
44
  "dist",
@@ -604,7 +604,7 @@ export type PlatformType = "swagger" | "knife4j" | "fastapi" | "yapi";
604
604
  *
605
605
  * @example
606
606
  * ```ts
607
- * import { platform, alovaGlobals } from 'worma/plugin';
607
+ * import { platform, alovaGlobals } from 'wormajs/plugin';
608
608
  *
609
609
  * defineConfig({
610
610
  * generator: [{