k99 0.2.0 → 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +8 -0
  3. package/README.zh.md +8 -0
  4. package/browser/package.json +8 -0
  5. package/browser/types.d.ts +20 -0
  6. package/cli/command/create.js +1 -2
  7. package/cli/command/index.js +1 -2
  8. package/cli/command/init.js +3 -5
  9. package/cli/command/start.js +9 -10
  10. package/cli/index.js +3 -4
  11. package/cli/opt/bind.js +1 -2
  12. package/cli/opt/index.js +1 -2
  13. package/cli/opt/listen.js +1 -2
  14. package/cli/opt/path.js +1 -2
  15. package/cli/opt/port.js +1 -2
  16. package/cli/opt/show-router.js +1 -2
  17. package/dist/k99.browser.js +3110 -0
  18. package/dist/k99.browser.min.js +6 -0
  19. package/dist/k99.esm.js +3082 -0
  20. package/dist/k99.esm.min.js +6 -0
  21. package/dist/k99.js +3104 -0
  22. package/dist/k99.mjs +3082 -0
  23. package/dist/k99Browser.browser.js +490 -0
  24. package/dist/k99Browser.browser.min.js +6 -0
  25. package/dist/k99Browser.esm.js +475 -0
  26. package/dist/k99Browser.esm.min.js +6 -0
  27. package/dist/k99Browser.js +484 -0
  28. package/dist/k99Browser.mjs +475 -0
  29. package/dist/k99Services.browser.js +145 -0
  30. package/dist/k99Services.browser.min.js +6 -0
  31. package/dist/k99Services.esm.js +136 -0
  32. package/dist/k99Services.esm.min.js +6 -0
  33. package/dist/k99Services.js +141 -0
  34. package/dist/k99Services.mjs +136 -0
  35. package/node/index.js +1386 -0
  36. package/node/index.mjs +1350 -0
  37. package/node/package.json +5 -0
  38. package/node/types.d.ts +166 -0
  39. package/package.json +77 -11
  40. package/services/package.json +8 -0
  41. package/services/types.d.ts +22 -0
  42. package/starter.js +0 -1
  43. package/types.d.ts +748 -0
  44. package/Container.d.ts +0 -92
  45. package/Container.js +0 -242
  46. package/Container.js.map +0 -1
  47. package/Controller/index.d.ts +0 -178
  48. package/Controller/index.js +0 -576
  49. package/Controller/index.js.map +0 -1
  50. package/Controller/patch/cookie.d.ts +0 -33
  51. package/Controller/patch/cookie.js +0 -168
  52. package/Controller/patch/cookie.js.map +0 -1
  53. package/Controller/patch/index.d.ts +0 -7
  54. package/Controller/patch/index.js +0 -26
  55. package/Controller/patch/index.js.map +0 -1
  56. package/Controller/patch/render.d.ts +0 -5
  57. package/Controller/patch/render.js +0 -24
  58. package/Controller/patch/render.js.map +0 -1
  59. package/ExitSignal.d.ts +0 -14
  60. package/ExitSignal.js +0 -29
  61. package/ExitSignal.js.map +0 -1
  62. package/Extension.d.ts +0 -56
  63. package/Extension.js +0 -93
  64. package/Extension.js.map +0 -1
  65. package/ExtensionContainer.d.ts +0 -55
  66. package/ExtensionContainer.js +0 -105
  67. package/ExtensionContainer.js.map +0 -1
  68. package/Plugin.d.ts +0 -52
  69. package/Plugin.js +0 -278
  70. package/Plugin.js.map +0 -1
  71. package/Preprocessor.d.ts +0 -86
  72. package/Preprocessor.js +0 -135
  73. package/Preprocessor.js.map +0 -1
  74. package/Router/assets.d.ts +0 -33
  75. package/Router/assets.js +0 -106
  76. package/Router/assets.js.map +0 -1
  77. package/Router/callback.d.ts +0 -9
  78. package/Router/callback.js +0 -152
  79. package/Router/callback.js.map +0 -1
  80. package/Router/extendsInterface.d.ts +0 -8
  81. package/Router/extendsInterface.js +0 -43
  82. package/Router/extendsInterface.js.map +0 -1
  83. package/Router/index.d.ts +0 -184
  84. package/Router/index.js +0 -615
  85. package/Router/index.js.map +0 -1
  86. package/Router/log.d.ts +0 -23
  87. package/Router/log.js +0 -120
  88. package/Router/log.js.map +0 -1
  89. package/Router/order.d.ts +0 -14
  90. package/Router/order.js +0 -71
  91. package/Router/order.js.map +0 -1
  92. package/Router/register.d.ts +0 -9
  93. package/Router/register.js +0 -252
  94. package/Router/register.js.map +0 -1
  95. package/Router/registerManager.d.ts +0 -22
  96. package/Router/registerManager.js +0 -102
  97. package/Router/registerManager.js.map +0 -1
  98. package/Router/scan.d.ts +0 -2
  99. package/Router/scan.js +0 -72
  100. package/Router/scan.js.map +0 -1
  101. package/Router/setHandleItem.d.ts +0 -3
  102. package/Router/setHandleItem.js +0 -94
  103. package/Router/setHandleItem.js.map +0 -1
  104. package/Router/settings.d.ts +0 -12
  105. package/Router/settings.js +0 -74
  106. package/Router/settings.js.map +0 -1
  107. package/Router/start.d.ts +0 -3
  108. package/Router/start.js +0 -270
  109. package/Router/start.js.map +0 -1
  110. package/Router/vars.d.ts +0 -10
  111. package/Router/vars.js +0 -40
  112. package/Router/vars.js.map +0 -1
  113. package/Service.d.ts +0 -12
  114. package/Service.js +0 -20
  115. package/Service.js.map +0 -1
  116. package/cli/command/create.d.ts +0 -7
  117. package/cli/command/create.js.map +0 -1
  118. package/cli/command/index.d.ts +0 -7
  119. package/cli/command/index.js.map +0 -1
  120. package/cli/command/init.d.ts +0 -6
  121. package/cli/command/init.js.map +0 -1
  122. package/cli/command/start.d.ts +0 -6
  123. package/cli/command/start.js.map +0 -1
  124. package/cli/index.d.ts +0 -2
  125. package/cli/index.js.map +0 -1
  126. package/cli/opt/bind.d.ts +0 -3
  127. package/cli/opt/bind.js.map +0 -1
  128. package/cli/opt/index.d.ts +0 -16
  129. package/cli/opt/index.js.map +0 -1
  130. package/cli/opt/listen.d.ts +0 -3
  131. package/cli/opt/listen.js.map +0 -1
  132. package/cli/opt/path.d.ts +0 -3
  133. package/cli/opt/path.js.map +0 -1
  134. package/cli/opt/port.d.ts +0 -3
  135. package/cli/opt/port.js.map +0 -1
  136. package/cli/opt/show-router.d.ts +0 -3
  137. package/cli/opt/show-router.js.map +0 -1
  138. package/index.d.ts +0 -354
  139. package/index.js +0 -155
  140. package/index.js.map +0 -1
  141. package/setOptions.d.ts +0 -12
  142. package/setOptions.js +0 -60
  143. package/setOptions.js.map +0 -1
  144. package/starter.d.ts +0 -2
  145. package/starter.js.map +0 -1
  146. package/symbols.d.ts +0 -13
  147. package/symbols.js +0 -31
  148. package/symbols.js.map +0 -1
  149. package/util/index.d.ts +0 -5
  150. package/util/index.js +0 -92
  151. package/util/index.js.map +0 -1
  152. package/util/stream.d.ts +0 -19
  153. package/util/stream.js +0 -66
  154. package/util/stream.js.map +0 -1
package/node/index.js ADDED
@@ -0,0 +1,1386 @@
1
+ /*!
2
+ * k99 v0.3.0-beta.1
3
+ * (c) 2019-2022 Fierflame
4
+ * @license MIT
5
+ */
6
+ 'use strict';
7
+
8
+ Object.defineProperty(exports, '__esModule', { value: true });
9
+
10
+ var fsFn = require('fs');
11
+ var pathFn = require('path');
12
+ var k99 = require('k99');
13
+ var http2 = require('http2');
14
+ var urlFn = require('url');
15
+
16
+ function _interopNamespace(e) {
17
+ if (e && e.__esModule) return e;
18
+ var n = Object.create(null);
19
+ if (e) {
20
+ Object.keys(e).forEach(function (k) {
21
+ if (k !== 'default') {
22
+ var d = Object.getOwnPropertyDescriptor(e, k);
23
+ Object.defineProperty(n, k, d.get ? d : {
24
+ enumerable: true,
25
+ get: function () {
26
+ return e[k];
27
+ }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n['default'] = e;
33
+ return Object.freeze(n);
34
+ }
35
+
36
+ var fsFn__namespace = /*#__PURE__*/_interopNamespace(fsFn);
37
+ var pathFn__namespace = /*#__PURE__*/_interopNamespace(pathFn);
38
+ var urlFn__namespace = /*#__PURE__*/_interopNamespace(urlFn);
39
+
40
+ function _defineProperty(obj, key, value) {
41
+ if (key in obj) {
42
+ Object.defineProperty(obj, key, {
43
+ value: value,
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true
47
+ });
48
+ } else {
49
+ obj[key] = value;
50
+ }
51
+
52
+ return obj;
53
+ }
54
+
55
+ const registers = Object.create(null);
56
+ function setRegister({
57
+ extname,
58
+ type,
59
+ register
60
+ }, list = registers) {
61
+ const key = `${type || ''}.${extname}`;
62
+
63
+ if (!/^(?:[a-z]+)?\.[a-z]+$/.test(key)) {
64
+ return false;
65
+ }
66
+
67
+ if (key in list) {
68
+ return false;
69
+ }
70
+
71
+ if (typeof register !== 'function') {
72
+ return false;
73
+ }
74
+
75
+ list[key] = {
76
+ extname,
77
+ type,
78
+ register
79
+ };
80
+ return true;
81
+ }
82
+ /** 注册文件 */
83
+
84
+ async function register(file, router, list) {
85
+ const {
86
+ extname,
87
+ type
88
+ } = file;
89
+ const key = `${type || ''}.${extname}`;
90
+ const register = (list === null || list === void 0 ? void 0 : list[key]) || registers[key];
91
+
92
+ if (!register) {
93
+ return false;
94
+ }
95
+
96
+ return register.register({ ...file
97
+ }, router);
98
+ }
99
+ setRegister({
100
+ extname: 'js',
101
+
102
+ async register({
103
+ root,
104
+ path,
105
+ plugin
106
+ }, router) {
107
+ const item = require(pathFn__namespace.join(root, path));
108
+
109
+ if (!item) {
110
+ return false;
111
+ }
112
+
113
+ router.register(item, {
114
+ root,
115
+ filePath: path,
116
+ plugin
117
+ });
118
+ return true;
119
+ }
120
+
121
+ });
122
+ setRegister({
123
+ extname: 'js',
124
+ type: 'resource',
125
+
126
+ async register({
127
+ root,
128
+ path,
129
+ plugin
130
+ }, router) {
131
+ const item = require(pathFn__namespace.join(root, path));
132
+
133
+ if (!item) {
134
+ return false;
135
+ }
136
+
137
+ router.resource(item, {
138
+ root,
139
+ filePath: path,
140
+ plugin
141
+ });
142
+ return true;
143
+ }
144
+
145
+ });
146
+ setRegister({
147
+ extname: 'js',
148
+ type: 'collection',
149
+
150
+ async register({
151
+ root,
152
+ path,
153
+ plugin
154
+ }, router) {
155
+ const item = require(pathFn__namespace.join(root, path));
156
+
157
+ if (!item) {
158
+ return false;
159
+ }
160
+
161
+ router.collection(item, {
162
+ root,
163
+ filePath: path,
164
+ plugin
165
+ });
166
+ return true;
167
+ }
168
+
169
+ });
170
+ setRegister({
171
+ extname: 'js',
172
+ type: 'members',
173
+
174
+ async register({
175
+ root,
176
+ path,
177
+ plugin
178
+ }, router) {
179
+ const item = require(pathFn__namespace.join(root, path));
180
+
181
+ if (!item) {
182
+ return false;
183
+ }
184
+
185
+ router.member(item, {
186
+ root,
187
+ filePath: path,
188
+ plugin
189
+ });
190
+ return true;
191
+ }
192
+
193
+ });
194
+ setRegister({
195
+ extname: 'js',
196
+ type: 'static',
197
+
198
+ async register({
199
+ root,
200
+ path,
201
+ plugin
202
+ }, router) {
203
+ const item = require(pathFn__namespace.join(root, path));
204
+
205
+ if (!item) {
206
+ return false;
207
+ }
208
+
209
+ router.collection(item, {
210
+ root,
211
+ filePath: path,
212
+ plugin
213
+ });
214
+ return true;
215
+ }
216
+
217
+ });
218
+ setRegister({
219
+ extname: 'js',
220
+ type: 'controller',
221
+
222
+ async register({
223
+ root,
224
+ path
225
+ }, router) {
226
+ const item = require(pathFn__namespace.join(root, path));
227
+
228
+ if (!item) {
229
+ return false;
230
+ }
231
+
232
+ if (typeof item.default !== 'function') {
233
+ return false;
234
+ }
235
+
236
+ if (!k99.Controller.isPrototypeOf(item.default)) {
237
+ return false;
238
+ }
239
+
240
+ router.controller = item.default;
241
+ return true;
242
+ }
243
+
244
+ });
245
+ setRegister({
246
+ extname: 'js',
247
+ type: 'guard',
248
+
249
+ async register({
250
+ root,
251
+ path
252
+ }, router) {
253
+ const item = require(pathFn__namespace.join(root, path));
254
+
255
+ if (!item) {
256
+ return false;
257
+ }
258
+
259
+ if (typeof item.default !== 'function') {
260
+ return false;
261
+ }
262
+
263
+ if (!k99.Guard.isPrototypeOf(item.default)) {
264
+ return false;
265
+ }
266
+
267
+ router.guards.add(item.default);
268
+ return true;
269
+ }
270
+
271
+ });
272
+ setRegister({
273
+ extname: 'js',
274
+ type: 'router',
275
+
276
+ async register({
277
+ root,
278
+ path
279
+ }, router) {
280
+ const item = require(pathFn__namespace.join(root, path));
281
+
282
+ if (!item) {
283
+ return false;
284
+ }
285
+
286
+ if (typeof item.default !== 'function') {
287
+ return false;
288
+ }
289
+
290
+ if (!k99.Router.isPrototypeOf(item.default)) {
291
+ return false;
292
+ }
293
+
294
+ router.route(item.default);
295
+ return true;
296
+ }
297
+
298
+ });
299
+ setRegister({
300
+ extname: 'mjs',
301
+
302
+ async register({
303
+ root,
304
+ path,
305
+ plugin
306
+ }, router) {
307
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
308
+
309
+ if (!item) {
310
+ return false;
311
+ }
312
+
313
+ router.register(item, {
314
+ root,
315
+ filePath: path,
316
+ plugin
317
+ });
318
+ return true;
319
+ }
320
+
321
+ });
322
+ setRegister({
323
+ extname: 'mjs',
324
+ type: 'resource',
325
+
326
+ async register({
327
+ root,
328
+ path,
329
+ plugin
330
+ }, router) {
331
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
332
+
333
+ if (!item) {
334
+ return false;
335
+ }
336
+
337
+ router.resource(item, {
338
+ root,
339
+ filePath: path,
340
+ plugin
341
+ });
342
+ return true;
343
+ }
344
+
345
+ });
346
+ setRegister({
347
+ extname: 'mjs',
348
+ type: 'collection',
349
+
350
+ async register({
351
+ root,
352
+ path,
353
+ plugin
354
+ }, router) {
355
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
356
+
357
+ if (!item) {
358
+ return false;
359
+ }
360
+
361
+ router.collection(item, {
362
+ root,
363
+ filePath: path,
364
+ plugin
365
+ });
366
+ return true;
367
+ }
368
+
369
+ });
370
+ setRegister({
371
+ extname: 'mjs',
372
+ type: 'members',
373
+
374
+ async register({
375
+ root,
376
+ path,
377
+ plugin
378
+ }, router) {
379
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
380
+
381
+ if (!item) {
382
+ return false;
383
+ }
384
+
385
+ router.member(item, {
386
+ root,
387
+ filePath: path,
388
+ plugin
389
+ });
390
+ return true;
391
+ }
392
+
393
+ });
394
+ setRegister({
395
+ extname: 'mjs',
396
+ type: 'static',
397
+
398
+ async register({
399
+ root,
400
+ path,
401
+ plugin
402
+ }, router) {
403
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
404
+
405
+ if (!item) {
406
+ return false;
407
+ }
408
+
409
+ router.collection(item, {
410
+ root,
411
+ filePath: path,
412
+ plugin
413
+ });
414
+ return true;
415
+ }
416
+
417
+ });
418
+ setRegister({
419
+ extname: 'mjs',
420
+ type: 'controller',
421
+
422
+ async register({
423
+ root,
424
+ path
425
+ }, router) {
426
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
427
+
428
+ if (!item) {
429
+ return false;
430
+ }
431
+
432
+ if (typeof item.default !== 'function') {
433
+ return false;
434
+ }
435
+
436
+ if (!k99.Controller.isPrototypeOf(item.default)) {
437
+ return false;
438
+ }
439
+
440
+ router.controller = item.default;
441
+ return true;
442
+ }
443
+
444
+ });
445
+ setRegister({
446
+ extname: 'mjs',
447
+ type: 'guard',
448
+
449
+ async register({
450
+ root,
451
+ path
452
+ }, router) {
453
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
454
+
455
+ if (!item) {
456
+ return false;
457
+ }
458
+
459
+ if (typeof item.default !== 'function') {
460
+ return false;
461
+ }
462
+
463
+ if (!k99.Guard.isPrototypeOf(item.default)) {
464
+ return false;
465
+ }
466
+
467
+ router.guards.add(item.default);
468
+ return true;
469
+ }
470
+
471
+ });
472
+ setRegister({
473
+ extname: 'mjs',
474
+ type: 'router',
475
+
476
+ async register({
477
+ root,
478
+ path
479
+ }, router) {
480
+ const item = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(pathFn__namespace.join(root, path))); });
481
+
482
+ if (!item) {
483
+ return false;
484
+ }
485
+
486
+ if (typeof item.default !== 'function') {
487
+ return false;
488
+ }
489
+
490
+ if (!k99.Router.isPrototypeOf(item.default)) {
491
+ return false;
492
+ }
493
+
494
+ router.route(item.default);
495
+ return true;
496
+ }
497
+
498
+ });
499
+
500
+ const dirRegex = /^((?:\d+\.)?)([:$]?)([a-zA-Z0-9_-]+)(\${0,3}|[?*+])$/;
501
+ const fileRegex = /^((?:\d+\.)?)([:$]?)([a-zA-Z0-9_-]+)(\${0,3}|[?*+])((?:\.[a-z]+)?)(\.[a-z]+)$/;
502
+ function getPathSortInfo(filename) {
503
+ const dir = dirRegex.exec(filename);
504
+
505
+ if (dir) {
506
+ const no = Number.parseInt(dir[1]);
507
+ const tuple = Boolean(dir[2]);
508
+ const extend = dir[4].replace(/\${3}$/, '+').replace(/\${2}$/, '*').replace(/\${1}$/, '?');
509
+ const name = [tuple && ':', dir[3], extend].filter(Boolean).join('');
510
+ return {
511
+ dir: true,
512
+ filename,
513
+ no,
514
+ tuple,
515
+ name,
516
+ extend
517
+ };
518
+ }
519
+
520
+ const file = fileRegex.exec(filename);
521
+
522
+ if (!file) {
523
+ return null;
524
+ }
525
+
526
+ const no = Number.parseInt(file[1]);
527
+ const tuple = Boolean(file[2]);
528
+ const extend = file[4].replace(/\${3}$/, '+').replace(/\${2}$/, '*').replace(/\${1}$/, '?');
529
+ const name = !file[1] && !tuple && !extend && file[3] === 'index' ? '' : [tuple && ':', file[3], extend].filter(Boolean).join('');
530
+ const type = file[5].substr(1);
531
+ const extname = file[6].substr(1);
532
+ return {
533
+ filename,
534
+ no,
535
+ tuple,
536
+ name,
537
+ extend,
538
+ type,
539
+ extname
540
+ };
541
+ }
542
+
543
+ function sortValid(a, b) {
544
+ if (a.name && !b.name) {
545
+ return 1;
546
+ }
547
+
548
+ if (!a.name && b.name) {
549
+ return -1;
550
+ }
551
+
552
+ if (!a.name && !b.name) {
553
+ return 0;
554
+ }
555
+
556
+ if (Number.isFinite(a.no) && Number.isFinite(b.no) && a.no !== b.no) {
557
+ return a.no - b.no;
558
+ }
559
+
560
+ if (Number.isFinite(a.no) && !Number.isFinite(b.no)) {
561
+ return -1;
562
+ }
563
+
564
+ if (!Number.isFinite(a.no) && Number.isFinite(b.no)) {
565
+ return 1;
566
+ }
567
+
568
+ if (a.tuple && !b.tuple) {
569
+ return 1;
570
+ }
571
+
572
+ if (!a.tuple && b.tuple) {
573
+ return -1;
574
+ }
575
+
576
+ if (a.dir && !b.dir) {
577
+ return 1;
578
+ }
579
+
580
+ if (!a.dir && b.dir) {
581
+ return -1;
582
+ }
583
+
584
+ if (a.extend === b.extend) {
585
+ let aName = a.name.toLowerCase();
586
+ let bName = b.name.toLowerCase();
587
+ return aName > bName ? 1 : aName < bName ? -1 : a.name < b.name ? 1 : a.name > b.name ? -1 : 0;
588
+ }
589
+
590
+ if (a.extend && !b.extend) {
591
+ return 1;
592
+ }
593
+
594
+ if (!a.extend && b.extend) {
595
+ return -1;
596
+ }
597
+
598
+ if (a.extend === '*') {
599
+ return 1;
600
+ }
601
+
602
+ if (b.extend === '*') {
603
+ return -1;
604
+ }
605
+
606
+ if (a.extend === '+') {
607
+ return 1;
608
+ }
609
+
610
+ if (b.extend === '+') {
611
+ return -1;
612
+ }
613
+
614
+ if (a.extend === '?') {
615
+ return 1;
616
+ }
617
+
618
+ return -1;
619
+ }
620
+
621
+ function isValidInfo(t) {
622
+ return Boolean(t);
623
+ }
624
+
625
+ async function readdir$1(path) {
626
+ return new Promise(resolve => fsFn__namespace.readdir(path, {
627
+ encoding: 'utf-8'
628
+ }, (err, files) => err ? resolve([]) : resolve(files))).then(paths => paths.map(getPathSortInfo).filter(isValidInfo).sort(sortValid));
629
+ }
630
+
631
+ async function stat(path) {
632
+ return new Promise(resolve => fsFn__namespace.stat(path, (err, stat) => err ? resolve() : resolve(stat)));
633
+ }
634
+
635
+ async function isFile$1(path) {
636
+ const s = await stat(path);
637
+ return s && s.isFile();
638
+ }
639
+
640
+ async function isDir(path) {
641
+ const s = await stat(path);
642
+ return s && s.isDirectory();
643
+ }
644
+
645
+ async function scan(root, router, plugin, list, path = '', scope = []) {
646
+ const routers = Object.create(null);
647
+
648
+ function getRouter(name) {
649
+ if (!name) {
650
+ return router;
651
+ }
652
+
653
+ let child = routers[name];
654
+
655
+ if (!child) {
656
+ child = router.route(name);
657
+ routers[name] = child;
658
+ }
659
+
660
+ return child;
661
+ }
662
+
663
+ for (let item of await readdir$1(pathFn__namespace.resolve(root, path))) {
664
+ const {
665
+ filename,
666
+ name
667
+ } = item;
668
+ const newPath = pathFn__namespace.join(path, filename);
669
+
670
+ if (item.dir) {
671
+ if (isDir(pathFn__namespace.resolve(root, newPath))) {
672
+ await scan(root, getRouter(name), plugin, list, newPath, [...scope, name]);
673
+ }
674
+ } else if (isFile$1(pathFn__namespace.resolve(root, newPath))) {
675
+ const {
676
+ extname,
677
+ type
678
+ } = item;
679
+ await register({
680
+ extname,
681
+ type,
682
+ root,
683
+ path: newPath,
684
+ plugin,
685
+ scope: name ? [...scope, name] : scope
686
+ }, getRouter(name), list);
687
+ }
688
+ }
689
+ }
690
+
691
+ class Scanner {
692
+ constructor() {
693
+ _defineProperty(this, "__registers", Object.create(null));
694
+ }
695
+
696
+ /**
697
+ * 设置公共的文件注册器
698
+ * @param register 注册配置
699
+ */
700
+ static setRegister(register) {
701
+ return setRegister(register);
702
+ }
703
+ /**
704
+ * 扫描指定路径,并将扫描到的文件进行注册
705
+ * @param root 要扫描的路径
706
+ * @param router 被注册的路由
707
+ */
708
+
709
+
710
+ static scan(root, router, plugin) {
711
+ return scan(root, router, plugin);
712
+ }
713
+ /** 注册器列表 */
714
+
715
+
716
+ /**
717
+ * 扫描指定路径,并将扫描到的文件进行注册
718
+ * @param root 要扫描的路径
719
+ * @param router 被注册的路由
720
+ */
721
+ scan(root, router, plugin) {
722
+ return scan(root, router, plugin, this.__registers);
723
+ }
724
+ /** 为当前路由设置注册器 */
725
+
726
+
727
+ setRegister(register) {
728
+ return setRegister(register, this.__registers);
729
+ }
730
+
731
+ }
732
+
733
+ async function getRouters(router, routers) {
734
+ const r = await getRouter(router);
735
+
736
+ if (!Array.isArray(routers)) {
737
+ return r ? [r] : undefined;
738
+ }
739
+
740
+ const list = r ? [r] : [];
741
+
742
+ for (const router of routers) {
743
+ const r = await getRouter(router);
744
+
745
+ if (r) {
746
+ list.push(r);
747
+ }
748
+ }
749
+
750
+ if (list.length) {
751
+ return list;
752
+ }
753
+ }
754
+
755
+ async function getRouter(router) {
756
+ if (typeof router === 'function') {
757
+ router = await router();
758
+ }
759
+
760
+ if (router instanceof k99.Router) {
761
+ return router;
762
+ }
763
+ }
764
+
765
+ class FsPlugin extends k99.Plugin {
766
+ /** 路径 */
767
+ async readSettings(path) {
768
+ const p = pathFn__namespace.resolve(this.settingsPath, `${path}.json`);
769
+
770
+ try {
771
+ return JSON.parse((await new Promise((resolve, reject) => fsFn__namespace.readFile(p, 'utf-8', (e, d) => e ? reject(e) : resolve(d)))));
772
+ } catch {}
773
+ }
774
+
775
+ readAsset(path, encoding) {
776
+ return new Promise(resolve => fsFn__namespace.readFile(pathFn__namespace.resolve(this.assetsPath, path), encoding ? 'utf-8' : null, (e, d) => e ? resolve(null) : resolve(typeof d === 'string' ? d : d.buffer)));
777
+ }
778
+
779
+ constructor(config, name) {
780
+ const {
781
+ path,
782
+ version,
783
+ author,
784
+ license,
785
+ assetsPath,
786
+ settingsPath,
787
+ logsPath
788
+ } = config;
789
+ super(name, version || '', {
790
+ author,
791
+ license
792
+ });
793
+ this._config = config;
794
+ this.assetsPath = pathFn__namespace.resolve(path, assetsPath || 'assets');
795
+ this.settingsPath = pathFn__namespace.resolve(path, settingsPath || 'settings');
796
+ this.logsPath = pathFn__namespace.resolve(path, logsPath || 'logs');
797
+ this.path = path;
798
+ }
799
+
800
+ async _initRouter(pluginRouter) {
801
+ const {
802
+ _config
803
+ } = this;
804
+ const list = await getRouters(_config.router, _config.routers);
805
+
806
+ for (const router of list || []) {
807
+ pluginRouter.route(router);
808
+ }
809
+
810
+ const {
811
+ appPath
812
+ } = _config;
813
+
814
+ if (list && !appPath) {
815
+ return;
816
+ }
817
+
818
+ const {
819
+ path
820
+ } = _config;
821
+ await Scanner.scan(pathFn__namespace.resolve(path, appPath || 'app'), pluginRouter);
822
+ }
823
+
824
+ }
825
+
826
+ function createFsLogApi(logsPath) {
827
+ const basePath = pathFn__namespace.resolve(logsPath, '.');
828
+ return {
829
+ async read(path) {
830
+ path = `${basePath}/${path}.log`;
831
+ return new Promise(resolve => fsFn__namespace.readFile(path, 'utf-8', (e, d) => resolve(e ? '' : d)));
832
+ },
833
+
834
+ async write(path, log) {
835
+ path = `${basePath}/${path}.log`;
836
+ await new Promise(r => fsFn__namespace.mkdir(pathFn__namespace.dirname(path), {
837
+ recursive: true
838
+ }, () => r()));
839
+ return new Promise(resolve => fsFn__namespace.appendFile(path, log, e => resolve(!e)));
840
+ },
841
+
842
+ async clear(path) {
843
+ path = `${basePath}/${path}.log`;
844
+ return new Promise(resolve => fsFn__namespace.writeFile(path, '', () => resolve()));
845
+ }
846
+
847
+ };
848
+ }
849
+
850
+ function createFsSettingsApi(settingsPath) {
851
+ const basePath = pathFn__namespace.resolve(settingsPath, '.');
852
+ return {
853
+ async read(path) {
854
+ const p = `${basePath}/${path}.json`;
855
+ const text = await new Promise(r => fsFn__namespace.readFile(p, 'utf8', (e, d) => e ? r('') : r(d)));
856
+
857
+ if (!text) {
858
+ return undefined;
859
+ }
860
+
861
+ try {
862
+ return JSON.parse(text);
863
+ } catch {}
864
+ },
865
+
866
+ async write(path, cfg) {
867
+ const p = `${basePath}/${path}.json`;
868
+
869
+ if (cfg === undefined) {
870
+ return new Promise(r => fsFn__namespace.unlink(p, e => r(!e)));
871
+ }
872
+
873
+ await new Promise(r => fsFn__namespace.mkdir(pathFn__namespace.dirname(p), {
874
+ recursive: true
875
+ }, r));
876
+ const text = JSON.stringify(cfg);
877
+ return new Promise(r => fsFn__namespace.writeFile(p, text, e => r(!e)));
878
+ }
879
+
880
+ };
881
+ }
882
+
883
+ function getStat(s) {
884
+ return {
885
+ get isDirectory() {
886
+ return s.isDirectory();
887
+ },
888
+
889
+ size: s.size,
890
+ updateTime: s.mtime,
891
+ createTime: s.birthtime
892
+ };
893
+ }
894
+
895
+ function createFsAssetsApi(assetsPath) {
896
+ const basePath = pathFn__namespace.resolve(assetsPath, '.');
897
+
898
+ function read(path, encoding) {
899
+ const p = `${basePath}/${path}`;
900
+ const options = encoding ? 'utf8' : null;
901
+ return new Promise(r => fsFn__namespace.readFile(p, options, (e, d) => e ? r(null) : r(typeof d === 'string' ? d : d.buffer)));
902
+ }
903
+
904
+ return {
905
+ read,
906
+
907
+ async write(path, data) {
908
+ const p = `${basePath}/${path}`;
909
+ await new Promise(r => fsFn__namespace.mkdir(pathFn__namespace.dirname(p), {
910
+ recursive: true
911
+ }, r));
912
+ return new Promise(r => fsFn__namespace.writeFile(p, data, e => r(!e)));
913
+ },
914
+
915
+ delete(path) {
916
+ const p = `${basePath}/${path}`;
917
+ return new Promise(resolve => fsFn__namespace.unlink(p, e => resolve(!e)));
918
+ },
919
+
920
+ stat(path) {
921
+ const p = `${basePath}/${path}`;
922
+ return new Promise(r => fsFn__namespace.stat(p, (e, s) => e ? r(null) : r(getStat(s))));
923
+ }
924
+
925
+ };
926
+ }
927
+
928
+ class NodeApp extends k99.App {
929
+ constructor({
930
+ path,
931
+ settingsPath,
932
+ assetsPath,
933
+ logsPath,
934
+ router
935
+ } = {}, plugins) {
936
+ const cwd = pathFn__namespace.resolve(path || process.cwd());
937
+ const newSettingsPath = pathFn__namespace.resolve(cwd, settingsPath || 'settings');
938
+ const newAssetsPath = pathFn__namespace.resolve(cwd, assetsPath || 'assets');
939
+ const newLogsPath = pathFn__namespace.resolve(cwd, logsPath || 'logs');
940
+ super({
941
+ path: cwd,
942
+ settingApi: createFsSettingsApi(newSettingsPath),
943
+ assetApi: createFsAssetsApi(newAssetsPath),
944
+ logApi: createFsLogApi(newLogsPath),
945
+ router
946
+ }, plugins);
947
+ this.cwd = cwd;
948
+ this.settingsPath = newSettingsPath;
949
+ this.assetsPath = newAssetsPath;
950
+ this.logsPath = newLogsPath;
951
+ }
952
+
953
+ }
954
+
955
+ function createRead(req) {
956
+ let currentEncoding = false;
957
+ let current = 0;
958
+ let cb = null;
959
+ let end = false;
960
+ const dataList = [];
961
+ let dataSize = 0;
962
+ const list = [];
963
+ let running = false;
964
+
965
+ function get(size) {
966
+ const chunk = Buffer.concat(dataList, dataSize);
967
+
968
+ if (size && dataSize > size) {
969
+ dataList.length = 0;
970
+ dataList.push(chunk.slice(size));
971
+ dataSize -= size;
972
+ return chunk.slice(0, size);
973
+ }
974
+
975
+ dataSize = 0;
976
+ dataList.length = 0;
977
+ return chunk;
978
+ }
979
+
980
+ function add(data) {
981
+ const buffer = typeof data === 'string' ? Buffer.from(data) : data;
982
+ dataSize += buffer.length || 0;
983
+ dataList.push(buffer);
984
+ return dataSize;
985
+ }
986
+
987
+ function nextData() {
988
+ return current ? req.read(current) : req.read();
989
+ }
990
+
991
+ function runCb(v) {
992
+ if (!cb) {
993
+ return;
994
+ }
995
+
996
+ cb(v);
997
+ [current, currentEncoding, cb] = list.shift() || [0, false, null];
998
+ }
999
+
1000
+ function runMain() {
1001
+ for (;;) {
1002
+ if (!cb) {
1003
+ return;
1004
+ }
1005
+
1006
+ if (end) {
1007
+ runCb(dataSize ? get(current) : null);
1008
+ continue;
1009
+ }
1010
+
1011
+ if (!current && dataSize) {
1012
+ runCb(get(current));
1013
+ continue;
1014
+ }
1015
+
1016
+ const data = nextData();
1017
+
1018
+ if (data === null) {
1019
+ return;
1020
+ }
1021
+
1022
+ if (current) {
1023
+ if (add(data) < current) {
1024
+ continue;
1025
+ }
1026
+
1027
+ runCb(get(current));
1028
+ continue;
1029
+ }
1030
+
1031
+ if (currentEncoding) {
1032
+ runCb(typeof data === 'string' ? data : String(data));
1033
+ } else {
1034
+ runCb(typeof data === 'string' ? Buffer.from(data) : data);
1035
+ }
1036
+ }
1037
+ }
1038
+
1039
+ let setEnd = false;
1040
+
1041
+ function run() {
1042
+ running = true;
1043
+ runMain();
1044
+
1045
+ if (setEnd) {
1046
+ end = true;
1047
+ runMain();
1048
+ }
1049
+
1050
+ running = false;
1051
+ }
1052
+
1053
+ req.addListener('end', () => {
1054
+ if (end || setEnd) {
1055
+ return;
1056
+ }
1057
+
1058
+ if (running) {
1059
+ setEnd = true;
1060
+ } else {
1061
+ end = true;
1062
+ run();
1063
+ }
1064
+ });
1065
+
1066
+ function read(size = 0, encoding = false) {
1067
+ return new Promise(resolve => {
1068
+ size = Math.max(size, 0);
1069
+
1070
+ if (cb) {
1071
+ list.push([size, encoding, resolve]);
1072
+ return;
1073
+ }
1074
+
1075
+ currentEncoding = encoding;
1076
+ current = size;
1077
+ cb = resolve;
1078
+ run();
1079
+ });
1080
+ }
1081
+
1082
+ return read;
1083
+ }
1084
+
1085
+ function createRequest(req) {
1086
+ const urlInfo = urlFn__namespace.parse(req.url || '/', true);
1087
+ return {
1088
+ method: (req.method || 'GET').toUpperCase(),
1089
+ url: req.url || '/',
1090
+ headers: req.headers,
1091
+ pathname: 'pathname' in req && req['pathname'] || urlInfo.pathname || '/',
1092
+ search: 'search' in req && req['search'] || urlInfo.search || '',
1093
+ query: 'query' in req && req['query'] || urlInfo.query || {},
1094
+ read: createRead(req)
1095
+ };
1096
+ }
1097
+
1098
+ async function sendResponse(res, target) {
1099
+ res.statusCode = target.statusCode;
1100
+
1101
+ for (const [k, v] of Object.entries(target.headers)) {
1102
+ res.setHeader(k, v);
1103
+ }
1104
+
1105
+ const stream = res instanceof http2.Http2ServerResponse ? res.stream : res;
1106
+
1107
+ for await (const data of target) {
1108
+ if (res.finished) {
1109
+ break;
1110
+ }
1111
+
1112
+ if (stream.write(data)) {
1113
+ continue;
1114
+ }
1115
+
1116
+ await new Promise(cb => stream.once('drain', cb));
1117
+ }
1118
+
1119
+ res.end();
1120
+ }
1121
+
1122
+ function createHttpCallback(app, notFound) {
1123
+ if (notFound) {
1124
+ return async function httpCallback(req, res, next) {
1125
+ const r = await app.request(createRequest(req));
1126
+
1127
+ if (r) {
1128
+ return sendResponse(res, r);
1129
+ }
1130
+
1131
+ return notFound(req, res, next);
1132
+ };
1133
+ }
1134
+
1135
+ return async function httpCallback(req, res, next) {
1136
+ const r = await app.request(createRequest(req));
1137
+
1138
+ if (r) {
1139
+ return sendResponse(res, r);
1140
+ }
1141
+
1142
+ if (next) {
1143
+ return next();
1144
+ }
1145
+ };
1146
+ }
1147
+
1148
+ /** 判断是否为文件 */
1149
+
1150
+ async function readdir(path) {
1151
+ return new Promise(resolve => fsFn__namespace.readdir(path, {
1152
+ encoding: 'utf-8'
1153
+ }, (err, files) => err ? resolve([]) : resolve(files)));
1154
+ }
1155
+
1156
+ /** 判断是否为文件 */
1157
+
1158
+ async function isFile(path) {
1159
+ return new Promise((resolve, reject) => fsFn__namespace.stat(path, (err, stats) => err ? reject(err) : resolve(stats))).then(s => s.isFile()).catch(() => false);
1160
+ }
1161
+
1162
+ const configFileNames = ['k99.config.js', '.k99.config.js', 'k99.config.json', '.k99.config.json'];
1163
+ /**
1164
+ * 从 npm 包目录中查找
1165
+ * @param id 相对 node_modules 的路径
1166
+ * @param parent 父配置
1167
+ */
1168
+
1169
+ async function readConfig(path) {
1170
+ // TODO: 获取原始路径
1171
+ for (let f of configFileNames) {
1172
+ const file = pathFn__namespace.resolve(path, f);
1173
+
1174
+ if (!(await isFile(file))) {
1175
+ continue;
1176
+ }
1177
+
1178
+ const config = (await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(file)); })).default;
1179
+
1180
+ if (config && typeof config === 'object') {
1181
+ return { ...config,
1182
+ path
1183
+ };
1184
+ }
1185
+ }
1186
+ }
1187
+
1188
+ /**
1189
+ * 从 npm 包目录中查找
1190
+ * @param id 相对 node_modules 的路径
1191
+ * @param parent 父配置
1192
+ */
1193
+
1194
+ async function find(path, id, plugins) {
1195
+ for (const modulePath of getModulePaths(path)) {
1196
+ const pluginPath = pathFn__namespace.resolve(modulePath, id);
1197
+ const config = plugins[pluginPath] || (await readConfig(pluginPath));
1198
+
1199
+ if (config) {
1200
+ return config;
1201
+ }
1202
+ }
1203
+ }
1204
+
1205
+ function* getModulePaths(path) {
1206
+ for (;;) {
1207
+ yield pathFn__namespace.resolve(path, 'node_modules');
1208
+ const p = pathFn__namespace.dirname(path);
1209
+
1210
+ if (p === path) {
1211
+ return;
1212
+ }
1213
+
1214
+ path = p;
1215
+ }
1216
+ }
1217
+
1218
+ const idRegex = '[a-zA-Z][a-zA-Z0-9_-]*(?:.[a-zA-Z][a-zA-Z0-9_-]*)*';
1219
+ const nsPluginRegex = new RegExp(`^(?:@${idRegex}/)?${idRegex}$`);
1220
+ const pluginRegex = new RegExp(`^${idRegex}$`);
1221
+ function isNsPluginName(id) {
1222
+ if (!id) {
1223
+ return false;
1224
+ }
1225
+
1226
+ if (typeof id !== 'string') {
1227
+ return false;
1228
+ }
1229
+
1230
+ return pluginRegex.test(id) || nsPluginRegex.test(id);
1231
+ }
1232
+ function isPluginName(id) {
1233
+ if (!id) {
1234
+ return false;
1235
+ }
1236
+
1237
+ if (typeof id !== 'string') {
1238
+ return false;
1239
+ }
1240
+
1241
+ return pluginRegex.test(id);
1242
+ }
1243
+
1244
+ function getName(config) {
1245
+ if (isPluginName(config.name)) {
1246
+ return config.name;
1247
+ }
1248
+
1249
+ const name = pathFn__namespace.basename(config.path);
1250
+
1251
+ if (isPluginName(name)) {
1252
+ return name;
1253
+ }
1254
+
1255
+ return '';
1256
+ }
1257
+
1258
+ async function findSubPackages(plugin, configs, plugins) {
1259
+ if (plugin.packages) {
1260
+ for (let name of plugin.packages) {
1261
+ if (!isNsPluginName(name)) {
1262
+ // TODO: 抛出错误
1263
+ continue;
1264
+ }
1265
+
1266
+ if (name in plugins) {
1267
+ continue;
1268
+ }
1269
+
1270
+ const config = await find(plugin.path, name, configs);
1271
+
1272
+ if (!config) {
1273
+ // TODO: 抛出错误
1274
+ continue;
1275
+ }
1276
+
1277
+ plugins[name] = new FsPlugin(config, name);
1278
+
1279
+ if (config.path in configs) {
1280
+ return;
1281
+ }
1282
+
1283
+ configs[config.path] = config;
1284
+ findSubPackages(config, configs, plugins);
1285
+ }
1286
+ }
1287
+
1288
+ for (const path of plugin.plugins || []) {
1289
+ const pluginPath = pathFn__namespace.resolve(plugin.path, path);
1290
+ const config = await readConfig(pluginPath);
1291
+
1292
+ if (!config) {
1293
+ // TODO: 抛出错误
1294
+ continue;
1295
+ }
1296
+
1297
+ const name = getName(config);
1298
+
1299
+ if (!name) {
1300
+ // TODO: 抛出错误
1301
+ continue;
1302
+ }
1303
+
1304
+ if (name in plugins) {
1305
+ // TODO: 抛出错误
1306
+ continue;
1307
+ }
1308
+
1309
+ plugins[name] = new FsPlugin(config, name);
1310
+ configs[config.path] = config;
1311
+ findSubPackages(config, configs, plugins);
1312
+ }
1313
+ }
1314
+
1315
+ async function start() {
1316
+ const cwd = process.cwd();
1317
+ /** 入口模块 */
1318
+
1319
+ const main = (await readConfig(process.cwd())) || {
1320
+ scan: 'plugins',
1321
+ path: cwd
1322
+ };
1323
+ const mainPlugin = new FsPlugin(main, '');
1324
+ /** 插件映射 */
1325
+
1326
+ const configs = Object.create(null);
1327
+ const plugins = Object.create(null);
1328
+ configs[cwd] = main; // 递归 npm 包插件
1329
+
1330
+ findSubPackages(main, configs, plugins);
1331
+
1332
+ if (main.scan) {
1333
+ const scanPath = pathFn__namespace.join(cwd, main.scan);
1334
+
1335
+ for (let name of await readdir(scanPath)) {
1336
+ if (!isPluginName(name)) {
1337
+ continue;
1338
+ }
1339
+
1340
+ if (name in plugins) {
1341
+ continue;
1342
+ }
1343
+
1344
+ const pluginPath = pathFn__namespace.resolve(cwd, name);
1345
+ const config = await readConfig(pluginPath);
1346
+
1347
+ if (!config) {
1348
+ continue;
1349
+ }
1350
+
1351
+ configs[config.path] = config;
1352
+ plugins[name] = new FsPlugin(config, name);
1353
+ await findSubPackages(config, configs, plugins);
1354
+ }
1355
+ }
1356
+
1357
+ for (const plugin of Object.values(plugins)) {
1358
+ await plugin.initRouter();
1359
+ }
1360
+
1361
+ await mainPlugin.initRouter();
1362
+ const app = new NodeApp(mainPlugin, plugins);
1363
+ return app;
1364
+ }
1365
+
1366
+ var K99Node = /*#__PURE__*/Object.freeze({
1367
+ __proto__: null,
1368
+ FsPlugin: FsPlugin,
1369
+ NodeApp: NodeApp,
1370
+ createHttpCallback: createHttpCallback,
1371
+ Scanner: Scanner,
1372
+ start: start,
1373
+ createFsAssetsApi: createFsAssetsApi,
1374
+ createFsLogApi: createFsLogApi,
1375
+ createFsSettingsApi: createFsSettingsApi
1376
+ });
1377
+
1378
+ exports.FsPlugin = FsPlugin;
1379
+ exports.NodeApp = NodeApp;
1380
+ exports.Scanner = Scanner;
1381
+ exports.createFsAssetsApi = createFsAssetsApi;
1382
+ exports.createFsLogApi = createFsLogApi;
1383
+ exports.createFsSettingsApi = createFsSettingsApi;
1384
+ exports.createHttpCallback = createHttpCallback;
1385
+ exports['default'] = K99Node;
1386
+ exports.start = start;