@webstir-io/webstir-backend 0.1.15 → 0.1.16

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 (123) hide show
  1. package/README.md +106 -79
  2. package/dist/add.d.ts +59 -0
  3. package/dist/add.js +626 -0
  4. package/dist/build/artifacts.d.ts +115 -1
  5. package/dist/build/artifacts.js +4 -4
  6. package/dist/build/entries.js +1 -1
  7. package/dist/build/pipeline.d.ts +33 -1
  8. package/dist/build/pipeline.js +307 -65
  9. package/dist/cache/diff.js +9 -8
  10. package/dist/cache/reporters.js +1 -1
  11. package/dist/deploy-cli.d.ts +2 -0
  12. package/dist/deploy-cli.js +86 -0
  13. package/dist/diagnostics/summary.js +2 -2
  14. package/dist/index.d.ts +6 -0
  15. package/dist/index.js +4 -0
  16. package/dist/manifest/pipeline.js +103 -32
  17. package/dist/provider.js +35 -17
  18. package/dist/runtime/bun.d.ts +51 -0
  19. package/dist/runtime/bun.js +499 -0
  20. package/dist/runtime/core.d.ts +141 -0
  21. package/dist/runtime/core.js +316 -0
  22. package/dist/runtime/deploy-backend.d.ts +20 -0
  23. package/dist/runtime/deploy-backend.js +175 -0
  24. package/dist/runtime/deploy-shared.d.ts +43 -0
  25. package/dist/runtime/deploy-shared.js +75 -0
  26. package/dist/runtime/deploy-static.d.ts +2 -0
  27. package/dist/runtime/deploy-static.js +161 -0
  28. package/dist/runtime/deploy.d.ts +3 -0
  29. package/dist/runtime/deploy.js +91 -0
  30. package/dist/runtime/forms.d.ts +73 -0
  31. package/dist/runtime/forms.js +236 -0
  32. package/dist/runtime/request-hooks.d.ts +47 -0
  33. package/dist/runtime/request-hooks.js +102 -0
  34. package/dist/runtime/session-metadata.d.ts +13 -0
  35. package/dist/runtime/session-metadata.js +98 -0
  36. package/dist/runtime/session-runtime.d.ts +28 -0
  37. package/dist/runtime/session-runtime.js +180 -0
  38. package/dist/runtime/session.d.ts +83 -0
  39. package/dist/runtime/session.js +396 -0
  40. package/dist/runtime/views.d.ts +74 -0
  41. package/dist/runtime/views.js +221 -0
  42. package/dist/scaffold/assets.js +25 -21
  43. package/dist/testing/context.js +1 -1
  44. package/dist/testing/index.d.ts +1 -1
  45. package/dist/testing/index.js +100 -56
  46. package/dist/utils/bun.d.ts +2 -0
  47. package/dist/utils/bun.js +13 -0
  48. package/dist/watch.d.ts +13 -1
  49. package/dist/watch.js +345 -97
  50. package/dist/workspace.d.ts +8 -0
  51. package/dist/workspace.js +44 -3
  52. package/package.json +49 -14
  53. package/scripts/publish.sh +2 -92
  54. package/scripts/smoke.mjs +282 -107
  55. package/scripts/update-contract.sh +12 -10
  56. package/src/add.ts +964 -0
  57. package/src/build/artifacts.ts +49 -46
  58. package/src/build/entries.ts +12 -12
  59. package/src/build/pipeline.ts +779 -403
  60. package/src/cache/diff.ts +111 -105
  61. package/src/cache/reporters.ts +26 -26
  62. package/src/deploy-cli.ts +111 -0
  63. package/src/diagnostics/summary.ts +28 -22
  64. package/src/index.ts +11 -0
  65. package/src/manifest/pipeline.ts +328 -215
  66. package/src/provider.ts +115 -98
  67. package/src/runtime/bun.ts +793 -0
  68. package/src/runtime/core.ts +598 -0
  69. package/src/runtime/deploy-backend.ts +239 -0
  70. package/src/runtime/deploy-shared.ts +136 -0
  71. package/src/runtime/deploy-static.ts +191 -0
  72. package/src/runtime/deploy.ts +143 -0
  73. package/src/runtime/forms.ts +364 -0
  74. package/src/runtime/request-hooks.ts +165 -0
  75. package/src/runtime/session-metadata.ts +135 -0
  76. package/src/runtime/session-runtime.ts +267 -0
  77. package/src/runtime/session.ts +642 -0
  78. package/src/runtime/views.ts +385 -0
  79. package/src/scaffold/assets.ts +77 -73
  80. package/src/testing/context.js +8 -9
  81. package/src/testing/context.ts +9 -9
  82. package/src/testing/index.d.ts +14 -3
  83. package/src/testing/index.js +254 -175
  84. package/src/testing/index.ts +298 -195
  85. package/src/testing/types.d.ts +18 -19
  86. package/src/testing/types.ts +18 -18
  87. package/src/utils/bun.ts +26 -0
  88. package/src/watch.ts +503 -99
  89. package/src/workspace.ts +59 -3
  90. package/templates/backend/.env.example +15 -0
  91. package/templates/backend/auth/adapter.ts +335 -36
  92. package/templates/backend/db/connection.ts +190 -65
  93. package/templates/backend/db/migrate.ts +149 -43
  94. package/templates/backend/db/types.d.ts +1 -1
  95. package/templates/backend/env.ts +132 -20
  96. package/templates/backend/functions/hello/index.ts +1 -2
  97. package/templates/backend/index.ts +15 -508
  98. package/templates/backend/jobs/nightly/index.ts +1 -1
  99. package/templates/backend/jobs/runtime.ts +24 -11
  100. package/templates/backend/jobs/scheduler.ts +208 -46
  101. package/templates/backend/module.ts +227 -13
  102. package/templates/backend/observability/logger.ts +2 -12
  103. package/templates/backend/observability/metrics.ts +8 -5
  104. package/templates/backend/session/sqlite.ts +152 -0
  105. package/templates/backend/session/store.ts +45 -0
  106. package/templates/backend/tsconfig.json +1 -1
  107. package/tests/add.test.js +327 -0
  108. package/tests/authAdapter.test.js +315 -0
  109. package/tests/bundlerParity.test.js +217 -0
  110. package/tests/cacheReporter.test.js +10 -10
  111. package/tests/dbConnection.test.js +209 -0
  112. package/tests/deploy.test.js +357 -0
  113. package/tests/envLoader.test.js +271 -17
  114. package/tests/integration.test.js +2432 -3
  115. package/tests/jobsScheduler.test.js +253 -0
  116. package/tests/manifest.test.js +287 -12
  117. package/tests/migrationRunner.test.js +249 -0
  118. package/tests/sessionScaffoldStore.test.js +752 -0
  119. package/tests/sessionStore.test.js +490 -0
  120. package/tests/testing.test.js +252 -0
  121. package/tests/watch.test.js +192 -32
  122. package/tsconfig.json +3 -10
  123. package/templates/backend/server/fastify.ts +0 -288
package/src/provider.ts CHANGED
@@ -1,124 +1,141 @@
1
1
  import path from 'node:path';
2
2
  import { existsSync } from 'node:fs';
3
3
 
4
- import type {
5
- ModuleBuildOptions,
6
- ModuleBuildResult,
7
- ModuleDiagnostic,
8
- ModuleManifest,
9
- ModuleProvider
10
- } from '@webstir-io/module-contract';
4
+ import type { ModuleDiagnostic, ModuleProvider } from '@webstir-io/module-contract';
11
5
 
12
6
  import { collectArtifacts, createBuildManifest } from './build/artifacts.js';
13
- import { buildSupportFile, runBackendBuildPipeline } from './build/pipeline.js';
7
+ import {
8
+ buildSupportFile,
9
+ resolveBackendBundler,
10
+ runBackendBuildPipeline,
11
+ } from './build/pipeline.js';
14
12
  import { loadBackendModuleManifest } from './manifest/pipeline.js';
15
13
  import { createCacheReporter } from './cache/reporters.js';
16
- import { pushEntryBucketSummary, normalizeLogLevel, filterDiagnostics } from './diagnostics/summary.js';
14
+ import { normalizeLogLevel, filterDiagnostics } from './diagnostics/summary.js';
17
15
  import { getBackendScaffoldAssets } from './scaffold/assets.js';
18
- import { normalizeMode, resolveWorkspacePaths } from './workspace.js';
16
+ import { normalizeMode, resolveWorkspacePaths, resolveWorkspaceRoot } from './workspace.js';
19
17
 
20
18
  import packageJson from '../package.json' with { type: 'json' };
21
19
 
22
20
  interface PackageJson {
23
- readonly name: string;
24
- readonly version: string;
25
- readonly engines?: {
26
- readonly node?: string;
27
- };
21
+ readonly name: string;
22
+ readonly version: string;
23
+ readonly engines?: {
24
+ readonly node?: string;
25
+ readonly bun?: string;
26
+ };
28
27
  }
29
28
 
30
29
  const pkg = packageJson as PackageJson;
31
30
 
32
31
  export const backendProvider: ModuleProvider = {
33
- metadata: {
34
- id: pkg.name ?? '@webstir-io/webstir-backend',
35
- kind: 'backend',
36
- version: pkg.version ?? '0.0.0',
37
- compatibility: {
38
- minCliVersion: '0.1.0',
39
- nodeRange: pkg.engines?.node ?? '>=20.18.1'
40
- }
41
- },
42
- resolveWorkspace(options) {
43
- return resolveWorkspacePaths(options.workspaceRoot);
32
+ metadata: {
33
+ id: pkg.name ?? '@webstir-io/webstir-backend',
34
+ kind: 'backend',
35
+ version: pkg.version ?? '0.0.0',
36
+ compatibility: {
37
+ minCliVersion: '0.1.0',
38
+ nodeRange: pkg.engines?.node ?? '>=20.18.1',
39
+ ...(pkg.engines?.bun ? { notes: `Requires Bun ${pkg.engines.bun} at runtime.` } : {}),
44
40
  },
45
- async build(options) {
46
- const paths = resolveWorkspacePaths(options.workspaceRoot);
47
- const tsconfigPath = path.join(paths.sourceRoot, 'tsconfig.json');
41
+ },
42
+ resolveWorkspace(options) {
43
+ const workspaceRoot = resolveWorkspaceRoot({
44
+ workspaceRoot: options.workspaceRoot,
45
+ });
46
+ return resolveWorkspacePaths(workspaceRoot);
47
+ },
48
+ async build(options) {
49
+ const env = options.env ?? {};
50
+ const workspaceRoot = resolveWorkspaceRoot({
51
+ workspaceRoot: options.workspaceRoot,
52
+ env,
53
+ });
54
+ const paths = resolveWorkspacePaths(workspaceRoot);
55
+ const tsconfigPath = path.join(paths.sourceRoot, 'tsconfig.json');
48
56
 
49
- const diagnostics: ModuleDiagnostic[] = [];
57
+ const diagnostics: ModuleDiagnostic[] = [];
50
58
 
51
- const incremental = options.incremental === true;
52
- const env = options.env ?? {};
53
- const mode = normalizeMode(env.WEBSTIR_MODULE_MODE);
54
- console.info(`[webstir-backend] ${mode}:start`);
59
+ const incremental = options.incremental === true;
60
+ const mode = normalizeMode(env.WEBSTIR_MODULE_MODE);
61
+ const bundler = resolveBackendBundler({
62
+ env,
63
+ incremental,
64
+ diagnostics,
65
+ });
66
+ console.info(`[webstir-backend] ${mode}:start`);
55
67
 
56
- const { entryPoints, outputs, includePublishSourcemaps } = await runBackendBuildPipeline({
57
- sourceRoot: paths.sourceRoot,
58
- buildRoot: paths.buildRoot,
59
- tsconfigPath,
60
- mode,
61
- env,
62
- incremental,
63
- diagnostics
64
- });
65
-
66
- const artifacts = await collectArtifacts(paths.buildRoot, includePublishSourcemaps);
67
- const envSource = path.join(paths.sourceRoot, 'env.ts');
68
- if (existsSync(envSource)) {
69
- try {
70
- await buildSupportFile({
71
- sourceFile: envSource,
72
- sourceRoot: paths.sourceRoot,
73
- buildRoot: paths.buildRoot,
74
- tsconfigPath,
75
- mode,
76
- env,
77
- diagnostics
78
- });
79
- } catch {
80
- // env compilation errors are already captured in diagnostics
81
- }
82
- }
83
- const moduleManifest = await loadBackendModuleManifest({
84
- workspaceRoot: options.workspaceRoot,
85
- buildRoot: paths.buildRoot,
86
- entryPoints,
87
- diagnostics
88
- });
89
- const manifest = createBuildManifest(paths.buildRoot, artifacts, diagnostics, moduleManifest);
68
+ const { entryPoints, outputs, includePublishSourcemaps } = await runBackendBuildPipeline({
69
+ sourceRoot: paths.sourceRoot,
70
+ buildRoot: paths.buildRoot,
71
+ tsconfigPath,
72
+ mode,
73
+ env,
74
+ incremental,
75
+ diagnostics,
76
+ bundler,
77
+ });
90
78
 
91
- console.info(`[webstir-backend] ${mode}:complete (entries=${manifest.entryPoints.length})`);
92
- diagnostics.push({ severity: 'info', message: `[webstir-backend] ${mode}:built entries=${manifest.entryPoints.length}` });
93
- const cacheReporter = createCacheReporter({
94
- workspaceRoot: options.workspaceRoot,
95
- buildRoot: paths.buildRoot,
96
- env,
97
- diagnostics
79
+ const artifacts = await collectArtifacts(paths.buildRoot, includePublishSourcemaps);
80
+ const envSource = path.join(paths.sourceRoot, 'env.ts');
81
+ if (existsSync(envSource)) {
82
+ try {
83
+ await buildSupportFile({
84
+ sourceFile: envSource,
85
+ sourceRoot: paths.sourceRoot,
86
+ buildRoot: paths.buildRoot,
87
+ tsconfigPath,
88
+ mode,
89
+ env,
90
+ diagnostics,
91
+ bundler,
98
92
  });
99
- try {
100
- await cacheReporter.diffOutputs(outputs, mode);
101
- } catch {
102
- // ignore cache errors
103
- }
104
- try {
105
- await cacheReporter.diffManifest(moduleManifest);
106
- } catch {
107
- // ignore cache errors
108
- }
109
- // Optionally filter diagnostics by severity for orchestrator consumption
110
- const minLevel = normalizeLogLevel(env.WEBSTIR_BACKEND_LOG_LEVEL);
111
- const filteredDiagnostics = filterDiagnostics(manifest.diagnostics, minLevel);
93
+ } catch {
94
+ // env compilation errors are already captured in diagnostics
95
+ }
96
+ }
97
+ const moduleManifest = await loadBackendModuleManifest({
98
+ workspaceRoot,
99
+ buildRoot: paths.buildRoot,
100
+ entryPoints,
101
+ diagnostics,
102
+ });
103
+ const manifest = createBuildManifest(paths.buildRoot, artifacts, diagnostics, moduleManifest);
112
104
 
113
- return {
114
- artifacts,
115
- manifest: {
116
- ...manifest,
117
- diagnostics: filteredDiagnostics
118
- }
119
- };
120
- },
121
- async getScaffoldAssets() {
122
- return await getBackendScaffoldAssets();
105
+ console.info(`[webstir-backend] ${mode}:complete (entries=${manifest.entryPoints.length})`);
106
+ diagnostics.push({
107
+ severity: 'info',
108
+ message: `[webstir-backend] ${mode}:built entries=${manifest.entryPoints.length}`,
109
+ });
110
+ const cacheReporter = createCacheReporter({
111
+ workspaceRoot,
112
+ buildRoot: paths.buildRoot,
113
+ env,
114
+ diagnostics,
115
+ });
116
+ try {
117
+ await cacheReporter.diffOutputs(outputs, mode);
118
+ } catch {
119
+ // ignore cache errors
120
+ }
121
+ try {
122
+ await cacheReporter.diffManifest(moduleManifest);
123
+ } catch {
124
+ // ignore cache errors
123
125
  }
126
+ // Optionally filter diagnostics by severity for orchestrator consumption
127
+ const minLevel = normalizeLogLevel(env.WEBSTIR_BACKEND_LOG_LEVEL);
128
+ const filteredDiagnostics = filterDiagnostics(manifest.diagnostics, minLevel);
129
+
130
+ return {
131
+ artifacts,
132
+ manifest: {
133
+ ...manifest,
134
+ diagnostics: filteredDiagnostics,
135
+ },
136
+ };
137
+ },
138
+ async getScaffoldAssets() {
139
+ return await getBackendScaffoldAssets();
140
+ },
124
141
  };