kempo-server 1.4.3 → 1.4.5
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.
- package/.github/copilot-instructions.md +96 -96
- package/.github/workflows/publish-npm.yml +41 -0
- package/README.md +650 -650
- package/builtinMiddleware.js +136 -136
- package/defaultConfig.js +129 -129
- package/docs/.config.json +5 -5
- package/docs/.config.json.example +19 -19
- package/docs/api/user/[id]/GET.js +15 -15
- package/docs/api/user/[id]/[info]/DELETE.js +12 -12
- package/docs/api/user/[id]/[info]/GET.js +17 -17
- package/docs/api/user/[id]/[info]/POST.js +18 -18
- package/docs/api/user/[id]/[info]/PUT.js +19 -19
- package/docs/configuration.html +119 -119
- package/docs/examples.html +201 -201
- package/docs/getting-started.html +72 -72
- package/docs/index.html +81 -81
- package/docs/manifest.json +87 -87
- package/docs/middleware.html +147 -147
- package/docs/request-response.html +95 -95
- package/docs/routing.html +77 -77
- package/example-middleware.js +23 -23
- package/example.config.json +50 -50
- package/findFile.js +138 -138
- package/getFiles.js +72 -72
- package/getFlags.js +34 -34
- package/index.js +47 -47
- package/middlewareRunner.js +25 -25
- package/package.json +10 -6
- package/requestWrapper.js +87 -87
- package/responseWrapper.js +204 -204
- package/router.js +285 -285
- package/serveFile.js +71 -71
- package/tests/builtinMiddleware-cors.node-test.js +17 -17
- package/tests/builtinMiddleware.node-test.js +74 -74
- package/tests/defaultConfig.node-test.js +13 -13
- package/tests/example-middleware.node-test.js +31 -31
- package/tests/findFile.node-test.js +46 -46
- package/tests/getFiles.node-test.js +25 -25
- package/tests/getFlags.node-test.js +30 -30
- package/tests/index.node-test.js +23 -23
- package/tests/middlewareRunner.node-test.js +18 -18
- package/tests/requestWrapper.node-test.js +51 -51
- package/tests/responseWrapper.node-test.js +74 -74
- package/tests/router-middleware.node-test.js +46 -46
- package/tests/router.node-test.js +88 -88
- package/tests/serveFile.node-test.js +52 -52
- package/tests/test-utils.js +106 -106
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
export default async function(request, response) {
|
|
2
|
-
const { id, info } = request.params;
|
|
3
|
-
|
|
4
|
-
try {
|
|
5
|
-
const updateData = await request.json();
|
|
6
|
-
|
|
7
|
-
// Example response for updating user info
|
|
8
|
-
const updatedUser = {
|
|
9
|
-
id: id,
|
|
10
|
-
message: 'User info updated successfully',
|
|
11
|
-
updatedFields: updateData
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
response.json(updatedUser);
|
|
15
|
-
} catch (error) {
|
|
16
|
-
response.status(400).json({ error: 'Invalid JSON' });
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
export default async function(request, response) {
|
|
2
|
+
const { id, info } = request.params;
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
const updateData = await request.json();
|
|
6
|
+
|
|
7
|
+
// Example response for updating user info
|
|
8
|
+
const updatedUser = {
|
|
9
|
+
id: id,
|
|
10
|
+
message: 'User info updated successfully',
|
|
11
|
+
updatedFields: updateData
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
response.json(updatedUser);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
response.status(400).json({ error: 'Invalid JSON' });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
export default async function(request, response) {
|
|
2
|
-
const { id, info } = request.params;
|
|
3
|
-
|
|
4
|
-
try {
|
|
5
|
-
const updateData = await request.json();
|
|
6
|
-
|
|
7
|
-
// Example response for replacing user info
|
|
8
|
-
const updatedUser = {
|
|
9
|
-
id: id,
|
|
10
|
-
message: 'User info replaced successfully',
|
|
11
|
-
newData: updateData,
|
|
12
|
-
updatedAt: new Date().toISOString()
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
response.json(updatedUser);
|
|
16
|
-
} catch (error) {
|
|
17
|
-
response.status(400).json({ error: 'Invalid JSON' });
|
|
18
|
-
}
|
|
19
|
-
}
|
|
1
|
+
export default async function(request, response) {
|
|
2
|
+
const { id, info } = request.params;
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
const updateData = await request.json();
|
|
6
|
+
|
|
7
|
+
// Example response for replacing user info
|
|
8
|
+
const updatedUser = {
|
|
9
|
+
id: id,
|
|
10
|
+
message: 'User info replaced successfully',
|
|
11
|
+
newData: updateData,
|
|
12
|
+
updatedAt: new Date().toISOString()
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
response.json(updatedUser);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
response.status(400).json({ error: 'Invalid JSON' });
|
|
18
|
+
}
|
|
19
|
+
}
|
package/docs/configuration.html
CHANGED
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
<html lang="en" theme="auto">
|
|
2
|
-
<head>
|
|
3
|
-
<meta charset='utf-8'>
|
|
4
|
-
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
|
5
|
-
<title>Configuration - Kempo Server</title>
|
|
6
|
-
<meta name='viewport' content='width=device-width, initial-scale=1'>
|
|
7
|
-
<link rel="icon" type="image/png" sizes="48x48" href="media/icon48.png">
|
|
8
|
-
<link rel="manifest" href="manifest.json">
|
|
9
|
-
<link rel="stylesheet" href="essential.css" />
|
|
10
|
-
</head>
|
|
11
|
-
<body>
|
|
12
|
-
<main>
|
|
13
|
-
<a href="./" class="btn">Home</a>
|
|
14
|
-
<h1>Configuration</h1>
|
|
15
|
-
<p>Customize Kempo Server's behavior with a simple JSON configuration file.</p>
|
|
16
|
-
|
|
17
|
-
<h2>Configuration File</h2>
|
|
18
|
-
<p>To configure the server create a <code>.config.json</code> within the root directory of your server (<code>public</code> in the start example).</p>
|
|
19
|
-
<p>This json file can have any of the following properties. Any property not defined will use the default configuration.</p>
|
|
20
|
-
|
|
21
|
-
<h2>Configuration Options</h2>
|
|
22
|
-
<ul>
|
|
23
|
-
<li><a href="#allowedMimes">allowedMimes</a> - File types that can be served</li>
|
|
24
|
-
<li><a href="#disallowedRegex">disallowedRegex</a> - Patterns for paths that should be blocked</li>
|
|
25
|
-
<li><a href="#customRoutes">customRoutes</a> - Custom route mappings</li>
|
|
26
|
-
<li><a href="#routeFiles">routeFiles</a> - Files that should be treated as route handlers</li>
|
|
27
|
-
<li><a href="#noRescanPaths">noRescanPaths</a> - Paths that should not trigger file system rescans</li>
|
|
28
|
-
<li><a href="#maxRescanAttempts">maxRescanAttempts</a> - Maximum number of rescan attempts</li>
|
|
29
|
-
<li><a href="#middleware">middleware</a> - Middleware configuration</li>
|
|
30
|
-
</ul>
|
|
31
|
-
|
|
32
|
-
<h3 id="allowedMimes">allowedMimes</h3>
|
|
33
|
-
<p>An object mapping file extensions to their MIME types. Files with extensions not in this list will not be served.</p>
|
|
34
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"jpeg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"gif"</span>: <span class="hljs-string">"image/gif"</span>,<br /> <span class="hljs-attr">"svg"</span>: <span class="hljs-string">"image/svg+xml"</span>,<br /> <span class="hljs-attr">"woff"</span>: <span class="hljs-string">"font/woff"</span>,<br /> <span class="hljs-attr">"woff2"</span>: <span class="hljs-string">"font/woff2"</span><br /> }<br />}</code></pre>
|
|
35
|
-
|
|
36
|
-
<h3 id="disallowedRegex">disallowedRegex</h3>
|
|
37
|
-
<p>An array of regular expressions that match paths that should never be served. This provides security by preventing access to sensitive files.</p>
|
|
38
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>, <span class="hljs-comment">// Hidden files (starting with .)</span><br /> <span class="hljs-string">"\\.env$"</span>, <span class="hljs-comment">// Environment files</span><br /> <span class="hljs-string">"\\.config$"</span>, <span class="hljs-comment">// Configuration files</span><br /> <span class="hljs-string">"password"</span>, <span class="hljs-comment">// Files containing "password"</span><br /> <span class="hljs-string">"node_modules"</span>, <span class="hljs-comment">// Node modules directory</span><br /> <span class="hljs-string">"\\.git"</span> <span class="hljs-comment">// Git directory</span><br /> ]<br />}</code></pre>
|
|
39
|
-
|
|
40
|
-
<h3 id="routeFiles">routeFiles</h3>
|
|
41
|
-
<p>An array of filenames that should be treated as route handlers and executed as JavaScript modules.</p>
|
|
42
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"routeFiles"</span>: [<br /> <span class="hljs-string">"GET.js"</span>,<br /> <span class="hljs-string">"POST.js"</span>,<br /> <span class="hljs-string">"PUT.js"</span>,<br /> <span class="hljs-string">"DELETE.js"</span>,<br /> <span class="hljs-string">"PATCH.js"</span>,<br /> <span class="hljs-string">"HEAD.js"</span>,<br /> <span class="hljs-string">"OPTIONS.js"</span>,<br /> <span class="hljs-string">"index.js"</span><br /> ]<br />}</code></pre>
|
|
43
|
-
|
|
44
|
-
<h3 id="noRescanPaths">noRescanPaths</h3>
|
|
45
|
-
<p>An array of regex patterns for paths that should not trigger a file system rescan. This improves performance for common static assets.</p>
|
|
46
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"noRescanPaths"</span>: [<br /> <span class="hljs-string">"/favicon\\.ico$"</span>,<br /> <span class="hljs-string">"/robots\\.txt$"</span>,<br /> <span class="hljs-string">"\\.map$"</span>,<br /> <span class="hljs-string">"\\.css$"</span>,<br /> <span class="hljs-string">"\\.js$"</span>,<br /> <span class="hljs-string">"\\.png$"</span>,<br /> <span class="hljs-string">"\\.jpg$"</span>,<br /> <span class="hljs-string">"\\.jpeg$"</span>,<br /> <span class="hljs-string">"\\.gif$"</span><br /> ]<br />}</code></pre>
|
|
47
|
-
|
|
48
|
-
<h3 id="customRoutes">customRoutes</h3>
|
|
49
|
-
<p>An object mapping custom route paths to file paths. Useful for aliasing or serving files from outside the document root.</p>
|
|
50
|
-
|
|
51
|
-
<h4>Basic Routes</h4>
|
|
52
|
-
<p>Map specific paths to files:</p>
|
|
53
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"/vendor/bootstrap.css"</span>: <span class="hljs-string">"./node_modules/bootstrap/dist/css/bootstrap.min.css"</span>,<br /> <span class="hljs-attr">"/api/status"</span>: <span class="hljs-string">"./status.js"</span>,<br /> <span class="hljs-attr">"/health"</span>: <span class="hljs-string">"./health-check.js"</span><br /> }<br />}</code></pre>
|
|
54
|
-
|
|
55
|
-
<h4>Wildcard Routes</h4>
|
|
56
|
-
<p>Wildcard routes allow you to map entire directory structures using the <code>*</code> wildcard:</p>
|
|
57
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"kempo/*"</span>: <span class="hljs-string">"./node_modules/kempo/dist/*"</span>,<br /> <span class="hljs-attr">"assets/*"</span>: <span class="hljs-string">"./static-files/*"</span>,<br /> <span class="hljs-attr">"docs/*"</span>: <span class="hljs-string">"./documentation/*"</span>,<br /> <span class="hljs-attr">"lib/*"</span>: <span class="hljs-string">"./node_modules/my-library/build/*"</span><br /> }<br />}</code></pre>
|
|
58
|
-
|
|
59
|
-
<p>With wildcard routes:</p>
|
|
60
|
-
<ul>
|
|
61
|
-
<li><code>kempo/styles.css</code> would serve <code>./node_modules/kempo/dist/styles.css</code></li>
|
|
62
|
-
<li><code>assets/logo.png</code> would serve <code>./static-files/logo.png</code></li>
|
|
63
|
-
<li><code>docs/readme.md</code> would serve <code>./documentation/readme.md</code></li>
|
|
64
|
-
<li><code>lib/utils.js</code> would serve <code>./node_modules/my-library/build/utils.js</code></li>
|
|
65
|
-
</ul>
|
|
66
|
-
<p>The <code>*</code> wildcard matches any single path segment (anything between <code>/</code> characters). Multiple wildcards can be used in a single route pattern.</p>
|
|
67
|
-
|
|
68
|
-
<h3 id="maxRescanAttempts">maxRescanAttempts</h3>
|
|
69
|
-
<p>The maximum number of times to attempt rescanning the file system when a file is not found. Defaults to 3.</p>
|
|
70
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"maxRescanAttempts"</span>: <span class="hljs-number">3</span><br />}</code></pre>
|
|
71
|
-
|
|
72
|
-
<h3 id="middleware">middleware</h3>
|
|
73
|
-
<p>Configuration for built-in and custom middleware. Middleware runs before your route handlers and can modify requests, responses, or handle requests entirely.</p>
|
|
74
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span><br /> },<br /> <span class="hljs-attr">"custom"</span>: [<span class="hljs-string">"./middleware/auth.js"</span>]<br /> }<br />}</code></pre>
|
|
75
|
-
|
|
76
|
-
<h2>Complete Configuration Example</h2>
|
|
77
|
-
<p>Here's a complete example of a <code>.config.json</code> file:</p>
|
|
78
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"jpeg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"gif"</span>: <span class="hljs-string">"image/gif"</span>,<br /> <span class="hljs-attr">"svg"</span>: <span class="hljs-string">"image/svg+xml"</span>,<br /> <span class="hljs-attr">"woff"</span>: <span class="hljs-string">"font/woff"</span>,<br /> <span class="hljs-attr">"woff2"</span>: <span class="hljs-string">"font/woff2"</span><br /> },<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>,<br /> <span class="hljs-string">"\\.env$"</span>,<br /> <span class="hljs-string">"\\.config$"</span>,<br /> <span class="hljs-string">"password"</span>,<br /> <span class="hljs-string">"node_modules"</span>,<br /> <span class="hljs-string">"\\.git"</span><br /> ],<br /> <span class="hljs-attr">"routeFiles"</span>: [<br /> <span class="hljs-string">"GET.js"</span>,<br /> <span class="hljs-string">"POST.js"</span>,<br /> <span class="hljs-string">"PUT.js"</span>,<br /> <span class="hljs-string">"DELETE.js"</span>,<br /> <span class="hljs-string">"PATCH.js"</span>,<br /> <span class="hljs-string">"HEAD.js"</span>,<br /> <span class="hljs-string">"OPTIONS.js"</span>,<br /> <span class="hljs-string">"index.js"</span><br /> ],<br /> <span class="hljs-attr">"noRescanPaths"</span>: [<br /> <span class="hljs-string">"/favicon\\.ico$"</span>,<br /> <span class="hljs-string">"/robots\\.txt$"</span>,<br /> <span class="hljs-string">"\\.map$"</span>,<br /> <span class="hljs-string">"\\.css$"</span>,<br /> <span class="hljs-string">"\\.js$"</span>,<br /> <span class="hljs-string">"\\.png$"</span>,<br /> <span class="hljs-string">"\\.jpg$"</span>,<br /> <span class="hljs-string">"\\.jpeg$"</span>,<br /> <span class="hljs-string">"\\.gif$"</span><br /> ],<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"/vendor/bootstrap.css"</span>: <span class="hljs-string">"./node_modules/bootstrap/dist/css/bootstrap.min.css"</span>,<br /> <span class="hljs-attr">"/vendor/jquery.js"</span>: <span class="hljs-string">"./node_modules/jquery/dist/jquery.min.js"</span>,<br /> <span class="hljs-attr">"assets/*"</span>: <span class="hljs-string">"./static-files/*"</span>,<br /> <span class="hljs-attr">"docs/*"</span>: <span class="hljs-string">"./documentation/*"</span><br /> },<br /> <span class="hljs-attr">"maxRescanAttempts"</span>: <span class="hljs-number">3</span>,<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span>,<br /> <span class="hljs-attr">"methods"</span>: [<span class="hljs-string">"GET"</span>, <span class="hljs-string">"POST"</span>, <span class="hljs-string">"PUT"</span>, <span class="hljs-string">"DELETE"</span>],<br /> <span class="hljs-attr">"headers"</span>: [<span class="hljs-string">"Content-Type"</span>, <span class="hljs-string">"Authorization"</span>]<br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"threshold"</span>: <span class="hljs-number">1024</span><br /> },<br /> <span class="hljs-attr">"security"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"headers"</span>: {<br /> <span class="hljs-attr">"X-Content-Type-Options"</span>: <span class="hljs-string">"nosniff"</span>,<br /> <span class="hljs-attr">"X-Frame-Options"</span>: <span class="hljs-string">"DENY"</span>,<br /> <span class="hljs-attr">"X-XSS-Protection"</span>: <span class="hljs-string">"1; mode=block"</span><br /> }<br /> },<br /> <span class="hljs-attr">"custom"</span>: [<br /> <span class="hljs-string">"./middleware/auth.js"</span>,<br /> <span class="hljs-string">"./middleware/logging.js"</span><br /> ]<br /> }<br />}</code></pre>
|
|
79
|
-
|
|
80
|
-
<h2>Environment-Specific Configuration</h2>
|
|
81
|
-
<p>You can create different configuration files for different environments:</p>
|
|
82
|
-
|
|
83
|
-
<h3>Development Configuration</h3>
|
|
84
|
-
<p>Create <code>.config.dev.json</code> for development:</p>
|
|
85
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"map"</span>: <span class="hljs-string">"application/json"</span><br /> },<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">false</span><br /> }<br /> }<br />}</code></pre>
|
|
86
|
-
|
|
87
|
-
<h3>Production Configuration</h3>
|
|
88
|
-
<p>Create <code>.config.prod.json</code> for production:</p>
|
|
89
|
-
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span><br /> },<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>,<br /> <span class="hljs-string">"\\.env$"</span>,<br /> <span class="hljs-string">"\\.config$"</span>,<br /> <span class="hljs-string">"password"</span>,<br /> <span class="hljs-string">"node_modules"</span>,<br /> <span class="hljs-string">"\\.git"</span>,<br /> <span class="hljs-string">"\\.map$"</span><br /> ],<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"https://yourdomain.com"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"threshold"</span>: <span class="hljs-number">1024</span><br /> },<br /> <span class="hljs-attr">"security"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"headers"</span>: {<br /> <span class="hljs-attr">"X-Content-Type-Options"</span>: <span class="hljs-string">"nosniff"</span>,<br /> <span class="hljs-attr">"X-Frame-Options"</span>: <span class="hljs-string">"DENY"</span>,<br /> <span class="hljs-attr">"X-XSS-Protection"</span>: <span class="hljs-string">"1; mode=block"</span>,<br /> <span class="hljs-attr">"Strict-Transport-Security"</span>: <span class="hljs-string">"max-age=31536000; includeSubDomains"</span><br /> }<br /> }<br /> }<br />}</code></pre>
|
|
90
|
-
|
|
91
|
-
<h2>Configuration Tips</h2>
|
|
92
|
-
|
|
93
|
-
<h3>Security Best Practices</h3>
|
|
94
|
-
<ul>
|
|
95
|
-
<li>Always include patterns to block sensitive files in <code>disallowedRegex</code></li>
|
|
96
|
-
<li>Use strict CORS settings in production</li>
|
|
97
|
-
<li>Enable security headers middleware</li>
|
|
98
|
-
<li>Don't serve source maps in production</li>
|
|
99
|
-
</ul>
|
|
100
|
-
|
|
101
|
-
<h3>Performance Optimization</h3>
|
|
102
|
-
<ul>
|
|
103
|
-
<li>Use <code>noRescanPaths</code> for static assets to improve performance</li>
|
|
104
|
-
<li>Enable compression for larger files</li>
|
|
105
|
-
<li>Use custom routes to serve files from CDN or optimized locations</li>
|
|
106
|
-
<li>Limit <code>maxRescanAttempts</code> to prevent excessive file system scanning</li>
|
|
107
|
-
</ul>
|
|
108
|
-
|
|
109
|
-
<h3>Development vs Production</h3>
|
|
110
|
-
<ul>
|
|
111
|
-
<li>Enable source maps in development, disable in production</li>
|
|
112
|
-
<li>Use relaxed CORS in development, strict in production</li>
|
|
113
|
-
<li>Enable compression in production for better performance</li>
|
|
114
|
-
<li>Add more security headers in production</li>
|
|
115
|
-
</ul>
|
|
116
|
-
</main>
|
|
117
|
-
<div style="height:25vh"></div>
|
|
118
|
-
</body>
|
|
119
|
-
</html>
|
|
1
|
+
<html lang="en" theme="auto">
|
|
2
|
+
<head>
|
|
3
|
+
<meta charset='utf-8'>
|
|
4
|
+
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
|
|
5
|
+
<title>Configuration - Kempo Server</title>
|
|
6
|
+
<meta name='viewport' content='width=device-width, initial-scale=1'>
|
|
7
|
+
<link rel="icon" type="image/png" sizes="48x48" href="media/icon48.png">
|
|
8
|
+
<link rel="manifest" href="manifest.json">
|
|
9
|
+
<link rel="stylesheet" href="essential.css" />
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<main>
|
|
13
|
+
<a href="./" class="btn">Home</a>
|
|
14
|
+
<h1>Configuration</h1>
|
|
15
|
+
<p>Customize Kempo Server's behavior with a simple JSON configuration file.</p>
|
|
16
|
+
|
|
17
|
+
<h2>Configuration File</h2>
|
|
18
|
+
<p>To configure the server create a <code>.config.json</code> within the root directory of your server (<code>public</code> in the start example).</p>
|
|
19
|
+
<p>This json file can have any of the following properties. Any property not defined will use the default configuration.</p>
|
|
20
|
+
|
|
21
|
+
<h2>Configuration Options</h2>
|
|
22
|
+
<ul>
|
|
23
|
+
<li><a href="#allowedMimes">allowedMimes</a> - File types that can be served</li>
|
|
24
|
+
<li><a href="#disallowedRegex">disallowedRegex</a> - Patterns for paths that should be blocked</li>
|
|
25
|
+
<li><a href="#customRoutes">customRoutes</a> - Custom route mappings</li>
|
|
26
|
+
<li><a href="#routeFiles">routeFiles</a> - Files that should be treated as route handlers</li>
|
|
27
|
+
<li><a href="#noRescanPaths">noRescanPaths</a> - Paths that should not trigger file system rescans</li>
|
|
28
|
+
<li><a href="#maxRescanAttempts">maxRescanAttempts</a> - Maximum number of rescan attempts</li>
|
|
29
|
+
<li><a href="#middleware">middleware</a> - Middleware configuration</li>
|
|
30
|
+
</ul>
|
|
31
|
+
|
|
32
|
+
<h3 id="allowedMimes">allowedMimes</h3>
|
|
33
|
+
<p>An object mapping file extensions to their MIME types. Files with extensions not in this list will not be served.</p>
|
|
34
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"jpeg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"gif"</span>: <span class="hljs-string">"image/gif"</span>,<br /> <span class="hljs-attr">"svg"</span>: <span class="hljs-string">"image/svg+xml"</span>,<br /> <span class="hljs-attr">"woff"</span>: <span class="hljs-string">"font/woff"</span>,<br /> <span class="hljs-attr">"woff2"</span>: <span class="hljs-string">"font/woff2"</span><br /> }<br />}</code></pre>
|
|
35
|
+
|
|
36
|
+
<h3 id="disallowedRegex">disallowedRegex</h3>
|
|
37
|
+
<p>An array of regular expressions that match paths that should never be served. This provides security by preventing access to sensitive files.</p>
|
|
38
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>, <span class="hljs-comment">// Hidden files (starting with .)</span><br /> <span class="hljs-string">"\\.env$"</span>, <span class="hljs-comment">// Environment files</span><br /> <span class="hljs-string">"\\.config$"</span>, <span class="hljs-comment">// Configuration files</span><br /> <span class="hljs-string">"password"</span>, <span class="hljs-comment">// Files containing "password"</span><br /> <span class="hljs-string">"node_modules"</span>, <span class="hljs-comment">// Node modules directory</span><br /> <span class="hljs-string">"\\.git"</span> <span class="hljs-comment">// Git directory</span><br /> ]<br />}</code></pre>
|
|
39
|
+
|
|
40
|
+
<h3 id="routeFiles">routeFiles</h3>
|
|
41
|
+
<p>An array of filenames that should be treated as route handlers and executed as JavaScript modules.</p>
|
|
42
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"routeFiles"</span>: [<br /> <span class="hljs-string">"GET.js"</span>,<br /> <span class="hljs-string">"POST.js"</span>,<br /> <span class="hljs-string">"PUT.js"</span>,<br /> <span class="hljs-string">"DELETE.js"</span>,<br /> <span class="hljs-string">"PATCH.js"</span>,<br /> <span class="hljs-string">"HEAD.js"</span>,<br /> <span class="hljs-string">"OPTIONS.js"</span>,<br /> <span class="hljs-string">"index.js"</span><br /> ]<br />}</code></pre>
|
|
43
|
+
|
|
44
|
+
<h3 id="noRescanPaths">noRescanPaths</h3>
|
|
45
|
+
<p>An array of regex patterns for paths that should not trigger a file system rescan. This improves performance for common static assets.</p>
|
|
46
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"noRescanPaths"</span>: [<br /> <span class="hljs-string">"/favicon\\.ico$"</span>,<br /> <span class="hljs-string">"/robots\\.txt$"</span>,<br /> <span class="hljs-string">"\\.map$"</span>,<br /> <span class="hljs-string">"\\.css$"</span>,<br /> <span class="hljs-string">"\\.js$"</span>,<br /> <span class="hljs-string">"\\.png$"</span>,<br /> <span class="hljs-string">"\\.jpg$"</span>,<br /> <span class="hljs-string">"\\.jpeg$"</span>,<br /> <span class="hljs-string">"\\.gif$"</span><br /> ]<br />}</code></pre>
|
|
47
|
+
|
|
48
|
+
<h3 id="customRoutes">customRoutes</h3>
|
|
49
|
+
<p>An object mapping custom route paths to file paths. Useful for aliasing or serving files from outside the document root.</p>
|
|
50
|
+
|
|
51
|
+
<h4>Basic Routes</h4>
|
|
52
|
+
<p>Map specific paths to files:</p>
|
|
53
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"/vendor/bootstrap.css"</span>: <span class="hljs-string">"./node_modules/bootstrap/dist/css/bootstrap.min.css"</span>,<br /> <span class="hljs-attr">"/api/status"</span>: <span class="hljs-string">"./status.js"</span>,<br /> <span class="hljs-attr">"/health"</span>: <span class="hljs-string">"./health-check.js"</span><br /> }<br />}</code></pre>
|
|
54
|
+
|
|
55
|
+
<h4>Wildcard Routes</h4>
|
|
56
|
+
<p>Wildcard routes allow you to map entire directory structures using the <code>*</code> wildcard:</p>
|
|
57
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"kempo/*"</span>: <span class="hljs-string">"./node_modules/kempo/dist/*"</span>,<br /> <span class="hljs-attr">"assets/*"</span>: <span class="hljs-string">"./static-files/*"</span>,<br /> <span class="hljs-attr">"docs/*"</span>: <span class="hljs-string">"./documentation/*"</span>,<br /> <span class="hljs-attr">"lib/*"</span>: <span class="hljs-string">"./node_modules/my-library/build/*"</span><br /> }<br />}</code></pre>
|
|
58
|
+
|
|
59
|
+
<p>With wildcard routes:</p>
|
|
60
|
+
<ul>
|
|
61
|
+
<li><code>kempo/styles.css</code> would serve <code>./node_modules/kempo/dist/styles.css</code></li>
|
|
62
|
+
<li><code>assets/logo.png</code> would serve <code>./static-files/logo.png</code></li>
|
|
63
|
+
<li><code>docs/readme.md</code> would serve <code>./documentation/readme.md</code></li>
|
|
64
|
+
<li><code>lib/utils.js</code> would serve <code>./node_modules/my-library/build/utils.js</code></li>
|
|
65
|
+
</ul>
|
|
66
|
+
<p>The <code>*</code> wildcard matches any single path segment (anything between <code>/</code> characters). Multiple wildcards can be used in a single route pattern.</p>
|
|
67
|
+
|
|
68
|
+
<h3 id="maxRescanAttempts">maxRescanAttempts</h3>
|
|
69
|
+
<p>The maximum number of times to attempt rescanning the file system when a file is not found. Defaults to 3.</p>
|
|
70
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"maxRescanAttempts"</span>: <span class="hljs-number">3</span><br />}</code></pre>
|
|
71
|
+
|
|
72
|
+
<h3 id="middleware">middleware</h3>
|
|
73
|
+
<p>Configuration for built-in and custom middleware. Middleware runs before your route handlers and can modify requests, responses, or handle requests entirely.</p>
|
|
74
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span><br /> },<br /> <span class="hljs-attr">"custom"</span>: [<span class="hljs-string">"./middleware/auth.js"</span>]<br /> }<br />}</code></pre>
|
|
75
|
+
|
|
76
|
+
<h2>Complete Configuration Example</h2>
|
|
77
|
+
<p>Here's a complete example of a <code>.config.json</code> file:</p>
|
|
78
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"jpeg"</span>: <span class="hljs-string">"image/jpeg"</span>,<br /> <span class="hljs-attr">"gif"</span>: <span class="hljs-string">"image/gif"</span>,<br /> <span class="hljs-attr">"svg"</span>: <span class="hljs-string">"image/svg+xml"</span>,<br /> <span class="hljs-attr">"woff"</span>: <span class="hljs-string">"font/woff"</span>,<br /> <span class="hljs-attr">"woff2"</span>: <span class="hljs-string">"font/woff2"</span><br /> },<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>,<br /> <span class="hljs-string">"\\.env$"</span>,<br /> <span class="hljs-string">"\\.config$"</span>,<br /> <span class="hljs-string">"password"</span>,<br /> <span class="hljs-string">"node_modules"</span>,<br /> <span class="hljs-string">"\\.git"</span><br /> ],<br /> <span class="hljs-attr">"routeFiles"</span>: [<br /> <span class="hljs-string">"GET.js"</span>,<br /> <span class="hljs-string">"POST.js"</span>,<br /> <span class="hljs-string">"PUT.js"</span>,<br /> <span class="hljs-string">"DELETE.js"</span>,<br /> <span class="hljs-string">"PATCH.js"</span>,<br /> <span class="hljs-string">"HEAD.js"</span>,<br /> <span class="hljs-string">"OPTIONS.js"</span>,<br /> <span class="hljs-string">"index.js"</span><br /> ],<br /> <span class="hljs-attr">"noRescanPaths"</span>: [<br /> <span class="hljs-string">"/favicon\\.ico$"</span>,<br /> <span class="hljs-string">"/robots\\.txt$"</span>,<br /> <span class="hljs-string">"\\.map$"</span>,<br /> <span class="hljs-string">"\\.css$"</span>,<br /> <span class="hljs-string">"\\.js$"</span>,<br /> <span class="hljs-string">"\\.png$"</span>,<br /> <span class="hljs-string">"\\.jpg$"</span>,<br /> <span class="hljs-string">"\\.jpeg$"</span>,<br /> <span class="hljs-string">"\\.gif$"</span><br /> ],<br /> <span class="hljs-attr">"customRoutes"</span>: {<br /> <span class="hljs-attr">"/vendor/bootstrap.css"</span>: <span class="hljs-string">"./node_modules/bootstrap/dist/css/bootstrap.min.css"</span>,<br /> <span class="hljs-attr">"/vendor/jquery.js"</span>: <span class="hljs-string">"./node_modules/jquery/dist/jquery.min.js"</span>,<br /> <span class="hljs-attr">"assets/*"</span>: <span class="hljs-string">"./static-files/*"</span>,<br /> <span class="hljs-attr">"docs/*"</span>: <span class="hljs-string">"./documentation/*"</span><br /> },<br /> <span class="hljs-attr">"maxRescanAttempts"</span>: <span class="hljs-number">3</span>,<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span>,<br /> <span class="hljs-attr">"methods"</span>: [<span class="hljs-string">"GET"</span>, <span class="hljs-string">"POST"</span>, <span class="hljs-string">"PUT"</span>, <span class="hljs-string">"DELETE"</span>],<br /> <span class="hljs-attr">"headers"</span>: [<span class="hljs-string">"Content-Type"</span>, <span class="hljs-string">"Authorization"</span>]<br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"threshold"</span>: <span class="hljs-number">1024</span><br /> },<br /> <span class="hljs-attr">"security"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"headers"</span>: {<br /> <span class="hljs-attr">"X-Content-Type-Options"</span>: <span class="hljs-string">"nosniff"</span>,<br /> <span class="hljs-attr">"X-Frame-Options"</span>: <span class="hljs-string">"DENY"</span>,<br /> <span class="hljs-attr">"X-XSS-Protection"</span>: <span class="hljs-string">"1; mode=block"</span><br /> }<br /> },<br /> <span class="hljs-attr">"custom"</span>: [<br /> <span class="hljs-string">"./middleware/auth.js"</span>,<br /> <span class="hljs-string">"./middleware/logging.js"</span><br /> ]<br /> }<br />}</code></pre>
|
|
79
|
+
|
|
80
|
+
<h2>Environment-Specific Configuration</h2>
|
|
81
|
+
<p>You can create different configuration files for different environments:</p>
|
|
82
|
+
|
|
83
|
+
<h3>Development Configuration</h3>
|
|
84
|
+
<p>Create <code>.config.dev.json</code> for development:</p>
|
|
85
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"map"</span>: <span class="hljs-string">"application/json"</span><br /> },<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"*"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">false</span><br /> }<br /> }<br />}</code></pre>
|
|
86
|
+
|
|
87
|
+
<h3>Production Configuration</h3>
|
|
88
|
+
<p>Create <code>.config.prod.json</code> for production:</p>
|
|
89
|
+
<pre><code class="hljs json">{<br /> <span class="hljs-attr">"allowedMimes"</span>: {<br /> <span class="hljs-attr">"html"</span>: <span class="hljs-string">"text/html"</span>,<br /> <span class="hljs-attr">"css"</span>: <span class="hljs-string">"text/css"</span>,<br /> <span class="hljs-attr">"js"</span>: <span class="hljs-string">"application/javascript"</span>,<br /> <span class="hljs-attr">"json"</span>: <span class="hljs-string">"application/json"</span>,<br /> <span class="hljs-attr">"png"</span>: <span class="hljs-string">"image/png"</span>,<br /> <span class="hljs-attr">"jpg"</span>: <span class="hljs-string">"image/jpeg"</span><br /> },<br /> <span class="hljs-attr">"disallowedRegex"</span>: [<br /> <span class="hljs-string">"^/\\..*"</span>,<br /> <span class="hljs-string">"\\.env$"</span>,<br /> <span class="hljs-string">"\\.config$"</span>,<br /> <span class="hljs-string">"password"</span>,<br /> <span class="hljs-string">"node_modules"</span>,<br /> <span class="hljs-string">"\\.git"</span>,<br /> <span class="hljs-string">"\\.map$"</span><br /> ],<br /> <span class="hljs-attr">"middleware"</span>: {<br /> <span class="hljs-attr">"cors"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"origin"</span>: <span class="hljs-string">"https://yourdomain.com"</span><br /> },<br /> <span class="hljs-attr">"compression"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"threshold"</span>: <span class="hljs-number">1024</span><br /> },<br /> <span class="hljs-attr">"security"</span>: {<br /> <span class="hljs-attr">"enabled"</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">"headers"</span>: {<br /> <span class="hljs-attr">"X-Content-Type-Options"</span>: <span class="hljs-string">"nosniff"</span>,<br /> <span class="hljs-attr">"X-Frame-Options"</span>: <span class="hljs-string">"DENY"</span>,<br /> <span class="hljs-attr">"X-XSS-Protection"</span>: <span class="hljs-string">"1; mode=block"</span>,<br /> <span class="hljs-attr">"Strict-Transport-Security"</span>: <span class="hljs-string">"max-age=31536000; includeSubDomains"</span><br /> }<br /> }<br /> }<br />}</code></pre>
|
|
90
|
+
|
|
91
|
+
<h2>Configuration Tips</h2>
|
|
92
|
+
|
|
93
|
+
<h3>Security Best Practices</h3>
|
|
94
|
+
<ul>
|
|
95
|
+
<li>Always include patterns to block sensitive files in <code>disallowedRegex</code></li>
|
|
96
|
+
<li>Use strict CORS settings in production</li>
|
|
97
|
+
<li>Enable security headers middleware</li>
|
|
98
|
+
<li>Don't serve source maps in production</li>
|
|
99
|
+
</ul>
|
|
100
|
+
|
|
101
|
+
<h3>Performance Optimization</h3>
|
|
102
|
+
<ul>
|
|
103
|
+
<li>Use <code>noRescanPaths</code> for static assets to improve performance</li>
|
|
104
|
+
<li>Enable compression for larger files</li>
|
|
105
|
+
<li>Use custom routes to serve files from CDN or optimized locations</li>
|
|
106
|
+
<li>Limit <code>maxRescanAttempts</code> to prevent excessive file system scanning</li>
|
|
107
|
+
</ul>
|
|
108
|
+
|
|
109
|
+
<h3>Development vs Production</h3>
|
|
110
|
+
<ul>
|
|
111
|
+
<li>Enable source maps in development, disable in production</li>
|
|
112
|
+
<li>Use relaxed CORS in development, strict in production</li>
|
|
113
|
+
<li>Enable compression in production for better performance</li>
|
|
114
|
+
<li>Add more security headers in production</li>
|
|
115
|
+
</ul>
|
|
116
|
+
</main>
|
|
117
|
+
<div style="height:25vh"></div>
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|