xservice-arkts 1.0.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/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ ISC License
2
+
3
+ Copyright (c) 2026, Jidong Chen
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # xservice-arkts
2
+
3
+ A tool to generate xservice_kit based flutter plugin with support for ArkTS/OHOS.
4
+
5
+ ## Features
6
+
7
+ - Generate Flutter plugin code for multiple platforms:
8
+ - Android (Java)
9
+ - iOS (Objective-C)
10
+ - Dart
11
+ - ArkTS/OHOS (HarmonyOS)
12
+
13
+ ## Installation
14
+
15
+ ```bash
16
+ npm install -g xservice-arkts
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ xservice-arkts <directory> [options]
23
+ ```
24
+
25
+ ### Options
26
+
27
+ - `-o, --output <output>`: A directory to save the output
28
+ - `-t, --type <type>`: Input file type support json and yaml default is json
29
+ - `-p, --package <package>`: Java package
30
+ - `-a, --arkts`: Generate ArkTS code for OHOS
31
+
32
+ ### Example
33
+
34
+ ```bash
35
+ xservice-arkts ./services -o ./gen -p com.xservice_kit.demo -t yaml --arkts
36
+ ```
37
+
38
+ ## Input File Format
39
+
40
+ The tool supports both JSON and YAML formats for service definitions.
41
+
42
+ ### Example YAML File
43
+
44
+ ```yaml
45
+ name: TestService
46
+ messages:
47
+ - name: getTestData
48
+ messageType: flutter
49
+ returnType: String
50
+ args:
51
+ - name: userId
52
+ type: String
53
+ - name: updateTestData
54
+ messageType: native
55
+ returnType: bool
56
+ args:
57
+ - name: data
58
+ type: Map
59
+ ```
60
+
61
+ ## Output
62
+
63
+ The tool generates the following directory structure:
64
+
65
+ ```
66
+ output/
67
+ ├── java/ # Android code
68
+ ├── oc/ # iOS code
69
+ ├── dart/ # Flutter code
70
+ └── arkts/ # ArkTS/OHOS code (if --arkts is specified)
71
+ ```
72
+
73
+ ## License
74
+
75
+ ISC
package/index.js ADDED
@@ -0,0 +1,375 @@
1
+ #!/usr/bin/env node
2
+
3
+ var program = require('commander');
4
+ var Path = require('path');
5
+ var Mustache = require('mustache');
6
+ var YAML = require('js-yaml');
7
+
8
+ console.log('xservice-arkts tool package at');
9
+ console.log(__dirname);
10
+
11
+
12
+
13
+ program
14
+ .arguments('<directory>')
15
+ .option('-o , --output <output>', 'A directory to save the output')
16
+ .option('-t , --type <type>', 'input file type support json and yaml default is json')
17
+ .option('-p , --package <package>', 'Java package')
18
+ .option('-a , --arkts', 'generate ArkTS code')
19
+ .action(function (directory) {
20
+ program.directory = directory;
21
+ start(directory);
22
+ }).parse(process.argv);
23
+
24
+ function toJsonString(rawdata) {
25
+ return YAML.safeLoad(rawdata);
26
+ }
27
+
28
+ function start(input_directory) {
29
+ const fs = require('fs');
30
+ let jsonAll = new Array();
31
+
32
+ if (program.type == 'yaml') {
33
+ fs.readdirSync(input_directory).forEach(file => {
34
+ if (file.includes('yaml') || file.includes('yml')) {
35
+ let realPath = Path.join(input_directory, file);
36
+ let rawdata = fs.readFileSync(realPath, 'utf8');
37
+ let jsonService = toJsonString(rawdata);
38
+ jsonAll.push(jsonService);
39
+ }
40
+ });
41
+ } else {
42
+ fs.readdirSync(input_directory).forEach(file => {
43
+ if (file.includes('json')) {
44
+ let realPath = Path.join(input_directory, file);
45
+ let rawdata = fs.readFileSync(realPath, 'utf8');
46
+ let jsonService = JSON.parse(rawdata);
47
+ jsonAll.push(jsonService);
48
+ }
49
+ });
50
+ }
51
+
52
+ var serviceNames = [];
53
+ console.log('Start generating...');
54
+ console.log('[input] -> ' + input_directory);
55
+ console.log('[package] -> ' + program.package);
56
+ console.log('---------------------------');
57
+ for (var i = 0; i < jsonAll.length; i++) {
58
+ console.log(jsonAll[i]);
59
+ formate_data(jsonAll[i]);
60
+ gen_java(jsonAll[i]);
61
+ gen_oc(jsonAll[i]);
62
+ gen_dart(jsonAll[i]);
63
+ if (program.arkts) {
64
+ gen_arkts(jsonAll[i]);
65
+ }
66
+ serviceNames.push({
67
+ "name": jsonAll[i].name,
68
+ "service_dart_file_name": dart_file_name(jsonAll[i].name)
69
+ });
70
+ console.log('Generating ' + jsonAll[i].name + " success!");
71
+ console.log('============================= ' + jsonAll[i].name);
72
+ }
73
+
74
+ jsonAll.pkg_name = program.package;
75
+ jsonAll.services = serviceNames;
76
+
77
+ console.log('Generating loaders');
78
+ gen_loader(jsonAll);
79
+ console.log('Generating Fnished. All success!');
80
+ console.log('!!!Please find the output under directory ' + program.output);
81
+ }
82
+
83
+ function default_dart_value(type) {
84
+ var mapper = {
85
+ "int": "0",
86
+ "double": "0.0",
87
+ "bool": "false",
88
+ "String": '""',
89
+ };
90
+
91
+ var mappedType = mapper[type];
92
+
93
+
94
+ if (mappedType) {
95
+ return mappedType;
96
+ }
97
+
98
+ if (type.includes("List")) {
99
+ return "[]";
100
+ }
101
+
102
+ if (type.includes("Map")) {
103
+ return "{}";
104
+ }
105
+
106
+ return mappedType;
107
+ }
108
+
109
+ function formate_data(jsonService) {
110
+ jsonService.service_name = jsonService.name;
111
+ jsonService.service_dart_file_name = dart_file_name(jsonService.name);
112
+
113
+ var nativeMessages = [];
114
+ var flutterMessages = [];
115
+ for (var i = 0; i < jsonService.messages.length; i++) {
116
+ var msg = jsonService.messages[i];
117
+ msg.service_dart_file_name = jsonService.service_dart_file_name;
118
+ msg.msg_dart_file_name = dart_file_name(msg.name);
119
+ msg.return_oc_type = dart_to_oc_type(msg.returnType);
120
+ msg.return_oc_ob_type = dart_to_oc_object_type(msg.returnType);
121
+ msg.return_java_type = dart_to_java_type(msg.returnType);
122
+ msg.return_arkts_type = dart_to_arkts_type(msg.returnType);
123
+ msg.service_name = jsonService.name;
124
+ msg.last = (i == jsonService.messages.length - 1);
125
+ msg.pkg_name = program.package;
126
+ msg.default_return_value = default_dart_value(msg.returnType);
127
+ msg.return_map = msg.returnType === "Map";
128
+
129
+ for (var j = 0; j < msg.args.length; j++) {
130
+ var arg = msg.args[j];
131
+ arg.oc_type = dart_to_oc_type(arg.type);
132
+ arg.java_type = dart_to_java_type(arg.type);
133
+ arg.oc_ob_type = dart_to_oc_object_type(arg.type);
134
+ arg.arkts_type = dart_to_arkts_type(arg.type);
135
+ arg.last = (j == msg.args.length - 1);
136
+ }
137
+
138
+ if (msg.messageType == "flutter") {
139
+ flutterMessages.push(msg);
140
+ } else {
141
+ nativeMessages.push(msg);
142
+ }
143
+ }
144
+
145
+ jsonService.native_msg = nativeMessages;
146
+ jsonService.flutter_msg = flutterMessages;
147
+ jsonService.pkg_name = program.package;
148
+ }
149
+
150
+ function gen_loader(jsonAll) {
151
+ gen_java_loader(jsonAll);
152
+ gen_dart_loader(jsonAll);
153
+ if (program.arkts) {
154
+ gen_arkts_loader(jsonAll);
155
+ }
156
+ }
157
+
158
+ function gen_java_loader(jsonAll) {
159
+ generate("java/loader.java", jsonAll, "java/loader/ServiceLoader.java");
160
+ }
161
+
162
+ function gen_dart_loader(jsonAll) {
163
+ generate("dart/loader.dart", jsonAll, "dart/loader/service_loader.dart");
164
+ }
165
+
166
+ function gen_arkts_loader(jsonAll) {
167
+ const context = {
168
+ pkg_name: jsonAll.pkg_name,
169
+ services: jsonAll.services || []
170
+ };
171
+ generate("arkts/loader.ets", context, "arkts/loader/ServiceLoader.ets");
172
+ }
173
+
174
+ function gen_dart(jsonService) {
175
+ console.log('Generating dart for' + jsonService.name);
176
+ var base = "dart/" + jsonService.name + "/";
177
+ generate("dart/service.dart", jsonService, base + "service/" + jsonService.service_dart_file_name + ".dart");
178
+ generate("dart/service_register.dart", jsonService, base + "service/" + jsonService.service_dart_file_name + "_" + "register" + ".dart");
179
+ for (var i = 0; i < jsonService.native_msg.length; i++) {
180
+ var msg = jsonService.native_msg[i];
181
+ generate("dart/handler.dart", msg, base + "handlers/" + jsonService.service_dart_file_name + "_" + msg.msg_dart_file_name + ".dart");
182
+ }
183
+ }
184
+
185
+ function gen_java(jsonService) {
186
+ console.log('Generating java for' + jsonService.name);
187
+ var base = "java/" + jsonService.name + "/";
188
+ generate("java/service.java", jsonService, base + "service/" + jsonService.name + ".java");
189
+ generate("java/service_register.java", jsonService, base + "service/" + jsonService.name + "Register" + ".java");
190
+ for (var i = 0; i < jsonService.flutter_msg.length; i++) {
191
+ var msg = jsonService.flutter_msg[i];
192
+ generate("java/handler.java", msg, base + "handlers/" + jsonService.name + "_" + msg.name + ".java");
193
+ }
194
+ }
195
+
196
+ function gen_oc(jsonService) {
197
+ console.log('Generating objective c for' + jsonService.name);
198
+ var base = "oc/" + jsonService.name + "/";
199
+ generate("oc/service.h", jsonService, base + "service/Service" + "_" + jsonService.name + ".h");
200
+ generate("oc/service.mm", jsonService, base + "service/Service" + "_" + jsonService.name + ".mm");
201
+ for (var i = 0; i < jsonService.flutter_msg.length; i++) {
202
+ var msg = jsonService.flutter_msg[i];
203
+ generate("oc/handler.h", msg, base + "handlers/" + jsonService.name + "_" + msg.name + ".h");
204
+ generate("oc/handler.mm", msg, base + "handlers/" + jsonService.name + "_" + msg.name + ".mm");
205
+ }
206
+ }
207
+
208
+ function gen_arkts(jsonService) {
209
+ console.log('Generating arkts for ' + jsonService.name);
210
+ var base = "arkts/" + jsonService.name + "/";
211
+
212
+ generate("arkts/service.ets", jsonService, base + "service/" + jsonService.name + ".ets");
213
+
214
+ generate("arkts/service_register.ets", jsonService, base + "service/" + jsonService.name + "Register.ets");
215
+
216
+ for (var i = 0; i < jsonService.flutter_msg.length; i++) {
217
+ var msg = jsonService.flutter_msg[i];
218
+ generate("arkts/handler.ets", msg, base + "handlers/" + jsonService.name + "_" + msg.name + ".ets");
219
+ }
220
+ }
221
+
222
+ function writeFile(path, contents, cb) {
223
+ var mkdirp = require('mkdirp');
224
+ var fs = require('fs');
225
+ var getDirName = require('path').dirname;
226
+ mkdirp(getDirName(path), function (err) {
227
+ if (err) return cb(err);
228
+ fs.writeFile(path, contents, cb);
229
+ });
230
+ }
231
+
232
+ function getAssetData(path) {
233
+ const fs = require('fs');
234
+ var realPath = __dirname + "/" + path;
235
+ return fs.readFileSync(realPath, 'utf8');
236
+ }
237
+
238
+ function generate(template, context, path) {
239
+ const fs = require('fs');
240
+ let templatePath = "templates/" + template;
241
+ // let templateString = fs.readFileSync(templatePath,'utf8');
242
+ let templateString = getAssetData(templatePath);
243
+ var rendered = Mustache.render(templateString, context);
244
+ rendered = rendered.replace(/&quot;/g, '"');
245
+ var realPath = Path.join(program.output, path);
246
+ writeFile(realPath, rendered, function () { });
247
+ }
248
+
249
+ //Transform the file names into dart style.
250
+ function dart_file_name(name) {
251
+ let tmp = "";
252
+ var r = 0;
253
+ let cps = new Array();
254
+
255
+ var A = name;
256
+
257
+ while (r < A.length) {
258
+ if (A.charAt(r) >= 'A' && A.charAt(r) <= 'Z') {
259
+ if (tmp.length > 0) {
260
+ cps.push(tmp);
261
+ }
262
+ tmp = "";
263
+ tmp += A.charAt(r++);
264
+ } else tmp += A.charAt(r++);
265
+ }
266
+ if (tmp.length > 0) {
267
+ cps.push(tmp);
268
+ }
269
+
270
+ var ans = "";
271
+ for (var i = 0; i < cps.length; i++) {
272
+ var low = cps[i].toLowerCase();
273
+ if (ans == "") {
274
+ ans = low;
275
+ } else {
276
+ ans += "_";
277
+ ans += low;
278
+ }
279
+ }
280
+
281
+ return ans;
282
+ }
283
+
284
+
285
+ function dart_to_oc_object_type(type) {
286
+ let mapper = {
287
+ "int": "NSNumber *",
288
+ "double": "NSNumber *",
289
+ "bool": "NSNumber *",
290
+ "String": "NSString *",
291
+ };
292
+
293
+ var mapped_type = mapper[type];
294
+ if (mapped_type) {
295
+ return mapped_type;
296
+ }
297
+
298
+ if (type.includes("List")) {
299
+ return "NSArray *";
300
+ }
301
+
302
+ if (type.includes("Map")) {
303
+ return "NSDictionary *";
304
+ }
305
+
306
+ return mapped_type;
307
+ }
308
+
309
+ function dart_to_oc_type(type) {
310
+ var mapper = {
311
+ "int": "int64_t",
312
+ "double": "double",
313
+ "bool": "BOOL",
314
+ "String": "NSString *",
315
+ };
316
+
317
+ var mappedType = mapper[type];
318
+
319
+ if (mappedType) {
320
+ return mappedType;
321
+ }
322
+
323
+ if (type.includes("List")) {
324
+ return "NSArray *";
325
+ }
326
+
327
+ if (type.includes("Map")) {
328
+ return "NSDictionary *";
329
+ }
330
+
331
+ return mappedType;
332
+ }
333
+
334
+ function dart_to_java_type(type) {
335
+
336
+ let typeMap = {
337
+ "int": "Integer",
338
+ "double": "Double",
339
+ "bool": "Boolean",
340
+ "String": "String",
341
+ };
342
+
343
+ var mapped_type = typeMap[type];
344
+ if (mapped_type) {
345
+ return mapped_type;
346
+ }
347
+
348
+ if (type.includes("List")) {
349
+ return "List";
350
+ }
351
+
352
+ if (type.includes("Map")) {
353
+ return "Map";
354
+ }
355
+
356
+ return mapped_type;
357
+ }
358
+
359
+ function dart_to_arkts_type(type) {
360
+ const typeMap = {
361
+ 'int': 'number',
362
+ 'double': 'number',
363
+ 'bool': 'boolean',
364
+ 'String': 'string',
365
+ };
366
+ let mapped = typeMap[type];
367
+ if (mapped) return mapped;
368
+ if (type.includes('List')) {
369
+ return 'Array<Object>';
370
+ }
371
+ if (type.includes('Map')) {
372
+ return 'Object';
373
+ }
374
+ return mapped;
375
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "xservice-arkts",
3
+ "version": "1.0.0",
4
+ "description": "A tool to generate xservice_kit based flutter plugin with support for ArkTS/OHOS. Forked from https://www.npmjs.com/package/xservice.",
5
+ "bin": {
6
+ "xservice-arkts": "index.js"
7
+ },
8
+ "main": "index.js",
9
+ "scripts": {
10
+ "test": "node index.js -o ./gen -p com.xservice_arkts.demo -t yaml -a ServicesYaml"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "git+https://github.com/Miosas/xservice-arkts.git"
15
+ },
16
+ "keywords": [
17
+ "xservice",
18
+ "xservice_kit",
19
+ "flutter",
20
+ "plugin",
21
+ "arkts",
22
+ "ohos",
23
+ "harmonyos"
24
+ ],
25
+ "author": "Jidong Chen",
26
+ "license": "ISC",
27
+ "bugs": {
28
+ "url": "https://github.com/Miosas/xservice-arkts/issues"
29
+ },
30
+ "homepage": "https://github.com/Miosas/xservice-arkts#readme",
31
+ "dependencies": {
32
+ "assets": "^3.0.1",
33
+ "commander": "^2.19.0",
34
+ "eslint": "^5.12.0",
35
+ "js-yaml": "^3.12.1",
36
+ "mustache": "^3.0.1",
37
+ "mkdirp": "^0.5.1"
38
+ },
39
+ "files": [
40
+ "templates/**",
41
+ "index.js"
42
+ ]
43
+ }
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="EMPTY_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="inheritedJdk" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ </module>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/arkts.iml" filepath="$PROJECT_DIR$/.idea/arkts.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Generated by code generator
3
+ * Handler: {{service_name}}_{{name}}
4
+ * Package: {{pkg_name}}
5
+ */
6
+
7
+ import { MessageHandler, MessageResult, MessageValue, ServiceGateway } from 'xservice_kit';
8
+
9
+ export class {{service_name}}_{{name}} implements MessageHandler<MessageValue> {
10
+ private mContext: Object = new Object;
11
+
12
+ private onCall(result: MessageResult<MessageValue>, {{#args}}{{name}}: {{arkts_type}}{{^last}}, {{/last}}{{/args}}): boolean {
13
+ // TODO: Implement your business logic here
14
+ // This method will be called when {{service_name}}.{{name}} is invoked
15
+
16
+ // TODO: Return appropriate value of type boolean
17
+ // For example:
18
+ // - For number: result.success(0);
19
+ // - For string: result.success('');
20
+ // - For boolean: result.success(false);
21
+ // - For Object: result.success({});
22
+
23
+ // Placeholder implementation - please implement your logic
24
+ result.success(false);
25
+ return true;
26
+ }
27
+
28
+ // ================== Do not edit code below! ==============
29
+ onMethodCall(name: string, args: Map<string,MessageValue>, result: MessageResult<MessageValue>): boolean {
30
+ this.onCall(
31
+ result{{#args}},
32
+ args.get('{{name}}') as {{arkts_type}}{{/args}}
33
+ );
34
+ return true;
35
+ }
36
+
37
+ handleMessageNames(): Array<string> {
38
+ let h: Array<string> = [];
39
+ h.push('{{name}}');
40
+ return h;
41
+ }
42
+
43
+ getContext(): Object {
44
+ return this.mContext;
45
+ }
46
+
47
+ setContext(obj: Object): void {
48
+ this.mContext = obj;
49
+ }
50
+
51
+ service(): string {
52
+ return '{{service_name}}';
53
+ }
54
+
55
+ static register(): void {
56
+ ServiceGateway.sharedInstance().registerHandler(new {{service_name}}_{{name}}());
57
+ }
58
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Generated by code generator
3
+ * Service Loader
4
+ * Package: {{pkg_name}}
5
+ */
6
+
7
+ {{#services}}
8
+ import { {{name}}Register } from '../{{name}}/service/{{name}}Register';
9
+ {{/services}}
10
+
11
+ export class ServiceLoader {
12
+ public static load(): void {
13
+ {{#services}}
14
+ {{name}}Register.register();
15
+ {{/services}}
16
+ }
17
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Generated by code generator
3
+ * Service: {{name}}
4
+ * Package: {{pkg_name}}
5
+ */
6
+
7
+ import { ServiceTemplate, ServiceGateway, MessageResult, MessageValue } from 'xservice_kit';
8
+ import { MethodResult } from '@ohos/flutter_ohos';
9
+
10
+ export class {{name}} {
11
+ private static readonly mService: ServiceTemplate = new ServiceTemplate('{{name}}');
12
+
13
+ public static getService(): ServiceTemplate {
14
+ return {{name}}.mService;
15
+ }
16
+
17
+ public static register(): void {
18
+ ServiceGateway.sharedInstance().addService({{name}}.mService);
19
+ }
20
+
21
+ {{#native_msg}}
22
+ public static {{name}}(result: MessageResult<MessageValue>{{#args}}, {{name}}: {{arkts_type}}{{/args}}): void {
23
+ const args: Record<string, MessageValue> = {};
24
+ {{#args}}
25
+ args['{{name}}'] = {{name}};
26
+ {{/args}}
27
+ const methodResult: MethodResult = {
28
+ success: (o: Object): void => {
29
+ if (o !== null && o !== undefined) {
30
+ result.success(o as MessageValue);
31
+ } else {
32
+ result.error('return type error', '', '');
33
+ }
34
+ },
35
+ error: (errorCode: string, errorMessage: string, errorDetails: Object): void => {
36
+ if (result) {
37
+ result.error(errorCode, errorMessage, errorDetails);
38
+ }
39
+ },
40
+ notImplemented: (): void => {
41
+ if (result) {
42
+ result.notImplemented();
43
+ }
44
+ }
45
+ };
46
+ {{service_name}}.mService.invoke(
47
+ '{{name}}',
48
+ args,
49
+ {{service_name}}.mService.methodChannelName(),
50
+ methodResult
51
+ );
52
+ }
53
+ {{/native_msg}}
54
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Generated by code generator
3
+ * Service: {{name}}
4
+ * Package: {{pkg_name}}
5
+ */
6
+
7
+ import { ServiceTemplate, ServiceGateway, MessageResult, MessageValue } from 'xservice_kit';
8
+ import { MethodResult } from '@ohos/flutter_ohos';
9
+
10
+ export class {{name}} {
11
+ private static readonly mService: ServiceTemplate = new ServiceTemplate('{{name}}');
12
+
13
+ public static getService(): ServiceTemplate {
14
+ return {{name}}.mService;
15
+ }
16
+
17
+ public static register(): void {
18
+ ServiceGateway.sharedInstance().addService({{name}}.mService);
19
+ }
20
+
21
+ {{#native_msg}}
22
+ public static {{name}}(result: MessageResult<MessageValue>{{#args}}, {{name}}: {{arkts_type}}{{/args}}): void {
23
+ const args: Record<string, MessageValue> = {};
24
+ {{#args}}
25
+ args['{{name}}'] = {{name}};
26
+ {{/args}}
27
+ const methodResult: MethodResult = {
28
+ success: (o: Object): void => {
29
+ if (o !== null && o !== undefined) {
30
+ result.success(o as MessageValue);
31
+ } else {
32
+ result.error('return type error', '', '');
33
+ }
34
+ },
35
+ error: (errorCode: string, errorMessage: string, errorDetails: Object): void => {
36
+ if (result) {
37
+ result.error(errorCode, errorMessage, errorDetails);
38
+ }
39
+ },
40
+ notImplemented: (): void => {
41
+ if (result) {
42
+ result.notImplemented();
43
+ }
44
+ }
45
+ };
46
+ {{service_name}}.mService.invoke(
47
+ '{{name}}',
48
+ args,
49
+ {{service_name}}.mService.methodChannelName(),
50
+ methodResult
51
+ );
52
+ }
53
+ {{/native_msg}}
54
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Generated by code generator
3
+ * Service Register: {{name}}Register
4
+ * Package: {{pkg_name}}
5
+ */
6
+
7
+ import { {{name}} } from './{{name}}';
8
+ {{#flutter_msg}}
9
+ import { {{service_name}}_{{name}} } from '../handlers/{{service_name}}_{{name}}';
10
+ {{/flutter_msg}}
11
+
12
+ export class {{name}}Register {
13
+ public static register(): void {
14
+ {{name}}.register();
15
+ {{#flutter_msg}}
16
+ {{service_name}}_{{name}}.register();
17
+ {{/flutter_msg}}
18
+ }
19
+ }
@@ -0,0 +1,38 @@
1
+ import 'dart:async';
2
+
3
+ import 'package:flutter/services.dart';
4
+ import 'package:xservice_kit/ServiceCallHandler.dart';
5
+ import 'package:xservice_kit/ServiceGateway.dart';
6
+
7
+ class {{service_name}}{{name}} extends ServiceCallHandler {
8
+
9
+ static void regsiter() {
10
+ ServiceGateway.sharedInstance().registerHandler(new {{service_name}}{{name}}());
11
+ }
12
+
13
+ @override
14
+ String name() {
15
+ return "{{name}}";
16
+ }
17
+
18
+ @override
19
+ String service() {
20
+ return "{{service_name}}";
21
+ }
22
+
23
+ @override
24
+ Future<{{returnType}}> onMethodCall(MethodCall call) {
25
+ return onCall({{#args}}call.arguments["{{name}}"]{{^last}},{{/last}}{{/args}});
26
+ }
27
+
28
+ //==============================================Do not edit code above!
29
+ Future<{{returnType}}> onCall({{#args}}{{type}} {{name}}{{^last}},{{/last}}{{/args}}) async{
30
+ //TODO:Add you handler code here.
31
+ {{#return_map}}
32
+ return {};
33
+ {{/return_map}}
34
+ {{^return_map}}
35
+ return null;
36
+ {{/return_map}}
37
+ }
38
+ }
@@ -0,0 +1,10 @@
1
+ {{#services}}import '../{{name}}/service/{{service_dart_file_name}}_register.dart';
2
+ {{/services}}
3
+
4
+ class ServiceLoader{
5
+ static void load(){
6
+ {{#services}}
7
+ {{name}}Register.register();
8
+ {{/services}}
9
+ }
10
+ }
@@ -0,0 +1,30 @@
1
+ import 'dart:async';
2
+ import 'package:xservice_kit/ServiceTemplate.dart';
3
+ import 'package:xservice_kit/ServiceGateway.dart';
4
+
5
+ class {{name}} {
6
+ static final ServiceTemplate _service = new ServiceTemplate("{{name}}");
7
+
8
+ static ServiceTemplate service(){
9
+ return _service;
10
+ }
11
+
12
+ static void regsiter() {
13
+ ServiceGateway.sharedInstance().registerService(_service);
14
+ }
15
+
16
+ {{#flutter_msg}}
17
+ static Future<{{returnType}}> {{name}}({{#args}}{{type}} {{name}}{{^last}},{{/last}}{{/args}},[onInvocationException? onException]) {
18
+ Map<String,dynamic> properties = new Map<String,dynamic>();
19
+ {{#args}}properties["{{name}}"]= {{name}};
20
+ {{/args}}return _service.invokeMethod('{{name}}',properties,onException).then<{{returnType}}>((value){
21
+ if(value == null){
22
+ return {{default_return_value}};
23
+ }else{
24
+ return value;
25
+ }
26
+ });
27
+ }
28
+ {{/flutter_msg}}
29
+
30
+ }
@@ -0,0 +1,15 @@
1
+
2
+ import '{{service_dart_file_name}}.dart';
3
+ {{#native_msg}}import '../handlers/{{service_dart_file_name}}_{{msg_dart_file_name}}.dart';
4
+ {{/native_msg}}
5
+
6
+ class {{service_name}}Register{
7
+
8
+ static void register(){
9
+ {{service_name}}.regsiter();
10
+ {{#native_msg}}
11
+ {{service_name}}{{name}}.regsiter();
12
+ {{/native_msg}}
13
+ }
14
+
15
+ }
@@ -0,0 +1,45 @@
1
+ package {{pkg_name}}.{{service_name}}.handlers;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.List;
5
+ import java.util.Map;
6
+ import fleamarket.taobao.com.xservicekit.handler.MessageHandler;
7
+ import fleamarket.taobao.com.xservicekit.handler.MessageResult;
8
+ import fleamarket.taobao.com.xservicekit.service.ServiceGateway;
9
+
10
+ public class {{service_name}}_{{name}} implements MessageHandler<{{return_java_type}}>{
11
+ private Object mContext = null;
12
+ private boolean onCall(MessageResult<{{return_java_type}}> result,{{#args}}{{java_type}} {{name}}{{^last}},{{/last}}{{/args}}){
13
+ //Add your handler code here.
14
+ return true;
15
+ }
16
+
17
+ //==================Do not edit code blow!==============
18
+ @Override
19
+ public boolean onMethodCall(String name, Map args, MessageResult<{{return_java_type}}> result) {
20
+ this.onCall(result,{{#args}}({{java_type}})args.get("{{name}}"){{^last}},{{/last}}{{/args}});
21
+ return true;
22
+ }
23
+ @Override
24
+ public List<String> handleMessageNames() {
25
+ List<String> h = new ArrayList<>();
26
+ h.add("{{name}}");
27
+ return h;
28
+ }
29
+ @Override
30
+ public Object getContext() {
31
+ return mContext;
32
+ }
33
+
34
+ @Override
35
+ public void setContext(Object obj) {
36
+ mContext = obj;
37
+ }
38
+ @Override
39
+ public String service() {
40
+ return "{{service_name}}";
41
+ }
42
+ public static void register(){
43
+ ServiceGateway.sharedInstance().registerHandler(new {{service_name}}_{{name}}());
44
+ }
45
+ }
@@ -0,0 +1,12 @@
1
+ package {{pkg_name}}.loader;
2
+
3
+ {{#services}}import {{pkg_name}}.{{name}}.service.*;
4
+ {{/services}}
5
+
6
+ public class ServiceLoader {
7
+ public static void load(){
8
+ {{#services}}
9
+ {{name}}Register.register();
10
+ {{/services}}
11
+ }
12
+ }
@@ -0,0 +1,48 @@
1
+ package {{pkg_name}}.{{service_name}}.service;
2
+
3
+ import java.util.HashMap;
4
+ import java.util.Map;
5
+
6
+ import fleamarket.taobao.com.xservicekit.service.ServiceTemplate;
7
+ import fleamarket.taobao.com.xservicekit.service.ServiceGateway;
8
+ import io.flutter.plugin.common.MethodChannel;
9
+ import fleamarket.taobao.com.xservicekit.handler.MessageResult;
10
+
11
+ public class {{service_name}} {
12
+ private static final ServiceTemplate mService = new ServiceTemplate("{{service_name}}");
13
+ public static ServiceTemplate getService(){
14
+ return mService;
15
+ }
16
+ public static void register(){
17
+ ServiceGateway.sharedInstance().addService(mService);
18
+ }
19
+ {{#native_msg}}
20
+ public static void {{name}}(final MessageResult<{{return_java_type}}> result, {{#args}}{{java_type}} {{name}}{{^last}},{{/last}}{{/args}}){
21
+ Map<String,Object> args = new HashMap<>();
22
+ {{#args}}args.put("{{name}}",{{name}});
23
+ {{/args}}mService.invoke("{{name}}", args, mService.methodChannelName(), new MethodChannel.Result() {
24
+ @Override
25
+ public void success(Object o) {
26
+ if (o instanceof {{return_java_type}}){
27
+ result.success(({{return_java_type}})o);
28
+ }else{
29
+ result.error("return type error code dart code","","");
30
+ }
31
+ }
32
+
33
+ @Override
34
+ public void error(String s, String s1, Object o) {
35
+ if (result != null){
36
+ result.error(s,s1,o);
37
+ }
38
+ }
39
+
40
+ @Override
41
+ public void notImplemented() {
42
+ if (result != null){
43
+ result.notImplemented();
44
+ }
45
+ }
46
+ });
47
+ }{{/native_msg}}
48
+ }
@@ -0,0 +1,12 @@
1
+ package {{pkg_name}}.{{service_name}}.service;
2
+
3
+ import {{pkg_name}}.{{service_name}}.handlers.*;
4
+
5
+ public class {{service_name}}Register {
6
+ public static void register(){
7
+ {{service_name}}.register();
8
+ {{#flutter_msg}}
9
+ {{service_name}}_{{name}}.register();
10
+ {{/flutter_msg}}
11
+ }
12
+ }
@@ -0,0 +1,6 @@
1
+ //Generated by AIOCodeGen do not edit!
2
+
3
+ #import "FlutterServiceCallHandler.h"
4
+
5
+ @interface {{service_name}}_{{name}} : FlutterServiceCallHandler
6
+ @end
@@ -0,0 +1,23 @@
1
+ //Generated by AIOCodeGen.
2
+ #import "ServiceGateway.h"
3
+ #import "{{service_name}}_{{name}}.h"
4
+
5
+ @implementation {{service_name}}_{{name}}
6
+ - (void)onCall:(void (^)({{return_oc_type}}))result {{#args}}{{name}}:({{oc_ob_type}}){{name}} {{/args}}{
7
+ //Add your handler code here!
8
+ //TODO:
9
+ }
10
+ #pragma mark - Do not edit these method.
11
+ - (void)__flutter_p_handler_{{name}}:(NSDictionary *)args result:(void (^)({{return_oc_type}}))result {
12
+ [self onCall:result {{#args}}{{name}}:args[@"{{name}}"] {{/args}}];
13
+ }
14
+ + (void)load{
15
+ [[ServiceGateway sharedInstance] registerHandler:[{{service_name}}_{{name}} new]];
16
+ }
17
+ - (NSString *)returnType{
18
+ return @"{{return_oc_type}}";
19
+ }
20
+ - (NSString *)service{
21
+ return @"{{service_name}}";
22
+ }
23
+ @end
@@ -0,0 +1,8 @@
1
+ //Generated by AIOCodeGen do not edit!
2
+ #import "FlutterServiceTemplate.h"
3
+
4
+ @interface Service_{{service_name}} : NSObject
5
+ + (FlutterServiceTemplate *)service;
6
+ {{#native_msg}}+ (void){{name}}:(void (^)({{return_oc_ob_type}}))resultCallback {{#args}}{{name}}:({{oc_ob_type}}){{name}} {{/args}};
7
+ {{/native_msg}}
8
+ @end
@@ -0,0 +1,32 @@
1
+ //Generated code. Do not edit!
2
+ #import "Service_{{service_name}}.h"
3
+ #import "ServiceGateway.h"
4
+ #import "FlutterServiceTemplate.h"
5
+
6
+ @implementation Service_{{service_name}}
7
+
8
+ + (FlutterServiceTemplate *)service {
9
+ static id _instance = nil;
10
+ static dispatch_once_t onceToken;
11
+ dispatch_once(&onceToken, ^{
12
+ _instance = [[FlutterServiceTemplate alloc] initWithName:@"{{service_name}}"];
13
+ });
14
+ return _instance;
15
+ }
16
+
17
+ + (void)load{
18
+ [[ServiceGateway sharedInstance] addService:[self service]];
19
+ }
20
+
21
+ {{#native_msg}}+ (void){{name}}:(void (^)({{return_oc_ob_type}}))resultCallback {{#args}}{{name}}:({{oc_ob_type}}){{name}} {{/args}} {
22
+ NSMutableDictionary *tmp = [NSMutableDictionary dictionary];
23
+ {{#args}}if({{name}}) tmp[@"{{name}}"] = {{name}};
24
+ {{/args}}[self.service invoke:@"{{name}}" args:tmp result:^(id tTesult) {
25
+ if (resultCallback) {
26
+ resultCallback(tTesult);
27
+ }
28
+ }];
29
+ }
30
+ {{/native_msg}}
31
+
32
+ @end