@unieojs/unieo 0.0.0-rc.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 (445) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +661 -0
  3. package/dist/cjs/Route.d.ts +21 -0
  4. package/dist/cjs/Route.d.ts.map +1 -0
  5. package/dist/cjs/Route.js +62 -0
  6. package/dist/cjs/Route.js.map +1 -0
  7. package/dist/cjs/common/Enum.d.ts +158 -0
  8. package/dist/cjs/common/Enum.d.ts.map +1 -0
  9. package/dist/cjs/common/Enum.js +222 -0
  10. package/dist/cjs/common/Enum.js.map +1 -0
  11. package/dist/cjs/common/Error/Base.d.ts +18 -0
  12. package/dist/cjs/common/Error/Base.d.ts.map +1 -0
  13. package/dist/cjs/common/Error/Base.js +25 -0
  14. package/dist/cjs/common/Error/Base.js.map +1 -0
  15. package/dist/cjs/common/Error/index.d.ts +59 -0
  16. package/dist/cjs/common/Error/index.d.ts.map +1 -0
  17. package/dist/cjs/common/Error/index.js +312 -0
  18. package/dist/cjs/common/Error/index.js.map +1 -0
  19. package/dist/cjs/common/constants.d.ts +2 -0
  20. package/dist/cjs/common/constants.d.ts.map +1 -0
  21. package/dist/cjs/common/constants.js +5 -0
  22. package/dist/cjs/common/constants.js.map +1 -0
  23. package/dist/cjs/core/CommonRouteExecutor.d.ts +17 -0
  24. package/dist/cjs/core/CommonRouteExecutor.d.ts.map +1 -0
  25. package/dist/cjs/core/CommonRouteExecutor.js +43 -0
  26. package/dist/cjs/core/CommonRouteExecutor.js.map +1 -0
  27. package/dist/cjs/core/ERPerformance.d.ts +30 -0
  28. package/dist/cjs/core/ERPerformance.d.ts.map +1 -0
  29. package/dist/cjs/core/ERPerformance.js +77 -0
  30. package/dist/cjs/core/ERPerformance.js.map +1 -0
  31. package/dist/cjs/core/Fetch.d.ts +9 -0
  32. package/dist/cjs/core/Fetch.d.ts.map +1 -0
  33. package/dist/cjs/core/Fetch.js +76 -0
  34. package/dist/cjs/core/Fetch.js.map +1 -0
  35. package/dist/cjs/core/Match.d.ts +35 -0
  36. package/dist/cjs/core/Match.d.ts.map +1 -0
  37. package/dist/cjs/core/Match.js +158 -0
  38. package/dist/cjs/core/Match.js.map +1 -0
  39. package/dist/cjs/core/Redirect.d.ts +17 -0
  40. package/dist/cjs/core/Redirect.d.ts.map +1 -0
  41. package/dist/cjs/core/Redirect.js +30 -0
  42. package/dist/cjs/core/Redirect.js.map +1 -0
  43. package/dist/cjs/core/RequestRewrite.d.ts +31 -0
  44. package/dist/cjs/core/RequestRewrite.d.ts.map +1 -0
  45. package/dist/cjs/core/RequestRewrite.js +201 -0
  46. package/dist/cjs/core/RequestRewrite.js.map +1 -0
  47. package/dist/cjs/core/ResponseRewrite.d.ts +26 -0
  48. package/dist/cjs/core/ResponseRewrite.d.ts.map +1 -0
  49. package/dist/cjs/core/ResponseRewrite.js +55 -0
  50. package/dist/cjs/core/ResponseRewrite.js.map +1 -0
  51. package/dist/cjs/core/RouteConfig.d.ts +21 -0
  52. package/dist/cjs/core/RouteConfig.d.ts.map +1 -0
  53. package/dist/cjs/core/RouteConfig.js +3 -0
  54. package/dist/cjs/core/RouteConfig.js.map +1 -0
  55. package/dist/cjs/core/RouteContext.d.ts +55 -0
  56. package/dist/cjs/core/RouteContext.d.ts.map +1 -0
  57. package/dist/cjs/core/RouteContext.js +200 -0
  58. package/dist/cjs/core/RouteContext.js.map +1 -0
  59. package/dist/cjs/core/executor/BaseExecutor.d.ts +32 -0
  60. package/dist/cjs/core/executor/BaseExecutor.d.ts.map +1 -0
  61. package/dist/cjs/core/executor/BaseExecutor.js +14 -0
  62. package/dist/cjs/core/executor/BaseExecutor.js.map +1 -0
  63. package/dist/cjs/core/executor/Factory.d.ts +18 -0
  64. package/dist/cjs/core/executor/Factory.d.ts.map +1 -0
  65. package/dist/cjs/core/executor/Factory.js +55 -0
  66. package/dist/cjs/core/executor/Factory.js.map +1 -0
  67. package/dist/cjs/core/executor/RouteExecutor.d.ts +12 -0
  68. package/dist/cjs/core/executor/RouteExecutor.d.ts.map +1 -0
  69. package/dist/cjs/core/executor/RouteExecutor.js +25 -0
  70. package/dist/cjs/core/executor/RouteExecutor.js.map +1 -0
  71. package/dist/cjs/core/executor/impl/RedirectExecutor.d.ts +14 -0
  72. package/dist/cjs/core/executor/impl/RedirectExecutor.d.ts.map +1 -0
  73. package/dist/cjs/core/executor/impl/RedirectExecutor.js +88 -0
  74. package/dist/cjs/core/executor/impl/RedirectExecutor.js.map +1 -0
  75. package/dist/cjs/core/executor/impl/RequestRewriteExecutor.d.ts +23 -0
  76. package/dist/cjs/core/executor/impl/RequestRewriteExecutor.d.ts.map +1 -0
  77. package/dist/cjs/core/executor/impl/RequestRewriteExecutor.js +104 -0
  78. package/dist/cjs/core/executor/impl/RequestRewriteExecutor.js.map +1 -0
  79. package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.d.ts +14 -0
  80. package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.d.ts.map +1 -0
  81. package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.js +94 -0
  82. package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.js.map +1 -0
  83. package/dist/cjs/core/executor/index.d.ts +8 -0
  84. package/dist/cjs/core/executor/index.d.ts.map +1 -0
  85. package/dist/cjs/core/executor/index.js +16 -0
  86. package/dist/cjs/core/executor/index.js.map +1 -0
  87. package/dist/cjs/core/index.d.ts +10 -0
  88. package/dist/cjs/core/index.d.ts.map +1 -0
  89. package/dist/cjs/core/index.js +26 -0
  90. package/dist/cjs/core/index.js.map +1 -0
  91. package/dist/cjs/core/meta/BaseMeta.d.ts +20 -0
  92. package/dist/cjs/core/meta/BaseMeta.d.ts.map +1 -0
  93. package/dist/cjs/core/meta/BaseMeta.js +14 -0
  94. package/dist/cjs/core/meta/BaseMeta.js.map +1 -0
  95. package/dist/cjs/core/meta/Factory.d.ts +28 -0
  96. package/dist/cjs/core/meta/Factory.d.ts.map +1 -0
  97. package/dist/cjs/core/meta/Factory.js +63 -0
  98. package/dist/cjs/core/meta/Factory.js.map +1 -0
  99. package/dist/cjs/core/meta/enum.d.ts +6 -0
  100. package/dist/cjs/core/meta/enum.d.ts.map +1 -0
  101. package/dist/cjs/core/meta/enum.js +10 -0
  102. package/dist/cjs/core/meta/enum.js.map +1 -0
  103. package/dist/cjs/core/meta/impl/RedirectMeta.d.ts +18 -0
  104. package/dist/cjs/core/meta/impl/RedirectMeta.d.ts.map +1 -0
  105. package/dist/cjs/core/meta/impl/RedirectMeta.js +25 -0
  106. package/dist/cjs/core/meta/impl/RedirectMeta.js.map +1 -0
  107. package/dist/cjs/core/meta/impl/RequestRewriteMeta.d.ts +18 -0
  108. package/dist/cjs/core/meta/impl/RequestRewriteMeta.d.ts.map +1 -0
  109. package/dist/cjs/core/meta/impl/RequestRewriteMeta.js +22 -0
  110. package/dist/cjs/core/meta/impl/RequestRewriteMeta.js.map +1 -0
  111. package/dist/cjs/core/meta/impl/ResponseRewriteMeta.d.ts +18 -0
  112. package/dist/cjs/core/meta/impl/ResponseRewriteMeta.d.ts.map +1 -0
  113. package/dist/cjs/core/meta/impl/ResponseRewriteMeta.js +22 -0
  114. package/dist/cjs/core/meta/impl/ResponseRewriteMeta.js.map +1 -0
  115. package/dist/cjs/core/meta/index.d.ts +8 -0
  116. package/dist/cjs/core/meta/index.d.ts.map +1 -0
  117. package/dist/cjs/core/meta/index.js +16 -0
  118. package/dist/cjs/core/meta/index.js.map +1 -0
  119. package/dist/cjs/core/processor/BaseProcessor.d.ts +37 -0
  120. package/dist/cjs/core/processor/BaseProcessor.d.ts.map +1 -0
  121. package/dist/cjs/core/processor/BaseProcessor.js +28 -0
  122. package/dist/cjs/core/processor/BaseProcessor.js.map +1 -0
  123. package/dist/cjs/core/processor/Factory.d.ts +26 -0
  124. package/dist/cjs/core/processor/Factory.d.ts.map +1 -0
  125. package/dist/cjs/core/processor/Factory.js +70 -0
  126. package/dist/cjs/core/processor/Factory.js.map +1 -0
  127. package/dist/cjs/core/processor/GroupProcessor.d.ts +21 -0
  128. package/dist/cjs/core/processor/GroupProcessor.d.ts.map +1 -0
  129. package/dist/cjs/core/processor/GroupProcessor.js +23 -0
  130. package/dist/cjs/core/processor/GroupProcessor.js.map +1 -0
  131. package/dist/cjs/core/processor/RouteProcessor.d.ts +9 -0
  132. package/dist/cjs/core/processor/RouteProcessor.d.ts.map +1 -0
  133. package/dist/cjs/core/processor/RouteProcessor.js +10 -0
  134. package/dist/cjs/core/processor/RouteProcessor.js.map +1 -0
  135. package/dist/cjs/core/processor/SubProcessor.d.ts +25 -0
  136. package/dist/cjs/core/processor/SubProcessor.d.ts.map +1 -0
  137. package/dist/cjs/core/processor/SubProcessor.js +56 -0
  138. package/dist/cjs/core/processor/SubProcessor.js.map +1 -0
  139. package/dist/cjs/core/processor/index.d.ts +6 -0
  140. package/dist/cjs/core/processor/index.d.ts.map +1 -0
  141. package/dist/cjs/core/processor/index.js +22 -0
  142. package/dist/cjs/core/processor/index.js.map +1 -0
  143. package/dist/cjs/core/value/SourceProcessor.d.ts +47 -0
  144. package/dist/cjs/core/value/SourceProcessor.d.ts.map +1 -0
  145. package/dist/cjs/core/value/SourceProcessor.js +121 -0
  146. package/dist/cjs/core/value/SourceProcessor.js.map +1 -0
  147. package/dist/cjs/core/value/SourceProcessorManager.d.ts +7 -0
  148. package/dist/cjs/core/value/SourceProcessorManager.d.ts.map +1 -0
  149. package/dist/cjs/core/value/SourceProcessorManager.js +33 -0
  150. package/dist/cjs/core/value/SourceProcessorManager.js.map +1 -0
  151. package/dist/cjs/core/value/ValueProcessor.d.ts +25 -0
  152. package/dist/cjs/core/value/ValueProcessor.d.ts.map +1 -0
  153. package/dist/cjs/core/value/ValueProcessor.js +57 -0
  154. package/dist/cjs/core/value/ValueProcessor.js.map +1 -0
  155. package/dist/cjs/core/value/ValueProcessorManager.d.ts +8 -0
  156. package/dist/cjs/core/value/ValueProcessorManager.d.ts.map +1 -0
  157. package/dist/cjs/core/value/ValueProcessorManager.js +28 -0
  158. package/dist/cjs/core/value/ValueProcessorManager.js.map +1 -0
  159. package/dist/cjs/core/value/index.d.ts +35 -0
  160. package/dist/cjs/core/value/index.d.ts.map +1 -0
  161. package/dist/cjs/core/value/index.js +57 -0
  162. package/dist/cjs/core/value/index.js.map +1 -0
  163. package/dist/cjs/index.d.ts +4 -0
  164. package/dist/cjs/index.d.ts.map +1 -0
  165. package/dist/cjs/index.js +20 -0
  166. package/dist/cjs/index.js.map +1 -0
  167. package/dist/cjs/middleware/DefaultFetch.d.ts +8 -0
  168. package/dist/cjs/middleware/DefaultFetch.d.ts.map +1 -0
  169. package/dist/cjs/middleware/DefaultFetch.js +36 -0
  170. package/dist/cjs/middleware/DefaultFetch.js.map +1 -0
  171. package/dist/cjs/middleware/ErrorFallback.d.ts +7 -0
  172. package/dist/cjs/middleware/ErrorFallback.d.ts.map +1 -0
  173. package/dist/cjs/middleware/ErrorFallback.js +30 -0
  174. package/dist/cjs/middleware/ErrorFallback.js.map +1 -0
  175. package/dist/cjs/middleware/index.d.ts +16 -0
  176. package/dist/cjs/middleware/index.d.ts.map +1 -0
  177. package/dist/cjs/middleware/index.js +119 -0
  178. package/dist/cjs/middleware/index.js.map +1 -0
  179. package/dist/cjs/middleware/types.d.ts +13 -0
  180. package/dist/cjs/middleware/types.d.ts.map +1 -0
  181. package/dist/cjs/middleware/types.js +3 -0
  182. package/dist/cjs/middleware/types.js.map +1 -0
  183. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  184. package/dist/cjs/util/Array.d.ts +3 -0
  185. package/dist/cjs/util/Array.d.ts.map +1 -0
  186. package/dist/cjs/util/Array.js +15 -0
  187. package/dist/cjs/util/Array.js.map +1 -0
  188. package/dist/cjs/util/Header.d.ts +5 -0
  189. package/dist/cjs/util/Header.d.ts.map +1 -0
  190. package/dist/cjs/util/Header.js +87 -0
  191. package/dist/cjs/util/Header.js.map +1 -0
  192. package/dist/cjs/util/LogUtil.d.ts +2 -0
  193. package/dist/cjs/util/LogUtil.d.ts.map +1 -0
  194. package/dist/cjs/util/LogUtil.js +10 -0
  195. package/dist/cjs/util/LogUtil.js.map +1 -0
  196. package/dist/cjs/util/PathRegexp.d.ts +12 -0
  197. package/dist/cjs/util/PathRegexp.d.ts.map +1 -0
  198. package/dist/cjs/util/PathRegexp.js +74 -0
  199. package/dist/cjs/util/PathRegexp.js.map +1 -0
  200. package/dist/cjs/util/PrefixLogger.d.ts +13 -0
  201. package/dist/cjs/util/PrefixLogger.d.ts.map +1 -0
  202. package/dist/cjs/util/PrefixLogger.js +38 -0
  203. package/dist/cjs/util/PrefixLogger.js.map +1 -0
  204. package/dist/cjs/util/RedirectHelper.d.ts +29 -0
  205. package/dist/cjs/util/RedirectHelper.d.ts.map +1 -0
  206. package/dist/cjs/util/RedirectHelper.js +140 -0
  207. package/dist/cjs/util/RedirectHelper.js.map +1 -0
  208. package/dist/cjs/util/Request.d.ts +11 -0
  209. package/dist/cjs/util/Request.d.ts.map +1 -0
  210. package/dist/cjs/util/Request.js +25 -0
  211. package/dist/cjs/util/Request.js.map +1 -0
  212. package/dist/cjs/util/Response.d.ts +12 -0
  213. package/dist/cjs/util/Response.d.ts.map +1 -0
  214. package/dist/cjs/util/Response.js +31 -0
  215. package/dist/cjs/util/Response.js.map +1 -0
  216. package/dist/cjs/util/Template.d.ts +2 -0
  217. package/dist/cjs/util/Template.d.ts.map +1 -0
  218. package/dist/cjs/util/Template.js +14 -0
  219. package/dist/cjs/util/Template.js.map +1 -0
  220. package/dist/cjs/util/Url.d.ts +19 -0
  221. package/dist/cjs/util/Url.d.ts.map +1 -0
  222. package/dist/cjs/util/Url.js +112 -0
  223. package/dist/cjs/util/Url.js.map +1 -0
  224. package/dist/esm/Route.d.ts +21 -0
  225. package/dist/esm/Route.d.ts.map +1 -0
  226. package/dist/esm/Route.js +58 -0
  227. package/dist/esm/Route.js.map +1 -0
  228. package/dist/esm/common/Enum.d.ts +158 -0
  229. package/dist/esm/common/Enum.d.ts.map +1 -0
  230. package/dist/esm/common/Enum.js +219 -0
  231. package/dist/esm/common/Enum.js.map +1 -0
  232. package/dist/esm/common/Error/Base.d.ts +18 -0
  233. package/dist/esm/common/Error/Base.d.ts.map +1 -0
  234. package/dist/esm/common/Error/Base.js +21 -0
  235. package/dist/esm/common/Error/Base.js.map +1 -0
  236. package/dist/esm/common/Error/index.d.ts +59 -0
  237. package/dist/esm/common/Error/index.d.ts.map +1 -0
  238. package/dist/esm/common/Error/index.js +294 -0
  239. package/dist/esm/common/Error/index.js.map +1 -0
  240. package/dist/esm/common/constants.d.ts +2 -0
  241. package/dist/esm/common/constants.d.ts.map +1 -0
  242. package/dist/esm/common/constants.js +2 -0
  243. package/dist/esm/common/constants.js.map +1 -0
  244. package/dist/esm/core/CommonRouteExecutor.d.ts +17 -0
  245. package/dist/esm/core/CommonRouteExecutor.d.ts.map +1 -0
  246. package/dist/esm/core/CommonRouteExecutor.js +39 -0
  247. package/dist/esm/core/CommonRouteExecutor.js.map +1 -0
  248. package/dist/esm/core/ERPerformance.d.ts +30 -0
  249. package/dist/esm/core/ERPerformance.d.ts.map +1 -0
  250. package/dist/esm/core/ERPerformance.js +72 -0
  251. package/dist/esm/core/ERPerformance.js.map +1 -0
  252. package/dist/esm/core/Fetch.d.ts +9 -0
  253. package/dist/esm/core/Fetch.d.ts.map +1 -0
  254. package/dist/esm/core/Fetch.js +72 -0
  255. package/dist/esm/core/Fetch.js.map +1 -0
  256. package/dist/esm/core/Match.d.ts +35 -0
  257. package/dist/esm/core/Match.d.ts.map +1 -0
  258. package/dist/esm/core/Match.js +154 -0
  259. package/dist/esm/core/Match.js.map +1 -0
  260. package/dist/esm/core/Redirect.d.ts +17 -0
  261. package/dist/esm/core/Redirect.d.ts.map +1 -0
  262. package/dist/esm/core/Redirect.js +26 -0
  263. package/dist/esm/core/Redirect.js.map +1 -0
  264. package/dist/esm/core/RequestRewrite.d.ts +31 -0
  265. package/dist/esm/core/RequestRewrite.d.ts.map +1 -0
  266. package/dist/esm/core/RequestRewrite.js +194 -0
  267. package/dist/esm/core/RequestRewrite.js.map +1 -0
  268. package/dist/esm/core/ResponseRewrite.d.ts +26 -0
  269. package/dist/esm/core/ResponseRewrite.d.ts.map +1 -0
  270. package/dist/esm/core/ResponseRewrite.js +51 -0
  271. package/dist/esm/core/ResponseRewrite.js.map +1 -0
  272. package/dist/esm/core/RouteConfig.d.ts +21 -0
  273. package/dist/esm/core/RouteConfig.d.ts.map +1 -0
  274. package/dist/esm/core/RouteConfig.js +2 -0
  275. package/dist/esm/core/RouteConfig.js.map +1 -0
  276. package/dist/esm/core/RouteContext.d.ts +55 -0
  277. package/dist/esm/core/RouteContext.d.ts.map +1 -0
  278. package/dist/esm/core/RouteContext.js +196 -0
  279. package/dist/esm/core/RouteContext.js.map +1 -0
  280. package/dist/esm/core/executor/BaseExecutor.d.ts +32 -0
  281. package/dist/esm/core/executor/BaseExecutor.d.ts.map +1 -0
  282. package/dist/esm/core/executor/BaseExecutor.js +10 -0
  283. package/dist/esm/core/executor/BaseExecutor.js.map +1 -0
  284. package/dist/esm/core/executor/Factory.d.ts +18 -0
  285. package/dist/esm/core/executor/Factory.d.ts.map +1 -0
  286. package/dist/esm/core/executor/Factory.js +51 -0
  287. package/dist/esm/core/executor/Factory.js.map +1 -0
  288. package/dist/esm/core/executor/RouteExecutor.d.ts +12 -0
  289. package/dist/esm/core/executor/RouteExecutor.d.ts.map +1 -0
  290. package/dist/esm/core/executor/RouteExecutor.js +21 -0
  291. package/dist/esm/core/executor/RouteExecutor.js.map +1 -0
  292. package/dist/esm/core/executor/impl/RedirectExecutor.d.ts +14 -0
  293. package/dist/esm/core/executor/impl/RedirectExecutor.d.ts.map +1 -0
  294. package/dist/esm/core/executor/impl/RedirectExecutor.js +84 -0
  295. package/dist/esm/core/executor/impl/RedirectExecutor.js.map +1 -0
  296. package/dist/esm/core/executor/impl/RequestRewriteExecutor.d.ts +23 -0
  297. package/dist/esm/core/executor/impl/RequestRewriteExecutor.d.ts.map +1 -0
  298. package/dist/esm/core/executor/impl/RequestRewriteExecutor.js +100 -0
  299. package/dist/esm/core/executor/impl/RequestRewriteExecutor.js.map +1 -0
  300. package/dist/esm/core/executor/impl/ResponseRewriteExecutor.d.ts +14 -0
  301. package/dist/esm/core/executor/impl/ResponseRewriteExecutor.d.ts.map +1 -0
  302. package/dist/esm/core/executor/impl/ResponseRewriteExecutor.js +90 -0
  303. package/dist/esm/core/executor/impl/ResponseRewriteExecutor.js.map +1 -0
  304. package/dist/esm/core/executor/index.d.ts +8 -0
  305. package/dist/esm/core/executor/index.d.ts.map +1 -0
  306. package/dist/esm/core/executor/index.js +7 -0
  307. package/dist/esm/core/executor/index.js.map +1 -0
  308. package/dist/esm/core/index.d.ts +10 -0
  309. package/dist/esm/core/index.d.ts.map +1 -0
  310. package/dist/esm/core/index.js +10 -0
  311. package/dist/esm/core/index.js.map +1 -0
  312. package/dist/esm/core/meta/BaseMeta.d.ts +20 -0
  313. package/dist/esm/core/meta/BaseMeta.d.ts.map +1 -0
  314. package/dist/esm/core/meta/BaseMeta.js +10 -0
  315. package/dist/esm/core/meta/BaseMeta.js.map +1 -0
  316. package/dist/esm/core/meta/Factory.d.ts +28 -0
  317. package/dist/esm/core/meta/Factory.d.ts.map +1 -0
  318. package/dist/esm/core/meta/Factory.js +59 -0
  319. package/dist/esm/core/meta/Factory.js.map +1 -0
  320. package/dist/esm/core/meta/enum.d.ts +6 -0
  321. package/dist/esm/core/meta/enum.d.ts.map +1 -0
  322. package/dist/esm/core/meta/enum.js +7 -0
  323. package/dist/esm/core/meta/enum.js.map +1 -0
  324. package/dist/esm/core/meta/impl/RedirectMeta.d.ts +18 -0
  325. package/dist/esm/core/meta/impl/RedirectMeta.d.ts.map +1 -0
  326. package/dist/esm/core/meta/impl/RedirectMeta.js +21 -0
  327. package/dist/esm/core/meta/impl/RedirectMeta.js.map +1 -0
  328. package/dist/esm/core/meta/impl/RequestRewriteMeta.d.ts +18 -0
  329. package/dist/esm/core/meta/impl/RequestRewriteMeta.d.ts.map +1 -0
  330. package/dist/esm/core/meta/impl/RequestRewriteMeta.js +18 -0
  331. package/dist/esm/core/meta/impl/RequestRewriteMeta.js.map +1 -0
  332. package/dist/esm/core/meta/impl/ResponseRewriteMeta.d.ts +18 -0
  333. package/dist/esm/core/meta/impl/ResponseRewriteMeta.d.ts.map +1 -0
  334. package/dist/esm/core/meta/impl/ResponseRewriteMeta.js +18 -0
  335. package/dist/esm/core/meta/impl/ResponseRewriteMeta.js.map +1 -0
  336. package/dist/esm/core/meta/index.d.ts +8 -0
  337. package/dist/esm/core/meta/index.d.ts.map +1 -0
  338. package/dist/esm/core/meta/index.js +7 -0
  339. package/dist/esm/core/meta/index.js.map +1 -0
  340. package/dist/esm/core/processor/BaseProcessor.d.ts +37 -0
  341. package/dist/esm/core/processor/BaseProcessor.d.ts.map +1 -0
  342. package/dist/esm/core/processor/BaseProcessor.js +24 -0
  343. package/dist/esm/core/processor/BaseProcessor.js.map +1 -0
  344. package/dist/esm/core/processor/Factory.d.ts +26 -0
  345. package/dist/esm/core/processor/Factory.d.ts.map +1 -0
  346. package/dist/esm/core/processor/Factory.js +66 -0
  347. package/dist/esm/core/processor/Factory.js.map +1 -0
  348. package/dist/esm/core/processor/GroupProcessor.d.ts +21 -0
  349. package/dist/esm/core/processor/GroupProcessor.d.ts.map +1 -0
  350. package/dist/esm/core/processor/GroupProcessor.js +19 -0
  351. package/dist/esm/core/processor/GroupProcessor.js.map +1 -0
  352. package/dist/esm/core/processor/RouteProcessor.d.ts +9 -0
  353. package/dist/esm/core/processor/RouteProcessor.d.ts.map +1 -0
  354. package/dist/esm/core/processor/RouteProcessor.js +6 -0
  355. package/dist/esm/core/processor/RouteProcessor.js.map +1 -0
  356. package/dist/esm/core/processor/SubProcessor.d.ts +25 -0
  357. package/dist/esm/core/processor/SubProcessor.d.ts.map +1 -0
  358. package/dist/esm/core/processor/SubProcessor.js +52 -0
  359. package/dist/esm/core/processor/SubProcessor.js.map +1 -0
  360. package/dist/esm/core/processor/index.d.ts +6 -0
  361. package/dist/esm/core/processor/index.d.ts.map +1 -0
  362. package/dist/esm/core/processor/index.js +6 -0
  363. package/dist/esm/core/processor/index.js.map +1 -0
  364. package/dist/esm/core/value/SourceProcessor.d.ts +47 -0
  365. package/dist/esm/core/value/SourceProcessor.d.ts.map +1 -0
  366. package/dist/esm/core/value/SourceProcessor.js +105 -0
  367. package/dist/esm/core/value/SourceProcessor.js.map +1 -0
  368. package/dist/esm/core/value/SourceProcessorManager.d.ts +7 -0
  369. package/dist/esm/core/value/SourceProcessorManager.d.ts.map +1 -0
  370. package/dist/esm/core/value/SourceProcessorManager.js +29 -0
  371. package/dist/esm/core/value/SourceProcessorManager.js.map +1 -0
  372. package/dist/esm/core/value/ValueProcessor.d.ts +25 -0
  373. package/dist/esm/core/value/ValueProcessor.d.ts.map +1 -0
  374. package/dist/esm/core/value/ValueProcessor.js +48 -0
  375. package/dist/esm/core/value/ValueProcessor.js.map +1 -0
  376. package/dist/esm/core/value/ValueProcessorManager.d.ts +8 -0
  377. package/dist/esm/core/value/ValueProcessorManager.d.ts.map +1 -0
  378. package/dist/esm/core/value/ValueProcessorManager.js +24 -0
  379. package/dist/esm/core/value/ValueProcessorManager.js.map +1 -0
  380. package/dist/esm/core/value/index.d.ts +35 -0
  381. package/dist/esm/core/value/index.d.ts.map +1 -0
  382. package/dist/esm/core/value/index.js +53 -0
  383. package/dist/esm/core/value/index.js.map +1 -0
  384. package/dist/esm/index.d.ts +4 -0
  385. package/dist/esm/index.d.ts.map +1 -0
  386. package/dist/esm/index.js +4 -0
  387. package/dist/esm/index.js.map +1 -0
  388. package/dist/esm/middleware/DefaultFetch.d.ts +8 -0
  389. package/dist/esm/middleware/DefaultFetch.d.ts.map +1 -0
  390. package/dist/esm/middleware/DefaultFetch.js +34 -0
  391. package/dist/esm/middleware/DefaultFetch.js.map +1 -0
  392. package/dist/esm/middleware/ErrorFallback.d.ts +7 -0
  393. package/dist/esm/middleware/ErrorFallback.d.ts.map +1 -0
  394. package/dist/esm/middleware/ErrorFallback.js +28 -0
  395. package/dist/esm/middleware/ErrorFallback.js.map +1 -0
  396. package/dist/esm/middleware/index.d.ts +16 -0
  397. package/dist/esm/middleware/index.d.ts.map +1 -0
  398. package/dist/esm/middleware/index.js +112 -0
  399. package/dist/esm/middleware/index.js.map +1 -0
  400. package/dist/esm/middleware/types.d.ts +13 -0
  401. package/dist/esm/middleware/types.d.ts.map +1 -0
  402. package/dist/esm/middleware/types.js +2 -0
  403. package/dist/esm/middleware/types.js.map +1 -0
  404. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  405. package/dist/esm/util/Array.d.ts +3 -0
  406. package/dist/esm/util/Array.d.ts.map +1 -0
  407. package/dist/esm/util/Array.js +11 -0
  408. package/dist/esm/util/Array.js.map +1 -0
  409. package/dist/esm/util/Header.d.ts +5 -0
  410. package/dist/esm/util/Header.d.ts.map +1 -0
  411. package/dist/esm/util/Header.js +81 -0
  412. package/dist/esm/util/Header.js.map +1 -0
  413. package/dist/esm/util/LogUtil.d.ts +2 -0
  414. package/dist/esm/util/LogUtil.d.ts.map +1 -0
  415. package/dist/esm/util/LogUtil.js +7 -0
  416. package/dist/esm/util/LogUtil.js.map +1 -0
  417. package/dist/esm/util/PathRegexp.d.ts +12 -0
  418. package/dist/esm/util/PathRegexp.d.ts.map +1 -0
  419. package/dist/esm/util/PathRegexp.js +69 -0
  420. package/dist/esm/util/PathRegexp.js.map +1 -0
  421. package/dist/esm/util/PrefixLogger.d.ts +13 -0
  422. package/dist/esm/util/PrefixLogger.d.ts.map +1 -0
  423. package/dist/esm/util/PrefixLogger.js +34 -0
  424. package/dist/esm/util/PrefixLogger.js.map +1 -0
  425. package/dist/esm/util/RedirectHelper.d.ts +29 -0
  426. package/dist/esm/util/RedirectHelper.d.ts.map +1 -0
  427. package/dist/esm/util/RedirectHelper.js +136 -0
  428. package/dist/esm/util/RedirectHelper.js.map +1 -0
  429. package/dist/esm/util/Request.d.ts +11 -0
  430. package/dist/esm/util/Request.d.ts.map +1 -0
  431. package/dist/esm/util/Request.js +20 -0
  432. package/dist/esm/util/Request.js.map +1 -0
  433. package/dist/esm/util/Response.d.ts +12 -0
  434. package/dist/esm/util/Response.d.ts.map +1 -0
  435. package/dist/esm/util/Response.js +25 -0
  436. package/dist/esm/util/Response.js.map +1 -0
  437. package/dist/esm/util/Template.d.ts +2 -0
  438. package/dist/esm/util/Template.d.ts.map +1 -0
  439. package/dist/esm/util/Template.js +11 -0
  440. package/dist/esm/util/Template.js.map +1 -0
  441. package/dist/esm/util/Url.d.ts +19 -0
  442. package/dist/esm/util/Url.d.ts.map +1 -0
  443. package/dist/esm/util/Url.js +99 -0
  444. package/dist/esm/util/Url.js.map +1 -0
  445. package/package.json +76 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Unieo Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,661 @@
1
+ <div align="center">
2
+ <h1>πŸ₯ Unieo</h1>
3
+ 🐚 A schema-driven routing engine for edge computing environments.
4
+ </div>
5
+ <br>
6
+
7
+ Unieo `[/juːniˈoʊ/]` brings code-free routing management to edge computing, with built-in **[WinterTC standards](https://wintertc.org/)** compliance for seamless deployment across Cloudflare Workers, Vercel Edge Functions, Aliyun EdgeRoutine, and other modern edge runtimes.
8
+
9
+ ## πŸ’‘ Motivation
10
+
11
+ ### 🌐 Understanding Edge Computing
12
+
13
+ Edge computing runs your code at data centers closest to your users, rather than in a single centralized location. This distributed approach delivers faster response times and better user experiences globally.
14
+
15
+ The Benefits:
16
+ - πŸš€ Lower Latency - Users connect to nearby servers instead of distant ones
17
+ - 🌍 Global Scale - Deploy once and run everywhere automatically
18
+ - πŸ’ͺ Improved Performance - Faster page loads and better user experience
19
+
20
+ Popular edge platforms include Cloudflare Workers, Vercel Edge Functions, and Aliyun EdgeRoutine.
21
+
22
+ ### 🎯 The Routing Challenge
23
+
24
+ Edge computing unlocks performance benefits, but introduces complexity in managing routing logic across distributed environments.
25
+
26
+ **Common Requirements:**
27
+ - 🌍 Serve localized content based on user geography
28
+ - πŸ“± Provide optimized experiences for different device types
29
+ - πŸ‘‘ Route premium users to enhanced features
30
+ - πŸ§ͺ Implement A/B testing and feature flags
31
+
32
+ **The Traditional Problem:** Every routing change requires code modifications and redeployment across all edge locations.
33
+
34
+ ### πŸ’‘ How Unieo Solves This
35
+
36
+ Unieo separates routing logic from application code through declarative configuration. Update routing rules instantly without touching your codebase.
37
+
38
+ **The Unieo Approach:**
39
+ ```typescript
40
+ // Route users by geography
41
+ {
42
+ name: 'geo-routing',
43
+ processor: 'COMMON_SUB_PROCESSOR',
44
+ meta: {
45
+ match: {
46
+ list: [{
47
+ origin: { source: 'country', sourceType: 'edge_info' },
48
+ criteria: { source: 'CN', sourceType: 'literal' },
49
+ operator: 'equal'
50
+ }]
51
+ },
52
+ requestRewrites: [{
53
+ type: 'url',
54
+ value: { source: '/zh/home', sourceType: 'literal' },
55
+ operation: 'set'
56
+ }]
57
+ }
58
+ }
59
+ ```
60
+
61
+ **Key Benefits:**
62
+ - πŸš€ **Instant Updates** - Change routing rules without code deployment
63
+ - 🌐 **WinterTC Compliance** - Built on web standards for universal compatibility
64
+ - 🎯 **Smart Routing** - Route based on location, device, headers, or custom criteria
65
+ - πŸ”§ **Schema-Driven** - Define complex logic through declarative configuration
66
+ - ⚑ **Edge-Optimized** - Minimal overhead for maximum performance
67
+
68
+ This approach enables dynamic routing rule distribution across edge environments while seamlessly integrating with existing development and configuration platforms.
69
+
70
+ ## πŸ“₯ Installation
71
+
72
+ ```bash
73
+ npm install @unieojs/unieo --save
74
+ ```
75
+
76
+ ## πŸƒβ€β™‚οΈ Quick Start
77
+
78
+ > [!WARNING]
79
+ > 🚧 **Development Notice**: Unieo is currently under active development, we are developing a more concise and intuitive routing API. Stay tuned! You'll be able to achieve the same functionality with much less code in the future.
80
+
81
+ ### πŸ’‘ Basic Usage
82
+
83
+ This example demonstrates a health check route that matches when the request URL path equals `/health` and rewrites the response header `content-type` to `application/json`:
84
+
85
+ - **Match condition**: `origin.source: 'path'` extracts the URL path, `criteria.source: '/health'` defines the target value, `operator: 'equal'` performs exact matching
86
+ - **Response rewrite**: Sets the `content-type` header to `application/json` when the route matches
87
+
88
+ ```typescript
89
+ import { Route } from 'unieo';
90
+
91
+ addEventListener('fetch', (event: FetchEvent) => {
92
+ // Create Route instance
93
+ const route = new Route({ event });
94
+
95
+ // Define routes configuration
96
+ const routes = [
97
+ {
98
+ name: 'api-routes',
99
+ type: 'api',
100
+ processor: 'COMMON_GROUP_PROCESSOR',
101
+ routes: [
102
+ {
103
+ name: 'health-check',
104
+ type: 'health',
105
+ processor: 'COMMON_SUB_PROCESSOR',
106
+ meta: {
107
+ match: {
108
+ list: [
109
+ {
110
+ origin: { source: 'path', sourceType: 'url' },
111
+ criteria: { source: '/health', sourceType: 'literal' },
112
+ operator: 'equal'
113
+ }
114
+ ]
115
+ },
116
+ responseRewrites: [
117
+ {
118
+ type: 'header',
119
+ field: 'content-type',
120
+ value: { source: 'application/json', sourceType: 'literal' },
121
+ operation: 'set'
122
+ }
123
+ ]
124
+ }
125
+ }
126
+ ]
127
+ }
128
+ ];
129
+
130
+ // Execute routes
131
+ const response = route.execute(routes);
132
+
133
+ // Respond
134
+ event.respondWith(response);
135
+ });
136
+ ```
137
+
138
+ ## 🎨 Real-World Examples
139
+
140
+ ### 🌐 API Gateway
141
+
142
+ Perfect for building API gateways that need request routing, authentication, and response transformation:
143
+
144
+ - **Match logic**: Uses `operator: 'regexp'` to match paths starting with `/api/private` using the pattern `^/api/private`
145
+ - **Request rewrite**: Adds `x-auth-required: true` header to mark the request as requiring authentication
146
+
147
+ ```typescript
148
+ const apiGatewayRoutes = [
149
+ {
150
+ name: 'auth-group',
151
+ type: 'authentication',
152
+ processor: 'COMMON_GROUP_PROCESSOR',
153
+ routes: [
154
+ {
155
+ name: 'require-auth',
156
+ type: 'auth-check',
157
+ processor: 'COMMON_SUB_PROCESSOR',
158
+ meta: {
159
+ match: {
160
+ list: [
161
+ {
162
+ origin: { source: 'path', sourceType: 'url' },
163
+ criteria: { source: '^/api/private', sourceType: 'literal' },
164
+ operator: 'regexp'
165
+ }
166
+ ]
167
+ },
168
+ requestRewrites: [
169
+ {
170
+ type: 'header',
171
+ field: 'x-auth-required',
172
+ value: { source: 'true', sourceType: 'literal' },
173
+ operation: 'set'
174
+ }
175
+ ]
176
+ }
177
+ }
178
+ ]
179
+ }
180
+ ];
181
+ ```
182
+
183
+ ### πŸš€ CDN Edge Logic
184
+
185
+ Implement sophisticated CDN logic with cache control and content optimization:
186
+
187
+ - **Match logic**: Uses `operator: 'regexp'` with pattern `\\.(jpg|jpeg|png|webp)$` to match image file extensions
188
+ - **Middleware chain**: Applies `ImageOptimization` middleware with quality settings, followed by `DefaultFetch`
189
+
190
+ ```typescript
191
+ const cdnRoutes = [
192
+ {
193
+ name: 'static-assets',
194
+ type: 'cdn',
195
+ processor: 'COMMON_GROUP_PROCESSOR',
196
+ routes: [
197
+ {
198
+ name: 'image-optimization',
199
+ type: 'image',
200
+ processor: 'COMMON_SUB_PROCESSOR',
201
+ meta: {
202
+ match: {
203
+ list: [
204
+ {
205
+ origin: { source: 'path', sourceType: 'url' },
206
+ criteria: { source: '\\.(jpg|jpeg|png|webp)$', sourceType: 'literal' },
207
+ operator: 'regexp'
208
+ }
209
+ ]
210
+ },
211
+ requestRewrites: [
212
+ {
213
+ type: 'middleware',
214
+ value: {
215
+ source: [
216
+ ['ImageOptimization', { quality: 80, format: 'webp' }],
217
+ ['DefaultFetch', {}]
218
+ ],
219
+ sourceType: 'literal'
220
+ },
221
+ operation: 'set'
222
+ }
223
+ ]
224
+ }
225
+ }
226
+ ]
227
+ }
228
+ ];
229
+ ```
230
+
231
+ ### πŸ§ͺ A/B Testing
232
+
233
+ Implement dynamic A/B testing based on user characteristics:
234
+
235
+ - **Match logic**: Combines two conditions with `operator: 'and'`:
236
+ - Checks `x-user-segment` header equals `beta`
237
+ - Checks URL path starts with `/app` using `operator: 'prefix'`
238
+ - **URL rewrite**: Redirects matching requests to `/app-beta` path
239
+
240
+ ```typescript
241
+ const abTestingRoutes = [
242
+ {
243
+ name: 'feature-toggle',
244
+ type: 'ab-test',
245
+ processor: 'COMMON_GROUP_PROCESSOR',
246
+ routes: [
247
+ {
248
+ name: 'new-ui-test',
249
+ type: 'ui-variant',
250
+ processor: 'COMMON_SUB_PROCESSOR',
251
+ meta: {
252
+ match: {
253
+ list: [
254
+ {
255
+ origin: { source: 'x-user-segment', sourceType: 'request_header' },
256
+ criteria: { source: 'beta', sourceType: 'literal' },
257
+ operator: 'equal'
258
+ },
259
+ {
260
+ origin: { source: 'path', sourceType: 'url' },
261
+ criteria: { source: '/app', sourceType: 'literal' },
262
+ operator: 'prefix'
263
+ }
264
+ ],
265
+ operator: 'and'
266
+ },
267
+ requestRewrites: [
268
+ {
269
+ type: 'url',
270
+ value: { source: '/app-beta', sourceType: 'literal' },
271
+ operation: 'set'
272
+ }
273
+ ]
274
+ }
275
+ }
276
+ ]
277
+ }
278
+ ];
279
+ ```
280
+
281
+ ### πŸ“± Device-Based Routing
282
+
283
+ Route requests based on device characteristics for optimal user experience:
284
+
285
+ - **Match logic**: Uses `sourceType: 'device'` with `source: 'type'` to detect device type, matches when equal to `mobile`
286
+ - **Request rewrite**: Adds `x-mobile-optimized: true` header for mobile-specific processing
287
+
288
+ ```typescript
289
+ const deviceRoutes = [
290
+ {
291
+ name: 'device-routing',
292
+ type: 'responsive',
293
+ processor: 'COMMON_GROUP_PROCESSOR',
294
+ routes: [
295
+ {
296
+ name: 'mobile-optimization',
297
+ type: 'mobile',
298
+ processor: 'COMMON_SUB_PROCESSOR',
299
+ meta: {
300
+ match: {
301
+ list: [
302
+ {
303
+ origin: { source: 'type', sourceType: 'device' },
304
+ criteria: { source: 'mobile', sourceType: 'literal' },
305
+ operator: 'equal'
306
+ }
307
+ ]
308
+ },
309
+ requestRewrites: [
310
+ {
311
+ type: 'header',
312
+ field: 'x-mobile-optimized',
313
+ value: { source: 'true', sourceType: 'literal' },
314
+ operation: 'set'
315
+ }
316
+ ]
317
+ }
318
+ }
319
+ ]
320
+ }
321
+ ];
322
+ ```
323
+
324
+ ### 🌍 Geo-based Routing
325
+
326
+ Serve localized content based on user location:
327
+
328
+ - **Match logic**: Uses `sourceType: 'edge_info'` with `source: 'country'` to get user's country, checks if it's `in` the EU region
329
+ - **Response rewrite**: Sets `x-privacy-policy: gdpr-compliant` header for EU users
330
+
331
+ ```typescript
332
+ const geoRoutes = [
333
+ {
334
+ name: 'geo-routing',
335
+ type: 'localization',
336
+ processor: 'COMMON_GROUP_PROCESSOR',
337
+ routes: [
338
+ {
339
+ name: 'eu-compliance',
340
+ type: 'gdpr',
341
+ processor: 'COMMON_SUB_PROCESSOR',
342
+ meta: {
343
+ match: {
344
+ list: [
345
+ {
346
+ origin: { source: 'country', sourceType: 'edge_info' },
347
+ criteria: { source: 'EU', sourceType: 'literal' },
348
+ operator: 'in'
349
+ }
350
+ ]
351
+ },
352
+ responseRewrites: [
353
+ {
354
+ type: 'header',
355
+ field: 'x-privacy-policy',
356
+ value: { source: 'gdpr-compliant', sourceType: 'literal' },
357
+ operation: 'set'
358
+ }
359
+ ]
360
+ }
361
+ }
362
+ ]
363
+ }
364
+ ];
365
+ ```
366
+
367
+ ## βš™οΈ Advanced Configuration
368
+
369
+ ### πŸ”— Middleware Integration
370
+
371
+ Unieo supports a comprehensive middleware system with custom middleware registration:
372
+
373
+ #### πŸ“ Creating Custom Middleware
374
+
375
+ First, create your custom middleware following the `MiddlewareGen` pattern:
376
+
377
+ ```typescript
378
+ import type { MiddlewareGen, BaseMiddlewareOption, RouteContext, MiddlewareNext } from 'unieo';
379
+
380
+ // Define your middleware options interface
381
+ interface AuthMiddlewareOption extends BaseMiddlewareOption {
382
+ secret: string;
383
+ headerName?: string;
384
+ }
385
+
386
+ // Create the middleware generator
387
+ const AuthMiddleware: MiddlewareGen<AuthMiddlewareOption> = (opt) => {
388
+ return async (ctx: RouteContext, next: MiddlewareNext) => {
389
+ const { secret, headerName = 'authorization' } = opt;
390
+
391
+ // Get auth header from request
392
+ const authHeader = ctx.request.headers.get(headerName);
393
+
394
+ if (!authHeader || !authHeader.includes(secret)) {
395
+ // Set unauthorized response
396
+ const response = new Response('Unauthorized', {
397
+ status: 401,
398
+ headers: { 'content-type': 'text/plain' }
399
+ });
400
+ ctx.setResponse(response);
401
+ return; // Don't call next() to short-circuit the middleware chain
402
+ }
403
+
404
+ // Add custom header to indicate auth success
405
+ ctx.request = new Request(ctx.request, {
406
+ headers: {
407
+ ...Object.fromEntries(ctx.request.headers),
408
+ 'x-auth-verified': 'true'
409
+ }
410
+ });
411
+
412
+ await next(); // Continue to next middleware
413
+ };
414
+ };
415
+
416
+ // Rate limiting middleware example
417
+ interface RateLimitMiddlewareOption extends BaseMiddlewareOption {
418
+ limit: number;
419
+ window: number; // in milliseconds
420
+ }
421
+
422
+ const RateLimitMiddleware: MiddlewareGen<RateLimitMiddlewareOption> = (opt) => {
423
+ const requestCounts = new Map<string, { count: number; resetTime: number }>();
424
+
425
+ return async (ctx: RouteContext, next: MiddlewareNext) => {
426
+ const { limit, window } = opt;
427
+ const clientIP = ctx.request.headers.get('cf-connecting-ip') || 'unknown';
428
+ const now = Date.now();
429
+
430
+ // Get or initialize request count for this IP
431
+ let clientData = requestCounts.get(clientIP);
432
+ if (!clientData || now > clientData.resetTime) {
433
+ clientData = { count: 0, resetTime: now + window };
434
+ requestCounts.set(clientIP, clientData);
435
+ }
436
+
437
+ clientData.count++;
438
+
439
+ if (clientData.count > limit) {
440
+ const response = new Response('Rate limit exceeded', {
441
+ status: 429,
442
+ headers: {
443
+ 'content-type': 'text/plain',
444
+ 'retry-after': Math.ceil((clientData.resetTime - now) / 1000).toString()
445
+ }
446
+ });
447
+ ctx.setResponse(response);
448
+ return;
449
+ }
450
+
451
+ await next();
452
+ };
453
+ };
454
+ ```
455
+
456
+ #### πŸ”§ Registering Custom Middleware
457
+
458
+ Register your custom middleware when creating the Route instance:
459
+
460
+ ```typescript
461
+ import { Route } from 'unieo';
462
+
463
+ const route = new Route({
464
+ event,
465
+ logger: console, // Custom logger
466
+ httpClient: { // Custom HTTP client
467
+ request: async (request, options) => {
468
+ // Custom fetch logic
469
+ return fetch(request, options);
470
+ }
471
+ },
472
+ // Register custom middleware
473
+ middlewares: [
474
+ ['Auth', AuthMiddleware],
475
+ ['RateLimit', RateLimitMiddleware],
476
+ // Add more custom middleware here
477
+ ]
478
+ });
479
+ ```
480
+
481
+ #### πŸ“‹ Using Custom Middleware in Routes
482
+
483
+ Now you can use your custom middleware in route configurations:
484
+
485
+ ```typescript
486
+ // Routes with custom middleware configuration
487
+ const routesWithMiddleware = [
488
+ {
489
+ name: 'api-with-middleware',
490
+ type: 'api',
491
+ processor: 'COMMON_GROUP_PROCESSOR',
492
+ routes: [
493
+ {
494
+ name: 'protected-endpoint',
495
+ type: 'protected',
496
+ processor: 'COMMON_SUB_PROCESSOR',
497
+ meta: {
498
+ requestRewrites: [
499
+ {
500
+ type: 'middleware',
501
+ value: {
502
+ source: [
503
+ ['Auth', { secret: 'your-secret-key', headerName: 'x-api-key' }],
504
+ ['RateLimit', { limit: 100, window: 60000 }], // 100 requests per minute
505
+ ['DefaultFetch', {}] // Always include DefaultFetch as the last middleware
506
+ ],
507
+ sourceType: 'literal'
508
+ },
509
+ operation: 'set'
510
+ }
511
+ ]
512
+ }
513
+ }
514
+ ]
515
+ }
516
+ ];
517
+ ```
518
+
519
+ ### 🧠 Complex Matching Logic
520
+
521
+ Create sophisticated matching conditions:
522
+
523
+ ```typescript
524
+ const complexRoutes = [
525
+ {
526
+ name: 'complex-matching',
527
+ type: 'advanced',
528
+ processor: 'COMMON_GROUP_PROCESSOR',
529
+ routes: [
530
+ {
531
+ name: 'multi-condition-route',
532
+ type: 'conditional',
533
+ processor: 'COMMON_SUB_PROCESSOR',
534
+ meta: {
535
+ match: {
536
+ list: [
537
+ {
538
+ // Match specific user agent
539
+ origin: { source: 'user-agent', sourceType: 'request_header' },
540
+ criteria: { source: 'bot|crawler', sourceType: 'literal' },
541
+ operator: 'regexp'
542
+ },
543
+ {
544
+ // Match specific time range
545
+ origin: { source: 'hour', sourceType: 'edge_info' },
546
+ criteria: { source: '9', sourceType: 'literal' },
547
+ operator: 'gte'
548
+ },
549
+ {
550
+ // Match specific path
551
+ origin: { source: 'path', sourceType: 'url' },
552
+ criteria: { source: '/api/', sourceType: 'literal' },
553
+ operator: 'prefix'
554
+ }
555
+ ],
556
+ operator: 'and' // All conditions must match
557
+ }
558
+ }
559
+ }
560
+ ]
561
+ }
562
+ ];
563
+ ```
564
+
565
+ ## πŸ“– Route Configuration Reference
566
+
567
+ ### πŸ“‚ GroupRouteConfig
568
+
569
+ ```typescript
570
+ interface GroupRouteConfig {
571
+ name: string; // Unique identifier for the route group
572
+ type: string; // Route type for categorization
573
+ processor: GroupProcessorType; // Processor type to handle the group
574
+ routes: SubRouteConfig[]; // Array of sub-routes
575
+ status?: RouteStatus; // ONLINE | OFFLINE
576
+ meta?: object; // Additional metadata
577
+ args?: Record<string, unknown>; // Processor arguments
578
+ }
579
+ ```
580
+
581
+ ### πŸ“„ SubRouteConfig
582
+
583
+ ```typescript
584
+ interface SubRouteConfig {
585
+ name: string; // Unique identifier for the sub-route
586
+ type: string; // Route type for categorization
587
+ processor: SubProcessorType; // Processor type to handle the route
588
+ status?: RouteStatus; // ONLINE | OFFLINE
589
+ meta?: {
590
+ match?: MatchConfig; // Matching conditions
591
+ redirects?: RedirectConfig[]; // Redirect rules
592
+ requestRewrites?: RequestRewriteConfig[]; // Request modifications
593
+ responseRewrites?: ResponseRewriteConfig[]; // Response modifications
594
+ };
595
+ args?: Record<string, unknown>; // Processor arguments
596
+ }
597
+ ```
598
+
599
+ ## 🧩 Extending Unieo
600
+
601
+ **Note: The extension system is currently under development. 🚧 The following represents the planned architecture.**
602
+
603
+ ### πŸ”§ Custom Processors
604
+
605
+ ```typescript
606
+ // Custom Group Processor (planned)
607
+ class CustomGroupProcessor extends BaseGroupProcessor {
608
+ static processorType = 'CUSTOM_GROUP_PROCESSOR';
609
+
610
+ async checkMatch(): Promise<boolean> {
611
+ // Custom matching logic
612
+ return true;
613
+ }
614
+ }
615
+
616
+ // Custom Sub Processor (planned)
617
+ class CustomSubProcessor extends BaseSubProcessor {
618
+ static processorType = 'CUSTOM_SUB_PROCESSOR';
619
+
620
+ async beforeRequest(): Promise<void> {
621
+ // Custom request processing
622
+ }
623
+
624
+ async beforeResponse(): Promise<void> {
625
+ // Custom response processing
626
+ }
627
+ }
628
+ ```
629
+
630
+ ### πŸ—οΈ Custom Route Class
631
+
632
+ ```typescript
633
+ // Extended Route class (planned)
634
+ class CustomRoute extends Route {
635
+ constructor(data: RouteRawData) {
636
+ super(data);
637
+ // Register custom processors
638
+ this.registerCustomProcessors();
639
+ }
640
+
641
+ private registerCustomProcessors() {
642
+ // Registration logic (under development)
643
+ }
644
+ }
645
+ ```
646
+
647
+ ## 🀝 Contributing
648
+
649
+ We welcome contributions! πŸŽ‰ Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details on how to get started.
650
+
651
+ ## πŸ“œ License
652
+
653
+ MIT License - see the [LICENSE](LICENSE) file for details.
654
+
655
+ ## πŸ”— Related Projects
656
+
657
+ - 🌐 [WinterTC](https://wintertc.org/) - Web-interoperable Server Runtimes Technical Committee standards
658
+ - 🌍 [Cloudflare Workers](https://workers.cloudflare.com/) - Deploy serverless code instantly across the globe
659
+ - ⚑ [Vercel Edge Functions](https://vercel.com/docs/functions/edge-functions) - Edge-side server functions
660
+ - πŸ—ΊοΈ [Aliyun EdgeRoutine](https://help.aliyun.com/zh/edge-security-acceleration/dcdn/user-guide/what-is-er) - Write JavaScript code and deploy and execute it on Alibaba Cloud points of presence (POPs) worldwide
661
+ - πŸ›£οΈ [path-to-regexp](https://github.com/pillarjs/path-to-regexp) - Express-style path matching
@@ -0,0 +1,21 @@
1
+ import type { GroupRawRoute } from './core';
2
+ import { RouteContext } from './core';
3
+ import { ERPerformance } from './core/ERPerformance';
4
+ import type { ERFetchEvent, HttpClient, ILogger } from './types';
5
+ import type { MiddlewareGen } from './middleware';
6
+ interface RouteRawData {
7
+ event: ERFetchEvent;
8
+ logger?: ILogger;
9
+ httpClient?: HttpClient;
10
+ performance?: ERPerformance;
11
+ middlewares?: [string, MiddlewareGen][];
12
+ }
13
+ export declare class Route {
14
+ #private;
15
+ constructor(data: RouteRawData);
16
+ get ctx(): RouteContext;
17
+ private registerProcessor;
18
+ execute(routes: GroupRawRoute[]): Promise<Response | undefined>;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=Route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../src/Route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAoC,YAAY,EAAgB,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,UAAU,YAAY;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;CACzC;AAED,qBAAa,KAAK;;gBAIJ,IAAI,EAAE,YAAY;IAmB9B,IAAI,GAAG,iBAEN;IAED,OAAO,CAAC,iBAAiB;IAKnB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE;CAWtC"}