@linyjs/plugin-docs 0.0.13

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 (254) hide show
  1. package/README.md +137 -0
  2. package/docs/api-reference/index.md +361 -0
  3. package/docs/best-practices/error-handling.md +462 -0
  4. package/docs/best-practices/naming-conventions.md +496 -0
  5. package/docs/best-practices/performance.md +532 -0
  6. package/docs/best-practices/security.md +620 -0
  7. package/docs/best-practices/service-definition.md +332 -0
  8. package/docs/faq.md +322 -0
  9. package/docs/getting-started/first-plugin.md +358 -0
  10. package/docs/getting-started/installation.md +244 -0
  11. package/docs/getting-started/quick-start.md +235 -0
  12. package/docs/guides/authentication.md +428 -0
  13. package/docs/guides/client-module.md +604 -0
  14. package/docs/guides/data-persistence.md +640 -0
  15. package/docs/guides/permissions.md +440 -0
  16. package/docs/guides/server-module.md +377 -0
  17. package/docs/guides/ui-slots.md +475 -0
  18. package/docs/migration/v0-to-v1.md +354 -0
  19. package/examples/analytics-plugin/README.md +416 -0
  20. package/examples/analytics-plugin/dist/client/index.d.ts +36 -0
  21. package/examples/analytics-plugin/dist/client/index.js +173 -0
  22. package/examples/analytics-plugin/dist/index.d.ts +64 -0
  23. package/examples/analytics-plugin/dist/index.js +72 -0
  24. package/examples/analytics-plugin/dist/server/index.d.ts +119 -0
  25. package/examples/analytics-plugin/dist/server/index.js +313 -0
  26. package/examples/analytics-plugin/package.json +28 -0
  27. package/examples/analytics-plugin/src/client/index.tsx +414 -0
  28. package/examples/analytics-plugin/src/index.ts +71 -0
  29. package/examples/analytics-plugin/src/server/index.ts +349 -0
  30. package/examples/analytics-plugin/tsconfig.json +21 -0
  31. package/examples/blog-plugin/README.md +319 -0
  32. package/examples/blog-plugin/dist/client/index.d.ts +22 -0
  33. package/examples/blog-plugin/dist/client/index.js +197 -0
  34. package/examples/blog-plugin/dist/server/index.d.ts +5 -0
  35. package/examples/blog-plugin/dist/server/index.js +220 -0
  36. package/examples/blog-plugin/package.json +24 -0
  37. package/examples/blog-plugin/src/client/index.tsx +409 -0
  38. package/examples/blog-plugin/src/server/index.ts +240 -0
  39. package/examples/blog-plugin/tsconfig.json +16 -0
  40. package/examples/hello-world/README.md +101 -0
  41. package/examples/hello-world/dist/client/index.d.ts +5 -0
  42. package/examples/hello-world/dist/client/index.js +80 -0
  43. package/examples/hello-world/dist/server/index.d.ts +5 -0
  44. package/examples/hello-world/dist/server/index.js +38 -0
  45. package/examples/hello-world/node_modules/.package-lock.json +61 -0
  46. package/examples/hello-world/node_modules/@linyjs/client-module-interface/HOOKS_USAGE.md +281 -0
  47. package/examples/hello-world/node_modules/@linyjs/client-module-interface/IMPLEMENTATION_SUMMARY.md +166 -0
  48. package/examples/hello-world/node_modules/@linyjs/client-module-interface/QUICK_REFERENCE.md +130 -0
  49. package/examples/hello-world/node_modules/@linyjs/client-module-interface/README.md +214 -0
  50. package/examples/hello-world/node_modules/@linyjs/client-module-interface/package.json +26 -0
  51. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/application.ts +50 -0
  52. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/comparison-example.tsx +229 -0
  53. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/di.ts +127 -0
  54. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/domain.ts +52 -0
  55. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/hooks-example.tsx +275 -0
  56. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/hooks.ts +175 -0
  57. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/index.ts +87 -0
  58. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/interfaces.ts +117 -0
  59. package/examples/hello-world/node_modules/@linyjs/client-module-interface/src/router.ts +49 -0
  60. package/examples/hello-world/node_modules/@linyjs/client-module-interface/tsconfig.json +10 -0
  61. package/examples/hello-world/node_modules/@linyjs/server-module-interface/package.json +21 -0
  62. package/examples/hello-world/node_modules/@linyjs/server-module-interface/src/application.ts +21 -0
  63. package/examples/hello-world/node_modules/@linyjs/server-module-interface/src/di.ts +127 -0
  64. package/examples/hello-world/node_modules/@linyjs/server-module-interface/src/domain.ts +75 -0
  65. package/examples/hello-world/node_modules/@linyjs/server-module-interface/src/index.ts +55 -0
  66. package/examples/hello-world/node_modules/@linyjs/server-module-interface/src/interfaces.ts +58 -0
  67. package/examples/hello-world/node_modules/@linyjs/server-module-interface/tsconfig.json +8 -0
  68. package/examples/hello-world/node_modules/@types/react/LICENSE +21 -0
  69. package/examples/hello-world/node_modules/@types/react/README.md +15 -0
  70. package/examples/hello-world/node_modules/@types/react/canary.d.ts +129 -0
  71. package/examples/hello-world/node_modules/@types/react/compiler-runtime.d.ts +4 -0
  72. package/examples/hello-world/node_modules/@types/react/experimental.d.ts +184 -0
  73. package/examples/hello-world/node_modules/@types/react/global.d.ts +166 -0
  74. package/examples/hello-world/node_modules/@types/react/index.d.ts +4369 -0
  75. package/examples/hello-world/node_modules/@types/react/jsx-dev-runtime.d.ts +33 -0
  76. package/examples/hello-world/node_modules/@types/react/jsx-runtime.d.ts +24 -0
  77. package/examples/hello-world/node_modules/@types/react/package.json +210 -0
  78. package/examples/hello-world/node_modules/@types/react/ts5.0/canary.d.ts +129 -0
  79. package/examples/hello-world/node_modules/@types/react/ts5.0/experimental.d.ts +184 -0
  80. package/examples/hello-world/node_modules/@types/react/ts5.0/global.d.ts +166 -0
  81. package/examples/hello-world/node_modules/@types/react/ts5.0/index.d.ts +4356 -0
  82. package/examples/hello-world/node_modules/@types/react/ts5.0/jsx-dev-runtime.d.ts +33 -0
  83. package/examples/hello-world/node_modules/@types/react/ts5.0/jsx-runtime.d.ts +24 -0
  84. package/examples/hello-world/node_modules/csstype/LICENSE +19 -0
  85. package/examples/hello-world/node_modules/csstype/README.md +291 -0
  86. package/examples/hello-world/node_modules/csstype/index.d.ts +22569 -0
  87. package/examples/hello-world/node_modules/csstype/index.js.flow +6863 -0
  88. package/examples/hello-world/node_modules/csstype/package.json +70 -0
  89. package/examples/hello-world/node_modules/react/LICENSE +21 -0
  90. package/examples/hello-world/node_modules/react/README.md +37 -0
  91. package/examples/hello-world/node_modules/react/cjs/react-compiler-runtime.development.js +24 -0
  92. package/examples/hello-world/node_modules/react/cjs/react-compiler-runtime.production.js +16 -0
  93. package/examples/hello-world/node_modules/react/cjs/react-compiler-runtime.profiling.js +16 -0
  94. package/examples/hello-world/node_modules/react/cjs/react-jsx-dev-runtime.development.js +338 -0
  95. package/examples/hello-world/node_modules/react/cjs/react-jsx-dev-runtime.production.js +14 -0
  96. package/examples/hello-world/node_modules/react/cjs/react-jsx-dev-runtime.profiling.js +14 -0
  97. package/examples/hello-world/node_modules/react/cjs/react-jsx-dev-runtime.react-server.development.js +370 -0
  98. package/examples/hello-world/node_modules/react/cjs/react-jsx-dev-runtime.react-server.production.js +40 -0
  99. package/examples/hello-world/node_modules/react/cjs/react-jsx-runtime.development.js +352 -0
  100. package/examples/hello-world/node_modules/react/cjs/react-jsx-runtime.production.js +34 -0
  101. package/examples/hello-world/node_modules/react/cjs/react-jsx-runtime.profiling.js +34 -0
  102. package/examples/hello-world/node_modules/react/cjs/react-jsx-runtime.react-server.development.js +370 -0
  103. package/examples/hello-world/node_modules/react/cjs/react-jsx-runtime.react-server.production.js +40 -0
  104. package/examples/hello-world/node_modules/react/cjs/react.development.js +1284 -0
  105. package/examples/hello-world/node_modules/react/cjs/react.production.js +542 -0
  106. package/examples/hello-world/node_modules/react/cjs/react.react-server.development.js +848 -0
  107. package/examples/hello-world/node_modules/react/cjs/react.react-server.production.js +423 -0
  108. package/examples/hello-world/node_modules/react/compiler-runtime.js +14 -0
  109. package/examples/hello-world/node_modules/react/index.js +7 -0
  110. package/examples/hello-world/node_modules/react/jsx-dev-runtime.js +7 -0
  111. package/examples/hello-world/node_modules/react/jsx-dev-runtime.react-server.js +7 -0
  112. package/examples/hello-world/node_modules/react/jsx-runtime.js +7 -0
  113. package/examples/hello-world/node_modules/react/jsx-runtime.react-server.js +7 -0
  114. package/examples/hello-world/node_modules/react/package.json +51 -0
  115. package/examples/hello-world/node_modules/react/react.react-server.js +7 -0
  116. package/examples/hello-world/node_modules/typescript/LICENSE.txt +55 -0
  117. package/examples/hello-world/node_modules/typescript/README.md +50 -0
  118. package/examples/hello-world/node_modules/typescript/SECURITY.md +41 -0
  119. package/examples/hello-world/node_modules/typescript/ThirdPartyNoticeText.txt +193 -0
  120. package/examples/hello-world/node_modules/typescript/bin/tsc +2 -0
  121. package/examples/hello-world/node_modules/typescript/bin/tsserver +2 -0
  122. package/examples/hello-world/node_modules/typescript/lib/_tsc.js +133818 -0
  123. package/examples/hello-world/node_modules/typescript/lib/_tsserver.js +659 -0
  124. package/examples/hello-world/node_modules/typescript/lib/_typingsInstaller.js +222 -0
  125. package/examples/hello-world/node_modules/typescript/lib/cs/diagnosticMessages.generated.json +2122 -0
  126. package/examples/hello-world/node_modules/typescript/lib/de/diagnosticMessages.generated.json +2122 -0
  127. package/examples/hello-world/node_modules/typescript/lib/es/diagnosticMessages.generated.json +2122 -0
  128. package/examples/hello-world/node_modules/typescript/lib/fr/diagnosticMessages.generated.json +2122 -0
  129. package/examples/hello-world/node_modules/typescript/lib/it/diagnosticMessages.generated.json +2122 -0
  130. package/examples/hello-world/node_modules/typescript/lib/ja/diagnosticMessages.generated.json +2122 -0
  131. package/examples/hello-world/node_modules/typescript/lib/ko/diagnosticMessages.generated.json +2122 -0
  132. package/examples/hello-world/node_modules/typescript/lib/lib.d.ts +22 -0
  133. package/examples/hello-world/node_modules/typescript/lib/lib.decorators.d.ts +384 -0
  134. package/examples/hello-world/node_modules/typescript/lib/lib.decorators.legacy.d.ts +22 -0
  135. package/examples/hello-world/node_modules/typescript/lib/lib.dom.asynciterable.d.ts +41 -0
  136. package/examples/hello-world/node_modules/typescript/lib/lib.dom.d.ts +39429 -0
  137. package/examples/hello-world/node_modules/typescript/lib/lib.dom.iterable.d.ts +571 -0
  138. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.collection.d.ts +147 -0
  139. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.core.d.ts +597 -0
  140. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.d.ts +28 -0
  141. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.generator.d.ts +77 -0
  142. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.iterable.d.ts +605 -0
  143. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.promise.d.ts +81 -0
  144. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.proxy.d.ts +128 -0
  145. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.reflect.d.ts +144 -0
  146. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.symbol.d.ts +46 -0
  147. package/examples/hello-world/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts +326 -0
  148. package/examples/hello-world/node_modules/typescript/lib/lib.es2016.array.include.d.ts +116 -0
  149. package/examples/hello-world/node_modules/typescript/lib/lib.es2016.d.ts +21 -0
  150. package/examples/hello-world/node_modules/typescript/lib/lib.es2016.full.d.ts +23 -0
  151. package/examples/hello-world/node_modules/typescript/lib/lib.es2016.intl.d.ts +31 -0
  152. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts +21 -0
  153. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.d.ts +26 -0
  154. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.date.d.ts +31 -0
  155. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.full.d.ts +23 -0
  156. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.intl.d.ts +44 -0
  157. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.object.d.ts +49 -0
  158. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts +135 -0
  159. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.string.d.ts +45 -0
  160. package/examples/hello-world/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts +53 -0
  161. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts +77 -0
  162. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts +53 -0
  163. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.d.ts +24 -0
  164. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.full.d.ts +24 -0
  165. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.intl.d.ts +83 -0
  166. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.promise.d.ts +30 -0
  167. package/examples/hello-world/node_modules/typescript/lib/lib.es2018.regexp.d.ts +37 -0
  168. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.array.d.ts +79 -0
  169. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.d.ts +24 -0
  170. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.full.d.ts +24 -0
  171. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.intl.d.ts +23 -0
  172. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.object.d.ts +33 -0
  173. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.string.d.ts +37 -0
  174. package/examples/hello-world/node_modules/typescript/lib/lib.es2019.symbol.d.ts +24 -0
  175. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.bigint.d.ts +765 -0
  176. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.d.ts +27 -0
  177. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.date.d.ts +42 -0
  178. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.full.d.ts +24 -0
  179. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.intl.d.ts +474 -0
  180. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.number.d.ts +28 -0
  181. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.promise.d.ts +47 -0
  182. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts +99 -0
  183. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.string.d.ts +44 -0
  184. package/examples/hello-world/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts +41 -0
  185. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.d.ts +23 -0
  186. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.full.d.ts +24 -0
  187. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.intl.d.ts +166 -0
  188. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.promise.d.ts +48 -0
  189. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.string.d.ts +33 -0
  190. package/examples/hello-world/node_modules/typescript/lib/lib.es2021.weakref.d.ts +78 -0
  191. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.array.d.ts +121 -0
  192. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.d.ts +25 -0
  193. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.error.d.ts +75 -0
  194. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.full.d.ts +24 -0
  195. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.intl.d.ts +145 -0
  196. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.object.d.ts +26 -0
  197. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.regexp.d.ts +39 -0
  198. package/examples/hello-world/node_modules/typescript/lib/lib.es2022.string.d.ts +25 -0
  199. package/examples/hello-world/node_modules/typescript/lib/lib.es2023.array.d.ts +924 -0
  200. package/examples/hello-world/node_modules/typescript/lib/lib.es2023.collection.d.ts +21 -0
  201. package/examples/hello-world/node_modules/typescript/lib/lib.es2023.d.ts +22 -0
  202. package/examples/hello-world/node_modules/typescript/lib/lib.es2023.full.d.ts +24 -0
  203. package/examples/hello-world/node_modules/typescript/lib/lib.es2023.intl.d.ts +56 -0
  204. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts +65 -0
  205. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.collection.d.ts +29 -0
  206. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.d.ts +26 -0
  207. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.full.d.ts +24 -0
  208. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.object.d.ts +29 -0
  209. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.promise.d.ts +35 -0
  210. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.regexp.d.ts +25 -0
  211. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts +68 -0
  212. package/examples/hello-world/node_modules/typescript/lib/lib.es2024.string.d.ts +29 -0
  213. package/examples/hello-world/node_modules/typescript/lib/lib.es5.d.ts +4601 -0
  214. package/examples/hello-world/node_modules/typescript/lib/lib.es6.d.ts +23 -0
  215. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.array.d.ts +35 -0
  216. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.collection.d.ts +96 -0
  217. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.d.ts +29 -0
  218. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.decorators.d.ts +28 -0
  219. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.disposable.d.ts +193 -0
  220. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.error.d.ts +24 -0
  221. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.float16.d.ts +445 -0
  222. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.full.d.ts +24 -0
  223. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.intl.d.ts +21 -0
  224. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.iterator.d.ts +148 -0
  225. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.promise.d.ts +34 -0
  226. package/examples/hello-world/node_modules/typescript/lib/lib.esnext.sharedmemory.d.ts +25 -0
  227. package/examples/hello-world/node_modules/typescript/lib/lib.scripthost.d.ts +322 -0
  228. package/examples/hello-world/node_modules/typescript/lib/lib.webworker.asynciterable.d.ts +41 -0
  229. package/examples/hello-world/node_modules/typescript/lib/lib.webworker.d.ts +13150 -0
  230. package/examples/hello-world/node_modules/typescript/lib/lib.webworker.importscripts.d.ts +23 -0
  231. package/examples/hello-world/node_modules/typescript/lib/lib.webworker.iterable.d.ts +340 -0
  232. package/examples/hello-world/node_modules/typescript/lib/pl/diagnosticMessages.generated.json +2122 -0
  233. package/examples/hello-world/node_modules/typescript/lib/pt-br/diagnosticMessages.generated.json +2122 -0
  234. package/examples/hello-world/node_modules/typescript/lib/ru/diagnosticMessages.generated.json +2122 -0
  235. package/examples/hello-world/node_modules/typescript/lib/tr/diagnosticMessages.generated.json +2122 -0
  236. package/examples/hello-world/node_modules/typescript/lib/tsc.js +8 -0
  237. package/examples/hello-world/node_modules/typescript/lib/tsserver.js +8 -0
  238. package/examples/hello-world/node_modules/typescript/lib/tsserverlibrary.d.ts +17 -0
  239. package/examples/hello-world/node_modules/typescript/lib/tsserverlibrary.js +21 -0
  240. package/examples/hello-world/node_modules/typescript/lib/typesMap.json +497 -0
  241. package/examples/hello-world/node_modules/typescript/lib/typescript.d.ts +11437 -0
  242. package/examples/hello-world/node_modules/typescript/lib/typescript.js +200276 -0
  243. package/examples/hello-world/node_modules/typescript/lib/typingsInstaller.js +8 -0
  244. package/examples/hello-world/node_modules/typescript/lib/watchGuard.js +53 -0
  245. package/examples/hello-world/node_modules/typescript/lib/zh-cn/diagnosticMessages.generated.json +2122 -0
  246. package/examples/hello-world/node_modules/typescript/lib/zh-tw/diagnosticMessages.generated.json +2122 -0
  247. package/examples/hello-world/node_modules/typescript/package.json +120 -0
  248. package/examples/hello-world/package-lock.json +74 -0
  249. package/examples/hello-world/package.json +23 -0
  250. package/examples/hello-world/src/client/index.tsx +110 -0
  251. package/examples/hello-world/src/server/index.ts +42 -0
  252. package/examples/hello-world/tsconfig.json +16 -0
  253. package/package.json +46 -0
  254. package/src/cli.ts +321 -0
@@ -0,0 +1,377 @@
1
+ # 服务端模块开发
2
+
3
+ 本指南详细介绍如何开发 linyjs 插件的服务端模块。
4
+
5
+ ## 概述
6
+
7
+ 服务端模块负责:
8
+
9
+ - 🌐 定义 API 路由和控制器
10
+ - 🔧 处理业务逻辑
11
+ - 💾 数据持久化(与数据库交互)
12
+ - 🔒 权限验证和安全控制
13
+ - ⏰ 定时任务
14
+
15
+ ## 模块结构
16
+
17
+ 一个完整的服务端模块包含:
18
+
19
+ ```typescript
20
+ import type { IModule } from '@linyjs/server-module-interface';
21
+
22
+ export const myServerModule: IModule = {
23
+ name: 'myServer',
24
+ moduleDependencies: ['logger'], // 依赖的其他模块
25
+ serviceDefs: [
26
+ controllerDef, // 控制器(API路由)
27
+ middlewareDef, // 中间件
28
+ cronDef, // 定时任务
29
+ serviceDef // 普通服务
30
+ ]
31
+ };
32
+ ```
33
+
34
+ ## 控制器(Controller)
35
+
36
+ 控制器用于定义 HTTP API 端点。
37
+
38
+ ### 基本示例
39
+
40
+ ```typescript
41
+ import type { IControllerService } from '@linyjs/server-module-interface';
42
+
43
+ class MyController implements IControllerService {
44
+ getRoutes() {
45
+ return [
46
+ {
47
+ method: 'GET',
48
+ path: '/api/items',
49
+ middlewares: [],
50
+ responseType: 'json',
51
+ handler: async (params, ctx) => {
52
+ return { items: [] };
53
+ }
54
+ }
55
+ ];
56
+ }
57
+ }
58
+
59
+ export const controllerDef = {
60
+ serviceTag: 'myController',
61
+ serviceImpl: MyController,
62
+ meta: { usageType: 'controller' }
63
+ };
64
+ ```
65
+
66
+ ### HTTP 方法
67
+
68
+ 支持所有标准 HTTP 方法:
69
+
70
+ ```typescript
71
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
72
+ ```
73
+
74
+ ### 路由参数
75
+
76
+ ```typescript
77
+ // 路径参数: /api/items/:id
78
+ {
79
+ path: '/api/items/:id',
80
+ handler: async (params) => {
81
+ const id = params.id; // 从 URL 获取
82
+ }
83
+ }
84
+
85
+ // 查询参数: /api/items?page=1&limit=10
86
+ {
87
+ path: '/api/items',
88
+ handler: async (params) => {
89
+ const page = params.query?.page;
90
+ const limit = params.query?.limit;
91
+ }
92
+ }
93
+
94
+ // 请求体: POST /api/items with JSON body
95
+ {
96
+ method: 'POST',
97
+ path: '/api/items',
98
+ handler: async (params) => {
99
+ const { name, description } = params.body;
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### 响应类型
105
+
106
+ 框架支持三种响应类型:
107
+
108
+ #### 1. JSON 响应(默认)
109
+
110
+ ```typescript
111
+ {
112
+ responseType: 'json',
113
+ handler: async () => {
114
+ return { message: 'Hello' }; // 自动序列化为 JSON
115
+ }
116
+ }
117
+ ```
118
+
119
+ #### 2. 文件下载
120
+
121
+ ```typescript
122
+ {
123
+ responseType: 'file',
124
+ handler: async () => {
125
+ return {
126
+ filePath: '/path/to/file.pdf',
127
+ filename: 'document.pdf',
128
+ contentType: 'application/pdf'
129
+ };
130
+ }
131
+ }
132
+ ```
133
+
134
+ #### 3. 视频流
135
+
136
+ ```typescript
137
+ {
138
+ responseType: 'video_stream',
139
+ handler: async (params) => {
140
+ const stream = fs.createReadStream(`/videos/${params.id}.mp4`);
141
+ return stream; // 支持 range 请求
142
+ }
143
+ }
144
+ ```
145
+
146
+ ### 中间件
147
+
148
+ 中间件用于请求预处理(如认证、日志):
149
+
150
+ ```typescript
151
+ {
152
+ path: '/api/protected',
153
+ middlewares: ['auth'], // 使用名为 'auth' 的中间件
154
+ handler: async (params, ctx) => {
155
+ // ctx.user 由中间件设置
156
+ const user = ctx.user;
157
+ }
158
+ }
159
+ ```
160
+
161
+ ## 中间件(Middleware)
162
+
163
+ 中间件在请求到达控制器之前执行。
164
+
165
+ ### 创建中间件
166
+
167
+ ```typescript
168
+ import type { IMiddlewareService } from '@linyjs/server-module-interface';
169
+
170
+ class AuthMiddleware implements IMiddlewareService {
171
+ getMiddlewares() {
172
+ return [{
173
+ middlewareId: 'auth',
174
+ handler: async (params, ctx, next) => {
175
+ const token = params.headers.authorization?.replace('Bearer ', '');
176
+
177
+ if (!token) {
178
+ throw new Error('Unauthorized');
179
+ }
180
+
181
+ // 验证 token...
182
+ ctx.user = decodedUser;
183
+
184
+ await next(); // 继续处理请求
185
+ }
186
+ }];
187
+ }
188
+ }
189
+
190
+ export const middlewareDef = {
191
+ serviceTag: 'authMiddleware',
192
+ serviceImpl: AuthMiddleware,
193
+ meta: { usageType: 'middleware' }
194
+ };
195
+ ```
196
+
197
+ ## 定时任务(Cron)
198
+
199
+ 定时任务按预定时间间隔执行。
200
+
201
+ ### 创建定时任务
202
+
203
+ ```typescript
204
+ import type { ICronService } from '@linyjs/server-module-interface';
205
+
206
+ class CleanupCron implements ICronService {
207
+ getCronJobs() {
208
+ return [{
209
+ name: 'cleanup-old-data',
210
+ schedule: '0 0 * * *', // 每天午夜执行
211
+ run: async () => {
212
+ console.log('Cleaning up old data...');
213
+ // 清理逻辑...
214
+ }
215
+ }];
216
+ }
217
+ }
218
+
219
+ export const cronDef = {
220
+ serviceTag: 'cleanupCron',
221
+ serviceImpl: CleanupCron,
222
+ meta: { usageType: 'cron' }
223
+ };
224
+ ```
225
+
226
+ ### Cron 表达式格式
227
+
228
+ ```
229
+ ┌───────────── 分钟 (0 - 59)
230
+ │ ┌───────────── 小时 (0 - 23)
231
+ │ │ ┌───────────── 日期 (1 - 31)
232
+ │ │ │ ┌───────────── 月份 (1 - 12)
233
+ │ │ │ │ ┌───────────── 星期几 (0 - 7, 0 和 7 都是周日)
234
+ │ │ │ │ │
235
+ * * * * *
236
+ ```
237
+
238
+ 常用示例:
239
+
240
+ - `*/5 * * * *` - 每 5 分钟
241
+ - `0 */2 * * *` - 每 2 小时
242
+ - `0 0 * * 0` - 每周日午夜
243
+ - `0 0 1 * *` - 每月 1 号午夜
244
+
245
+ ## 依赖注入
246
+
247
+ 服务之间可以通过依赖注入互相引用。
248
+
249
+ ### 声明依赖
250
+
251
+ ```typescript
252
+ export const myServiceDef = {
253
+ serviceTag: 'myService',
254
+ serviceImpl: MyService,
255
+ dependencies: ['otherService'], // 依赖其他服务
256
+ meta: { usageType: 'normal_service' }
257
+ };
258
+ ```
259
+
260
+ ### 使用依赖
261
+
262
+ ```typescript
263
+ class MyService {
264
+ constructor(private otherService: any) {}
265
+
266
+ async doSomething() {
267
+ // 使用依赖的服务
268
+ const result = await this.otherService.someMethod();
269
+ return result;
270
+ }
271
+ }
272
+ ```
273
+
274
+ ## 错误处理
275
+
276
+ ### 返回错误响应
277
+
278
+ ```typescript
279
+ handler: async (params, ctx) => {
280
+ try {
281
+ // 业务逻辑
282
+ const data = await fetchData();
283
+ return { success: true, data };
284
+ } catch (error) {
285
+ return {
286
+ status: 500,
287
+ data: { error: error.message }
288
+ };
289
+ }
290
+ }
291
+ ```
292
+
293
+ ### 抛出异常
294
+
295
+ ```typescript
296
+ handler: async (params, ctx) => {
297
+ if (!params.body.name) {
298
+ throw new Error('Name is required'); // 自动返回 400
299
+ }
300
+ }
301
+ ```
302
+
303
+ ## 最佳实践
304
+
305
+ ### 0. 遵循 ServiceDef 代码风格规范
306
+
307
+ > 📐 **重要**: 请阅读 [ServiceDef 代码风格规范](../best-practices/service-definition.md),了解两条核心规则:
308
+ > 1. ServiceDef 必须声明为独立变量,禁止内联在 `serviceDefs` 数组中
309
+ > 2. ServiceDef 声明必须与实现类放在同一个文件中
310
+
311
+ ### 1. 分离关注点
312
+
313
+ ```
314
+ src/server/
315
+ ├── controllers/ # API 路由定义
316
+ ├── services/ # 业务逻辑
317
+ ├── models/ # 数据模型
318
+ └── middlewares/ # 中间件
319
+ ```
320
+
321
+ ### 2. 使用 TypeScript 类型
322
+
323
+ ```typescript
324
+ interface CreateItemRequest {
325
+ name: string;
326
+ description?: string;
327
+ }
328
+
329
+ handler: async (params: { body: CreateItemRequest }) => {
330
+ const { name, description } = params.body;
331
+ }
332
+ ```
333
+
334
+ ### 3. 输入验证
335
+
336
+ ```typescript
337
+ handler: async (params) => {
338
+ const { email } = params.body;
339
+
340
+ if (!isValidEmail(email)) {
341
+ return {
342
+ status: 400,
343
+ data: { error: 'Invalid email format' }
344
+ };
345
+ }
346
+ }
347
+ ```
348
+
349
+ ### 4. 日志记录
350
+
351
+ ```typescript
352
+ class MyController {
353
+ constructor(private logger: any) {}
354
+
355
+ handler: async (params) => {
356
+ this.logger.info('Processing request...');
357
+ // ...
358
+ }
359
+ }
360
+ ```
361
+
362
+ ## 完整示例
363
+
364
+ 查看完整示例:
365
+
366
+ - 📁 [Hello World 示例](../../examples/hello-world/src/server/index.ts)
367
+ - 📁 [Blog Plugin 示例](../../examples/blog-plugin/src/server/index.ts)
368
+
369
+ ## 下一步
370
+
371
+ - 💻 阅读 [客户端模块开发](./client-module.md)
372
+ - 💾 阅读 [数据持久化](./data-persistence.md)
373
+ - 🔒 阅读 [权限管理](./permissions.md)
374
+
375
+ ---
376
+
377
+ **上一篇**: [第一个插件教程](../getting-started/first-plugin.md) | **下一篇**: [客户端模块开发](./client-module.md)