ldap-rest 0.0.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 (296) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +48 -0
  3. package/bin/cleanup-external-users.mjs +219 -0
  4. package/bin/index.mjs +54 -0
  5. package/bin/sync-james.mjs +190 -0
  6. package/dist/abstract/ldapFlat.js +1 -0
  7. package/dist/abstract/plugin.js +1 -0
  8. package/dist/abstract/twakePlugin.js +1 -0
  9. package/dist/bin/index.js +1 -0
  10. package/dist/config/args.js +1 -0
  11. package/dist/lib/auth/base.js +1 -0
  12. package/dist/lib/authz/base.js +1 -0
  13. package/dist/lib/expressFormatedResponses.js +1 -0
  14. package/dist/lib/ldapActions.js +1 -0
  15. package/dist/lib/parseConfig.js +1 -0
  16. package/dist/lib/utils.js +1 -0
  17. package/dist/logger/winston.js +1 -0
  18. package/dist/plugins/auth/authzLinid1.js +1 -0
  19. package/dist/plugins/auth/authzPerBranch.js +1 -0
  20. package/dist/plugins/auth/crowdsec.js +1 -0
  21. package/dist/plugins/auth/llng.js +1 -0
  22. package/dist/plugins/auth/openidconnect.js +1 -0
  23. package/dist/plugins/auth/rateLimit.js +1 -0
  24. package/dist/plugins/auth/token.js +1 -0
  25. package/dist/plugins/configApi.js +1 -0
  26. package/dist/plugins/demo/helloworld.js +1 -0
  27. package/dist/plugins/ldap/bulkImport.js +1 -0
  28. package/dist/plugins/ldap/departmentSync.js +1 -0
  29. package/dist/plugins/ldap/externalUsersInGroups.js +1 -0
  30. package/dist/plugins/ldap/flatGeneric.js +1 -0
  31. package/dist/plugins/ldap/groups.js +1 -0
  32. package/dist/plugins/ldap/onChange.js +1 -0
  33. package/dist/plugins/ldap/organization.js +1 -0
  34. package/dist/plugins/ldap/trash.js +1 -0
  35. package/dist/plugins/priority.json.js +1 -0
  36. package/dist/plugins/static.js +1 -0
  37. package/dist/plugins/twake/calendarResources.js +1 -0
  38. package/dist/plugins/twake/james.js +1 -0
  39. package/dist/plugins/weblogs.js +1 -0
  40. package/dist/src/abstract/ldapFlat.d.ts +94 -0
  41. package/dist/src/abstract/plugin.d.ts +43 -0
  42. package/dist/src/abstract/twakePlugin.d.ts +90 -0
  43. package/dist/src/bin/index.d.ts +43 -0
  44. package/dist/src/browser/ldap-group-editor/LdapGroupEditor.d.ts +31 -0
  45. package/dist/src/browser/ldap-group-editor/api/GroupApiClient.d.ts +23 -0
  46. package/dist/src/browser/ldap-group-editor/components/CreateGroupModal.d.ts +19 -0
  47. package/dist/src/browser/ldap-group-editor/components/GroupPropertyEditor.d.ts +30 -0
  48. package/dist/src/browser/ldap-group-editor/components/GroupTree.d.ts +17 -0
  49. package/dist/src/browser/ldap-group-editor/components/MoveGroupModal.d.ts +20 -0
  50. package/dist/src/browser/ldap-group-editor/index.d.ts +6 -0
  51. package/dist/src/browser/ldap-group-editor/types.d.ts +58 -0
  52. package/dist/src/browser/ldap-resource-editor/api/ResourceApiClient.d.ts +53 -0
  53. package/dist/src/browser/ldap-resource-editor/cache/CacheManager.d.ts +65 -0
  54. package/dist/src/browser/ldap-resource-editor/index.d.ts +6 -0
  55. package/dist/src/browser/ldap-resource-editor/types.d.ts +78 -0
  56. package/dist/src/browser/ldap-tree-viewer/LdapTreeViewer.d.ts +26 -0
  57. package/dist/src/browser/ldap-tree-viewer/api/LdapApiClient.d.ts +30 -0
  58. package/dist/src/browser/ldap-tree-viewer/components/TreeNode.d.ts +17 -0
  59. package/dist/src/browser/ldap-tree-viewer/components/TreeRoot.d.ts +14 -0
  60. package/dist/src/browser/ldap-tree-viewer/index.d.ts +7 -0
  61. package/dist/src/browser/ldap-tree-viewer/store/Store.d.ts +18 -0
  62. package/dist/src/browser/ldap-tree-viewer/store/actions.d.ts +28 -0
  63. package/dist/src/browser/ldap-tree-viewer/store/reducers.d.ts +7 -0
  64. package/dist/src/browser/ldap-tree-viewer/types.d.ts +34 -0
  65. package/dist/src/browser/ldap-unit-editor/LdapUnitEditor.d.ts +27 -0
  66. package/dist/src/browser/ldap-unit-editor/api/UnitApiClient.d.ts +24 -0
  67. package/dist/src/browser/ldap-unit-editor/components/MoveUnitModal.d.ts +28 -0
  68. package/dist/src/browser/ldap-unit-editor/components/UnitPropertyEditor.d.ts +28 -0
  69. package/dist/src/browser/ldap-unit-editor/components/UnitTree.d.ts +18 -0
  70. package/dist/src/browser/ldap-unit-editor/index.d.ts +6 -0
  71. package/dist/src/browser/ldap-unit-editor/types.d.ts +55 -0
  72. package/dist/src/browser/ldap-user-editor/LdapUserEditor.d.ts +32 -0
  73. package/dist/src/browser/ldap-user-editor/api/UserApiClient.d.ts +55 -0
  74. package/dist/src/browser/ldap-user-editor/cache/CacheManager.d.ts +65 -0
  75. package/dist/src/browser/ldap-user-editor/components/MoveUserModal.d.ts +28 -0
  76. package/dist/src/browser/ldap-user-editor/components/PointerField.d.ts +22 -0
  77. package/dist/src/browser/ldap-user-editor/components/UserEditor.d.ts +46 -0
  78. package/dist/src/browser/ldap-user-editor/components/UserList.d.ts +24 -0
  79. package/dist/src/browser/ldap-user-editor/components/UserTree.d.ts +24 -0
  80. package/dist/src/browser/ldap-user-editor/index.d.ts +7 -0
  81. package/dist/src/browser/ldap-user-editor/types.d.ts +67 -0
  82. package/dist/src/browser/shared/components/Modal.d.ts +38 -0
  83. package/dist/src/browser/shared/components/StatusMessage.d.ts +48 -0
  84. package/dist/src/browser/shared/index.d.ts +10 -0
  85. package/dist/src/browser/shared/types/index.d.ts +65 -0
  86. package/dist/src/browser/shared/utils/dom.d.ts +33 -0
  87. package/dist/src/browser/shared/utils/form.d.ts +28 -0
  88. package/dist/src/browser/shared/utils/schema.d.ts +29 -0
  89. package/dist/src/config/args.d.ts +128 -0
  90. package/dist/src/config/schema.d.ts +18 -0
  91. package/dist/src/hooks.d.ts +76 -0
  92. package/dist/src/lib/auth/base.d.ts +9 -0
  93. package/dist/src/lib/authz/base.d.ts +63 -0
  94. package/dist/src/lib/expressFormatedResponses.d.ts +26 -0
  95. package/dist/src/lib/ldapActions.d.ts +91 -0
  96. package/dist/src/lib/parseConfig.d.ts +23 -0
  97. package/dist/src/lib/utils.d.ts +73 -0
  98. package/dist/src/logger/winston.d.ts +3 -0
  99. package/dist/src/plugins/auth/authzLinid1.d.ts +46 -0
  100. package/dist/src/plugins/auth/authzPerBranch.d.ts +59 -0
  101. package/dist/src/plugins/auth/crowdsec.d.ts +29 -0
  102. package/dist/src/plugins/auth/llng.d.ts +8 -0
  103. package/dist/src/plugins/auth/openidconnect.d.ts +11 -0
  104. package/dist/src/plugins/auth/rateLimit.d.ts +24 -0
  105. package/dist/src/plugins/auth/token.d.ts +17 -0
  106. package/dist/src/plugins/configApi.d.ts +24 -0
  107. package/dist/src/plugins/demo/helloworld.d.ts +12 -0
  108. package/dist/src/plugins/ldap/bulkImport.d.ts +48 -0
  109. package/dist/src/plugins/ldap/departmentSync.d.ts +35 -0
  110. package/dist/src/plugins/ldap/externalUsersInGroups.d.ts +21 -0
  111. package/dist/src/plugins/ldap/flatGeneric.d.ts +31 -0
  112. package/dist/src/plugins/ldap/groups.d.ts +95 -0
  113. package/dist/src/plugins/ldap/onChange.d.ts +32 -0
  114. package/dist/src/plugins/ldap/organization.d.ts +65 -0
  115. package/dist/src/plugins/ldap/trash.d.ts +52 -0
  116. package/dist/src/plugins/static.d.ts +7 -0
  117. package/dist/src/plugins/twake/calendarResources.d.ts +31 -0
  118. package/dist/src/plugins/twake/james.d.ts +83 -0
  119. package/dist/src/plugins/weblogs.d.ts +8 -0
  120. package/docs/DEVELOPER_GUIDE.md +298 -0
  121. package/docs/OPENAPI.md +440 -0
  122. package/docs/PLUGIN_DEPENDENCIES.md +612 -0
  123. package/docs/README.md +466 -0
  124. package/docs/api/REFERENCE.md +983 -0
  125. package/docs/api/REST_API.md +1237 -0
  126. package/docs/authentication.md +469 -0
  127. package/docs/authzLinid1.md +521 -0
  128. package/docs/authzPerBranch.md +596 -0
  129. package/docs/browser/LIBRARIES.md +1196 -0
  130. package/docs/examples/EXAMPLES.md +1659 -0
  131. package/docs/examples/twake-mailbox-type-nomenclature.ldif +37 -0
  132. package/docs/examples/twake-mailbox-type-schema-amendment.ldif +30 -0
  133. package/docs/jamesTeamMailboxes.md +343 -0
  134. package/docs/ldapBulkImport.md +722 -0
  135. package/docs/ldapExternalUsersInGroups.md +325 -0
  136. package/docs/ldapFlatGeneric.md +444 -0
  137. package/docs/ldapGroups.md +589 -0
  138. package/docs/ldapOrganizations.md +659 -0
  139. package/docs/ldapTrash.md +260 -0
  140. package/docs/linagora.png +0 -0
  141. package/docs/onChange.md +318 -0
  142. package/docs/plugins/DEVELOPMENT.md +1219 -0
  143. package/docs/presenterm-fr.md +721 -0
  144. package/docs/presenterm.md +721 -0
  145. package/docs/schemas/SCHEMAS.md +1212 -0
  146. package/docs/static.md +410 -0
  147. package/docs/twakeCalendarResources.md +148 -0
  148. package/docs/twakeJames.md +661 -0
  149. package/docs/weblogs.md +399 -0
  150. package/examples/web/ldap-group-editor.html +113 -0
  151. package/examples/web/ldap-tree-viewer.html +368 -0
  152. package/examples/web/ldap-unit-editor.html +108 -0
  153. package/examples/web/ldap-user-editor.html +412 -0
  154. package/package.json +458 -0
  155. package/static/browser/common-demo.css +450 -0
  156. package/static/browser/ldap-group-editor/LdapGroupEditor.js +207 -0
  157. package/static/browser/ldap-group-editor/LdapGroupEditor.js.map +1 -0
  158. package/static/browser/ldap-group-editor/api/GroupApiClient.js +112 -0
  159. package/static/browser/ldap-group-editor/api/GroupApiClient.js.map +1 -0
  160. package/static/browser/ldap-group-editor/components/CreateGroupModal.js +212 -0
  161. package/static/browser/ldap-group-editor/components/CreateGroupModal.js.map +1 -0
  162. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js +497 -0
  163. package/static/browser/ldap-group-editor/components/GroupPropertyEditor.js.map +1 -0
  164. package/static/browser/ldap-group-editor/components/GroupTree.js +153 -0
  165. package/static/browser/ldap-group-editor/components/GroupTree.js.map +1 -0
  166. package/static/browser/ldap-group-editor/components/MoveGroupModal.js +235 -0
  167. package/static/browser/ldap-group-editor/components/MoveGroupModal.js.map +1 -0
  168. package/static/browser/ldap-group-editor/index.js +2 -0
  169. package/static/browser/ldap-group-editor/index.js.map +1 -0
  170. package/static/browser/ldap-group-editor/types.js +2 -0
  171. package/static/browser/ldap-group-editor/types.js.map +1 -0
  172. package/static/browser/ldap-group-editor.esm.js +1399 -0
  173. package/static/browser/ldap-group-editor.esm.js.map +1 -0
  174. package/static/browser/ldap-group-editor.js +1407 -0
  175. package/static/browser/ldap-group-editor.js.map +1 -0
  176. package/static/browser/ldap-group-editor.min.js +2 -0
  177. package/static/browser/ldap-group-editor.min.js.map +1 -0
  178. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js +226 -0
  179. package/static/browser/ldap-resource-editor/api/ResourceApiClient.js.map +1 -0
  180. package/static/browser/ldap-resource-editor/cache/CacheManager.js +123 -0
  181. package/static/browser/ldap-resource-editor/cache/CacheManager.js.map +1 -0
  182. package/static/browser/ldap-resource-editor/index.js +2 -0
  183. package/static/browser/ldap-resource-editor/index.js.map +1 -0
  184. package/static/browser/ldap-resource-editor/types.js +2 -0
  185. package/static/browser/ldap-resource-editor/types.js.map +1 -0
  186. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js +187 -0
  187. package/static/browser/ldap-tree-viewer/LdapTreeViewer.js.map +1 -0
  188. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js +50 -0
  189. package/static/browser/ldap-tree-viewer/api/LdapApiClient.js.map +1 -0
  190. package/static/browser/ldap-tree-viewer/components/TreeNode.js +140 -0
  191. package/static/browser/ldap-tree-viewer/components/TreeNode.js.map +1 -0
  192. package/static/browser/ldap-tree-viewer/components/TreeRoot.js +98 -0
  193. package/static/browser/ldap-tree-viewer/components/TreeRoot.js.map +1 -0
  194. package/static/browser/ldap-tree-viewer/index.js +2 -0
  195. package/static/browser/ldap-tree-viewer/index.js.map +1 -0
  196. package/static/browser/ldap-tree-viewer/store/Store.js +29 -0
  197. package/static/browser/ldap-tree-viewer/store/Store.js.map +1 -0
  198. package/static/browser/ldap-tree-viewer/store/actions.js +53 -0
  199. package/static/browser/ldap-tree-viewer/store/actions.js.map +1 -0
  200. package/static/browser/ldap-tree-viewer/store/reducers.js +79 -0
  201. package/static/browser/ldap-tree-viewer/store/reducers.js.map +1 -0
  202. package/static/browser/ldap-tree-viewer/types.js +2 -0
  203. package/static/browser/ldap-tree-viewer/types.js.map +1 -0
  204. package/static/browser/ldap-tree-viewer.css +2 -0
  205. package/static/browser/ldap-tree-viewer.css.map +1 -0
  206. package/static/browser/ldap-tree-viewer.esm.js +606 -0
  207. package/static/browser/ldap-tree-viewer.esm.js.map +1 -0
  208. package/static/browser/ldap-tree-viewer.js +614 -0
  209. package/static/browser/ldap-tree-viewer.js.map +1 -0
  210. package/static/browser/ldap-tree-viewer.min.js +2 -0
  211. package/static/browser/ldap-tree-viewer.min.js.map +1 -0
  212. package/static/browser/ldap-unit-editor/LdapUnitEditor.js +119 -0
  213. package/static/browser/ldap-unit-editor/LdapUnitEditor.js.map +1 -0
  214. package/static/browser/ldap-unit-editor/api/UnitApiClient.js +95 -0
  215. package/static/browser/ldap-unit-editor/api/UnitApiClient.js.map +1 -0
  216. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js +295 -0
  217. package/static/browser/ldap-unit-editor/components/MoveUnitModal.js.map +1 -0
  218. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js +321 -0
  219. package/static/browser/ldap-unit-editor/components/UnitPropertyEditor.js.map +1 -0
  220. package/static/browser/ldap-unit-editor/components/UnitTree.js +197 -0
  221. package/static/browser/ldap-unit-editor/components/UnitTree.js.map +1 -0
  222. package/static/browser/ldap-unit-editor/index.js +2 -0
  223. package/static/browser/ldap-unit-editor/index.js.map +1 -0
  224. package/static/browser/ldap-unit-editor/types.js +2 -0
  225. package/static/browser/ldap-unit-editor/types.js.map +1 -0
  226. package/static/browser/ldap-unit-editor.esm.js +1013 -0
  227. package/static/browser/ldap-unit-editor.esm.js.map +1 -0
  228. package/static/browser/ldap-unit-editor.js +1021 -0
  229. package/static/browser/ldap-unit-editor.js.map +1 -0
  230. package/static/browser/ldap-unit-editor.min.js +2 -0
  231. package/static/browser/ldap-unit-editor.min.js.map +1 -0
  232. package/static/browser/ldap-user-editor/LdapUserEditor.js +184 -0
  233. package/static/browser/ldap-user-editor/LdapUserEditor.js.map +1 -0
  234. package/static/browser/ldap-user-editor/api/UserApiClient.js +209 -0
  235. package/static/browser/ldap-user-editor/api/UserApiClient.js.map +1 -0
  236. package/static/browser/ldap-user-editor/cache/CacheManager.js +123 -0
  237. package/static/browser/ldap-user-editor/cache/CacheManager.js.map +1 -0
  238. package/static/browser/ldap-user-editor/components/MoveUserModal.js +302 -0
  239. package/static/browser/ldap-user-editor/components/MoveUserModal.js.map +1 -0
  240. package/static/browser/ldap-user-editor/components/PointerField.js +152 -0
  241. package/static/browser/ldap-user-editor/components/PointerField.js.map +1 -0
  242. package/static/browser/ldap-user-editor/components/UserEditor.js +608 -0
  243. package/static/browser/ldap-user-editor/components/UserEditor.js.map +1 -0
  244. package/static/browser/ldap-user-editor/components/UserList.js +181 -0
  245. package/static/browser/ldap-user-editor/components/UserList.js.map +1 -0
  246. package/static/browser/ldap-user-editor/components/UserTree.js +164 -0
  247. package/static/browser/ldap-user-editor/components/UserTree.js.map +1 -0
  248. package/static/browser/ldap-user-editor/index.js +2 -0
  249. package/static/browser/ldap-user-editor/index.js.map +1 -0
  250. package/static/browser/ldap-user-editor/types.js +2 -0
  251. package/static/browser/ldap-user-editor/types.js.map +1 -0
  252. package/static/browser/ldap-user-editor.css +2 -0
  253. package/static/browser/ldap-user-editor.css.map +1 -0
  254. package/static/browser/ldap-user-editor.esm.js +1897 -0
  255. package/static/browser/ldap-user-editor.esm.js.map +1 -0
  256. package/static/browser/ldap-user-editor.js +1905 -0
  257. package/static/browser/ldap-user-editor.js.map +1 -0
  258. package/static/browser/ldap-user-editor.min.js +2 -0
  259. package/static/browser/ldap-user-editor.min.js.map +1 -0
  260. package/static/browser/shared/components/Modal.js +121 -0
  261. package/static/browser/shared/components/Modal.js.map +1 -0
  262. package/static/browser/shared/components/StatusMessage.js +119 -0
  263. package/static/browser/shared/components/StatusMessage.js.map +1 -0
  264. package/static/browser/shared/index.js +7 -0
  265. package/static/browser/shared/index.js.map +1 -0
  266. package/static/browser/shared/types/index.js +37 -0
  267. package/static/browser/shared/types/index.js.map +1 -0
  268. package/static/browser/shared/utils/dom.js +78 -0
  269. package/static/browser/shared/utils/dom.js.map +1 -0
  270. package/static/browser/shared/utils/form.js +234 -0
  271. package/static/browser/shared/utils/form.js.map +1 -0
  272. package/static/browser/shared/utils/schema.js +121 -0
  273. package/static/browser/shared/utils/schema.js.map +1 -0
  274. package/static/browser/shared.esm.js +694 -0
  275. package/static/browser/shared.esm.js.map +1 -0
  276. package/static/browser/shared.js +723 -0
  277. package/static/browser/shared.js.map +1 -0
  278. package/static/browser/shared.min.js +2 -0
  279. package/static/browser/shared.min.js.map +1 -0
  280. package/static/schemas/ad/computers.json +92 -0
  281. package/static/schemas/ad/groups.json +55 -0
  282. package/static/schemas/ad/organizations.json +66 -0
  283. package/static/schemas/ad/users.json +116 -0
  284. package/static/schemas/standard/devices.json +72 -0
  285. package/static/schemas/standard/groups.json +54 -0
  286. package/static/schemas/standard/organizations.json +49 -0
  287. package/static/schemas/standard/users.json +86 -0
  288. package/static/schemas/twake/groups.json +75 -0
  289. package/static/schemas/twake/nomenclature/twakeAccountStatus.json +31 -0
  290. package/static/schemas/twake/nomenclature/twakeDeliveryMode.json +31 -0
  291. package/static/schemas/twake/nomenclature/twakeListType.json +31 -0
  292. package/static/schemas/twake/nomenclature/twakeMailboxType.json +31 -0
  293. package/static/schemas/twake/nomenclature/twakeTitle.json +31 -0
  294. package/static/schemas/twake/organizations.json +52 -0
  295. package/static/schemas/twake/positions.json +32 -0
  296. package/static/schemas/twake/users.json +112 -0
@@ -0,0 +1,440 @@
1
+ # OpenAPI Documentation Generation
2
+
3
+ LDAP-Rest includes an automatic OpenAPI 3.0 specification generator that analyzes TypeScript source code to generate API documentation without modifying production code.
4
+
5
+ ## Features
6
+
7
+ - **Zero runtime overhead**: Generator runs as a build tool, not in production
8
+ - **TypeScript AST analysis**: Parses TypeScript directly to extract routes
9
+ - **No code annotations required**: Works with existing code structure
10
+ - **Automatic route discovery**: Finds all `app.get()`, `app.post()`, etc. calls
11
+ - **Template variable resolution**: Converts `${this.config.api_prefix}` to `/api`
12
+ - **Express to OpenAPI conversion**: Translates `:param` to `{param}` format
13
+ - **Plugin categorization**: Groups routes by plugin with proper tags
14
+
15
+ ## Quick Start
16
+
17
+ ### Generate OpenAPI Specification
18
+
19
+ ```bash
20
+ npm run generate:openapi
21
+ ```
22
+
23
+ This creates `openapi.json` in the project root containing the complete API specification for all loaded plugins.
24
+
25
+ ### View the Specification
26
+
27
+ You can use the generated `openapi.json` with various tools:
28
+
29
+ **Swagger UI** (online viewer):
30
+
31
+ ```bash
32
+ # Serve the spec with a simple HTTP server
33
+ npx http-server -p 8080
34
+
35
+ # Visit: https://editor.swagger.io/
36
+ # File → Import URL → http://localhost:8080/openapi.json
37
+ ```
38
+
39
+ **Redoc** (documentation generator):
40
+
41
+ ```bash
42
+ npx @redocly/cli preview-docs openapi.json
43
+ ```
44
+
45
+ **Postman**: Import `openapi.json` directly
46
+
47
+ **VS Code**: Use "OpenAPI (Swagger) Editor" extension
48
+
49
+ ## How It Works
50
+
51
+ ### 1. TypeScript AST Parsing
52
+
53
+ The generator uses the TypeScript Compiler API to parse all plugin files:
54
+
55
+ ```typescript
56
+ // Creates a TypeScript program
57
+ const program = ts.createProgram(fileNames, options);
58
+ const checker = program.getTypeChecker();
59
+ ```
60
+
61
+ ### 2. Plugin Discovery
62
+
63
+ Searches for classes extending `DmPlugin`:
64
+
65
+ ```typescript
66
+ class LdapGroups extends DmPlugin {
67
+ name = 'ldapGroups'; // Extracted as plugin name
68
+
69
+ api(app: Express): void {
70
+ // Routes extracted from here
71
+ }
72
+ }
73
+ ```
74
+
75
+ ### 3. Route Extraction
76
+
77
+ Finds all Express route definitions:
78
+
79
+ ```typescript
80
+ // Input (in plugin code):
81
+ app.get(`${this.config.api_prefix}/v1/ldap/groups/:cn`, (req, res) => {...});
82
+
83
+ // Output (in openapi.json):
84
+ {
85
+ "/api/v1/ldap/groups/{cn}": {
86
+ "get": {
87
+ "summary": "Get groups",
88
+ "tags": ["Groups"],
89
+ "parameters": [
90
+ {
91
+ "name": "cn",
92
+ "in": "path",
93
+ "required": true,
94
+ "schema": { "type": "string" }
95
+ }
96
+ ]
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### 4. Template Variable Resolution
103
+
104
+ Replaces template variables with actual values:
105
+
106
+ | Template Variable | Replacement |
107
+ | ---------------------------- | ------------ |
108
+ | `${this.config.api_prefix}` | `/api` |
109
+ | `${apiPrefix}` | `/api` |
110
+ | `${this.config.static_name}` | `static` |
111
+ | `${resourceName}` | `{resource}` |
112
+
113
+ ### 5. Special Handling
114
+
115
+ **Multipart Form Data** (Bulk Import):
116
+
117
+ ```typescript
118
+ // Detected from path pattern
119
+ if (pathTemplate.includes('bulk-import')) {
120
+ requestBody.content = {
121
+ 'multipart/form-data': {
122
+ schema: {
123
+ properties: {
124
+ file: { type: 'string', format: 'binary' },
125
+ dryRun: { type: 'boolean' },
126
+ // ...
127
+ },
128
+ },
129
+ },
130
+ };
131
+ }
132
+ ```
133
+
134
+ **CSV Templates**:
135
+
136
+ ```typescript
137
+ // Detected from path pattern
138
+ if (method === 'get' && pathTemplate.includes('template.csv')) {
139
+ responses = {
140
+ '200': {
141
+ description: 'CSV template',
142
+ content: {
143
+ 'text/csv': { schema: { type: 'string' } },
144
+ },
145
+ },
146
+ };
147
+ }
148
+ ```
149
+
150
+ ## Generated Structure
151
+
152
+ The `openapi.json` file contains:
153
+
154
+ ```json
155
+ {
156
+ "openapi": "3.0.0",
157
+ "info": {
158
+ "title": "LDAP-Rest API",
159
+ "version": "1.0.0",
160
+ "description": "RESTful API for LDAP management with LDAP-Rest"
161
+ },
162
+ "servers": [
163
+ {
164
+ "url": "http://localhost:8081",
165
+ "description": "Development server"
166
+ }
167
+ ],
168
+ "paths": {
169
+ "/api/v1/ldap/groups": { ... },
170
+ "/api/v1/ldap/organizations": { ... }
171
+ },
172
+ "tags": [
173
+ { "name": "Groups", "description": "Groups operations" },
174
+ { "name": "Organizations", "description": "Organizations operations" }
175
+ ]
176
+ }
177
+ ```
178
+
179
+ ## Supported Plugins
180
+
181
+ The generator automatically discovers routes from all plugins:
182
+
183
+ | Plugin | Tag | Routes |
184
+ | ------------------- | ------------- | ----------- |
185
+ | `ldapGroups` | Groups | 8 endpoints |
186
+ | `ldapOrganizations` | Organizations | 7 endpoints |
187
+ | `ldapBulkImport` | Bulk Import | 2 endpoints |
188
+ | `configApi` | Configuration | 1 endpoint |
189
+ | `static` | Static Files | 2 endpoints |
190
+
191
+ _Note: Number of routes may vary based on configuration and loaded plugins_
192
+
193
+ ## Customizing Summaries
194
+
195
+ While the generator provides default summaries, you can add JSDoc comments to improve them:
196
+
197
+ ```typescript
198
+ /**
199
+ * @openapi summary: List all groups with optional filtering
200
+ * @openapi description: Returns all LDAP groups, optionally filtered by match query
201
+ */
202
+ app.get(`${this.config.api_prefix}/v1/ldap/groups`, async (req, res) => {
203
+ // ...
204
+ });
205
+ ```
206
+
207
+ The generator will extract these annotations:
208
+
209
+ - `@openapi summary:` → `summary` field
210
+ - `@openapi description:` → `description` field
211
+
212
+ ## Plugin Tag Mapping
213
+
214
+ The generator maps plugin names to human-readable tags:
215
+
216
+ ```typescript
217
+ private pluginTags: Map<string, string> = new Map([
218
+ ['ldapGroups', 'Groups'],
219
+ ['ldapOrganizations', 'Organizations'],
220
+ ['ldapFlatGeneric', 'Entities'],
221
+ ['ldapBulkImport', 'Bulk Import'],
222
+ ['james', 'Apache James Integration'],
223
+ ['calendarResources', 'Calendar Resources'],
224
+ ['configApi', 'Configuration'],
225
+ ['static', 'Static Files'],
226
+ ]);
227
+ ```
228
+
229
+ To add mappings for custom plugins, edit `scripts/generate-openapi.ts`.
230
+
231
+ ## Integration with CI/CD
232
+
233
+ ### Verify Spec is Up-to-Date
234
+
235
+ Add to your CI pipeline:
236
+
237
+ ```bash
238
+ # Generate fresh spec
239
+ npm run generate:openapi
240
+
241
+ # Check if it differs from committed version
242
+ git diff --exit-code openapi.json
243
+ ```
244
+
245
+ ### Generate on Pre-Commit
246
+
247
+ Add to `.git/hooks/pre-commit`:
248
+
249
+ ```bash
250
+ #!/bin/sh
251
+ npm run generate:openapi
252
+ git add openapi.json
253
+ ```
254
+
255
+ ### Publish to API Documentation Platform
256
+
257
+ ```bash
258
+ # After generation, upload to your docs platform
259
+ npm run generate:openapi
260
+ npx @redocly/cli push openapi.json
261
+ ```
262
+
263
+ ## Limitations
264
+
265
+ ### Current Limitations
266
+
267
+ 1. **No type inference**: Schemas are generic `{ type: 'object' }`
268
+ 2. **No JSDoc parsing**: Only basic `@openapi` annotations supported
269
+ 3. **Static analysis only**: Cannot analyze dynamic routes
270
+ 4. **No response schemas**: All responses use generic object type
271
+
272
+ ### Why These Limitations?
273
+
274
+ The generator uses **static analysis** to avoid runtime dependencies. This means:
275
+
276
+ - ✅ Zero impact on production code
277
+ - ✅ No decorators or annotations required
278
+ - ✅ Fast generation
279
+ - ❌ Limited type information
280
+
281
+ ### Future Enhancements
282
+
283
+ Planned improvements:
284
+
285
+ - [ ] Extract TypeScript interfaces for request/response bodies
286
+ - [ ] Parse JSDoc `@param` and `@returns` annotations
287
+ - [ ] Generate schema definitions from TypeScript types
288
+ - [ ] Support for custom response status codes
289
+ - [ ] Query parameter detection from `req.query`
290
+
291
+ ## Troubleshooting
292
+
293
+ ### "tsconfig.json not found"
294
+
295
+ The generator needs a valid TypeScript configuration:
296
+
297
+ ```bash
298
+ # Ensure tsconfig.json exists
299
+ ls tsconfig.json
300
+ ```
301
+
302
+ ### "Found 0 plugins"
303
+
304
+ Check that:
305
+
306
+ 1. Plugins extend `DmPlugin`
307
+ 2. Plugins have an `api(app: Express)` method
308
+ 3. TypeScript compilation succeeds: `npm run check:ts`
309
+
310
+ ### Wrong paths generated
311
+
312
+ Template variables not replaced correctly? Check:
313
+
314
+ ```typescript
315
+ // Supported:
316
+ `${this.config.api_prefix}/v1/...``${apiPrefix}/v1/...``${this.config.static_name}/...`
317
+ // Not supported:
318
+ `${someOtherVariable}/...`;
319
+ ```
320
+
321
+ Add custom replacements in `scripts/generate-openapi.ts`:
322
+
323
+ ```typescript
324
+ pathTemplate = text.replace(/\$\{myVariable\}/g, 'replacement');
325
+ // ...
326
+ ```
327
+
328
+ ### Routes missing
329
+
330
+ The generator only finds routes in `api()` methods of plugin classes. Routes defined elsewhere won't be detected.
331
+
332
+ ## Examples
333
+
334
+ ### Example 1: View API in Swagger Editor
335
+
336
+ ```bash
337
+ # 1. Generate spec
338
+ npm run generate:openapi
339
+
340
+ # 2. Start local server
341
+ npx http-server -p 8080
342
+
343
+ # 3. Visit https://editor.swagger.io/
344
+ # 4. File → Import URL → http://localhost:8080/openapi.json
345
+ ```
346
+
347
+ ### Example 2: Generate TypeScript Client
348
+
349
+ ```bash
350
+ # Generate spec
351
+ npm run generate:openapi
352
+
353
+ # Generate TypeScript axios client
354
+ npx @openapitools/openapi-generator-cli generate \
355
+ -i openapi.json \
356
+ -g typescript-axios \
357
+ -o ./generated-client
358
+ ```
359
+
360
+ ### Example 3: Validate API Responses
361
+
362
+ ```bash
363
+ # Generate spec
364
+ npm run generate:openapi
365
+
366
+ # Install validator
367
+ npm install --save-dev @seriousme/openapi-schema-validator
368
+
369
+ # Use in tests
370
+ import { Validator } from '@seriousme/openapi-schema-validator';
371
+
372
+ const validator = new Validator();
373
+ await validator.validate('./openapi.json');
374
+ ```
375
+
376
+ ## Comparison with Alternatives
377
+
378
+ ### tsoa (TypeScript OpenAPI)
379
+
380
+ **Pros**:
381
+
382
+ - Full type inference
383
+ - Automatic validation
384
+ - Schema generation
385
+
386
+ **Cons**:
387
+
388
+ - ❌ Requires decorators in production code
389
+ - ❌ Changes code structure
390
+ - ❌ Runtime overhead
391
+
392
+ ### swagger-jsdoc
393
+
394
+ **Pros**:
395
+
396
+ - JSDoc annotations
397
+ - Familiar syntax
398
+
399
+ **Cons**:
400
+
401
+ - ❌ Requires extensive annotations
402
+ - ❌ Pollutes code with comments
403
+ - ❌ Manual maintenance
404
+
405
+ ### LDAP-Rest Generator
406
+
407
+ **Pros**:
408
+
409
+ - ✅ No production code changes
410
+ - ✅ Zero runtime overhead
411
+ - ✅ Automatic route discovery
412
+ - ✅ Works with existing code
413
+
414
+ **Cons**:
415
+
416
+ - ⚠️ Limited type information
417
+ - ⚠️ Generic schemas
418
+
419
+ ## Contributing
420
+
421
+ To improve the generator:
422
+
423
+ 1. Edit `scripts/generate-openapi.ts`
424
+ 2. Test with `npm run generate:openapi`
425
+ 3. Verify output in `openapi.json`
426
+ 4. Submit PR with changes
427
+
428
+ Common improvements:
429
+
430
+ - Add plugin tag mappings
431
+ - Improve summary generation
432
+ - Add more template variable replacements
433
+ - Extract TypeScript types for schemas
434
+
435
+ ## See Also
436
+
437
+ - [Plugin Development Guide](DEVELOPER_GUIDE.md)
438
+ - [Plugin Dependencies](PLUGIN_DEPENDENCIES.md)
439
+ - [OpenAPI 3.0 Specification](https://swagger.io/specification/)
440
+ - [TypeScript Compiler API](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API)