@minecraft-docker/mcctl-api 1.7.6

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 (82) hide show
  1. package/README.md +142 -0
  2. package/dist/app.d.ts +7 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +83 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/config/index.d.ts +32 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +124 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +20 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/rcon.d.ts +35 -0
  15. package/dist/lib/rcon.d.ts.map +1 -0
  16. package/dist/lib/rcon.js +90 -0
  17. package/dist/lib/rcon.js.map +1 -0
  18. package/dist/plugins/auth.d.ts +32 -0
  19. package/dist/plugins/auth.d.ts.map +1 -0
  20. package/dist/plugins/auth.js +194 -0
  21. package/dist/plugins/auth.js.map +1 -0
  22. package/dist/plugins/swagger.d.ts +170 -0
  23. package/dist/plugins/swagger.d.ts.map +1 -0
  24. package/dist/plugins/swagger.js +211 -0
  25. package/dist/plugins/swagger.js.map +1 -0
  26. package/dist/routes/auth.d.ts +12 -0
  27. package/dist/routes/auth.d.ts.map +1 -0
  28. package/dist/routes/auth.js +144 -0
  29. package/dist/routes/auth.js.map +1 -0
  30. package/dist/routes/backup.d.ts +9 -0
  31. package/dist/routes/backup.d.ts.map +1 -0
  32. package/dist/routes/backup.js +271 -0
  33. package/dist/routes/backup.js.map +1 -0
  34. package/dist/routes/console.d.ts +6 -0
  35. package/dist/routes/console.d.ts.map +1 -0
  36. package/dist/routes/console.js +90 -0
  37. package/dist/routes/console.js.map +1 -0
  38. package/dist/routes/players.d.ts +9 -0
  39. package/dist/routes/players.d.ts.map +1 -0
  40. package/dist/routes/players.js +353 -0
  41. package/dist/routes/players.js.map +1 -0
  42. package/dist/routes/router.d.ts +10 -0
  43. package/dist/routes/router.d.ts.map +1 -0
  44. package/dist/routes/router.js +55 -0
  45. package/dist/routes/router.js.map +1 -0
  46. package/dist/routes/servers/actions.d.ts +6 -0
  47. package/dist/routes/servers/actions.d.ts.map +1 -0
  48. package/dist/routes/servers/actions.js +65 -0
  49. package/dist/routes/servers/actions.js.map +1 -0
  50. package/dist/routes/servers.d.ts +10 -0
  51. package/dist/routes/servers.d.ts.map +1 -0
  52. package/dist/routes/servers.js +403 -0
  53. package/dist/routes/servers.js.map +1 -0
  54. package/dist/routes/worlds.d.ts +10 -0
  55. package/dist/routes/worlds.d.ts.map +1 -0
  56. package/dist/routes/worlds.js +341 -0
  57. package/dist/routes/worlds.js.map +1 -0
  58. package/dist/schemas/backup.d.ts +47 -0
  59. package/dist/schemas/backup.d.ts.map +1 -0
  60. package/dist/schemas/backup.js +43 -0
  61. package/dist/schemas/backup.js.map +1 -0
  62. package/dist/schemas/player.d.ts +46 -0
  63. package/dist/schemas/player.d.ts.map +1 -0
  64. package/dist/schemas/player.js +46 -0
  65. package/dist/schemas/player.js.map +1 -0
  66. package/dist/schemas/router.d.ts +42 -0
  67. package/dist/schemas/router.d.ts.map +1 -0
  68. package/dist/schemas/router.js +26 -0
  69. package/dist/schemas/router.js.map +1 -0
  70. package/dist/schemas/server.d.ts +139 -0
  71. package/dist/schemas/server.d.ts.map +1 -0
  72. package/dist/schemas/server.js +124 -0
  73. package/dist/schemas/server.js.map +1 -0
  74. package/dist/schemas/world.d.ts +142 -0
  75. package/dist/schemas/world.d.ts.map +1 -0
  76. package/dist/schemas/world.js +124 -0
  77. package/dist/schemas/world.js.map +1 -0
  78. package/dist/utils/docker-compose.d.ts +23 -0
  79. package/dist/utils/docker-compose.d.ts.map +1 -0
  80. package/dist/utils/docker-compose.js +100 -0
  81. package/dist/utils/docker-compose.js.map +1 -0
  82. package/package.json +69 -0
@@ -0,0 +1,194 @@
1
+ import fp from 'fastify-plugin';
2
+ import bcrypt from 'bcrypt';
3
+ import ipRangeCheck from 'ip-range-check';
4
+ // ============================================================
5
+ // Plugin Implementation
6
+ // ============================================================
7
+ const authPlugin = async (fastify, opts) => {
8
+ const { config } = opts;
9
+ // Validate config based on mode
10
+ validateAuthConfig(config);
11
+ // Decorate fastify with auth utilities
12
+ fastify.decorate('authConfig', config);
13
+ fastify.decorate('isAuthenticated', false);
14
+ // Default excluded paths
15
+ const excludedPaths = new Set(config.excludePaths ?? ['/health', '/health/']);
16
+ // Skip authentication if disabled
17
+ if (config.mode === 'disabled') {
18
+ fastify.log.warn('Authentication is DISABLED. This should only be used in development!');
19
+ return;
20
+ }
21
+ // Add preHandler hook for authentication
22
+ fastify.addHook('preHandler', async (request, reply) => {
23
+ // Skip authentication for excluded paths
24
+ if (excludedPaths.has(request.url)) {
25
+ return;
26
+ }
27
+ // Normalize URL for path matching (remove query string)
28
+ const urlPath = request.url.split('?')[0] ?? request.url;
29
+ if (excludedPaths.has(urlPath)) {
30
+ return;
31
+ }
32
+ try {
33
+ await authenticate(request, reply, config, fastify);
34
+ }
35
+ catch (error) {
36
+ if (error instanceof AuthError) {
37
+ reply.code(error.statusCode).send({
38
+ error: error.name,
39
+ message: error.message,
40
+ });
41
+ return reply;
42
+ }
43
+ throw error;
44
+ }
45
+ });
46
+ };
47
+ // ============================================================
48
+ // Authentication Logic
49
+ // ============================================================
50
+ class AuthError extends Error {
51
+ statusCode;
52
+ constructor(message, statusCode = 401) {
53
+ super(message);
54
+ this.name = 'AuthenticationError';
55
+ this.statusCode = statusCode;
56
+ }
57
+ }
58
+ async function authenticate(request, _reply, config, fastify) {
59
+ switch (config.mode) {
60
+ case 'api-key':
61
+ await authenticateApiKey(request, config, fastify);
62
+ break;
63
+ case 'ip-whitelist':
64
+ await authenticateIpWhitelist(request, config, fastify);
65
+ break;
66
+ case 'basic':
67
+ await authenticateBasic(request, config, fastify);
68
+ break;
69
+ case 'combined':
70
+ await authenticateCombined(request, config, fastify);
71
+ break;
72
+ default:
73
+ throw new AuthError('Invalid authentication mode', 500);
74
+ }
75
+ }
76
+ async function authenticateApiKey(request, config, fastify) {
77
+ const apiKey = request.headers['x-api-key'];
78
+ if (!apiKey) {
79
+ throw new AuthError('Missing X-API-Key header');
80
+ }
81
+ if (apiKey !== config.apiKey) {
82
+ fastify.log.warn({ ip: getClientIp(request) }, 'Invalid API key attempt');
83
+ throw new AuthError('Invalid API key');
84
+ }
85
+ }
86
+ async function authenticateIpWhitelist(request, config, fastify) {
87
+ const clientIp = getClientIp(request);
88
+ const whitelist = config.ipWhitelist ?? [];
89
+ if (whitelist.length === 0) {
90
+ throw new AuthError('IP whitelist is empty', 500);
91
+ }
92
+ const isAllowed = ipRangeCheck(clientIp, whitelist);
93
+ if (!isAllowed) {
94
+ fastify.log.warn({ ip: clientIp }, 'IP not in whitelist');
95
+ throw new AuthError('IP address not allowed', 403);
96
+ }
97
+ }
98
+ async function authenticateBasic(request, config, fastify) {
99
+ const authHeader = request.headers.authorization;
100
+ if (!authHeader || !authHeader.startsWith('Basic ')) {
101
+ throw new AuthError('Missing or invalid Authorization header');
102
+ }
103
+ const base64Credentials = authHeader.substring(6);
104
+ const credentials = Buffer.from(base64Credentials, 'base64').toString('utf-8');
105
+ const [username, password] = credentials.split(':');
106
+ if (!username || !password) {
107
+ throw new AuthError('Invalid credentials format');
108
+ }
109
+ const users = config.users ?? [];
110
+ const user = users.find((u) => u.username === username);
111
+ if (!user) {
112
+ fastify.log.warn({ username, ip: getClientIp(request) }, 'Unknown user attempt');
113
+ throw new AuthError('Invalid credentials');
114
+ }
115
+ const isValid = await bcrypt.compare(password, user.passwordHash);
116
+ if (!isValid) {
117
+ fastify.log.warn({ username, ip: getClientIp(request) }, 'Invalid password attempt');
118
+ throw new AuthError('Invalid credentials');
119
+ }
120
+ }
121
+ async function authenticateCombined(request, config, fastify) {
122
+ // Both API key AND IP whitelist must pass
123
+ await authenticateApiKey(request, config, fastify);
124
+ await authenticateIpWhitelist(request, config, fastify);
125
+ }
126
+ // ============================================================
127
+ // Utilities
128
+ // ============================================================
129
+ function getClientIp(request) {
130
+ // Check for forwarded headers (reverse proxy scenarios)
131
+ const xForwardedFor = request.headers['x-forwarded-for'];
132
+ if (xForwardedFor) {
133
+ const ips = Array.isArray(xForwardedFor) ? xForwardedFor[0] : xForwardedFor.split(',')[0];
134
+ if (ips) {
135
+ return ips.trim();
136
+ }
137
+ }
138
+ const xRealIp = request.headers['x-real-ip'];
139
+ if (xRealIp) {
140
+ const ip = Array.isArray(xRealIp) ? xRealIp[0] : xRealIp;
141
+ if (ip) {
142
+ return ip;
143
+ }
144
+ }
145
+ // Fallback to socket IP
146
+ return request.ip;
147
+ }
148
+ function validateAuthConfig(config) {
149
+ switch (config.mode) {
150
+ case 'disabled':
151
+ // No validation needed
152
+ break;
153
+ case 'api-key':
154
+ if (!config.apiKey) {
155
+ throw new Error('API key is required for api-key authentication mode');
156
+ }
157
+ break;
158
+ case 'ip-whitelist':
159
+ if (!config.ipWhitelist || config.ipWhitelist.length === 0) {
160
+ throw new Error('IP whitelist is required for ip-whitelist authentication mode');
161
+ }
162
+ break;
163
+ case 'basic':
164
+ if (!config.users || config.users.length === 0) {
165
+ throw new Error('Users are required for basic authentication mode');
166
+ }
167
+ break;
168
+ case 'combined':
169
+ if (!config.apiKey) {
170
+ throw new Error('API key is required for combined authentication mode');
171
+ }
172
+ if (!config.ipWhitelist || config.ipWhitelist.length === 0) {
173
+ throw new Error('IP whitelist is required for combined authentication mode');
174
+ }
175
+ break;
176
+ default:
177
+ throw new Error(`Unknown authentication mode: ${config.mode}`);
178
+ }
179
+ }
180
+ // ============================================================
181
+ // Helper for generating password hashes
182
+ // ============================================================
183
+ export async function hashPassword(password, saltRounds = 10) {
184
+ return bcrypt.hash(password, saltRounds);
185
+ }
186
+ // ============================================================
187
+ // Export
188
+ // ============================================================
189
+ export default fp(authPlugin, {
190
+ name: 'auth',
191
+ fastify: '5.x',
192
+ });
193
+ export { authPlugin, AuthError };
194
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/plugins/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { FastifyPluginAsync } from 'fastify';
2
+ export interface SwaggerPluginOptions {
3
+ title?: string;
4
+ description?: string;
5
+ version?: string;
6
+ routePrefix?: string;
7
+ }
8
+ declare const swaggerPlugin: FastifyPluginAsync<SwaggerPluginOptions>;
9
+ /**
10
+ * Common response schemas for reuse across routes
11
+ */
12
+ export declare const commonSchemas: {
13
+ errorResponse: {
14
+ type: string;
15
+ properties: {
16
+ error: {
17
+ type: string;
18
+ description: string;
19
+ };
20
+ message: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ };
25
+ required: string[];
26
+ };
27
+ healthResponse: {
28
+ type: string;
29
+ properties: {
30
+ status: {
31
+ type: string;
32
+ enum: string[];
33
+ description: string;
34
+ };
35
+ timestamp: {
36
+ type: string;
37
+ format: string;
38
+ description: string;
39
+ };
40
+ };
41
+ required: string[];
42
+ };
43
+ serverNameParam: {
44
+ type: string;
45
+ description: string;
46
+ pattern: string;
47
+ examples: string[];
48
+ };
49
+ worldNameParam: {
50
+ type: string;
51
+ description: string;
52
+ pattern: string;
53
+ examples: string[];
54
+ };
55
+ playerNameParam: {
56
+ type: string;
57
+ description: string;
58
+ pattern: string;
59
+ examples: string[];
60
+ };
61
+ };
62
+ /**
63
+ * Common route options for consistent error responses
64
+ */
65
+ export declare const commonRouteOptions: {
66
+ unauthorizedResponse: {
67
+ description: string;
68
+ content: {
69
+ 'application/json': {
70
+ schema: {
71
+ type: string;
72
+ properties: {
73
+ error: {
74
+ type: string;
75
+ description: string;
76
+ };
77
+ message: {
78
+ type: string;
79
+ description: string;
80
+ };
81
+ };
82
+ required: string[];
83
+ };
84
+ example: {
85
+ error: string;
86
+ message: string;
87
+ };
88
+ };
89
+ };
90
+ };
91
+ forbiddenResponse: {
92
+ description: string;
93
+ content: {
94
+ 'application/json': {
95
+ schema: {
96
+ type: string;
97
+ properties: {
98
+ error: {
99
+ type: string;
100
+ description: string;
101
+ };
102
+ message: {
103
+ type: string;
104
+ description: string;
105
+ };
106
+ };
107
+ required: string[];
108
+ };
109
+ example: {
110
+ error: string;
111
+ message: string;
112
+ };
113
+ };
114
+ };
115
+ };
116
+ notFoundResponse: {
117
+ description: string;
118
+ content: {
119
+ 'application/json': {
120
+ schema: {
121
+ type: string;
122
+ properties: {
123
+ error: {
124
+ type: string;
125
+ description: string;
126
+ };
127
+ message: {
128
+ type: string;
129
+ description: string;
130
+ };
131
+ };
132
+ required: string[];
133
+ };
134
+ example: {
135
+ error: string;
136
+ message: string;
137
+ };
138
+ };
139
+ };
140
+ };
141
+ internalErrorResponse: {
142
+ description: string;
143
+ content: {
144
+ 'application/json': {
145
+ schema: {
146
+ type: string;
147
+ properties: {
148
+ error: {
149
+ type: string;
150
+ description: string;
151
+ };
152
+ message: {
153
+ type: string;
154
+ description: string;
155
+ };
156
+ };
157
+ required: string[];
158
+ };
159
+ example: {
160
+ error: string;
161
+ message: string;
162
+ };
163
+ };
164
+ };
165
+ };
166
+ };
167
+ declare const _default: FastifyPluginAsync<SwaggerPluginOptions>;
168
+ export default _default;
169
+ export { swaggerPlugin };
170
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../src/plugins/swagger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAS9D,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,QAAA,MAAM,aAAa,EAAE,kBAAkB,CAAC,oBAAoB,CAuG3D,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwD9B,CAAC;;AAMF,wBAIG;AAEH,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,211 @@
1
+ import fp from 'fastify-plugin';
2
+ import swagger from '@fastify/swagger';
3
+ import swaggerUi from '@fastify/swagger-ui';
4
+ // ============================================================
5
+ // Plugin Implementation
6
+ // ============================================================
7
+ const swaggerPlugin = async (fastify, opts) => {
8
+ const { title = 'mcctl-api', description = 'REST API for managing Docker Minecraft servers', version = '0.1.0', routePrefix = '/docs', } = opts;
9
+ // Register Swagger (OpenAPI spec generation)
10
+ await fastify.register(swagger, {
11
+ openapi: {
12
+ openapi: '3.1.0',
13
+ info: {
14
+ title,
15
+ description,
16
+ version,
17
+ license: {
18
+ name: 'Apache-2.0',
19
+ url: 'https://www.apache.org/licenses/LICENSE-2.0.html',
20
+ },
21
+ contact: {
22
+ name: 'smallmiro',
23
+ url: 'https://github.com/smallmiro/minecraft-server-manager',
24
+ },
25
+ },
26
+ externalDocs: {
27
+ url: 'https://minecraft-server-manager.readthedocs.io/',
28
+ description: 'Full documentation',
29
+ },
30
+ servers: [
31
+ {
32
+ url: '/',
33
+ description: 'Current server (relative)',
34
+ },
35
+ {
36
+ url: 'http://localhost:5000',
37
+ description: 'Local development server',
38
+ },
39
+ {
40
+ url: 'http://192.168.20.37:5000',
41
+ description: 'LAN server',
42
+ },
43
+ ],
44
+ tags: [
45
+ { name: 'health', description: 'Health check endpoints' },
46
+ { name: 'servers', description: 'Minecraft server management' },
47
+ { name: 'console', description: 'RCON console access' },
48
+ { name: 'worlds', description: 'World management' },
49
+ { name: 'players', description: 'Player management' },
50
+ ],
51
+ components: {
52
+ securitySchemes: {
53
+ apiKey: {
54
+ type: 'apiKey',
55
+ name: 'X-API-Key',
56
+ in: 'header',
57
+ description: 'API key for authentication',
58
+ },
59
+ basicAuth: {
60
+ type: 'http',
61
+ scheme: 'basic',
62
+ description: 'Basic HTTP authentication',
63
+ },
64
+ },
65
+ },
66
+ security: [{ apiKey: [] }],
67
+ },
68
+ });
69
+ // Register Swagger UI
70
+ await fastify.register(swaggerUi, {
71
+ routePrefix,
72
+ uiConfig: {
73
+ docExpansion: 'list',
74
+ deepLinking: true,
75
+ displayRequestDuration: true,
76
+ filter: true,
77
+ showExtensions: true,
78
+ showCommonExtensions: true,
79
+ syntaxHighlight: {
80
+ activate: true,
81
+ theme: 'monokai',
82
+ },
83
+ },
84
+ uiHooks: {
85
+ onRequest: function (_request, _reply, next) {
86
+ next();
87
+ },
88
+ preHandler: function (_request, _reply, next) {
89
+ next();
90
+ },
91
+ },
92
+ staticCSP: false,
93
+ transformStaticCSP: (header) => header,
94
+ transformSpecification: (swaggerObject) => swaggerObject,
95
+ transformSpecificationClone: true,
96
+ });
97
+ fastify.log.info(`Swagger UI available at ${routePrefix}`);
98
+ fastify.log.info(`OpenAPI spec available at ${routePrefix}/json`);
99
+ };
100
+ // ============================================================
101
+ // Common Schemas
102
+ // ============================================================
103
+ /**
104
+ * Common response schemas for reuse across routes
105
+ */
106
+ export const commonSchemas = {
107
+ // Error response schema
108
+ errorResponse: {
109
+ type: 'object',
110
+ properties: {
111
+ error: { type: 'string', description: 'Error type' },
112
+ message: { type: 'string', description: 'Error message' },
113
+ },
114
+ required: ['error', 'message'],
115
+ },
116
+ // Health check response schema
117
+ healthResponse: {
118
+ type: 'object',
119
+ properties: {
120
+ status: { type: 'string', enum: ['ok'], description: 'Health status' },
121
+ timestamp: { type: 'string', format: 'date-time', description: 'ISO 8601 timestamp' },
122
+ },
123
+ required: ['status', 'timestamp'],
124
+ },
125
+ // Common parameters
126
+ serverNameParam: {
127
+ type: 'string',
128
+ description: 'Server name (without mc- prefix)',
129
+ pattern: '^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$',
130
+ examples: ['survival', 'creative', 'modded'],
131
+ },
132
+ worldNameParam: {
133
+ type: 'string',
134
+ description: 'World name',
135
+ pattern: '^[a-zA-Z0-9][a-zA-Z0-9_-]*$',
136
+ examples: ['world', 'survival_world', 'creative-world'],
137
+ },
138
+ playerNameParam: {
139
+ type: 'string',
140
+ description: 'Minecraft player name',
141
+ pattern: '^[a-zA-Z0-9_]{3,16}$',
142
+ examples: ['Notch', 'Steve', 'Alex'],
143
+ },
144
+ };
145
+ /**
146
+ * Common route options for consistent error responses
147
+ */
148
+ export const commonRouteOptions = {
149
+ // 401 Unauthorized
150
+ unauthorizedResponse: {
151
+ description: 'Authentication required',
152
+ content: {
153
+ 'application/json': {
154
+ schema: commonSchemas.errorResponse,
155
+ example: {
156
+ error: 'AuthenticationError',
157
+ message: 'Missing X-API-Key header',
158
+ },
159
+ },
160
+ },
161
+ },
162
+ // 403 Forbidden
163
+ forbiddenResponse: {
164
+ description: 'Access denied',
165
+ content: {
166
+ 'application/json': {
167
+ schema: commonSchemas.errorResponse,
168
+ example: {
169
+ error: 'AuthenticationError',
170
+ message: 'IP address not allowed',
171
+ },
172
+ },
173
+ },
174
+ },
175
+ // 404 Not Found
176
+ notFoundResponse: {
177
+ description: 'Resource not found',
178
+ content: {
179
+ 'application/json': {
180
+ schema: commonSchemas.errorResponse,
181
+ example: {
182
+ error: 'NotFound',
183
+ message: 'Server not found',
184
+ },
185
+ },
186
+ },
187
+ },
188
+ // 500 Internal Server Error
189
+ internalErrorResponse: {
190
+ description: 'Internal server error',
191
+ content: {
192
+ 'application/json': {
193
+ schema: commonSchemas.errorResponse,
194
+ example: {
195
+ error: 'InternalError',
196
+ message: 'An unexpected error occurred',
197
+ },
198
+ },
199
+ },
200
+ },
201
+ };
202
+ // ============================================================
203
+ // Export
204
+ // ============================================================
205
+ export default fp(swaggerPlugin, {
206
+ name: 'swagger',
207
+ fastify: '5.x',
208
+ dependencies: [], // No dependencies, should be registered early
209
+ });
210
+ export { swaggerPlugin };
211
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.js","sourceRoot":"","sources":["../../src/plugins/swagger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Authentication Routes
3
+ *
4
+ * Handles user authentication for the mcctl-console.
5
+ * Validates credentials against users.yaml file.
6
+ */
7
+ import { FastifyInstance } from 'fastify';
8
+ /**
9
+ * Register authentication routes
10
+ */
11
+ export default function authRoutes(app: FastifyInstance): Promise<void>;
12
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAYxE;;GAEG;AACH,wBAA8B,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJ5E"}