|
1 | | -import { doveadm_arg_types, doveadm_flag_types, getDoveadmCmdLine } from '../doveadm.js' |
2 | | -import { getVitepressMd } from '../markdown.js' |
3 | | -import { addWatchPaths, loadData, normalizeArrayData } from '../utility.js' |
4 | | -import camelCase from 'camelcase' |
5 | | -import slugify from '@sindresorhus/slugify' |
6 | | - |
7 | | -const doveadm_userargs = { |
8 | | - 'all-users': { |
9 | | - cli: 'A', |
10 | | - example: false, |
11 | | - type: doveadm_arg_types.BOOL, |
12 | | - text: `Apply operation to all users.` |
13 | | - }, |
14 | | - 'socket-path': { |
15 | | - cli: 'S', |
16 | | - example: '/var/run/dovecot/doveadm-server', |
17 | | - type: doveadm_arg_types.STRING, |
18 | | - text: `Path to doveadm socket.` |
19 | | - }, |
20 | | - user: { |
21 | | - cli: 'u', |
22 | | - example: 'username', |
23 | | - type: doveadm_arg_types.STRING, |
24 | | - text: `UID of user to apply operation to.`, |
25 | | - }, |
26 | | -} |
27 | | - |
28 | | -const doveadm_userfileargs = { |
29 | | - /* Hidden from documentation. |
30 | | - 'trans-flags': { |
31 | | - type: doveadm_arg_types.INTEGER, |
32 | | - text: `Transaction flags.` |
33 | | - }, |
34 | | - */ |
35 | | - 'user-file': { |
36 | | - cli: 'F', |
37 | | - type: doveadm_arg_types.STRING, |
38 | | - text: `A filename. If set, fetch usernames from file. One username per line.` |
39 | | - }, |
40 | | -} |
41 | | - |
42 | | -function typeToString(type) { |
43 | | - switch (type) { |
44 | | - case doveadm_arg_types.ARRAY: |
45 | | - return 'array' |
46 | | - case doveadm_arg_types.BOOL: |
47 | | - return 'boolean' |
48 | | - case doveadm_arg_types.INTEGER: |
49 | | - return 'integer' |
50 | | - case doveadm_arg_types.STRING: |
51 | | - return 'string' |
52 | | - case doveadm_arg_types.SEARCH_QUERY: |
53 | | - return 'search_query' |
54 | | - case doveadm_arg_types.ISTREAM: |
55 | | - return 'istream' |
56 | | - } |
57 | | -} |
58 | | - |
59 | | -function argToHttpParam(arg) { |
60 | | - return arg.split('-').reduce((s, c) => |
61 | | - s + (c.charAt(0).toUpperCase() + c.slice(1))) |
62 | | -} |
63 | | - |
64 | | -async function normalizeDoveadm(doveadm) { |
65 | | - const md = await getVitepressMd() |
66 | | - |
67 | | - for (const [k, v] of Object.entries(doveadm)) { |
68 | | - if (!v) { |
69 | | - delete doveadm[k] |
70 | | - continue |
71 | | - } |
72 | | - |
73 | | - if (v.flags && (v.flags & doveadm_flag_types.USER)) { |
74 | | - v.args = { ...v.args, ...doveadm_userargs } |
75 | | - } |
76 | | - |
77 | | - if (v.flags && (v.flags & doveadm_flag_types.USERFILE)) { |
78 | | - v.args = { ...v.args, ...doveadm_userfileargs } |
79 | | - } |
80 | | - |
81 | | - /* Convert 'man' entry into a markdown link to man page. |
82 | | - * We will add the hash to all URLs for simplicity; for those man |
83 | | - * pages that don't have individual command names, this will just |
84 | | - * be ignored by the browser. */ |
85 | | - if (v.man) { |
86 | | - v.man_link = md.renderInline('[[man,' + v.man + ',' + slugify(k) + ']]') |
87 | | - } |
88 | | - |
89 | | - /* Change entries. */ |
90 | | - for (const k2 of ['added', 'changed', 'deprecated', 'removed']) { |
91 | | - if (v[k2]) { |
92 | | - const changes = [] |
93 | | - for (const[k3, v3] of Object.entries(v[k2])) { |
94 | | - changes.push({ |
95 | | - text: v3 ? md.render(v3.trim()) : null, |
96 | | - version: md.renderInline('[[' + k2 + ',' + k3 + ']]') |
97 | | - }) |
98 | | - } |
99 | | - v[k2] = changes |
100 | | - } |
101 | | - } |
102 | | - |
103 | | - /* Response values. */ |
104 | | - if (v.response) { |
105 | | - if (v.response.text) { |
106 | | - v.response.text = md.render(String(v.response.text)) |
107 | | - } |
108 | | - } else { |
109 | | - delete v['response'] |
110 | | - } |
111 | | - |
112 | | - /* Text Description. */ |
113 | | - if (v.text) { |
114 | | - v.text = md.render(v.text) |
115 | | - } |
116 | | - |
117 | | - /* Cmd line arguments. */ |
118 | | - v.usage = k + (v.args ? ' ' + getDoveadmCmdLine(v.args) : '') |
119 | | - |
120 | | - if (v.args) { |
121 | | - const args = [] |
122 | | - for (const [k2, v2] of Object.entries(v.args)) { |
123 | | - if (!v2.hidden) { |
124 | | - args.push({ |
125 | | - /* Undefined examples will resolve to undefined. */ |
126 | | - cli_only: v2.cli_only, |
127 | | - example: v2.example, |
128 | | - flag: v2.cli ? '-' + v2.cli : (v2.positional ? k2 : '--' + k2), |
129 | | - param: argToHttpParam(k2), |
130 | | - type: typeToString(v2.type), |
131 | | - text: v2.text ? md.render(v2.text) : null |
132 | | - }) |
133 | | - } |
134 | | - } |
135 | | - v.args = args |
136 | | - } |
137 | | - if (!v.args || !v.args.length) { |
138 | | - delete v['args'] |
139 | | - } |
140 | | - |
141 | | - /* HTTP API info. */ |
142 | | - v.http_cmd = camelCase(k) |
143 | | - } |
144 | | - |
145 | | - return { |
146 | | - doveadm: normalizeArrayData( |
147 | | - doveadm, |
148 | | - ['tags'] |
149 | | - ), |
150 | | - http_api_link: md.renderInline('[[link,doveadm_http_api,HTTP API]]') |
151 | | - } |
152 | | -} |
| 1 | +import { addWatchPaths } from '../utility.js' |
| 2 | +import { loadDoveadm } from '../doveadm.js' |
153 | 3 |
|
154 | 4 | export default addWatchPaths({ |
155 | 5 | async load() { |
156 | | - return await normalizeDoveadm( |
157 | | - structuredClone((await loadData('doveadm')).doveadm) |
158 | | - ) |
| 6 | + return await loadDoveadm() |
159 | 7 | } |
160 | 8 | }) |
0 commit comments