create-kelpie 0.6.0 → 0.7.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/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +1 -0
- package/dist/scaffold.js.map +1 -1
- package/package.json +1 -1
- package/src/scaffold.ts +1 -0
- package/templates/README.md +2 -1
- package/templates/kelpie.config.ts +4 -0
- package/templates/package.json +1 -0
- package/templates/src/migrate.ts +59 -0
- package/templates/src/server.ts +13 -47
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,wEAAwE;AACxE,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,0FAA0F;IAC1F,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,qEAAqE;IACrE,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,wEAAwE;AACxE,qBAAa,aAAc,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA6DD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAkBtD;AAED,gGAAgG;AAChG,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,MAAM,EAAE,CAsBpE"}
|
package/dist/scaffold.js
CHANGED
|
@@ -29,6 +29,7 @@ const TEMPLATE_FILES = new Map([
|
|
|
29
29
|
['kelpie.config.ts', 'kelpie.config.ts'],
|
|
30
30
|
['kelpie.ui.config.ts', 'kelpie.ui.config.ts'],
|
|
31
31
|
['src/server.ts', 'src/server.ts'],
|
|
32
|
+
['src/migrate.ts', 'src/migrate.ts'],
|
|
32
33
|
['src/reseal.ts', 'src/reseal.ts'],
|
|
33
34
|
['web/index.html', 'web/index.html'],
|
|
34
35
|
['web/main.tsx', 'web/main.tsx'],
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/scaffold.ts
CHANGED
|
@@ -50,6 +50,7 @@ const TEMPLATE_FILES: ReadonlyMap<string, string> = new Map([
|
|
|
50
50
|
['kelpie.config.ts', 'kelpie.config.ts'],
|
|
51
51
|
['kelpie.ui.config.ts', 'kelpie.ui.config.ts'],
|
|
52
52
|
['src/server.ts', 'src/server.ts'],
|
|
53
|
+
['src/migrate.ts', 'src/migrate.ts'],
|
|
53
54
|
['src/reseal.ts', 'src/reseal.ts'],
|
|
54
55
|
['web/index.html', 'web/index.html'],
|
|
55
56
|
['web/main.tsx', 'web/main.tsx'],
|
package/templates/README.md
CHANGED
|
@@ -117,7 +117,8 @@ One process now serves the pages and the API on `PORT`. Boot fails if
|
|
|
117
117
|
stops rather than answering every browser with a blank page.
|
|
118
118
|
|
|
119
119
|
Migrations apply at boot. Running more than one instance makes that a race, so
|
|
120
|
-
migrate once in a release step
|
|
120
|
+
migrate once with `npm run migrate` in a release step, then start the instances
|
|
121
|
+
with `--no-migrate`. That command is forward-only and safe to re-run.
|
|
121
122
|
|
|
122
123
|
## Upgrading
|
|
123
124
|
|
|
@@ -57,6 +57,10 @@ export default defineKelpieConfig({
|
|
|
57
57
|
|
|
58
58
|
webBundleDirectory: fromEnv<string | undefined>('WEB_BUNDLE_DIR', z.string().min(1).optional(), undefined),
|
|
59
59
|
moduleConfigPath: fromEnv<string | undefined>('KELPIE_MODULE_CONFIG_PATH', z.string().min(1).optional(), undefined),
|
|
60
|
+
// A human-readable name for this install ("dev", "demo", "cloud"). Read by
|
|
61
|
+
// the browser through `GET /v1/public/config` and shown at the top of the
|
|
62
|
+
// UI on non-production runs.
|
|
63
|
+
siteName: fromEnv<string | undefined>('KELPIE_SITE_NAME', z.string().min(1).optional(), undefined),
|
|
60
64
|
trustedProxyHopCount: fromEnv('TRUSTED_PROXY_HOP_COUNT', nonNegativeInt, 0),
|
|
61
65
|
|
|
62
66
|
// The deployment's base URL. Every emailed link (invite, password reset,
|
package/templates/package.json
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"dev:api": "node --watch --env-file-if-exists=.env src/server.ts",
|
|
12
12
|
"dev:web": "vite",
|
|
13
13
|
"start": "node --env-file-if-exists=.env src/server.ts",
|
|
14
|
+
"migrate": "node --env-file-if-exists=.env src/migrate.ts",
|
|
14
15
|
"reseal": "node --env-file-if-exists=.env src/reseal.ts",
|
|
15
16
|
"build": "vite build",
|
|
16
17
|
"typecheck": "tsc --project tsconfig.server.json && tsc --project tsconfig.web.json"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConfigurationError,
|
|
3
|
+
ModuleBootError,
|
|
4
|
+
ModuleConfigFileError,
|
|
5
|
+
bootAssembly,
|
|
6
|
+
runMigrations,
|
|
7
|
+
} from '@kelpie/server'
|
|
8
|
+
|
|
9
|
+
import kelpieConfig from '../kelpie.config.ts'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Applies every pending migration, then exits.
|
|
13
|
+
*
|
|
14
|
+
* This is the release step `--no-migrate` expects: run it once before starting
|
|
15
|
+
* instances that skip boot-time migration, so applying migrations is not a race
|
|
16
|
+
* between them. Registration runs first, because modules declare their
|
|
17
|
+
* migrations directory while registering and there is nothing to migrate until
|
|
18
|
+
* that pass has finished. Migrations are forward-only and safe to re-run; a
|
|
19
|
+
* second run is a no-op.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
function reportFatal(message: string): void {
|
|
23
|
+
process.stderr.write(`${message}\n`)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function migrate(): Promise<void> {
|
|
27
|
+
const { database, contributions, logger } = await bootAssembly(kelpieConfig, process.env)
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
await runMigrations(database.db, contributions.schemas, logger)
|
|
31
|
+
} finally {
|
|
32
|
+
await database.close()
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
await migrate()
|
|
38
|
+
process.exit(0)
|
|
39
|
+
} catch (error: unknown) {
|
|
40
|
+
if (error instanceof ConfigurationError) {
|
|
41
|
+
reportFatal(error.message)
|
|
42
|
+
reportFatal('Check .env against the table in README.md.')
|
|
43
|
+
process.exit(1)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (error instanceof ModuleConfigFileError) {
|
|
47
|
+
reportFatal(error.message)
|
|
48
|
+
reportFatal('Fix the file at KELPIE_MODULE_CONFIG_PATH, or unset it to let workspaces decide for themselves.')
|
|
49
|
+
process.exit(1)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (error instanceof ModuleBootError) {
|
|
53
|
+
reportFatal(error.message)
|
|
54
|
+
reportFatal('Fix the module list in kelpie.config.ts, or the configuration it needs.')
|
|
55
|
+
process.exit(1)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
throw error
|
|
59
|
+
}
|
package/templates/src/server.ts
CHANGED
|
@@ -5,22 +5,12 @@ import {
|
|
|
5
5
|
ModuleBootError,
|
|
6
6
|
ModuleConfigFileError,
|
|
7
7
|
WebBundleError,
|
|
8
|
-
|
|
8
|
+
bootAssembly,
|
|
9
9
|
createApp,
|
|
10
|
-
createEventBus,
|
|
11
|
-
createIdFactory,
|
|
12
|
-
createLogger,
|
|
13
|
-
createTransactionScope,
|
|
14
|
-
createTransportForDestination,
|
|
15
|
-
readModuleConfigFile,
|
|
16
|
-
registerModules,
|
|
17
|
-
resolveActorFrom,
|
|
18
10
|
resolveClientIpFrom,
|
|
19
|
-
resolveKelpieConfig,
|
|
20
11
|
runMigrations,
|
|
21
12
|
serveWebBundle,
|
|
22
13
|
} from '@kelpie/server'
|
|
23
|
-
import type { CredentialDependencies } from '@kelpie/server'
|
|
24
14
|
|
|
25
15
|
import kelpieConfig from '../kelpie.config.ts'
|
|
26
16
|
|
|
@@ -28,12 +18,13 @@ import kelpieConfig from '../kelpie.config.ts'
|
|
|
28
18
|
* The entry point. It reads the environment, registers the configured modules,
|
|
29
19
|
* applies migrations, wires the dependencies, and serves.
|
|
30
20
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
21
|
+
* The config, database, and registration pass come from `bootAssembly`, shared
|
|
22
|
+
* with the standalone `migrate` command. Registration runs before migrations:
|
|
23
|
+
* modules declare their migrations directory while registering, so there is
|
|
24
|
+
* nothing to migrate until that pass has finished.
|
|
34
25
|
*
|
|
35
|
-
* `--no-migrate` skips the migration step, for deployments where
|
|
36
|
-
* step
|
|
26
|
+
* `--no-migrate` skips the migration step, for deployments where `npm run migrate`
|
|
27
|
+
* migrates once in a release step and many instances then start.
|
|
37
28
|
*/
|
|
38
29
|
|
|
39
30
|
function reportFatal(message: string): void {
|
|
@@ -41,37 +32,10 @@ function reportFatal(message: string): void {
|
|
|
41
32
|
}
|
|
42
33
|
|
|
43
34
|
async function start(): Promise<void> {
|
|
44
|
-
const config =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})
|
|
49
|
-
const database = connectDatabase(config.databaseUrl, logger)
|
|
50
|
-
const events = createEventBus(logger)
|
|
51
|
-
const createId = createIdFactory()
|
|
52
|
-
const credentials: CredentialDependencies = { db: database.db, now: () => new Date() }
|
|
53
|
-
const moduleConfig = readModuleConfigFile(config.moduleConfigPath)
|
|
54
|
-
const contributions = await registerModules({
|
|
55
|
-
modules: kelpieConfig.modules,
|
|
56
|
-
environment: config.env,
|
|
57
|
-
logger,
|
|
58
|
-
events,
|
|
59
|
-
moduleConfig,
|
|
60
|
-
resolveActor: (context) => resolveActorFrom(credentials, context),
|
|
61
|
-
services: {
|
|
62
|
-
db: database.db,
|
|
63
|
-
transaction: createTransactionScope({ db: database.db, bus: events, logger, createId }),
|
|
64
|
-
createId,
|
|
65
|
-
now: () => new Date(),
|
|
66
|
-
appBaseUrl: config.appBaseUrl,
|
|
67
|
-
secretEncryption: config.secretEncryption,
|
|
68
|
-
},
|
|
69
|
-
// `provider` picks a named sender from the runtime's registry. `'log'` is
|
|
70
|
-
// built in; `'smtp'` is registered by the built-in `smtp-email` core
|
|
71
|
-
// module; other names come from third-party provider modules listed in
|
|
72
|
-
// `kelpie.config.ts`. `from` is the address on every outgoing message.
|
|
73
|
-
email: { provider: config.email.EMAIL_PROVIDER, from: config.email.EMAIL_FROM },
|
|
74
|
-
})
|
|
35
|
+
const { config, logger, database, createId, credentials, contributions } = await bootAssembly(
|
|
36
|
+
kelpieConfig,
|
|
37
|
+
process.env,
|
|
38
|
+
)
|
|
75
39
|
|
|
76
40
|
if (process.argv.includes('--no-migrate')) {
|
|
77
41
|
logger.info('skipping migrations', { reason: '--no-migrate' })
|
|
@@ -86,6 +50,8 @@ async function start(): Promise<void> {
|
|
|
86
50
|
credentials,
|
|
87
51
|
createId,
|
|
88
52
|
rateLimit: config.rateLimit,
|
|
53
|
+
runtimeMode: config.runtimeMode,
|
|
54
|
+
siteName: config.siteName,
|
|
89
55
|
// The socket address, then `X-Forwarded-For` only as far as the configured
|
|
90
56
|
// number of trusted proxies allows. Resolved from the connection itself
|
|
91
57
|
// rather than defaulted inside `createApp`, and trusting the header any
|