create-kelpie 0.2.0 → 0.3.0
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/dist/options.d.ts +1 -1
- package/dist/options.d.ts.map +1 -1
- package/dist/options.js +5 -1
- package/dist/options.js.map +1 -1
- package/package.json +2 -2
- package/src/options.ts +5 -1
- package/templates/README.md +24 -0
- package/templates/src/server.ts +23 -0
package/dist/options.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* what this produces, which is what makes it testable.
|
|
7
7
|
*/
|
|
8
8
|
import type { ScaffoldOptions } from './scaffold.ts';
|
|
9
|
-
export declare const USAGE = "Scaffold a self-hosted Kelpie assembly.\n\n npm create kelpie [directory] [options]\n\nOptions:\n --name <name> Package name. Defaults to the directory name\n --database-url <url> postgres:// connection string\n --port <port> API port (default 3000)\n --web-port <port> Dev server port (default 5173)\n --database-port <port> Host port for the bundled Postgres (default 5432)\n --email-from <address> Address transactional mail comes from\n --docker, --no-docker Write a docker-compose.yml for Postgres (default yes)\n --yes Take every default; never prompt\n --help This message\n\nWith --yes and no --database-url, the connection string points at the bundled\nPostgres. Without a terminal to prompt on, --yes is required.";
|
|
9
|
+
export declare const USAGE = "Scaffold a self-hosted Kelpie assembly.\n\n npm create kelpie@latest\n npm create kelpie@latest -- [directory] [options]\n\nThe -- matters once you pass options: without it npm reads flags like --yes as\nits own rather than passing them on.\n\nOptions:\n --name <name> Package name. Defaults to the directory name\n --database-url <url> postgres:// connection string\n --port <port> API port (default 3000)\n --web-port <port> Dev server port (default 5173)\n --database-port <port> Host port for the bundled Postgres (default 5432)\n --email-from <address> Address transactional mail comes from\n --docker, --no-docker Write a docker-compose.yml for Postgres (default yes)\n --yes Take every default; never prompt\n --help This message\n\nWith --yes and no --database-url, the connection string points at the bundled\nPostgres. Without a terminal to prompt on, --yes is required.";
|
|
10
10
|
export interface ParsedArguments {
|
|
11
11
|
readonly directory: string | undefined;
|
|
12
12
|
readonly name: string | undefined;
|
package/dist/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAapD,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAapD,eAAO,MAAM,KAAK,68BAoB4C,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CACvB;AAgBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe,CAqCvE;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,IAAI,MAAM,CAevC;AAgCD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAsC5G"}
|
package/dist/options.js
CHANGED
|
@@ -21,7 +21,11 @@ const SECRET_KEY_BYTES = 32;
|
|
|
21
21
|
const HIGHEST_PORT = 65535;
|
|
22
22
|
export const USAGE = `Scaffold a self-hosted Kelpie assembly.
|
|
23
23
|
|
|
24
|
-
npm create kelpie
|
|
24
|
+
npm create kelpie@latest
|
|
25
|
+
npm create kelpie@latest -- [directory] [options]
|
|
26
|
+
|
|
27
|
+
The -- matters once you pass options: without it npm reads flags like --yes as
|
|
28
|
+
its own rather than passing them on.
|
|
25
29
|
|
|
26
30
|
Options:
|
|
27
31
|
--name <name> Package name. Defaults to the directory name
|
package/dist/options.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAG7C,MAAM,iBAAiB,GAAG,QAAQ,CAAA;AAClC,MAAM,YAAY,GAAG,IAAI,CAAA;AACzB,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,qBAAqB,GAAG,IAAI,CAAA;AAClC,MAAM,kBAAkB,GAAG,oBAAoB,CAAA;AAE/C,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAE3B,MAAM,YAAY,GAAG,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-kelpie",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Scaffold a self-hosted Kelpie assembly. Run it with npm create kelpie.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"kelpie",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"access": "public"
|
|
26
26
|
},
|
|
27
27
|
"bin": {
|
|
28
|
-
"create-kelpie": "
|
|
28
|
+
"create-kelpie": "dist/index.js"
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
31
|
"dist",
|
package/src/options.ts
CHANGED
|
@@ -28,7 +28,11 @@ const HIGHEST_PORT = 65535
|
|
|
28
28
|
|
|
29
29
|
export const USAGE = `Scaffold a self-hosted Kelpie assembly.
|
|
30
30
|
|
|
31
|
-
npm create kelpie
|
|
31
|
+
npm create kelpie@latest
|
|
32
|
+
npm create kelpie@latest -- [directory] [options]
|
|
33
|
+
|
|
34
|
+
The -- matters once you pass options: without it npm reads flags like --yes as
|
|
35
|
+
its own rather than passing them on.
|
|
32
36
|
|
|
33
37
|
Options:
|
|
34
38
|
--name <name> Package name. Defaults to the directory name
|
package/templates/README.md
CHANGED
|
@@ -67,6 +67,10 @@ stops the service at boot and lists every problem at once.
|
|
|
67
67
|
| `SECRET_ENCRYPTION_KEY` | 32 bytes of base64, generated for this project |
|
|
68
68
|
| `SECRET_ENCRYPTION_KEY_PREVIOUS` | Optional. Set only while rotating the key above |
|
|
69
69
|
| `WEBHOOK_DELIVERY_RETENTION_DAYS` | Optional, default 30 |
|
|
70
|
+
| `WEB_BUNDLE_DIR` | Optional. A built web bundle to serve from the same origin as the API. Unset while developing; see Deploying below |
|
|
71
|
+
| `RATE_LIMIT_FORMS_LIMIT` / `RATE_LIMIT_FORMS_WINDOW_SECONDS` | Optional. Requests per window per IP on a public form submit, default 20 / 60 |
|
|
72
|
+
| `RATE_LIMIT_AUTH_LIMIT` / `RATE_LIMIT_AUTH_WINDOW_SECONDS` | Optional. Requests per window per IP on signup, login, and password reset, default 10 / 60 |
|
|
73
|
+
| `RATE_LIMIT_API_LIMIT` / `RATE_LIMIT_API_WINDOW_SECONDS` | Optional. Requests per window per API key on the rest of `/v1`, default 600 / 60 |
|
|
70
74
|
|
|
71
75
|
### Rotating the encryption key
|
|
72
76
|
|
|
@@ -80,6 +84,26 @@ unreadable, so rotate rather than replace:
|
|
|
80
84
|
3. Re-encrypt everything still under the old key. Safe to run more than once.
|
|
81
85
|
4. Remove `SECRET_ENCRYPTION_KEY_PREVIOUS` and deploy again.
|
|
82
86
|
|
|
87
|
+
## Deploying
|
|
88
|
+
|
|
89
|
+
`npm run dev` runs two processes. Vite builds the pages as you edit them and
|
|
90
|
+
passes API calls through to the service, so your browser talks to one address.
|
|
91
|
+
Vite is a development tool and has no part in a deployment.
|
|
92
|
+
|
|
93
|
+
Build the pages once, then point the service at what it wrote:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm run build
|
|
97
|
+
WEB_BUNDLE_DIR=./dist npm start
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
One process now serves the pages and the API on `PORT`. Boot fails if
|
|
101
|
+
`WEB_BUNDLE_DIR` holds no `index.html`, so a deployment whose build did not run
|
|
102
|
+
stops rather than answering every browser with a blank page.
|
|
103
|
+
|
|
104
|
+
Migrations apply at boot. Running more than one instance makes that a race, so
|
|
105
|
+
migrate once in a release step and start the instances with `--no-migrate`.
|
|
106
|
+
|
|
83
107
|
## Upgrading
|
|
84
108
|
|
|
85
109
|
```bash
|
package/templates/src/server.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { serve } from '@hono/node-server'
|
|
2
|
+
import { getConnInfo } from '@hono/node-server/conninfo'
|
|
2
3
|
import {
|
|
3
4
|
ConfigurationError,
|
|
4
5
|
ModuleBootError,
|
|
5
6
|
ModuleConfigFileError,
|
|
7
|
+
WebBundleError,
|
|
6
8
|
connectDatabase,
|
|
7
9
|
createApp,
|
|
8
10
|
createEmailSender,
|
|
@@ -15,6 +17,7 @@ import {
|
|
|
15
17
|
registerModules,
|
|
16
18
|
resolveActorFrom,
|
|
17
19
|
runMigrations,
|
|
20
|
+
serveWebBundle,
|
|
18
21
|
} from '@kelpie/server'
|
|
19
22
|
import type { CredentialDependencies } from '@kelpie/server'
|
|
20
23
|
|
|
@@ -72,8 +75,22 @@ async function start(): Promise<void> {
|
|
|
72
75
|
contributions,
|
|
73
76
|
credentials,
|
|
74
77
|
createId,
|
|
78
|
+
rateLimit: config.rateLimit,
|
|
79
|
+
// The real socket address. A header-based fallback would be spoofable, so
|
|
80
|
+
// this is resolved from the connection itself rather than defaulted
|
|
81
|
+
// inside `createApp`.
|
|
82
|
+
resolveClientIp: (context) => getConnInfo(context).remote.address ?? 'unknown',
|
|
75
83
|
})
|
|
76
84
|
|
|
85
|
+
// After `createApp`, so every API route is registered ahead of the fallback.
|
|
86
|
+
// Unset while developing, where the Vite dev server builds the pages itself
|
|
87
|
+
// and proxies `/v1` here. Set it in a deployment, after `npm run build`, and
|
|
88
|
+
// one process serves the pages and the API on one address.
|
|
89
|
+
if (config.webBundleDirectory !== undefined) {
|
|
90
|
+
serveWebBundle(app, { directory: config.webBundleDirectory })
|
|
91
|
+
logger.info('serving web bundle', { directory: config.webBundleDirectory })
|
|
92
|
+
}
|
|
93
|
+
|
|
77
94
|
const server = serve({ fetch: app.fetch, port: config.port }, (address) => {
|
|
78
95
|
logger.info('listening', { port: address.port, runtimeMode: config.runtimeMode })
|
|
79
96
|
})
|
|
@@ -114,5 +131,11 @@ try {
|
|
|
114
131
|
process.exit(1)
|
|
115
132
|
}
|
|
116
133
|
|
|
134
|
+
if (error instanceof WebBundleError) {
|
|
135
|
+
reportFatal(error.message)
|
|
136
|
+
reportFatal('Run `npm run build` to produce one, or unset WEB_BUNDLE_DIR to serve the API alone.')
|
|
137
|
+
process.exit(1)
|
|
138
|
+
}
|
|
139
|
+
|
|
117
140
|
throw error
|
|
118
141
|
}
|