@sdk-it/dart 0.15.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.
package/README.md ADDED
File without changes
@@ -0,0 +1,2 @@
1
+ export * from './lib/generate.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,116 @@
1
+ // packages/dart/src/lib/generate.ts
2
+ import { execSync } from "node:child_process";
3
+ import { join } from "node:path";
4
+ import "npm-run-path";
5
+ import { camelcase, pascalcase, spinalcase } from "stringcase";
6
+ import { forEachOperation, writeFiles } from "@sdk-it/core";
7
+
8
+ // packages/dart/src/lib/interceptors.txt
9
+ var interceptors_default = "abstract class Interceptor {\n RequestConfig before(RequestConfig config);\n void after();\n}\n\nclass BaseUrlInterceptor extends Interceptor {\n final String Function() getBaseUrl;\n BaseUrlInterceptor(this.getBaseUrl);\n\n @override\n RequestConfig before(RequestConfig config) {\n final baseUrl = getBaseUrl();\n if (config.url.scheme.isEmpty) {\n config.url = Uri.parse(baseUrl + config.url.toString());\n }\n return config;\n }\n\n @override\n void after() {\n //\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n RequestConfig({required this.method, required this.url, required this.headers});\n}\n";
10
+
11
+ // packages/dart/src/lib/generate.ts
12
+ async function generate(spec, settings) {
13
+ const output = settings.mode === "full" ? join(settings.output, "src") : settings.output;
14
+ const groups = {};
15
+ forEachOperation({ spec }, (entry, operation) => {
16
+ const [groupName] = operation.tags ?? [];
17
+ const group = groups[groupName] ?? (groups[groupName] = {
18
+ methods: [],
19
+ use: `final ${groupName} = new ${pascalcase(groupName)}();`
20
+ });
21
+ group.methods.push(`
22
+ Future<http.Response> ${camelcase(operation.operationId)}() async {
23
+ final stream = await this.dispatcher.dispatch(RequestConfig(
24
+ method: '${entry.method}',
25
+ url: Uri.parse('${entry.path}'),
26
+ headers: {},
27
+ ));
28
+ final response = await http.Response.fromStream(stream);
29
+ return response;
30
+ }
31
+ `);
32
+ });
33
+ const clazzez = Object.entries(groups).reduce(
34
+ (acc, [name, { methods }]) => {
35
+ return {
36
+ ...acc,
37
+ [`api/${spinalcase(name)}.dart`]: `
38
+ import 'dart:convert';
39
+ import 'package:http/http.dart' as http;
40
+ import '../interceptors.dart';
41
+ import '../http.dart';
42
+
43
+ class ${pascalcase(name)} {
44
+ final Dispatcher dispatcher;
45
+ ${pascalcase(name)}(this.dispatcher);
46
+ ${methods.join("\n")}
47
+ }
48
+ `
49
+ };
50
+ },
51
+ {}
52
+ );
53
+ console.dir({ groups }, { depth: null });
54
+ const client = `
55
+ import './interceptors.dart';
56
+ import './http.dart';
57
+ ${Object.keys(groups).map((name) => `import './api/${spinalcase(name)}.dart';`).join("\n")}
58
+
59
+ class Client {
60
+ final Options options;
61
+ ${Object.keys(groups).map((name) => `late final ${pascalcase(name)} ${camelcase(name)};`).join("\n")}
62
+
63
+ Client(this.options) {
64
+ final interceptors = [new BaseUrlInterceptor(() => this.options.baseUrl)];
65
+
66
+ ${Object.keys(groups).map(
67
+ (name) => `this.${camelcase(name)} = new ${pascalcase(name)}(new Dispatcher(interceptors));`
68
+ ).join("\n")}
69
+
70
+ }
71
+
72
+ void setOptions({String? baseUrl}) {
73
+ if (baseUrl != null) {
74
+ options.baseUrl = baseUrl;
75
+ }
76
+ }
77
+ }
78
+
79
+
80
+ class Options {
81
+ String baseUrl;
82
+ Options({required this.baseUrl});
83
+ }
84
+
85
+ `;
86
+ await writeFiles(output, {
87
+ "index.dart": client,
88
+ "interceptors.dart": interceptors_default,
89
+ "http.dart": `
90
+ import 'interceptors.dart';
91
+ import 'package:http/http.dart' as http;
92
+
93
+ class Dispatcher {
94
+ final List<Interceptor> interceptors;
95
+
96
+ Dispatcher(this.interceptors);
97
+
98
+ Future<http.StreamedResponse> dispatch(RequestConfig config) {
99
+ final modifedConfig = interceptors.fold(
100
+ config,
101
+ (acc, interceptor) => interceptor.before(acc),
102
+ );
103
+ final request = http.Request(modifedConfig.method, modifedConfig.url);
104
+ return request.send();
105
+ }
106
+ }
107
+ `,
108
+ ...clazzez
109
+ // 'index.dart': await getFolderExports(output, settings.useTsExtension),
110
+ });
111
+ execSync("dart format .", { cwd: output });
112
+ }
113
+ export {
114
+ generate
115
+ };
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/generate.ts", "../src/lib/interceptors.txt"],
4
+ "sourcesContent": ["import { execSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { npmRunPathEnv } from 'npm-run-path';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\nimport { camelcase, pascalcase, spinalcase } from 'stringcase';\n\n\n\nimport { forEachOperation, writeFiles } from '@sdk-it/core';\n\n\n\nimport interceptors from './interceptors.txt';\n\n\n\n\n\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: {\n output: string;\n env: ReturnType<typeof npmRunPathEnv>;\n }) => void | Promise<void>;\n },\n) {\n const output =\n settings.mode === 'full' ? join(settings.output, 'src') : settings.output;\n const groups: Record<\n string,\n {\n use: string;\n methods: string[];\n }\n > = {};\n forEachOperation({ spec }, (entry, operation) => {\n const [groupName] = operation.tags ?? [];\n const group =\n groups[groupName] ??\n (groups[groupName] = {\n methods: [],\n use: `final ${groupName} = new ${pascalcase(groupName)}();`,\n });\n group.methods.push(`\n Future<http.Response> ${camelcase(operation.operationId)}() async {\n final stream = await this.dispatcher.dispatch(RequestConfig(\n method: '${entry.method}',\n url: Uri.parse('${entry.path}'),\n headers: {},\n ));\n final response = await http.Response.fromStream(stream);\n return response;\n }\n `);\n });\n\n const clazzez = Object.entries(groups).reduce<Record<string, string>>(\n (acc, [name, { methods }]) => {\n return {\n ...acc,\n [`api/${spinalcase(name)}.dart`]: `\n import 'dart:convert';\nimport 'package:http/http.dart' as http;\nimport '../interceptors.dart';\nimport '../http.dart';\n\n class ${pascalcase(name)} {\n final Dispatcher dispatcher;\n ${pascalcase(name)}(this.dispatcher);\n ${methods.join('\\n')}\n }\n `,\n };\n },\n {},\n );\n\n console.dir({ groups }, { depth: null });\n\n const client = `\nimport './interceptors.dart';\nimport './http.dart';\n${Object.keys(groups)\n .map((name) => `import './api/${spinalcase(name)}.dart';`)\n .join('\\n')}\n\n class Client {\n final Options options;\n${Object.keys(groups)\n .map((name) => `late final ${pascalcase(name)} ${camelcase(name)};`)\n .join('\\n')}\n\n Client(this.options) {\n final interceptors = [new BaseUrlInterceptor(() => this.options.baseUrl)];\n\n ${Object.keys(groups)\n .map(\n (name) =>\n `this.${camelcase(name)} = new ${pascalcase(name)}(new Dispatcher(interceptors));`,\n )\n .join('\\n')}\n\n }\n\n void setOptions({String? baseUrl}) {\n if (baseUrl != null) {\n options.baseUrl = baseUrl;\n }\n }\n }\n\n\nclass Options {\n String baseUrl;\n Options({required this.baseUrl});\n}\n\n `;\n await writeFiles(output, {\n 'index.dart': client,\n 'interceptors.dart': interceptors,\n 'http.dart': `\n import 'interceptors.dart';\nimport 'package:http/http.dart' as http;\n\nclass Dispatcher {\n final List<Interceptor> interceptors;\n\n Dispatcher(this.interceptors);\n\n Future<http.StreamedResponse> dispatch(RequestConfig config) {\n final modifedConfig = interceptors.fold(\n config,\n (acc, interceptor) => interceptor.before(acc),\n );\n final request = http.Request(modifedConfig.method, modifedConfig.url);\n return request.send();\n }\n}\n`,\n ...clazzez,\n // 'index.dart': await getFolderExports(output, settings.useTsExtension),\n });\n\n execSync('dart format .', { cwd: output });\n}", "abstract class Interceptor {\n RequestConfig before(RequestConfig config);\n void after();\n}\n\nclass BaseUrlInterceptor extends Interceptor {\n final String Function() getBaseUrl;\n BaseUrlInterceptor(this.getBaseUrl);\n\n @override\n RequestConfig before(RequestConfig config) {\n final baseUrl = getBaseUrl();\n if (config.url.scheme.isEmpty) {\n config.url = Uri.parse(baseUrl + config.url.toString());\n }\n return config;\n }\n\n @override\n void after() {\n //\n }\n}\n\nclass RequestConfig {\n final String method;\n Uri url;\n final Map<String, String> headers;\n RequestConfig({required this.method, required this.url, required this.headers});\n}\n"],
5
+ "mappings": ";AAAA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,OAA8B;AAE9B,SAAS,WAAW,YAAY,kBAAkB;AAIlD,SAAS,kBAAkB,kBAAkB;;;ACR7C;;;ADkBA,eAAsB,SACpB,MACA,UAaA;AACA,QAAM,SACJ,SAAS,SAAS,SAAS,KAAK,SAAS,QAAQ,KAAK,IAAI,SAAS;AACrE,QAAM,SAMF,CAAC;AACL,mBAAiB,EAAE,KAAK,GAAG,CAAC,OAAO,cAAc;AAC/C,UAAM,CAAC,SAAS,IAAI,UAAU,QAAQ,CAAC;AACvC,UAAM,QACJ,OAAO,SAAS,MACf,OAAO,SAAS,IAAI;AAAA,MACnB,SAAS,CAAC;AAAA,MACV,KAAK,SAAS,SAAS,UAAU,WAAW,SAAS,CAAC;AAAA,IACxD;AACF,UAAM,QAAQ,KAAK;AAAA,gCACS,UAAU,UAAU,WAAW,CAAC;AAAA;AAAA,uBAEzC,MAAM,MAAM;AAAA,8BACL,MAAM,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMnC;AAAA,EACH,CAAC;AAED,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE;AAAA,IACrC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,OAAO,WAAW,IAAI,CAAC,OAAO,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAM9B,WAAW,IAAI,CAAC;AAAA;AAAA,QAEpB,WAAW,IAAI,CAAC;AAAA,QAChB,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,MAGpB;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,CAAC;AAEvC,QAAM,SAAS;AAAA;AAAA;AAAA,EAGf,OAAO,KAAK,MAAM,EACjB,IAAI,CAAC,SAAS,iBAAiB,WAAW,IAAI,CAAC,SAAS,EACxD,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAIX,OAAO,KAAK,MAAM,EACjB,IAAI,CAAC,SAAS,cAAc,WAAW,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,GAAG,EAClE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKP,OAAO,KAAK,MAAM,EACjB;AAAA,IACC,CAAC,SACC,QAAQ,UAAU,IAAI,CAAC,UAAU,WAAW,IAAI,CAAC;AAAA,EACrD,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBf,QAAM,WAAW,QAAQ;AAAA,IACvB,cAAc;AAAA,IACd,qBAAqB;AAAA,IACrB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmBb,GAAG;AAAA;AAAA,EAEL,CAAC;AAED,WAAS,iBAAiB,EAAE,KAAK,OAAO,CAAC;AAC3C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ import { npmRunPathEnv } from 'npm-run-path';
2
+ import type { OpenAPIObject } from 'openapi3-ts/oas31';
3
+ export declare function generate(spec: OpenAPIObject, settings: {
4
+ output: string;
5
+ name?: string;
6
+ /**
7
+ * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces
8
+ * minimal: generate only the client sdk
9
+ */
10
+ mode?: 'full' | 'minimal';
11
+ formatCode?: (options: {
12
+ output: string;
13
+ env: ReturnType<typeof npmRunPathEnv>;
14
+ }) => void | Promise<void>;
15
+ }): Promise<void>;
16
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAevD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;KACvC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,iBAyHF"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@sdk-it/dart",
3
+ "version": "0.15.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "exports": {
12
+ "./package.json": "./package.json",
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "default": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "!**/*.tsbuildinfo"
22
+ ],
23
+ "dependencies": {
24
+ "npm-run-path": "6.0.0",
25
+ "openapi3-ts": "4.4.0",
26
+ "@sdk-it/core": "0.15.0"
27
+ }
28
+ }