@book000/twitterts 0.26.1 → 0.28.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 (77) hide show
  1. package/dist/converter.d.ts +2 -2
  2. package/dist/converter.d.ts.map +1 -1
  3. package/dist/converter.js +4 -4
  4. package/dist/converter.js.map +1 -1
  5. package/dist/generate-types/custom-types-generator.d.ts +53 -0
  6. package/dist/generate-types/custom-types-generator.d.ts.map +1 -0
  7. package/dist/generate-types/custom-types-generator.js +394 -0
  8. package/dist/generate-types/custom-types-generator.js.map +1 -0
  9. package/dist/generate-types/endpoint-type-generator.d.ts +66 -0
  10. package/dist/generate-types/endpoint-type-generator.d.ts.map +1 -0
  11. package/dist/generate-types/endpoint-type-generator.js +187 -0
  12. package/dist/generate-types/endpoint-type-generator.js.map +1 -0
  13. package/dist/generate-types/types-generator.d.ts +49 -0
  14. package/dist/generate-types/types-generator.d.ts.map +1 -0
  15. package/dist/generate-types/types-generator.js +89 -0
  16. package/dist/generate-types/types-generator.js.map +1 -0
  17. package/dist/generate-types/utils.d.ts +95 -0
  18. package/dist/generate-types/utils.d.ts.map +1 -0
  19. package/dist/generate-types/utils.js +160 -0
  20. package/dist/generate-types/utils.js.map +1 -0
  21. package/dist/generate-types.js +41 -741
  22. package/dist/generate-types.js.map +1 -1
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/models/responses/custom/custom-search-timeline-entry.d.ts +2 -2
  28. package/dist/models/responses/custom/custom-search-timeline-entry.d.ts.map +1 -1
  29. package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts +42 -8
  30. package/dist/models/responses/custom/custom-timeline-tweet-entry.d.ts.map +1 -1
  31. package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts +1 -0
  32. package/dist/models/responses/custom/custom-tweet-legacy-object.d.ts.map +1 -1
  33. package/dist/models/responses/custom/custom-tweet-object.d.ts +60 -17
  34. package/dist/models/responses/custom/custom-tweet-object.d.ts.map +1 -1
  35. package/dist/models/responses/custom/custom-user-legacy-object.d.ts +55 -0
  36. package/dist/models/responses/custom/custom-user-legacy-object.d.ts.map +1 -0
  37. package/dist/models/responses/custom/custom-user-legacy-object.js +4 -0
  38. package/dist/models/responses/custom/custom-user-legacy-object.js.map +1 -0
  39. package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts +103 -2
  40. package/dist/models/responses/custom/custom-user-like-tweet-entry.d.ts.map +1 -1
  41. package/dist/models/responses/custom/custom-user-tweet-entry.d.ts +1 -0
  42. package/dist/models/responses/custom/custom-user-tweet-entry.d.ts.map +1 -1
  43. package/dist/models/responses/endpoints.d.ts +5 -2
  44. package/dist/models/responses/endpoints.d.ts.map +1 -1
  45. package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts +4 -4
  46. package/dist/models/responses/graphql/get/audio-space-by-id-success.d.ts.map +1 -1
  47. package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts +19 -0
  48. package/dist/models/responses/graphql/get/follow-host-button-query-success.d.ts.map +1 -0
  49. package/dist/models/responses/graphql/get/follow-host-button-query-success.js +4 -0
  50. package/dist/models/responses/graphql/get/follow-host-button-query-success.js.map +1 -0
  51. package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts +27 -3
  52. package/dist/models/responses/graphql/get/home-latest-timeline-success.d.ts.map +1 -1
  53. package/dist/models/responses/graphql/get/home-timeline-success.d.ts +283 -13
  54. package/dist/models/responses/graphql/get/home-timeline-success.d.ts.map +1 -1
  55. package/dist/models/responses/graphql/get/likes-success.d.ts +103 -2
  56. package/dist/models/responses/graphql/get/likes-success.d.ts.map +1 -1
  57. package/dist/models/responses/graphql/get/search-timeline-success.d.ts +2 -2
  58. package/dist/models/responses/graphql/get/search-timeline-success.d.ts.map +1 -1
  59. package/dist/models/responses/graphql/get/user-tweets-success.d.ts +1 -0
  60. package/dist/models/responses/graphql/get/user-tweets-success.d.ts.map +1 -1
  61. package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts +11 -2
  62. package/dist/models/responses/graphql/post/home-latest-timeline-success.d.ts.map +1 -1
  63. package/dist/models/responses/graphql/post/home-timeline-success.d.ts +508 -32
  64. package/dist/models/responses/graphql/post/home-timeline-success.d.ts.map +1 -1
  65. package/dist/parser/home-timeline-parser.d.ts.map +1 -1
  66. package/dist/parser/search-timeline.d.ts.map +1 -1
  67. package/dist/parser/user-like-tweets.d.ts.map +1 -1
  68. package/dist/parser/user-tweets.d.ts.map +1 -1
  69. package/dist/scraper.d.ts.map +1 -1
  70. package/dist/scraper.js.map +1 -1
  71. package/dist/tsconfig.build.tsbuildinfo +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/dist/twitter.d.ts +13 -9
  74. package/dist/twitter.d.ts.map +1 -1
  75. package/dist/twitter.js +2 -1
  76. package/dist/twitter.js.map +1 -1
  77. package/package.json +1 -1
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EndPointTypeGenerator = void 0;
7
+ const node_utils_1 = require("@book000/node-utils");
8
+ const utils_1 = require("./utils");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ /**
11
+ * エンドポイントのまとめ型定義(src/models/responses/endpoints.ts)を生成するクラス
12
+ */
13
+ class EndPointTypeGenerator {
14
+ /**
15
+ * @param results エンドポイントごとのレスポンス情報
16
+ * @param typesDirectory 型定義の出力先ディレクトリ
17
+ */
18
+ constructor(results, typesDirectory) {
19
+ this.results = results.filter((result) => result.paths.some((path) => path.endsWith('.json')));
20
+ this.typesDirectory = typesDirectory;
21
+ }
22
+ /**
23
+ * TypeScript インポート文群を生成する
24
+ *
25
+ * @returns インポート文群
26
+ */
27
+ generateImport() {
28
+ // import { GraphQLGetUserTweetsResponse } from './graphql/get/user-tweets'
29
+ return this.results
30
+ .map((result) => {
31
+ const name = utils_1.Utils.getName(result.type, result.name, result.method, result.statusCode);
32
+ const filename = utils_1.Utils.getFilename(result.type, result.name, result.method, result.statusCode);
33
+ return `import { ${name} } from './${filename}'`;
34
+ })
35
+ .filter((value, index, self) => self.indexOf(value) === index)
36
+ .join('\n');
37
+ }
38
+ /**
39
+ * メソッド名の配列を取得する
40
+ *
41
+ * @param type エンドポイントの種類
42
+ * @returns メソッド名の配列
43
+ */
44
+ getMethods(type) {
45
+ return this.results
46
+ .filter((result) => result.type === type.toLowerCase())
47
+ .map((result) => result.method)
48
+ .filter((value, index, self) => self.indexOf(value) === index);
49
+ }
50
+ /**
51
+ * エンドポイント名群(<TYPE><METHOD>Endpoint)の定義を生成する
52
+ *
53
+ * @param type エンドポイントの種類
54
+ * @param method メソッド名
55
+ * @returns エンドポイント名群の定義
56
+ */
57
+ generateEndPointType(type, method) {
58
+ const head = `export type ${type}${method}Endpoint =`;
59
+ const types = this.results
60
+ .filter((result) => result.type === type.toLowerCase() && result.method === method)
61
+ .filter((value, index, self) => self.findIndex((v) => v.name === value.name) === index)
62
+ .map((result) => {
63
+ return ` | '${result.name}'`;
64
+ });
65
+ if (types.length === 0) {
66
+ return null;
67
+ }
68
+ return `${head}\n${types.join('\n')}`;
69
+ }
70
+ /**
71
+ * エンドポイント名を元に、成功・失敗のレスポンス型定義をまとめる型定義(<TYPE><METHOD>Response)を生成する。
72
+ *
73
+ * @param type エンドポイントの種類
74
+ * @param method メソッド名
75
+ */
76
+ generateResponseMergeType(type, method) {
77
+ const names = this.results
78
+ .filter((result) => result.type === type.toLowerCase())
79
+ .map((result) => result.name)
80
+ .filter((value, index, self) => self.indexOf(value) === index);
81
+ const types = names.map((name) => {
82
+ const successType = utils_1.Utils.getName(type, name, method, '200');
83
+ const errorType = utils_1.Utils.getName(type, name, method, '400');
84
+ const responseType = utils_1.Utils.getName(type, name, method, null);
85
+ const isExistsSuccess = this.results.some((result) => result.type === type.toLowerCase() &&
86
+ result.name === name &&
87
+ result.method === method &&
88
+ result.statusCode.startsWith('2'));
89
+ const isExistsError = this.results.some((result) => result.type === type.toLowerCase() &&
90
+ result.name === name &&
91
+ result.method === method &&
92
+ !result.statusCode.startsWith('2'));
93
+ const tsDocument = `/** ${type} ${name} ${method} レスポンスモデル */`;
94
+ if (isExistsSuccess && isExistsError) {
95
+ return `${tsDocument}\nexport type ${responseType} = ${successType} | ${errorType}`;
96
+ }
97
+ if (isExistsSuccess) {
98
+ return `${tsDocument}\nexport type ${responseType} = ${successType}`;
99
+ }
100
+ if (isExistsError) {
101
+ return `${tsDocument}\nexport type ${responseType} = ${errorType}`;
102
+ }
103
+ return '';
104
+ });
105
+ return types.filter((type) => type !== '').join('\n');
106
+ }
107
+ /**
108
+ * エンドポイント名を元に、レスポンス型定義を紐づけるような型定義(<TYPE><METHOD>EndPointResponseType)を生成する。
109
+ *
110
+ * @param type エンドポイントの種類
111
+ * @param method メソッド名
112
+ * @returns レスポンス型定義を紐づけるような型定義
113
+ */
114
+ generateResponseType(type, method) {
115
+ const head = `export type ${type}${method}EndPointResponseType<T extends ${type}${method}Endpoint> =`;
116
+ const types = this.results
117
+ .filter((result) => result.type === type.toLowerCase() && result.method === method)
118
+ .filter((value, index, self) => self.findIndex((v) => v.name === value.name) === index)
119
+ .map((result) => {
120
+ const name = utils_1.Utils.getName(result.type, result.name, result.method, null);
121
+ return ` T extends '${result.name}' ? ${name} :`;
122
+ });
123
+ return `${head}\n${types.join('\n')}\n never`;
124
+ }
125
+ /**
126
+ * エンドポイントの種類と HTTP メソッドを元に、「レスポンス型定義を紐づけるような型定義」を生成する。
127
+ *
128
+ * @param types エンドポイントの種類の配列
129
+ * @returns レスポンス型定義を紐づけるような型定義
130
+ */
131
+ generateEndpointResponseType(types) {
132
+ const head = 'export type EndPointResponseType<M extends HttpMethod, T extends RequestType, N extends GraphQLEndpoint | RESTEndpoint> = ';
133
+ const results = [];
134
+ for (const type of types) {
135
+ const methods = this.getMethods(type);
136
+ if (methods.length === 0) {
137
+ continue;
138
+ }
139
+ if (types.at(0) !== type) {
140
+ results.push(':');
141
+ }
142
+ results.push(`T extends '${type.toUpperCase()}' ?`);
143
+ for (const method of methods) {
144
+ // 最後以外は : をつける
145
+ if (methods.at(0) !== method) {
146
+ results.push(':');
147
+ }
148
+ results.push(`M extends '${method}' ?`, ` N extends ${type}${method}Endpoint ?`, ` ${type}${method}EndPointResponseType<N> :`, ' never');
149
+ }
150
+ results.push(' : never');
151
+ }
152
+ return `${head}\n${results.join('\n')}\n: never`;
153
+ }
154
+ /**
155
+ * エンドポイントのまとめ型定義(src/models/responses/endpoints.ts)を生成する
156
+ */
157
+ generate() {
158
+ const logger = node_utils_1.Logger.configure('EndPointTypeGenerator.generate');
159
+ const types = ['GraphQL', 'REST'];
160
+ const data = [];
161
+ const imports = this.generateImport();
162
+ data.push(imports, "import { HttpMethod, RequestType } from '../../scraper'");
163
+ for (const type of types) {
164
+ const unionTypes = [];
165
+ const methods = this.getMethods(type);
166
+ for (const method of methods) {
167
+ const mergeTypes = this.generateResponseMergeType(type, method);
168
+ const endpointType = this.generateEndPointType(type, method);
169
+ const responseType = this.generateResponseType(type, method);
170
+ if (!endpointType || !responseType) {
171
+ continue;
172
+ }
173
+ data.push(mergeTypes, endpointType, responseType);
174
+ unionTypes.push(` | ${type}${method}Endpoint`);
175
+ }
176
+ if (unionTypes.length === 0) {
177
+ unionTypes.push(' | never');
178
+ }
179
+ data.push(`export type ${type}Endpoint =\n${unionTypes.join('\n')}\n`);
180
+ }
181
+ data.push(this.generateEndpointResponseType(types));
182
+ node_fs_1.default.writeFileSync(`${this.typesDirectory}/endpoints.ts`, data.map((d) => d.trim()).join('\n\n'));
183
+ logger.info(`📝 ${this.typesDirectory}/endpoints.ts`);
184
+ }
185
+ }
186
+ exports.EndPointTypeGenerator = EndPointTypeGenerator;
187
+ //# sourceMappingURL=endpoint-type-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-type-generator.js","sourceRoot":"","sources":["../../src/generate-types/endpoint-type-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { Result } from './utils';
2
+ /**
3
+ * 複数型定義生成オプション(TwitterGenerateTypes.generateTypes)
4
+ */
5
+ interface GenerateTypesOptions {
6
+ /**
7
+ * 保存先ディレクトリパス設定
8
+ */
9
+ directory: {
10
+ /**
11
+ * スキーマファイルのディレクトリパス
12
+ */
13
+ schema: string;
14
+ /**
15
+ * 型定義ファイルのディレクトリパス
16
+ */
17
+ types: string;
18
+ };
19
+ /** 並列処理をするかどうか */
20
+ parallel: boolean;
21
+ }
22
+ /**
23
+ * 型定義生成クラス
24
+ */
25
+ export declare class TwitterTypesGenerator {
26
+ /**
27
+ * エンドポイントごとのレスポンス群
28
+ */
29
+ private readonly results;
30
+ /**
31
+ * @param options 型定義生成クラスのオプション
32
+ */
33
+ constructor(results: Result[]);
34
+ /**
35
+ * エンドポイントの型定義を生成する
36
+ *
37
+ * @param options 単一の型定義生成オプション
38
+ * @param result エンドポイントごとのレスポンス情報
39
+ */
40
+ private generateType;
41
+ /**
42
+ * 保存されたデバッグレスポンスを元に、全てのエンドポイントの型定義を生成する。
43
+ *
44
+ * @param options 型定義生成オプション
45
+ */
46
+ generateTypes(options: GenerateTypesOptions): Promise<void>;
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=types-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-generator.d.ts","sourceRoot":"","sources":["../../src/generate-types/types-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAS,MAAM,SAAS,CAAA;AAgCvC;;GAEG;AACH,UAAU,oBAAoB;IAC5B;;OAEG;IACH,SAAS,EAAE;QACT;;WAEG;QACH,MAAM,EAAE,MAAM,CAAA;QAEd;;WAEG;QACH,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,kBAAkB;IAClB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC;;OAEG;gBACS,OAAO,EAAE,MAAM,EAAE;IAI7B;;;;;OAKG;YACW,YAAY;IAqC1B;;;;OAIG;IACU,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgDzE"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TwitterTypesGenerator = void 0;
7
+ const node_utils_1 = require("@book000/node-utils");
8
+ const dist_1 = require("genson-js/dist");
9
+ const json_schema_to_typescript_1 = require("json-schema-to-typescript");
10
+ const node_path_1 = require("node:path");
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const utils_1 = require("./utils");
13
+ /**
14
+ * 型定義生成クラス
15
+ */
16
+ class TwitterTypesGenerator {
17
+ /**
18
+ * @param options 型定義生成クラスのオプション
19
+ */
20
+ constructor(results) {
21
+ this.results = results;
22
+ }
23
+ /**
24
+ * エンドポイントの型定義を生成する
25
+ *
26
+ * @param options 単一の型定義生成オプション
27
+ * @param result エンドポイントごとのレスポンス情報
28
+ */
29
+ async generateType(options, result) {
30
+ const logger = node_utils_1.Logger.configure('TwitterGenerateTypes.generateType');
31
+ if (result.paths.length === 0) {
32
+ return;
33
+ }
34
+ logger.info(`🔍 Generating: ${options.name}`);
35
+ let schema;
36
+ for (const path of result.paths) {
37
+ const data = JSON.parse(node_fs_1.default.readFileSync(path, 'utf8'));
38
+ const fileSchema = (0, dist_1.createSchema)(data);
39
+ schema = schema ? (0, dist_1.mergeSchemas)([schema, fileSchema]) : fileSchema;
40
+ }
41
+ if (!schema) {
42
+ throw new Error('No schema found');
43
+ }
44
+ node_fs_1.default.mkdirSync((0, node_path_1.dirname)(options.path.schema), { recursive: true });
45
+ node_fs_1.default.writeFileSync(options.path.schema, JSON.stringify(schema, null, 2));
46
+ node_fs_1.default.mkdirSync((0, node_path_1.dirname)(options.path.types), { recursive: true });
47
+ const types = await (0, json_schema_to_typescript_1.compile)(schema, options.name, utils_1.Utils.getCompileOptions(options.tsDocument));
48
+ node_fs_1.default.writeFileSync(options.path.types, types);
49
+ logger.info(`📝 Successful: ${options.name} (from ${result.paths.length} files)`);
50
+ }
51
+ /**
52
+ * 保存されたデバッグレスポンスを元に、全てのエンドポイントの型定義を生成する。
53
+ *
54
+ * @param options 型定義生成オプション
55
+ */
56
+ async generateTypes(options) {
57
+ const generators = [];
58
+ for (const result of this.results) {
59
+ const name = utils_1.Utils.getName(result.type, result.name, result.method, result.statusCode);
60
+ const filename = utils_1.Utils.getFilename(result.type, result.name, result.method, result.statusCode);
61
+ const schemaPath = `${options.directory.schema}/${filename}.json`;
62
+ const typesPath = `${options.directory.types}/${filename}.ts`;
63
+ const type = result.type === 'graphql'
64
+ ? 'GraphQL'
65
+ : result.type === 'rest'
66
+ ? 'REST'
67
+ : null;
68
+ const generator = this.generateType({
69
+ path: {
70
+ schema: schemaPath,
71
+ types: typesPath,
72
+ },
73
+ name,
74
+ tsDocument: `${type} ${result.method} ${result.name} ${result.statusCode.startsWith('2') ? '成功' : '失敗'}レスポンスモデル`,
75
+ }, result);
76
+ generators.push(generator);
77
+ }
78
+ if (options.parallel) {
79
+ await Promise.all(generators);
80
+ }
81
+ else {
82
+ for (const generator of generators) {
83
+ await generator;
84
+ }
85
+ }
86
+ }
87
+ }
88
+ exports.TwitterTypesGenerator = TwitterTypesGenerator;
89
+ //# sourceMappingURL=types-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-generator.js","sourceRoot":"","sources":["../../src/generate-types/types-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { Options } from 'json-schema-to-typescript';
2
+ /**
3
+ * レスポンスファイル群からの、エンドポイントごとのレスポンス群型
4
+ */
5
+ export interface Result {
6
+ /**
7
+ * エンドポイントの種別(graphql または rest)
8
+ */
9
+ type: string;
10
+ /**
11
+ * レスポンスの名前
12
+ */
13
+ name: string;
14
+ /**
15
+ * レスポンスの HTTP メソッド
16
+ */
17
+ method: string;
18
+ /**
19
+ * レスポンスのステータスコード
20
+ */
21
+ statusCode: string;
22
+ /**
23
+ * このエンドポイントに該当するレスポンスのパス群
24
+ */
25
+ paths: string[];
26
+ }
27
+ /**
28
+ * ユーティリティ
29
+ */
30
+ export declare const Utils: {
31
+ /**
32
+ * ディレクトリ内にあるディレクトリ群を取得する
33
+ *
34
+ * @param parentDirectory ディレクトリを取得する親ディレクトリパス
35
+ * @param baseDirectories ディレクトリを取得する子ディレクトリパス群
36
+ * @returns ディレクトリ群
37
+ */
38
+ getDirectories(parentDirectory: string, baseDirectories?: string[]): string[];
39
+ /**
40
+ * ディレクトリ内にある JSON ファイル群を取得する
41
+ *
42
+ * @param parentDirectory ファイルを取得する親ディレクトリパス
43
+ * @param baseDirectories ファイルを取得するディレクトリパス
44
+ * @returns JSON ファイル群
45
+ */
46
+ getJSONFiles(parentDirectory: string, baseDirectories?: string[]): string[];
47
+ /**
48
+ * レスポンスデバッグ出力 JSON ファイルを元に、エンドポイントごとの情報をまとめて取得する
49
+ *
50
+ * @returns エンドポイントごとの情報
51
+ */
52
+ getEndPointResponses(debugOutputDirectory: string): Result[];
53
+ /**
54
+ * レスポンスの型定義名を取得する
55
+ *
56
+ * @param rawType リクエストの種別(graphql または rest)
57
+ * @param rawName レスポンスの名前
58
+ * @param rawMethod レスポンスの HTTP メソッド
59
+ * @param rawStatus レスポンスのステータスコード
60
+ * @returns 型定義名
61
+ */
62
+ getName(rawType: string, rawName: string, rawMethod: string, rawStatus: string | null): string;
63
+ /**
64
+ * キャメルケースに変換する
65
+ *
66
+ * @param string 変換する文字列
67
+ * @returns キャメルケース変換後の文字列
68
+ */
69
+ toCamelCase(string: string): string;
70
+ /**
71
+ * 先頭文字を大文字に変換する
72
+ *
73
+ * @param string 変換する文字列
74
+ * @returns 変換後の文字列
75
+ */
76
+ capitalize(string: string): string;
77
+ /**
78
+ * ファイル名を取得する
79
+ *
80
+ * @param rawType リクエストの種別(graphql または rest)
81
+ * @param rawName レスポンスの名前
82
+ * @param rawMethod レスポンスの HTTP メソッド
83
+ * @param rawStatus レスポンスのステータスコード
84
+ * @returns ファイル名
85
+ */
86
+ getFilename(rawType: string, rawName: string, rawMethod: string, rawStatus: string): string;
87
+ /**
88
+ * json-schema-to-typescript のコンパイルオプションを作成・取得する
89
+ *
90
+ * @param tsDocument コンパイル結果の先頭に追加する tsdoc
91
+ * @returns コンパイルオプション
92
+ */
93
+ getCompileOptions(tsDocument?: string): Partial<Options>;
94
+ };
95
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/generate-types/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAInD;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,KAAK;IAChB;;;;;;OAMG;oCAEgB,MAAM,oBACN,MAAM,EAAE,GACxB,MAAM,EAAE;IAWX;;;;;;OAMG;kCAEgB,MAAM,oBACN,MAAM,EAAE,GACxB,MAAM,EAAE;IAaX;;;;OAIG;+CACwC,MAAM,GAAG,MAAM,EAAE;IAgC5D;;;;;;;;OAQG;qBAEQ,MAAM,WACN,MAAM,aACJ,MAAM,aACN,MAAM,GAAG,IAAI,GACvB,MAAM;IAkBT;;;;;OAKG;wBACiB,MAAM,GAAG,MAAM;IAInC;;;;;OAKG;uBACgB,MAAM,GAAG,MAAM;IAIlC;;;;;;;;OAQG;yBAEQ,MAAM,WACN,MAAM,aACJ,MAAM,aACN,MAAM,GAChB,MAAM;IAST;;;;;OAKG;mCAC4B,MAAM,GAAG,QAAQ,OAAO,CAAC;CAiBzD,CAAA"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Utils = void 0;
7
+ const node_path_1 = require("node:path");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ /**
10
+ * ユーティリティ
11
+ */
12
+ exports.Utils = {
13
+ /**
14
+ * ディレクトリ内にあるディレクトリ群を取得する
15
+ *
16
+ * @param parentDirectory ディレクトリを取得する親ディレクトリパス
17
+ * @param baseDirectories ディレクトリを取得する子ディレクトリパス群
18
+ * @returns ディレクトリ群
19
+ */
20
+ getDirectories(parentDirectory, baseDirectories = []) {
21
+ const baseDirectory = (0, node_path_1.join)(parentDirectory, ...baseDirectories);
22
+ return node_fs_1.default
23
+ .readdirSync(baseDirectory)
24
+ .filter((directory) => !['.', '..'].includes(directory) &&
25
+ node_fs_1.default.statSync(`${baseDirectory}/${directory}`).isDirectory());
26
+ },
27
+ /**
28
+ * ディレクトリ内にある JSON ファイル群を取得する
29
+ *
30
+ * @param parentDirectory ファイルを取得する親ディレクトリパス
31
+ * @param baseDirectories ファイルを取得するディレクトリパス
32
+ * @returns JSON ファイル群
33
+ */
34
+ getJSONFiles(parentDirectory, baseDirectories = []) {
35
+ const baseDirectory = (0, node_path_1.join)(parentDirectory, ...baseDirectories);
36
+ return node_fs_1.default
37
+ .readdirSync(baseDirectory)
38
+ .filter((file) => !['.', '..'].includes(file) &&
39
+ node_fs_1.default.statSync((0, node_path_1.join)(baseDirectory, file)).isFile() &&
40
+ file.endsWith('.json'))
41
+ .map((file) => (0, node_path_1.join)(baseDirectory, file));
42
+ },
43
+ /**
44
+ * レスポンスデバッグ出力 JSON ファイルを元に、エンドポイントごとの情報をまとめて取得する
45
+ *
46
+ * @returns エンドポイントごとの情報
47
+ */
48
+ getEndPointResponses(debugOutputDirectory) {
49
+ const results = [];
50
+ for (const type of this.getDirectories(debugOutputDirectory)) {
51
+ for (const name of this.getDirectories(debugOutputDirectory, [type])) {
52
+ for (const method of this.getDirectories(debugOutputDirectory, [
53
+ type,
54
+ name,
55
+ ])) {
56
+ for (const statusCode of this.getDirectories(debugOutputDirectory, [
57
+ type,
58
+ name,
59
+ method,
60
+ ])) {
61
+ results.push({
62
+ type,
63
+ name,
64
+ method,
65
+ statusCode,
66
+ paths: this.getJSONFiles(debugOutputDirectory, [
67
+ type,
68
+ name,
69
+ method,
70
+ statusCode,
71
+ ]),
72
+ });
73
+ }
74
+ }
75
+ }
76
+ }
77
+ return results;
78
+ },
79
+ /**
80
+ * レスポンスの型定義名を取得する
81
+ *
82
+ * @param rawType リクエストの種別(graphql または rest)
83
+ * @param rawName レスポンスの名前
84
+ * @param rawMethod レスポンスの HTTP メソッド
85
+ * @param rawStatus レスポンスのステータスコード
86
+ * @returns 型定義名
87
+ */
88
+ getName(rawType, rawName, rawMethod, rawStatus) {
89
+ const type = rawType.toLocaleLowerCase() === 'graphql'
90
+ ? 'GraphQL'
91
+ : rawType.toLocaleLowerCase() === 'rest'
92
+ ? 'REST'
93
+ : null;
94
+ if (!type) {
95
+ throw new Error(`Invalid type: ${rawType}`);
96
+ }
97
+ const method = this.toCamelCase(rawMethod);
98
+ const name = this.capitalize(rawName);
99
+ const status = rawStatus === null ? '' : rawStatus.startsWith('2') ? 'Success' : 'Error';
100
+ return `${type}${method}${name}${status}Response`;
101
+ },
102
+ /**
103
+ * キャメルケースに変換する
104
+ *
105
+ * @param string 変換する文字列
106
+ * @returns キャメルケース変換後の文字列
107
+ */
108
+ toCamelCase(string) {
109
+ return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
110
+ },
111
+ /**
112
+ * 先頭文字を大文字に変換する
113
+ *
114
+ * @param string 変換する文字列
115
+ * @returns 変換後の文字列
116
+ */
117
+ capitalize(string) {
118
+ return string.charAt(0).toUpperCase() + string.slice(1);
119
+ },
120
+ /**
121
+ * ファイル名を取得する
122
+ *
123
+ * @param rawType リクエストの種別(graphql または rest)
124
+ * @param rawName レスポンスの名前
125
+ * @param rawMethod レスポンスの HTTP メソッド
126
+ * @param rawStatus レスポンスのステータスコード
127
+ * @returns ファイル名
128
+ */
129
+ getFilename(rawType, rawName, rawMethod, rawStatus) {
130
+ const type = rawType.toLowerCase();
131
+ const method = rawMethod.toLowerCase();
132
+ const name = rawName.replaceAll(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
133
+ const status = rawStatus.startsWith('2') ? '-success' : '-error';
134
+ return `${type}/${method}/${name}${status}`;
135
+ },
136
+ /**
137
+ * json-schema-to-typescript のコンパイルオプションを作成・取得する
138
+ *
139
+ * @param tsDocument コンパイル結果の先頭に追加する tsdoc
140
+ * @returns コンパイルオプション
141
+ */
142
+ getCompileOptions(tsDocument) {
143
+ const compileOptions = {
144
+ bannerComment: '/* eslint-disable @typescript-eslint/ban-types */',
145
+ additionalProperties: false,
146
+ enableConstEnums: true,
147
+ strictIndexSignatures: true,
148
+ style: {
149
+ semi: false,
150
+ singleQuote: true,
151
+ },
152
+ unknownAny: true,
153
+ };
154
+ if (tsDocument) {
155
+ compileOptions.bannerComment = `${compileOptions.bannerComment}\n\n/** ${tsDocument} */`;
156
+ }
157
+ return compileOptions;
158
+ },
159
+ };
160
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/generate-types/utils.ts"],"names":[],"mappings":"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"}