@rehearsal-db/core 0.1.0-beta.13 → 0.1.0-beta.15

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 (169) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +4 -1
  3. package/dist/package.json +100 -0
  4. package/dist/scripts/install/create_root_config.d.mts +3 -0
  5. package/dist/scripts/install/create_root_config.mjs +13 -0
  6. package/dist/scripts/runtime/manage_database.d.mts +6 -0
  7. package/{scripts → dist/scripts}/runtime/manage_database.mjs +6 -8
  8. package/dist/src/application/session.d.mts +96 -0
  9. package/dist/src/application/session.mjs +380 -0
  10. package/dist/src/baseline/artifact.d.mts +119 -0
  11. package/dist/src/baseline/artifact.mjs +522 -0
  12. package/dist/src/baseline/builder.d.mts +19 -0
  13. package/dist/src/baseline/builder.mjs +142 -0
  14. package/dist/src/baseline/input_discovery.d.mts +13 -0
  15. package/dist/src/baseline/input_discovery.mjs +149 -0
  16. package/dist/src/baseline/policy_review.d.mts +56 -0
  17. package/dist/src/baseline/policy_review.mjs +73 -0
  18. package/dist/src/baseline/preparation.d.mts +63 -0
  19. package/dist/src/baseline/preparation.mjs +295 -0
  20. package/dist/src/baseline/privacy_engine.d.mts +162 -0
  21. package/dist/src/baseline/privacy_engine.mjs +1162 -0
  22. package/dist/src/baseline/privacy_structured_json.d.mts +66 -0
  23. package/dist/src/baseline/privacy_structured_json.mjs +464 -0
  24. package/dist/src/baseline/sanitization_policy.d.mts +69 -0
  25. package/dist/src/baseline/sanitization_policy.mjs +227 -0
  26. package/dist/src/baseline/schema_snapshot.d.mts +19 -0
  27. package/dist/src/baseline/schema_snapshot.mjs +79 -0
  28. package/dist/src/cli/arguments.d.mts +43 -0
  29. package/dist/src/cli/arguments.mjs +135 -0
  30. package/dist/src/cli/guided.d.mts +51 -0
  31. package/dist/src/cli/guided.mjs +713 -0
  32. package/dist/src/cli/init_command.d.mts +21 -0
  33. package/dist/src/cli/init_command.mjs +90 -0
  34. package/dist/src/cli/project_commands.d.mts +157 -0
  35. package/dist/src/cli/project_commands.mjs +183 -0
  36. package/dist/src/cli/rehearsal.d.mts +7 -0
  37. package/dist/src/cli/rehearsal.mjs +706 -0
  38. package/dist/src/cli/renderers.d.mts +299 -0
  39. package/dist/src/cli/renderers.mjs +554 -0
  40. package/dist/src/cli/runtime_commands.d.mts +265 -0
  41. package/dist/src/cli/runtime_commands.mjs +599 -0
  42. package/dist/src/cli/source_commands.d.mts +432 -0
  43. package/dist/src/cli/source_commands.mjs +299 -0
  44. package/dist/src/cli/terminal.d.mts +59 -0
  45. package/dist/src/cli/terminal.mjs +230 -0
  46. package/dist/src/identity/claim.d.mts +144 -0
  47. package/dist/src/identity/claim.mjs +947 -0
  48. package/dist/src/identity/provider_configuration.d.mts +37 -0
  49. package/dist/src/identity/provider_configuration.mjs +132 -0
  50. package/dist/src/identity/storage.d.mts +21 -0
  51. package/dist/src/identity/storage.mjs +122 -0
  52. package/dist/src/index.d.mts +4 -0
  53. package/dist/src/index.mjs +3 -0
  54. package/dist/src/project/configuration.d.mts +181 -0
  55. package/dist/src/project/configuration.mjs +958 -0
  56. package/dist/src/project/install_scaffold.d.mts +42 -0
  57. package/dist/src/project/install_scaffold.mjs +263 -0
  58. package/dist/src/project/setup.d.mts +87 -0
  59. package/dist/src/project/setup.mjs +414 -0
  60. package/dist/src/project/support_report.d.mts +88 -0
  61. package/dist/src/project/support_report.mjs +83 -0
  62. package/dist/src/runtime/cleanup.d.mts +85 -0
  63. package/dist/src/runtime/cleanup.mjs +311 -0
  64. package/dist/src/runtime/migration_history.d.mts +51 -0
  65. package/dist/src/runtime/migration_history.mjs +170 -0
  66. package/dist/src/runtime/plan.d.mts +134 -0
  67. package/dist/src/runtime/plan.mjs +636 -0
  68. package/dist/src/runtime/policy.d.mts +66 -0
  69. package/dist/src/runtime/policy.mjs +369 -0
  70. package/dist/src/runtime/restore.d.mts +22 -0
  71. package/dist/src/runtime/restore.mjs +276 -0
  72. package/dist/src/runtime/service_environment.d.mts +11 -0
  73. package/dist/src/runtime/service_environment.mjs +58 -0
  74. package/dist/src/runtime/topology.d.mts +51 -0
  75. package/dist/src/runtime/topology.mjs +128 -0
  76. package/dist/src/shared/diagnostics.d.mts +97 -0
  77. package/dist/src/shared/diagnostics.mjs +170 -0
  78. package/dist/src/shared/human_output.d.mts +2 -0
  79. package/{src → dist/src}/shared/human_output.mjs +1 -3
  80. package/dist/src/shared/node_runtime.d.mts +14 -0
  81. package/dist/src/shared/node_runtime.mjs +25 -0
  82. package/dist/src/shared/operation_guard.d.mts +22 -0
  83. package/dist/src/shared/operation_guard.mjs +150 -0
  84. package/dist/src/shared/process_environment.d.mts +15 -0
  85. package/dist/src/shared/process_environment.mjs +50 -0
  86. package/dist/src/source/access.d.mts +165 -0
  87. package/dist/src/source/access.mjs +602 -0
  88. package/dist/src/source/asset_transfer.d.mts +27 -0
  89. package/dist/src/source/asset_transfer.mjs +202 -0
  90. package/dist/src/source/baseline.d.mts +66 -0
  91. package/dist/src/source/baseline.mjs +372 -0
  92. package/dist/src/source/external_reader.d.mts +42 -0
  93. package/dist/src/source/external_reader.mjs +278 -0
  94. package/dist/src/source/postgresql_access.d.mts +86 -0
  95. package/dist/src/source/postgresql_access.mjs +454 -0
  96. package/dist/src/source/privacy_paths.d.mts +10 -0
  97. package/dist/src/source/privacy_paths.mjs +27 -0
  98. package/dist/src/targets/driver.d.mts +2 -0
  99. package/dist/src/targets/driver.mjs +13 -0
  100. package/dist/src/targets/postgresql.d.mts +5 -0
  101. package/dist/src/targets/postgresql.mjs +641 -0
  102. package/dist/src/targets/supabase.d.mts +8 -0
  103. package/dist/src/targets/supabase.mjs +659 -0
  104. package/dist/src/targets/supabase_environment.d.mts +49 -0
  105. package/dist/src/targets/supabase_environment.mjs +162 -0
  106. package/dist/src/targets/target.d.mts +33 -0
  107. package/dist/src/targets/target.mjs +39 -0
  108. package/docs/README.md +1 -0
  109. package/docs/architecture.md +17 -9
  110. package/docs/configuration.md +49 -8
  111. package/docs/getting-started.md +28 -0
  112. package/docs/index.md +1 -0
  113. package/docs/production-source.md +43 -7
  114. package/docs/releasing.md +5 -3
  115. package/docs/roadmap.md +3 -2
  116. package/docs/sanitization.md +415 -14
  117. package/docs/standalone-workflow.md +12 -6
  118. package/docs/troubleshooting.md +5 -1
  119. package/docs/tutorial.md +5 -0
  120. package/docs/typescript.md +87 -0
  121. package/package.json +35 -29
  122. package/scripts/install/create_root_config.mjs +0 -36
  123. package/src/README.md +0 -17
  124. package/src/application/session.mjs +0 -435
  125. package/src/baseline/artifact.mjs +0 -684
  126. package/src/baseline/builder.mjs +0 -164
  127. package/src/baseline/input_discovery.mjs +0 -155
  128. package/src/baseline/policy_review.mjs +0 -92
  129. package/src/baseline/preparation.mjs +0 -323
  130. package/src/baseline/privacy_engine.mjs +0 -952
  131. package/src/baseline/sanitization_policy.mjs +0 -299
  132. package/src/baseline/schema_snapshot.mjs +0 -113
  133. package/src/cli/arguments.mjs +0 -126
  134. package/src/cli/guided.mjs +0 -814
  135. package/src/cli/init_command.mjs +0 -94
  136. package/src/cli/rehearsal.mjs +0 -970
  137. package/src/cli/renderers.mjs +0 -626
  138. package/src/cli/runtime_commands.mjs +0 -707
  139. package/src/cli/source_commands.mjs +0 -347
  140. package/src/cli/terminal.mjs +0 -275
  141. package/src/identity/claim.mjs +0 -1163
  142. package/src/identity/provider_configuration.mjs +0 -177
  143. package/src/identity/storage.mjs +0 -165
  144. package/src/project/configuration.mjs +0 -1337
  145. package/src/project/install_scaffold.mjs +0 -291
  146. package/src/project/setup.mjs +0 -466
  147. package/src/project/support_report.mjs +0 -105
  148. package/src/runtime/cleanup.mjs +0 -381
  149. package/src/runtime/migration_history.mjs +0 -220
  150. package/src/runtime/plan.mjs +0 -722
  151. package/src/runtime/policy.mjs +0 -438
  152. package/src/runtime/restore.mjs +0 -337
  153. package/src/runtime/service_environment.mjs +0 -82
  154. package/src/runtime/topology.mjs +0 -177
  155. package/src/shared/diagnostics.mjs +0 -207
  156. package/src/shared/node_runtime.mjs +0 -31
  157. package/src/shared/operation_guard.mjs +0 -162
  158. package/src/shared/process_environment.mjs +0 -68
  159. package/src/source/access.mjs +0 -753
  160. package/src/source/asset_transfer.mjs +0 -207
  161. package/src/source/baseline.mjs +0 -482
  162. package/src/source/external_reader.mjs +0 -255
  163. package/src/source/postgresql_access.mjs +0 -581
  164. package/src/source/privacy_paths.mjs +0 -38
  165. package/src/targets/postgresql.mjs +0 -808
  166. package/src/targets/supabase.mjs +0 -840
  167. package/src/targets/supabase_environment.mjs +0 -229
  168. package/src/targets/target.mjs +0 -66
  169. /package/{src/project → types}/configuration.d.mts +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,99 @@ a Changelog, and versions will follow Semantic Versioning after the package exis
7
7
 
8
8
  ### Added
9
9
 
10
+ - A strict, no-emit TypeScript gate now checks the first shared runtime utilities and
11
+ verifies that consumers can compile against Rehearsal's public configuration types.
12
+ - The documentation site now explains the supported TypeScript surface with examples
13
+ that are compiled and checked against their rendered documentation source.
14
+ - All shipped implementation and executable-helper source now uses TypeScript. Clean
15
+ builds emit Node-compatible ESM and declarations into the reviewed package boundary,
16
+ and tests exercise that compiled output rather than an alternate source path.
17
+ - The published build omits repository-only JavaScript source maps while retaining
18
+ runtime JavaScript and declarations, keeping the installed package compact.
19
+
20
+ ### Fixed
21
+
22
+ - Packed onboarding chooses an available local port block for preserved configuration
23
+ fixtures, so unrelated running Rehearsal projects cannot make the isolation test fail.
24
+
25
+ ## [0.1.0-beta.14] - 2026-10-05
26
+
27
+ ### Added
28
+
29
+ - Packed-package onboarding is now a required CI job. It covers fresh Supabase and
30
+ PostgreSQL installs, beta.7 configuration preservation, missing credentials, occupied
31
+ ports, malformed configuration, and non-destructive partial-setup recovery.
32
+ - The independent test lab can run the same first-install boundary against an exact
33
+ candidate tarball before either database lifecycle.
34
+ - Installation and setup now report the exact active Rehearsal configuration path and
35
+ explain when a supported existing nested config prevents root-file generation.
36
+ - Packed-package onboarding covers fresh, nested, existing-root, and repeated installs
37
+ while proving reviewed configuration bytes are preserved.
38
+ - Privacy policy version 2 can explicitly treat nullable owners as non-matches and match
39
+ an approved owner through any of a bounded list of pseudonymized identity columns.
40
+ - Bounded JSON unions classify each permitted root type, while JSON dictionaries require
41
+ reviewed runtime-key formats, key actions, value recipes, and item/depth/byte limits.
42
+ - JSON dictionaries can restrict runtime keys to canonical signed integers within an
43
+ explicit safe-integer range, preserving positive, negative, and reviewed zero keys
44
+ without widening numeric maps to arbitrary text.
45
+ - Date shifting can explicitly preserve numeric epoch-millisecond representation,
46
+ including inside structured JSON, while sharing a stable grouped offset with related
47
+ epoch or ISO-string dates.
48
+ - Bounded scalar enums retain only explicitly reviewed structural strings, finite
49
+ numbers, or booleans inside ordinary fields and nested JSON declarations, rejecting
50
+ out-of-domain values without echoing them in diagnostics.
51
+ - Validated strings preserve bounded, case-sensitive structural codes from open domains
52
+ using a package-owned portable alphabet, refusing credential-shaped and malformed
53
+ text without consumer regexes, callbacks, or static identifier lists.
54
+ - Keyed hexadecimal and GTIN pseudonyms preserve reviewed database constraints, while
55
+ fixed-width digest recipes derive fingerprints only from explicitly named sanitized
56
+ columns and reject missing, excluded, duplicate, or cyclic inputs.
57
+ - A single GTIN recipe can declare reviewed `allowedLengths`, preserving each source
58
+ value's 8-, 12-, 13-, or 14-digit shape and check digit even inside structured JSON.
59
+ - Keyed URL pseudonyms replace private HTTPS URLs with deterministic, bounded HTTPS
60
+ loopback paths without retaining source hosts, paths, credentials, queries, or tokens.
61
+ - Bounded binding substitution can retain permitted surrounding text while replacing
62
+ exact occurrences of a reviewed UUID with its corresponding keyed UUID pseudonym.
63
+ - External PostgreSQL readers can declare a bounded exact allowlist of provider-owned
64
+ permission groups. Rehearsal verifies safe membership options, group attributes,
65
+ nesting, view ownership, and the complete effective privilege surface.
66
+
67
+ ### Documentation
68
+
69
+ - First-time users now have a short recovery table for interrupted setup, failed
70
+ upgrades, port conflicts, missing OAuth credentials, and low Docker capacity.
71
+ - The configuration guide documents a safe manual move to the project root, separating
72
+ config-file-relative JavaScript imports from project-root-relative Rehearsal paths.
73
+ - The sanitization guide documents nullable and multi-column ownership, heterogeneous
74
+ JSON values, runtime-keyed dictionaries, keyed HTTPS replacements, bounded identity
75
+ substitution, and their fail-closed boundaries.
76
+
77
+ ### Fixed
78
+
79
+ - Source preparation now stores and reads each target's access receipt and owner-only
80
+ reader credential under its configured baseline artifact directory. Nested and
81
+ multi-target state roots no longer collide, and retirement refuses a receipt from a
82
+ different target root.
83
+ - Supabase Storage source preparation now recursively traverses real folder placeholder
84
+ entries while keeping the approved prefix, path, depth, object-count, per-object, and
85
+ total-byte boundaries fail closed.
86
+ - Approved-owner selection now rejects non-finite numeric values in every declared
87
+ owner column before choosing a privacy branch, including when another column already
88
+ matches the approved owner.
89
+ - Pseudonymized canonical integer dictionary keys now share the same keyed identity
90
+ mapping as numeric columns and nested numeric values using the same namespace, so
91
+ runtime maps keep their reviewed cross-representation joins.
92
+ - External-reader membership mismatches now return a redacted, actionable source
93
+ authorization refusal instead of an internal-failure diagnostic.
94
+ - All external-reader privilege, expiration, readable-surface, and security-definer
95
+ denials now use the same `SOURCE_AUTHORIZATION_REFUSED` diagnostic and exit code 3.
96
+ - Identity claims now sequence PostgreSQL reads on their single transaction client,
97
+ avoiding deprecated overlapping queries and remaining compatible with pg 9.
98
+
99
+ ## [0.1.0-beta.13] - 2026-10-05
100
+
101
+ ### Added
102
+
10
103
  - Runtime and CI compatibility now cover maintained Node.js 22, 24, and 26 releases;
11
104
  Node.js 24 LTS remains the recommended default and release-build runtime.
12
105
  - Source access policies can use an externally provisioned, database-expiring
package/README.md CHANGED
@@ -45,7 +45,9 @@ For an ordinary npm application install, Rehearsal safely creates a commented
45
45
  `rehearsal.config.mjs` in the project root, adds only its local-artifact entries to
46
46
  `.gitignore`, and prepares the isolated local runtime configuration. It detects the
47
47
  project name, database target, migration paths, commands, and free ports. Review lines
48
- marked `CHECK`, then open the guide. Existing files are never overwritten.
48
+ marked `CHECK`, then open the guide. Existing files are never overwritten. If a supported
49
+ root or nested config already exists, Rehearsal reports that active path and does not
50
+ create a competing file; see [Configuration](docs/configuration.md#workspaces-and-custom-paths).
49
51
 
50
52
  If install scripts are disabled or the workspace root is ambiguous, installation makes
51
53
  no guess. Run `npx rehearsal` inside the application and choose **Set the stage** for the
@@ -143,6 +145,7 @@ Reference:
143
145
 
144
146
  - [CLI commands](docs/commands.md)
145
147
  - [Configuration](docs/configuration.md)
148
+ - [TypeScript types](docs/typescript.md)
146
149
  - [Baselines](docs/baselines.md)
147
150
  - [Sanitization](docs/sanitization.md)
148
151
  - [Security model](docs/security-model.md)
@@ -0,0 +1,100 @@
1
+ {
2
+ "name": "@rehearsal-db/core",
3
+ "version": "0.1.0-beta.15",
4
+ "private": false,
5
+ "description": "Safely rehearse PostgreSQL and Supabase migrations against sanitized, production-shaped data.",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Ddupasquier/rehearsal-db.git"
9
+ },
10
+ "bugs": {
11
+ "url": "https://github.com/Ddupasquier/rehearsal-db/issues"
12
+ },
13
+ "homepage": "https://ddupasquier.github.io/rehearsal-db/",
14
+ "publishConfig": {
15
+ "access": "public",
16
+ "tag": "beta",
17
+ "provenance": true
18
+ },
19
+ "type": "module",
20
+ "engines": {
21
+ "node": "^22.0.0 || ^24.0.0 || ^26.0.0"
22
+ },
23
+ "bin": {
24
+ "rehearsal": "dist/src/cli/rehearsal.mjs"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./types/configuration.d.mts",
29
+ "import": "./dist/src/index.mjs"
30
+ },
31
+ "./baseline": "./dist/src/baseline/artifact.mjs",
32
+ "./baseline-builder": "./dist/src/baseline/builder.mjs",
33
+ "./diagnostics": "./dist/src/shared/diagnostics.mjs",
34
+ "./migrations": "./dist/src/runtime/migration_history.mjs",
35
+ "./process-environment": "./dist/src/shared/process_environment.mjs",
36
+ "./privacy": "./dist/src/baseline/privacy_engine.mjs",
37
+ "./schema": "./dist/src/baseline/schema_snapshot.mjs",
38
+ "./service-environment": "./dist/src/runtime/service_environment.mjs",
39
+ "./source-access": "./dist/src/source/access.mjs"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "types",
44
+ "docs/*.md",
45
+ "README.md",
46
+ "BENCHMARKS.md",
47
+ "CHANGELOG.md",
48
+ "SECURITY.md",
49
+ "COMPATIBILITY.md",
50
+ "SUPPORT.md",
51
+ "LICENSE"
52
+ ],
53
+ "scripts": {
54
+ "postinstall": "node dist/scripts/install/create_root_config.mjs",
55
+ "prepack": "npm run build",
56
+ "build": "node scripts/build/clean.mjs && tsc --project tsconfig.build.json",
57
+ "docs:build": "node scripts/docs/build.mjs",
58
+ "docs:preview": "node scripts/docs/serve.mjs",
59
+ "test": "npm run build && vitest run",
60
+ "test:unit": "npm run build && vitest run tests/unit",
61
+ "test:integration": "npm run build && vitest run tests/integration tests/contracts",
62
+ "test:docs": "npm run build && vitest run tests/contracts/documentationCommands.test.mjs",
63
+ "test:fixture": "npm run build && node scripts/verification/fixtures/supabase.mjs",
64
+ "test:fixture:postgresql": "npm run build && node scripts/verification/fixtures/postgresql.mjs",
65
+ "test:fixture:dependent": "npm run build && node scripts/verification/fixtures/dependent.mjs",
66
+ "test:fixture:onboarding": "npm run build && node scripts/verification/fixtures/onboarding.mjs",
67
+ "test:fixture:typescript": "npm run build && node scripts/verification/fixtures/typescript.mjs",
68
+ "test:fixture:standalone": "npm run build && node scripts/verification/fixtures/standalone.mjs",
69
+ "test:fixture:privacy": "npm run build && node scripts/verification/fixtures/privacy.mjs",
70
+ "check": "npm run check:syntax && npm run typecheck && npm run test && npm run docs:build && npm run format:check && npm run package:audit",
71
+ "check:syntax": "find scripts tests -type f -name '*.mjs' -exec node --check {} +",
72
+ "typecheck": "tsc --project tsconfig.json",
73
+ "format": "prettier --write .",
74
+ "format:check": "prettier --check .",
75
+ "package:audit": "node scripts/verification/audit_package.mjs"
76
+ },
77
+ "keywords": [
78
+ "postgresql",
79
+ "supabase",
80
+ "migration",
81
+ "testing",
82
+ "database"
83
+ ],
84
+ "license": "MIT",
85
+ "dependencies": {
86
+ "@clack/prompts": "^1.8.1",
87
+ "pg": "^8.23.1"
88
+ },
89
+ "devDependencies": {
90
+ "@fontsource-variable/dm-sans": "^5.3.0",
91
+ "@fontsource-variable/fraunces": "^5.3.0",
92
+ "@lydell/node-pty": "^1.2.0-beta.15",
93
+ "@types/node": "22.20.5",
94
+ "@types/pg": "^8.23.1",
95
+ "marked": "^18.0.14",
96
+ "prettier": "^3.9.6",
97
+ "typescript": "7.0.2",
98
+ "vitest": "^5.0.2"
99
+ }
100
+ }
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ /** Create safe project-root Rehearsal scaffolding during a local install. */
3
+ export {};
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ /** Create safe project-root Rehearsal scaffolding during a local install. */
3
+ import { fileURLToPath } from "node:url";
4
+ import { createInstalledRehearsalScaffold, renderInstalledRehearsalScaffold, } from "../../src/project/install_scaffold.mjs";
5
+ const packageRoot = fileURLToPath(new URL("../../..", import.meta.url));
6
+ try {
7
+ const result = await createInstalledRehearsalScaffold({ packageRoot });
8
+ console.log(renderInstalledRehearsalScaffold(result));
9
+ }
10
+ catch (error) {
11
+ const message = error instanceof Error ? error.message : String(error);
12
+ console.warn(`Rehearsal could not safely create project files during installation: ${message}\nNext: run npx rehearsal from the application directory.`);
13
+ }
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Purpose: Select the configured database runtime and forward the requested
4
+ * lifecycle action to its isolated driver.
5
+ */
6
+ export {};
@@ -3,16 +3,14 @@
3
3
  * Purpose: Select the configured database runtime and forward the requested
4
4
  * lifecycle action to its isolated driver.
5
5
  */
6
-
7
6
  import { loadRehearsalConfig } from "../../src/project/configuration.mjs";
8
- import {
9
- parseRuntimeInvocation,
10
- runRuntimeTarget,
11
- } from "../../src/targets/target.mjs";
12
-
7
+ import { parseRuntimeInvocation } from "../../src/targets/target.mjs";
8
+ import { runRuntimeTarget } from "../../src/targets/driver.mjs";
13
9
  const invocation = parseRuntimeInvocation();
14
10
  const { config } = await loadRehearsalConfig({
15
- projectRoot: process.cwd(),
16
- configPath: invocation.configPath,
11
+ projectRoot: process.cwd(),
12
+ ...(invocation.configPath === undefined
13
+ ? {}
14
+ : { configPath: invocation.configPath }),
17
15
  });
18
16
  await runRuntimeTarget(config.runtime.target);
@@ -0,0 +1,96 @@
1
+ /** Launch ordinary application commands against verified local runtime files. */
2
+ import { spawn } from "node:child_process";
3
+ import type { EventEmitter } from "node:events";
4
+ declare const SESSION_SIGNALS: string[];
5
+ type SessionSignal = (typeof SESSION_SIGNALS)[number];
6
+ export interface ApplicationReadiness {
7
+ readonly url: string;
8
+ readonly expectedStatus?: number;
9
+ readonly timeoutSeconds?: number;
10
+ }
11
+ export interface ApplicationSession {
12
+ readonly pid: number | undefined;
13
+ readonly ready: Readonly<{
14
+ url: string;
15
+ status: number;
16
+ }>;
17
+ readonly stop: () => Promise<void>;
18
+ readonly wait: () => Promise<ChildExit>;
19
+ readonly diagnostics: () => ApplicationDiagnostics;
20
+ }
21
+ export interface ApplicationDiagnostics {
22
+ readonly stdoutBytes: number;
23
+ readonly stderrBytes: number;
24
+ }
25
+ interface ChildExit {
26
+ readonly status: number | null;
27
+ readonly signal: NodeJS.Signals | null;
28
+ }
29
+ interface SessionInput {
30
+ readonly isTTY?: boolean;
31
+ prependListener(event: "data", listener: (chunk: Buffer | string) => void): unknown;
32
+ removeListener(event: "data", listener: (chunk: Buffer | string) => void): unknown;
33
+ }
34
+ interface EnvironmentInput {
35
+ readonly files: Readonly<Record<string, string>> & {
36
+ readonly primary: string;
37
+ };
38
+ readonly mappings: Readonly<Record<string, string>>;
39
+ }
40
+ interface HttpJsonAssertion {
41
+ readonly path: readonly string[];
42
+ readonly equals?: unknown;
43
+ readonly notEquals?: unknown;
44
+ readonly minimumItems?: number;
45
+ }
46
+ export interface HttpProofCheck {
47
+ readonly name: string;
48
+ readonly kind: "positive" | "negative";
49
+ readonly url: string;
50
+ readonly method?: string;
51
+ readonly expectedStatus: number;
52
+ readonly timeoutMs?: number;
53
+ readonly json?: HttpJsonAssertion | null;
54
+ }
55
+ type SignalTarget = Pick<EventEmitter, "prependListener" | "removeListener">;
56
+ export declare const buildApplicationEnvironment: ({ files, mappings, }: EnvironmentInput) => Promise<Record<string, string>>;
57
+ export declare const summarizeProjectCommandFailure: ({ error, status, signal, stdout, stderr, stdoutByteCount, stderrByteCount, }: {
58
+ error?: NodeJS.ErrnoException;
59
+ status: number | null;
60
+ signal: NodeJS.Signals | null;
61
+ stdout?: string;
62
+ stderr?: string;
63
+ stdoutByteCount?: number;
64
+ stderrByteCount?: number;
65
+ }) => string;
66
+ export declare const startApplicationSession: ({ command, cwd, files, mappings, readiness, inheritedEnvironment, spawnImplementation, fetchImplementation, signalTarget, }: EnvironmentInput & {
67
+ command: string;
68
+ cwd: string;
69
+ readiness: ApplicationReadiness;
70
+ inheritedEnvironment?: NodeJS.ProcessEnv;
71
+ spawnImplementation?: typeof spawn;
72
+ fetchImplementation?: typeof fetch;
73
+ signalTarget?: SignalTarget;
74
+ }) => Promise<ApplicationSession>;
75
+ /**
76
+ * Keep a ready application session attached until the user interrupts it.
77
+ * The child process group is always stopped before this function returns.
78
+ */
79
+ export declare const holdApplicationSession: ({ session, signalTarget, input, onReady, }: {
80
+ session: ApplicationSession;
81
+ signalTarget?: SignalTarget;
82
+ input?: SessionInput;
83
+ onReady?: (ready: ApplicationSession["ready"]) => void;
84
+ }) => Promise<Readonly<{
85
+ signal: SessionSignal;
86
+ diagnostics: ApplicationDiagnostics;
87
+ }>>;
88
+ export declare const runHttpProofs: ({ checks, fetchImplementation, }: {
89
+ checks: readonly HttpProofCheck[];
90
+ fetchImplementation?: typeof fetch;
91
+ }) => Promise<readonly Readonly<{
92
+ name: string;
93
+ kind: "positive" | "negative";
94
+ status: number;
95
+ }>[]>;
96
+ export {};