@apifuse/provider-sdk 2.2.0-beta.7 → 2.2.0-beta.70
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/AUTHORING.md +943 -51
- package/CHANGELOG.md +273 -1
- package/LICENSE +21 -0
- package/README.md +117 -29
- package/SUBMISSION.md +3 -2
- package/bin/apifuse-check.ts +293 -13
- package/bin/apifuse-dev.ts +42 -19
- package/bin/apifuse-migrate-deployment.ts +200 -0
- package/bin/apifuse-migrate-operation-declaration.ts +55 -0
- package/bin/apifuse-migrate-shape.ts +202 -0
- package/bin/apifuse-pack-check.ts +19 -6
- package/bin/apifuse-pack-smoke.ts +57 -2
- package/bin/apifuse-pack-types.ts +736 -38
- package/bin/apifuse-perf.ts +59 -23
- package/bin/apifuse-record.ts +923 -94
- package/bin/apifuse-submit-check.ts +2313 -281
- package/bin/apifuse-test.ts +3 -1
- package/bin/submit-check-delimited-text.ts +50 -0
- package/dist/auth-turn/index.d.ts +3 -3
- package/dist/auth-turn/index.js +1 -1
- package/dist/auth.d.ts +14 -0
- package/dist/auth.js +67 -0
- package/dist/ceremonies/index.d.ts +16 -0
- package/dist/ceremonies/index.js +141 -36
- package/dist/cli/commands.d.ts +1 -1
- package/dist/cli/commands.js +30 -0
- package/dist/cli/create.d.ts +1 -1
- package/dist/cli/create.js +8 -2
- package/dist/cli/deployment-intent.d.ts +178 -0
- package/dist/cli/deployment-intent.js +277 -0
- package/dist/cli/local-connection.d.ts +111 -0
- package/dist/cli/local-connection.js +151 -0
- package/dist/cli/migrate-deployment-intent.d.ts +132 -0
- package/dist/cli/migrate-deployment-intent.js +1552 -0
- package/dist/cli/migrate-operation-declaration.d.ts +70 -0
- package/dist/cli/migrate-operation-declaration.js +2206 -0
- package/dist/cli/migrate-operation-shape.d.ts +44 -0
- package/dist/cli/migrate-operation-shape.js +113 -0
- package/dist/cli/migrate-provider-shape.d.ts +56 -0
- package/dist/cli/migrate-provider-shape.js +580 -0
- package/dist/cli/resolver-runtime.d.ts +21 -0
- package/dist/cli/resolver-runtime.js +31 -0
- package/dist/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/dist/cli/templates/provider/Dockerfile.tpl +1 -1
- package/dist/cli/templates/provider/README.md.tpl +41 -19
- package/dist/cli/templates/provider/index.ts.tpl +6 -3
- package/dist/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/dist/cli/templates/provider/provider.json.tpl +6 -0
- package/dist/config/loader.d.ts +202 -16
- package/dist/config/loader.js +491 -141
- package/dist/contract-serialization.js +4 -8
- package/dist/contract-types.d.ts +12 -5
- package/dist/contract.js +24 -10
- package/dist/declaration-validation.d.ts +34 -0
- package/dist/declaration-validation.js +305 -0
- package/dist/define.d.ts +71 -29
- package/dist/define.js +807 -69
- package/dist/dev.d.ts +5 -0
- package/dist/dev.js +8 -1
- package/dist/engine.d.ts +129 -0
- package/dist/engine.js +209 -0
- package/dist/error-observability.d.ts +7 -0
- package/dist/error-observability.js +61 -0
- package/dist/error-resolution.d.ts +18 -0
- package/dist/error-resolution.js +243 -0
- package/dist/errors.d.ts +74 -0
- package/dist/errors.js +99 -0
- package/dist/fixture-sanitization.d.ts +28 -0
- package/dist/fixture-sanitization.js +371 -0
- package/dist/handle-meta.d.ts +90 -0
- package/dist/handle-meta.js +73 -0
- package/dist/handle.d.ts +226 -0
- package/dist/handle.js +345 -0
- package/dist/health-scenario.d.ts +1901 -0
- package/dist/health-scenario.js +653 -0
- package/dist/i18n/catalog.js +21 -1
- package/dist/i18n/error-messages.d.ts +86 -0
- package/dist/i18n/error-messages.js +192 -0
- package/dist/i18n/index.d.ts +1 -0
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/keys.d.ts +12 -0
- package/dist/i18n/keys.js +76 -5
- package/dist/i18n/operation-locale-namespace.d.ts +2 -0
- package/dist/i18n/operation-locale-namespace.js +7 -0
- package/dist/index.d.ts +40 -15
- package/dist/index.js +29 -11
- package/dist/lint.d.ts +43 -11
- package/dist/lint.js +2512 -177
- package/dist/native-address.d.ts +43 -0
- package/dist/native-address.js +281 -0
- package/dist/native-egress-policy.d.ts +31 -0
- package/dist/native-egress-policy.js +288 -0
- package/dist/observability.d.ts +5 -2
- package/dist/observability.js +48 -1
- package/dist/provider.d.ts +18 -8
- package/dist/provider.js +11 -6
- package/dist/runtime/auth-flow.d.ts +6 -1
- package/dist/runtime/auth-flow.js +8 -0
- package/dist/runtime/bounded-expiring-map.d.ts +21 -0
- package/dist/runtime/bounded-expiring-map.js +64 -0
- package/dist/runtime/browser-telemetry-binding.d.ts +5 -0
- package/dist/runtime/browser-telemetry-binding.js +83 -0
- package/dist/runtime/browser-telemetry.d.ts +76 -0
- package/dist/runtime/browser-telemetry.js +165 -0
- package/dist/runtime/browser.d.ts +4 -0
- package/dist/runtime/browser.js +688 -83
- package/dist/runtime/cache-telemetry.d.ts +71 -0
- package/dist/runtime/cache-telemetry.js +177 -0
- package/dist/runtime/cache.d.ts +3 -0
- package/dist/runtime/cache.js +245 -23
- package/dist/runtime/capability-response.d.ts +3 -0
- package/dist/runtime/capability-response.js +56 -0
- package/dist/runtime/capability-telemetry.d.ts +46 -0
- package/dist/runtime/capability-telemetry.js +68 -0
- package/dist/runtime/chrome149-header-order.d.ts +58 -0
- package/dist/runtime/chrome149-header-order.js +289 -0
- package/dist/runtime/diagnostic-env-values.d.ts +5 -0
- package/dist/runtime/diagnostic-env-values.js +57 -0
- package/dist/runtime/diagnostic-env.d.ts +14 -0
- package/dist/runtime/diagnostic-env.js +44 -0
- package/dist/runtime/diagnostic-redactor.d.ts +54 -0
- package/dist/runtime/diagnostic-redactor.js +571 -0
- package/dist/runtime/egress-lease.d.ts +65 -0
- package/dist/runtime/egress-lease.js +236 -0
- package/dist/runtime/engine-mode.d.ts +74 -0
- package/dist/runtime/engine-mode.js +152 -0
- package/dist/runtime/env.js +14 -1
- package/dist/runtime/executor.d.ts +3 -2
- package/dist/runtime/executor.js +23 -26
- package/dist/runtime/handle-wordlist.d.ts +43 -0
- package/dist/runtime/handle-wordlist.js +256 -0
- package/dist/runtime/handle.d.ts +71 -0
- package/dist/runtime/handle.js +908 -0
- package/dist/runtime/http-telemetry-binding.d.ts +10 -0
- package/dist/runtime/http-telemetry-binding.js +152 -0
- package/dist/runtime/http-telemetry-guard.d.ts +16 -0
- package/dist/runtime/http-telemetry-guard.js +202 -0
- package/dist/runtime/http-telemetry.d.ts +104 -0
- package/dist/runtime/http-telemetry.js +190 -0
- package/dist/runtime/http.d.ts +34 -0
- package/dist/runtime/http.js +680 -121
- package/dist/runtime/insights.js +2 -2
- package/dist/runtime/instrumentation.d.ts +2 -2
- package/dist/runtime/instrumentation.js +462 -19
- package/dist/runtime/native-network-errors.d.ts +33 -0
- package/dist/runtime/native-network-errors.js +69 -0
- package/dist/runtime/native-network.d.ts +105 -0
- package/dist/runtime/native-network.js +1433 -0
- package/dist/runtime/native-telemetry.d.ts +142 -0
- package/dist/runtime/native-telemetry.js +231 -0
- package/dist/runtime/ocr-telemetry.d.ts +82 -0
- package/dist/runtime/ocr-telemetry.js +192 -0
- package/dist/runtime/ocr.d.ts +29 -0
- package/dist/runtime/ocr.js +468 -0
- package/dist/runtime/otlp.d.ts +71 -2
- package/dist/runtime/otlp.js +398 -16
- package/dist/runtime/provider.d.ts +7 -0
- package/dist/runtime/provider.js +14 -0
- package/dist/runtime/proxy-errors.js +6 -2
- package/dist/runtime/proxy-nodemaven.d.ts +56 -0
- package/dist/runtime/proxy-nodemaven.js +147 -0
- package/dist/runtime/proxy-retry-policy.d.ts +4 -1
- package/dist/runtime/proxy-retry-policy.js +11 -2
- package/dist/runtime/proxy-telemetry.d.ts +133 -3
- package/dist/runtime/proxy-telemetry.js +218 -70
- package/dist/runtime/redirect-hop-headers.d.ts +19 -0
- package/dist/runtime/redirect-hop-headers.js +58 -0
- package/dist/runtime/redirects.d.ts +61 -0
- package/dist/runtime/redirects.js +149 -0
- package/dist/runtime/redis.d.ts +1 -1
- package/dist/runtime/redis.js +4 -2
- package/dist/runtime/request-options.d.ts +75 -1
- package/dist/runtime/request-options.js +588 -0
- package/dist/runtime/request-telemetry.d.ts +70 -0
- package/dist/runtime/request-telemetry.js +229 -0
- package/dist/runtime/resolver-config.d.ts +13 -0
- package/dist/runtime/resolver-config.js +14 -0
- package/dist/runtime/resolver-public.d.ts +3 -0
- package/dist/runtime/resolver-public.js +1 -0
- package/dist/runtime/resolver-runtime-options.d.ts +14 -0
- package/dist/runtime/resolver-runtime-options.js +33 -0
- package/dist/runtime/resolver-shared.d.ts +24 -0
- package/dist/runtime/resolver-shared.js +69 -0
- package/dist/runtime/resolver-span-attributes.d.ts +34 -0
- package/dist/runtime/resolver-span-attributes.js +93 -0
- package/dist/runtime/resolver-telemetry.d.ts +135 -0
- package/dist/runtime/resolver-telemetry.js +204 -0
- package/dist/runtime/resolver-usage.d.ts +32 -0
- package/dist/runtime/resolver-usage.js +54 -0
- package/dist/runtime/resolver-vendors/bindings.d.ts +53 -0
- package/dist/runtime/resolver-vendors/bindings.js +45 -0
- package/dist/runtime/resolver-vendors/browser.d.ts +24 -0
- package/dist/runtime/resolver-vendors/browser.js +423 -0
- package/dist/runtime/resolver-vendors/capsolver.d.ts +22 -0
- package/dist/runtime/resolver-vendors/capsolver.js +544 -0
- package/dist/runtime/resolver-vendors/hosts.d.ts +23 -0
- package/dist/runtime/resolver-vendors/hosts.js +68 -0
- package/dist/runtime/resolver-vendors/hypersolutions.d.ts +27 -0
- package/dist/runtime/resolver-vendors/hypersolutions.js +369 -0
- package/dist/runtime/resolver-vendors/twocaptcha.d.ts +24 -0
- package/dist/runtime/resolver-vendors/twocaptcha.js +425 -0
- package/dist/runtime/resolver-vendors/types.d.ts +125 -0
- package/dist/runtime/resolver-vendors/types.js +106 -0
- package/dist/runtime/resolver.d.ts +79 -0
- package/dist/runtime/resolver.js +1094 -0
- package/dist/runtime/state-telemetry.d.ts +79 -0
- package/dist/runtime/state-telemetry.js +194 -0
- package/dist/runtime/state.d.ts +10 -1
- package/dist/runtime/state.js +322 -82
- package/dist/runtime/stealth-akamai-sbsd.d.ts +54 -0
- package/dist/runtime/stealth-akamai-sbsd.js +142 -0
- package/dist/runtime/stealth-cookies.d.ts +24 -0
- package/dist/runtime/stealth-cookies.js +131 -0
- package/dist/runtime/stealth-owned-headers.d.ts +39 -0
- package/dist/runtime/stealth-owned-headers.js +57 -0
- package/dist/runtime/stealth-telemetry.d.ts +92 -0
- package/dist/runtime/stealth-telemetry.js +179 -0
- package/dist/runtime/stealth.d.ts +45 -6
- package/dist/runtime/stealth.js +1775 -320
- package/dist/runtime/stt-telemetry.d.ts +77 -0
- package/dist/runtime/stt-telemetry.js +176 -0
- package/dist/runtime/stt.js +18 -19
- package/dist/runtime/timeout.d.ts +5 -0
- package/dist/runtime/timeout.js +12 -0
- package/dist/runtime/trace-config.d.ts +12 -0
- package/dist/runtime/trace-config.js +62 -0
- package/dist/runtime/trace.d.ts +17 -0
- package/dist/runtime/trace.js +176 -25
- package/dist/runtime-boundary-lint.d.ts +137 -0
- package/dist/runtime-boundary-lint.js +590 -0
- package/dist/schema.d.ts +20 -0
- package/dist/schema.js +72 -2
- package/dist/serve.d.ts +1 -1
- package/dist/serve.js +1 -1
- package/dist/server/error-observability.d.ts +1 -0
- package/dist/server/error-observability.js +1 -0
- package/dist/server/error-stack-frames.d.ts +35 -0
- package/dist/server/error-stack-frames.js +219 -0
- package/dist/server/index.d.ts +21 -2
- package/dist/server/index.js +11 -2
- package/dist/server/runtime-diagnostics.d.ts +165 -0
- package/dist/server/runtime-diagnostics.js +360 -0
- package/dist/server/sdk-version.d.ts +3 -0
- package/dist/server/sdk-version.js +19 -0
- package/dist/server/self-test-input-tokens.d.ts +2 -1
- package/dist/server/self-test-input-tokens.js +18 -14
- package/dist/server/self-test-redaction.js +8 -33
- package/dist/server/self-test.d.ts +18 -3
- package/dist/server/self-test.js +139 -76
- package/dist/server/sensitive-values.d.ts +26 -0
- package/dist/server/sensitive-values.js +137 -0
- package/dist/server/serve-implementation.d.ts +285 -0
- package/dist/server/serve-implementation.js +3172 -0
- package/dist/server/serve.d.ts +1 -75
- package/dist/server/serve.js +1 -1170
- package/dist/server/state-backend-report.d.ts +70 -0
- package/dist/server/state-backend-report.js +113 -0
- package/dist/server/trace-output.d.ts +7 -0
- package/dist/server/trace-output.js +111 -0
- package/dist/server/types.d.ts +37 -5
- package/dist/server/types.js +34 -1
- package/dist/stateful/errors.d.ts +19 -0
- package/dist/stateful/errors.js +24 -0
- package/dist/stateful/http-provider-event-emitter.d.ts +40 -0
- package/dist/stateful/http-provider-event-emitter.js +237 -0
- package/dist/stateful/http-session-owner-registry.d.ts +44 -0
- package/dist/stateful/http-session-owner-registry.js +210 -0
- package/dist/stateful/index.d.ts +18 -0
- package/dist/stateful/index.js +18 -0
- package/dist/stateful/provider-event-delivery-failures.d.ts +32 -0
- package/dist/stateful/provider-event-delivery-failures.js +43 -0
- package/dist/stateful/provider-event-pipeline-metrics.d.ts +46 -0
- package/dist/stateful/provider-event-pipeline-metrics.js +48 -0
- package/dist/stateful/provider-event-pipeline.d.ts +50 -0
- package/dist/stateful/provider-event-pipeline.js +1 -0
- package/dist/stateful/provider-events.d.ts +101 -0
- package/dist/stateful/provider-events.js +289 -0
- package/dist/stateful/session-key.d.ts +15 -0
- package/dist/stateful/session-key.js +86 -0
- package/dist/stateful/stateful-provider-adapter-context.d.ts +5 -0
- package/dist/stateful/stateful-provider-adapter-context.js +42 -0
- package/dist/stateful/stateful-provider-adapter-metrics.d.ts +15 -0
- package/dist/stateful/stateful-provider-adapter-metrics.js +21 -0
- package/dist/stateful/stateful-provider-adapter.d.ts +98 -0
- package/dist/stateful/stateful-provider-adapter.js +287 -0
- package/dist/stateful/stateful-provider-observability.d.ts +62 -0
- package/dist/stateful/stateful-provider-observability.js +161 -0
- package/dist/stateful/stateful-provider-owner-forwarder.d.ts +41 -0
- package/dist/stateful/stateful-provider-owner-forwarder.js +237 -0
- package/dist/stateful/stateful-provider-runtime-context.d.ts +35 -0
- package/dist/stateful/stateful-provider-runtime-context.js +61 -0
- package/dist/stateful/stateful-provider-runtime-executor.d.ts +34 -0
- package/dist/stateful/stateful-provider-runtime-executor.js +52 -0
- package/dist/stateful/stateful-provider-session-routing.d.ts +67 -0
- package/dist/stateful/stateful-provider-session-routing.js +345 -0
- package/dist/stateful/stateful-provider-session-runtime.d.ts +98 -0
- package/dist/stateful/stateful-provider-session-runtime.js +245 -0
- package/dist/stateful-signing.d.ts +18 -0
- package/dist/stateful-signing.js +27 -0
- package/dist/stealth/profiles.d.ts +15 -4
- package/dist/stealth/profiles.js +169 -211
- package/dist/stream-evidence.d.ts +74 -0
- package/dist/stream-evidence.js +785 -0
- package/dist/stream.js +7 -1
- package/dist/testing/index.d.ts +2 -1
- package/dist/testing/index.js +2 -1
- package/dist/testing/run.d.ts +32 -2
- package/dist/testing/run.js +509 -25
- package/dist/trace-sanitization.d.ts +6 -0
- package/dist/trace-sanitization.js +68 -0
- package/dist/types.d.ts +899 -210
- package/dist/types.js +1 -0
- package/dist/typescript-module.d.ts +39 -0
- package/dist/typescript-module.js +72 -0
- package/package.json +52 -6
- package/src/auth-turn/index.ts +1 -1
- package/src/auth.ts +118 -0
- package/src/ceremonies/index.ts +189 -46
- package/src/cli/commands.ts +37 -0
- package/src/cli/create.ts +8 -2
- package/src/cli/deployment-intent.ts +364 -0
- package/src/cli/local-connection.ts +221 -0
- package/src/cli/migrate-deployment-intent.ts +1908 -0
- package/src/cli/migrate-operation-declaration.ts +3026 -0
- package/src/cli/migrate-operation-shape.ts +184 -0
- package/src/cli/migrate-provider-shape.ts +778 -0
- package/src/cli/resolver-runtime.ts +72 -0
- package/src/cli/templates/provider/.agents/skills/health-checks-and-fail-closed/SKILL.md.tpl +141 -23
- package/src/cli/templates/provider/Dockerfile.tpl +1 -1
- package/src/cli/templates/provider/README.md.tpl +41 -19
- package/src/cli/templates/provider/index.ts.tpl +6 -3
- package/src/cli/templates/provider/operations/ping.ts.tpl +4 -1
- package/src/cli/templates/provider/provider.json.tpl +6 -0
- package/src/config/loader.ts +774 -181
- package/src/contract-serialization.ts +5 -7
- package/src/contract-types.ts +12 -5
- package/src/contract.ts +24 -10
- package/src/declaration-validation.ts +376 -0
- package/src/define.ts +1105 -131
- package/src/dev.ts +13 -1
- package/src/engine.ts +390 -0
- package/src/error-observability.ts +64 -0
- package/src/error-resolution.ts +269 -0
- package/src/errors.ts +157 -0
- package/src/fixture-sanitization.ts +422 -0
- package/src/handle-meta.ts +143 -0
- package/src/handle.ts +694 -0
- package/src/health-scenario.ts +960 -0
- package/src/i18n/catalog.ts +23 -1
- package/src/i18n/error-messages.ts +255 -0
- package/src/i18n/index.ts +1 -0
- package/src/i18n/keys.ts +80 -6
- package/src/i18n/operation-locale-namespace.ts +10 -0
- package/src/index.ts +390 -23
- package/src/lint.ts +2975 -234
- package/src/native-address.ts +340 -0
- package/src/native-egress-policy.ts +358 -0
- package/src/observability.ts +51 -1
- package/src/provider.ts +207 -27
- package/src/runtime/auth-flow.ts +15 -0
- package/src/runtime/bounded-expiring-map.ts +67 -0
- package/src/runtime/browser-telemetry-binding.ts +92 -0
- package/src/runtime/browser-telemetry.ts +289 -0
- package/src/runtime/browser.ts +882 -99
- package/src/runtime/cache-telemetry.ts +247 -0
- package/src/runtime/cache.ts +258 -22
- package/src/runtime/capability-response.ts +53 -0
- package/src/runtime/capability-telemetry.ts +101 -0
- package/src/runtime/chrome149-header-order.ts +330 -0
- package/src/runtime/diagnostic-env-values.ts +56 -0
- package/src/runtime/diagnostic-env.ts +65 -0
- package/src/runtime/diagnostic-redactor.ts +668 -0
- package/src/runtime/egress-lease.ts +341 -0
- package/src/runtime/engine-mode.ts +233 -0
- package/src/runtime/env.ts +15 -1
- package/src/runtime/executor.ts +39 -32
- package/src/runtime/handle-wordlist.ts +266 -0
- package/src/runtime/handle.ts +1180 -0
- package/src/runtime/http-telemetry-binding.ts +162 -0
- package/src/runtime/http-telemetry-guard.ts +208 -0
- package/src/runtime/http-telemetry.ts +292 -0
- package/src/runtime/http.ts +896 -150
- package/src/runtime/insights.ts +2 -2
- package/src/runtime/instrumentation.ts +628 -28
- package/src/runtime/native-network-errors.ts +99 -0
- package/src/runtime/native-network.ts +1853 -0
- package/src/runtime/native-telemetry.ts +366 -0
- package/src/runtime/ocr-telemetry.ts +308 -0
- package/src/runtime/ocr.ts +564 -0
- package/src/runtime/otlp.ts +468 -21
- package/src/runtime/provider.ts +15 -0
- package/src/runtime/proxy-errors.ts +12 -4
- package/src/runtime/proxy-nodemaven.ts +222 -0
- package/src/runtime/proxy-retry-policy.ts +12 -1
- package/src/runtime/proxy-telemetry.ts +358 -103
- package/src/runtime/redirect-hop-headers.ts +71 -0
- package/src/runtime/redirects.ts +215 -0
- package/src/runtime/redis.ts +7 -2
- package/src/runtime/request-options.ts +728 -1
- package/src/runtime/request-telemetry.ts +375 -0
- package/src/runtime/resolver-config.ts +18 -0
- package/src/runtime/resolver-public.ts +44 -0
- package/src/runtime/resolver-runtime-options.ts +50 -0
- package/src/runtime/resolver-shared.ts +113 -0
- package/src/runtime/resolver-span-attributes.ts +139 -0
- package/src/runtime/resolver-telemetry.ts +362 -0
- package/src/runtime/resolver-usage.ts +99 -0
- package/src/runtime/resolver-vendors/bindings.ts +61 -0
- package/src/runtime/resolver-vendors/browser.ts +591 -0
- package/src/runtime/resolver-vendors/capsolver.ts +727 -0
- package/src/runtime/resolver-vendors/hosts.ts +81 -0
- package/src/runtime/resolver-vendors/hypersolutions.ts +480 -0
- package/src/runtime/resolver-vendors/twocaptcha.ts +555 -0
- package/src/runtime/resolver-vendors/types.ts +261 -0
- package/src/runtime/resolver.ts +1543 -0
- package/src/runtime/state-telemetry.ts +298 -0
- package/src/runtime/state.ts +435 -89
- package/src/runtime/stealth-akamai-sbsd.ts +207 -0
- package/src/runtime/stealth-cookies.ts +155 -0
- package/src/runtime/stealth-owned-headers.ts +67 -0
- package/src/runtime/stealth-telemetry.ts +309 -0
- package/src/runtime/stealth.ts +2275 -372
- package/src/runtime/stt-telemetry.ts +282 -0
- package/src/runtime/stt.ts +96 -91
- package/src/runtime/timeout.ts +18 -0
- package/src/runtime/trace-config.ts +78 -0
- package/src/runtime/trace.ts +257 -35
- package/src/runtime-boundary-lint.ts +707 -0
- package/src/schema.ts +80 -2
- package/src/serve.ts +6 -1
- package/src/server/error-observability.ts +1 -0
- package/src/server/error-stack-frames.ts +214 -0
- package/src/server/index.ts +184 -2
- package/src/server/runtime-diagnostics.ts +522 -0
- package/src/server/sdk-version.ts +22 -0
- package/src/server/self-test-input-tokens.ts +29 -14
- package/src/server/self-test-redaction.ts +10 -40
- package/src/server/self-test.ts +205 -89
- package/src/server/sensitive-values.ts +211 -0
- package/src/server/serve-implementation.ts +4596 -0
- package/src/server/serve.ts +1 -1685
- package/src/server/state-backend-report.ts +185 -0
- package/src/server/trace-output.ts +189 -0
- package/src/server/types.ts +34 -1
- package/src/stateful/README.md +146 -0
- package/src/stateful/errors.ts +35 -0
- package/src/stateful/http-provider-event-emitter.ts +314 -0
- package/src/stateful/http-session-owner-registry.ts +306 -0
- package/src/stateful/index.ts +18 -0
- package/src/stateful/provider-event-delivery-failures.ts +80 -0
- package/src/stateful/provider-event-pipeline-metrics.ts +95 -0
- package/src/stateful/provider-event-pipeline.ts +61 -0
- package/src/stateful/provider-events.ts +462 -0
- package/src/stateful/session-key.ts +111 -0
- package/src/stateful/stateful-provider-adapter-context.ts +59 -0
- package/src/stateful/stateful-provider-adapter-metrics.ts +48 -0
- package/src/stateful/stateful-provider-adapter.ts +562 -0
- package/src/stateful/stateful-provider-observability.ts +261 -0
- package/src/stateful/stateful-provider-owner-forwarder.ts +310 -0
- package/src/stateful/stateful-provider-runtime-context.ts +96 -0
- package/src/stateful/stateful-provider-runtime-executor.ts +96 -0
- package/src/stateful/stateful-provider-session-routing.ts +546 -0
- package/src/stateful/stateful-provider-session-runtime.ts +403 -0
- package/src/stateful-signing.ts +46 -0
- package/src/stealth/profiles.ts +212 -231
- package/src/stream-evidence.ts +988 -0
- package/src/stream.ts +8 -1
- package/src/testing/index.ts +10 -1
- package/src/testing/run.ts +685 -19
- package/src/trace-sanitization.ts +110 -0
- package/src/types.ts +1014 -273
- package/src/typescript-module.ts +100 -0
- package/dist/choice-token.d.ts +0 -24
- package/dist/choice-token.js +0 -74
- package/dist/runtime/choice.d.ts +0 -15
- package/dist/runtime/choice.js +0 -413
- package/src/choice-token.ts +0 -165
- package/src/runtime/choice.ts +0 -686
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `apifuse migrate-deployment [path] [--check] [--json] [--drop-codeowners-lock]`
|
|
5
|
+
*
|
|
6
|
+
* Retires a provider repository's standalone `deploy.ts`. Deployment intent
|
|
7
|
+
* has one home — the `deployment` key on `defineProvider({...})` — and only
|
|
8
|
+
* the fields that differ from the runtime profile are written there. The
|
|
9
|
+
* command:
|
|
10
|
+
*
|
|
11
|
+
* 1. reads `deploy.ts`, subtracts the profile defaults, and proves the
|
|
12
|
+
* resulting key resolves to exactly what the file declared;
|
|
13
|
+
* 2. writes the key into the declaration literal (after `runtime`), removes
|
|
14
|
+
* a `deployment` extra from a `{ ...provider, deployment }` default export
|
|
15
|
+
* and any `import ... from "./deploy"`;
|
|
16
|
+
* 3. deletes `deploy.ts` — after checking that no other repository source
|
|
17
|
+
* (tests included) imports the module. The `.github/CODEOWNERS`
|
|
18
|
+
* `/deploy.ts` lock stays unless `--drop-codeowners-lock` is passed: the
|
|
19
|
+
* platform still honors a re-added legacy file until its fallback is
|
|
20
|
+
* retired.
|
|
21
|
+
*
|
|
22
|
+
* Exit codes: 0 migrated or already migrated; 1 refused (the transform does
|
|
23
|
+
* not guess — a refusal names the manual step) or missing index.ts.
|
|
24
|
+
* `--check` reports without writing.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
28
|
+
import { join, relative, resolve } from "node:path";
|
|
29
|
+
|
|
30
|
+
import type * as MigrateModule from "../src/cli/migrate-deployment-intent.js";
|
|
31
|
+
|
|
32
|
+
/** Directories never scanned for deploy-module consumers. */
|
|
33
|
+
const SKIPPED_DIRECTORIES = new Set([
|
|
34
|
+
"node_modules",
|
|
35
|
+
".git",
|
|
36
|
+
"dist",
|
|
37
|
+
"build",
|
|
38
|
+
"coverage",
|
|
39
|
+
".turbo",
|
|
40
|
+
"__generated__",
|
|
41
|
+
]);
|
|
42
|
+
const SOURCE_FILE = /\.(?:[cm]?[jt]s|[jt]sx)$/u;
|
|
43
|
+
|
|
44
|
+
export const LEGACY_DEPLOY_FILE = "deploy.ts";
|
|
45
|
+
export const CODEOWNERS_FILE = ".github/CODEOWNERS";
|
|
46
|
+
|
|
47
|
+
export async function main(): Promise<void> {
|
|
48
|
+
// The transform needs the TypeScript compiler; load it here so a missing
|
|
49
|
+
// devDependency is a one-line report instead of an import stack trace.
|
|
50
|
+
let migrateDeploymentIntent: typeof MigrateModule.migrateDeploymentIntent;
|
|
51
|
+
let findDeployModuleConsumers: typeof MigrateModule.findDeployModuleConsumers;
|
|
52
|
+
try {
|
|
53
|
+
({ migrateDeploymentIntent, findDeployModuleConsumers } = await import(
|
|
54
|
+
"../src/cli/migrate-deployment-intent.js"
|
|
55
|
+
));
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const args = normalizeArgs(process.argv.slice(2));
|
|
61
|
+
const check = args.includes("--check");
|
|
62
|
+
const json = args.includes("--json");
|
|
63
|
+
const dropCodeownersLock = args.includes("--drop-codeowners-lock");
|
|
64
|
+
const positional = args.filter((argument) => !argument.startsWith("--"));
|
|
65
|
+
const providerRoot = resolve(positional[0] ?? ".");
|
|
66
|
+
const indexPath = resolve(providerRoot, "index.ts");
|
|
67
|
+
const deployPath = resolve(providerRoot, LEGACY_DEPLOY_FILE);
|
|
68
|
+
const codeownersPath = resolve(providerRoot, CODEOWNERS_FILE);
|
|
69
|
+
|
|
70
|
+
const report = (payload: Record<string, unknown>, humanText: string): void => {
|
|
71
|
+
if (json) {
|
|
72
|
+
console.log(JSON.stringify({ schemaVersion: 1, providerRoot, ...payload }));
|
|
73
|
+
} else {
|
|
74
|
+
console.log(humanText);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
if (!existsSync(indexPath)) {
|
|
79
|
+
report(
|
|
80
|
+
{ status: "refused", reason: "index.ts not found" },
|
|
81
|
+
`migrate-deployment: ${indexPath} not found.`,
|
|
82
|
+
);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const deploySource = existsSync(deployPath) ? readFileSync(deployPath, "utf8") : undefined;
|
|
87
|
+
const codeownersSource = existsSync(codeownersPath)
|
|
88
|
+
? readFileSync(codeownersPath, "utf8")
|
|
89
|
+
: undefined;
|
|
90
|
+
const result = migrateDeploymentIntent({
|
|
91
|
+
indexSource: readFileSync(indexPath, "utf8"),
|
|
92
|
+
deploySource,
|
|
93
|
+
codeownersSource,
|
|
94
|
+
dropCodeownersLock,
|
|
95
|
+
indexFileName: indexPath,
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (result.status === "refused") {
|
|
99
|
+
report(
|
|
100
|
+
{ status: "refused", reason: result.reason },
|
|
101
|
+
`migrate-deployment: refused — ${result.reason}\nThis provider needs a manual migration; do not delete deploy.ts without one.`,
|
|
102
|
+
);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (result.status === "unchanged") {
|
|
107
|
+
report(
|
|
108
|
+
{ status: "unchanged", notes: result.notes },
|
|
109
|
+
`migrate-deployment: already migrated; nothing to do.${formatNotes(result.notes)}`,
|
|
110
|
+
);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (result.removeDeployFile) {
|
|
115
|
+
// index.ts is accounted for by the transform; any other source that
|
|
116
|
+
// imports the module (a test, a helper) would break when it is deleted.
|
|
117
|
+
const consumers = findDeployModuleConsumers(
|
|
118
|
+
providerRoot,
|
|
119
|
+
collectOtherSources(providerRoot, [indexPath, deployPath]),
|
|
120
|
+
);
|
|
121
|
+
if (consumers.length > 0) {
|
|
122
|
+
const reason = `deploy.ts is still imported by ${consumers.join(", ")}; remove or rewrite those imports before migrating.`;
|
|
123
|
+
report(
|
|
124
|
+
{ status: "refused", reason },
|
|
125
|
+
`migrate-deployment: refused — ${reason}\nThis provider needs a manual migration; do not delete deploy.ts without one.`,
|
|
126
|
+
);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const touchedPaths: string[] = [];
|
|
132
|
+
if (result.indexChanged) touchedPaths.push("index.ts");
|
|
133
|
+
if (result.removeDeployFile) touchedPaths.push(LEGACY_DEPLOY_FILE);
|
|
134
|
+
if (result.codeownersChanged) touchedPaths.push(CODEOWNERS_FILE);
|
|
135
|
+
const payload = {
|
|
136
|
+
shape: result.shape,
|
|
137
|
+
legacy: result.legacy,
|
|
138
|
+
intent: result.intent,
|
|
139
|
+
resolved: result.resolved,
|
|
140
|
+
resolvedEqual: result.legacy === undefined ? undefined : true,
|
|
141
|
+
touchedPaths,
|
|
142
|
+
notes: result.notes,
|
|
143
|
+
};
|
|
144
|
+
const intentSummary =
|
|
145
|
+
Object.keys(result.intent).length === 0
|
|
146
|
+
? "profile defaults (no deployment key)"
|
|
147
|
+
: `deployment: ${JSON.stringify(result.intent)}`;
|
|
148
|
+
|
|
149
|
+
if (check) {
|
|
150
|
+
report(
|
|
151
|
+
{ status: "would-migrate", ...payload },
|
|
152
|
+
`migrate-deployment: would migrate (${intentSummary}; touches ${touchedPaths.join(", ")}). Run without --check to write.${formatNotes(result.notes)}`,
|
|
153
|
+
);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (result.indexChanged) writeFileSync(indexPath, result.indexSource, "utf8");
|
|
158
|
+
if (result.codeownersChanged && result.codeownersSource !== undefined) {
|
|
159
|
+
writeFileSync(codeownersPath, result.codeownersSource, "utf8");
|
|
160
|
+
}
|
|
161
|
+
if (result.removeDeployFile) rmSync(deployPath, { force: true });
|
|
162
|
+
report(
|
|
163
|
+
{ status: "migrated", ...payload },
|
|
164
|
+
`migrate-deployment: migrated (${intentSummary}; touched ${touchedPaths.join(", ")}). Review the diff, then run \`apifuse check\` and \`bun run type-check\`.${formatNotes(result.notes)}`,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function normalizeArgs(argv: string[]): string[] {
|
|
169
|
+
return argv[0] === "migrate-deployment" ? argv.slice(1) : argv;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Every source file under `providerRoot` except `excluded`, with text. */
|
|
173
|
+
function collectOtherSources(
|
|
174
|
+
providerRoot: string,
|
|
175
|
+
excluded: readonly string[],
|
|
176
|
+
): { readonly path: string; readonly text: string }[] {
|
|
177
|
+
const skip = new Set(excluded.map((file) => resolve(file)));
|
|
178
|
+
const files: { readonly path: string; readonly text: string }[] = [];
|
|
179
|
+
const walk = (directory: string): void => {
|
|
180
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
181
|
+
const absolute = join(directory, entry.name);
|
|
182
|
+
if (entry.isDirectory()) {
|
|
183
|
+
if (!SKIPPED_DIRECTORIES.has(entry.name)) walk(absolute);
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (!entry.isFile() || !SOURCE_FILE.test(entry.name) || skip.has(resolve(absolute))) continue;
|
|
187
|
+
files.push({ path: relative(providerRoot, absolute), text: readFileSync(absolute, "utf8") });
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
walk(providerRoot);
|
|
191
|
+
return files;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function formatNotes(notes: readonly string[]): string {
|
|
195
|
+
return notes.length === 0 ? "" : `\n${notes.map((note) => ` - ${note}`).join("\n")}`;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (import.meta.main) {
|
|
199
|
+
await main();
|
|
200
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `apifuse migrate-operation-declaration [path] [--check] [--json]`
|
|
5
|
+
*
|
|
6
|
+
* Rewrites ADR-0009's legacy nested operation declarations to the flat
|
|
7
|
+
* authoring contract. The run is repository-atomic: any declaration the
|
|
8
|
+
* codemod cannot prove leaves every source file untouched and exits 2.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { resolve } from "node:path";
|
|
12
|
+
|
|
13
|
+
import { migrateOperationDeclarationRepository } from "../src/cli/migrate-operation-declaration.js";
|
|
14
|
+
|
|
15
|
+
export async function main(): Promise<number> {
|
|
16
|
+
const args = process.argv.slice(3);
|
|
17
|
+
const check = args.includes("--check");
|
|
18
|
+
const json = args.includes("--json");
|
|
19
|
+
const positional = args.filter((argument) => !argument.startsWith("--"));
|
|
20
|
+
const providerRoot = resolve(positional[0] ?? ".");
|
|
21
|
+
const result = migrateOperationDeclarationRepository(providerRoot, { check });
|
|
22
|
+
|
|
23
|
+
if (json) {
|
|
24
|
+
console.log(
|
|
25
|
+
JSON.stringify({
|
|
26
|
+
schemaVersion: 1,
|
|
27
|
+
command: "migrate-operation-declaration",
|
|
28
|
+
...result,
|
|
29
|
+
}),
|
|
30
|
+
);
|
|
31
|
+
} else if (result.status === "refused") {
|
|
32
|
+
console.error(
|
|
33
|
+
`migrate-operation-declaration: refused ${result.refusals.length} declaration(s); no files were written.`,
|
|
34
|
+
);
|
|
35
|
+
for (const item of result.refusals) {
|
|
36
|
+
console.error(` ${item.file} [${item.operationKey}] ${item.reason}: ${item.detail}`);
|
|
37
|
+
}
|
|
38
|
+
} else if (result.status === "unchanged") {
|
|
39
|
+
console.log("migrate-operation-declaration: already flat; nothing to do.");
|
|
40
|
+
} else {
|
|
41
|
+
const verb = result.status === "would-migrate" ? "would migrate" : "migrated";
|
|
42
|
+
const sidecar = result.sidecar === undefined ? "" : ` and ${result.sidecar}`;
|
|
43
|
+
console.log(
|
|
44
|
+
`migrate-operation-declaration: ${verb} ${result.operationCount} operation(s) across ${result.changedFiles.length} file(s)${sidecar}.`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const exitCode = result.status === "refused" ? 2 : 0;
|
|
49
|
+
process.exitCode = exitCode;
|
|
50
|
+
return exitCode;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (import.meta.main) {
|
|
54
|
+
process.exit(await main());
|
|
55
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* `apifuse migrate-shape [path] [--check] [--json]`
|
|
5
|
+
*
|
|
6
|
+
* Applies the provider authoring-shape migration for the phase-separated SDK
|
|
7
|
+
* (2.2.0-beta.37+) to a provider repository. Two coordinated transforms:
|
|
8
|
+
*
|
|
9
|
+
* 1. `index.ts`: single-phase `defineProvider({...operations})` becomes the
|
|
10
|
+
* two-phase declaration builder. The old shape default-exports a builder
|
|
11
|
+
* FUNCTION under the new SDK, so the module stops loading.
|
|
12
|
+
* 2. Every provider source file: legacy `defineOperation(config)` /
|
|
13
|
+
* `defineStreamOperation(config)` become the curried
|
|
14
|
+
* `defineOperation<ProviderContext>()(config)`. The legacy call returns
|
|
15
|
+
* the inner factory with the config swallowed, so every operation in the
|
|
16
|
+
* map turns into a function and finalizeProvider rejects the provider
|
|
17
|
+
* with a misleading health-check error.
|
|
18
|
+
*
|
|
19
|
+
* Both halves belong to the same SDK bump: this transform and the pin bump
|
|
20
|
+
* must land in one commit.
|
|
21
|
+
*
|
|
22
|
+
* Exit codes: 0 migrated or already migrated; 1 any skip (the transform
|
|
23
|
+
* refuses to guess) or a missing index.ts. `--check` reports without
|
|
24
|
+
* writing. A skip is a hard stop for fan-out callers — never pair a pin bump
|
|
25
|
+
* with a skipped migration.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
29
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
30
|
+
|
|
31
|
+
import { migrateOperationShape } from "../src/cli/migrate-operation-shape.js";
|
|
32
|
+
import { migrateProviderShape } from "../src/cli/migrate-provider-shape.js";
|
|
33
|
+
|
|
34
|
+
const SOURCE_SKIP_DIRECTORIES = new Set([
|
|
35
|
+
"node_modules",
|
|
36
|
+
"__tests__",
|
|
37
|
+
"__fixtures__",
|
|
38
|
+
".git",
|
|
39
|
+
"dist",
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
type FileOutcome = {
|
|
43
|
+
readonly path: string;
|
|
44
|
+
readonly status: string;
|
|
45
|
+
readonly detail?: string;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export async function main(): Promise<void> {
|
|
49
|
+
const args = process.argv.slice(3);
|
|
50
|
+
const check = args.includes("--check");
|
|
51
|
+
const json = args.includes("--json");
|
|
52
|
+
const positional = args.filter((argument) => !argument.startsWith("--"));
|
|
53
|
+
const providerRoot = resolve(positional[0] ?? ".");
|
|
54
|
+
const indexPath = resolve(providerRoot, "index.ts");
|
|
55
|
+
|
|
56
|
+
const report = (payload: Record<string, unknown>, humanText: string): void => {
|
|
57
|
+
if (json) {
|
|
58
|
+
console.log(
|
|
59
|
+
JSON.stringify({ schemaVersion: 2, providerRoot, ...payload }),
|
|
60
|
+
);
|
|
61
|
+
} else {
|
|
62
|
+
console.log(humanText);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
if (!existsSync(indexPath)) {
|
|
67
|
+
report(
|
|
68
|
+
{ status: "skipped", reason: "index.ts not found" },
|
|
69
|
+
`migrate-shape: ${indexPath} not found.`,
|
|
70
|
+
);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ── Pass 1: provider two-phase shape on index.ts
|
|
75
|
+
const indexSource = readFileSync(indexPath, "utf8");
|
|
76
|
+
const providerResult = migrateProviderShape(indexSource, indexPath);
|
|
77
|
+
|
|
78
|
+
if (providerResult.status === "skipped") {
|
|
79
|
+
report(
|
|
80
|
+
{ status: "skipped", stage: "provider-shape", reason: providerResult.reason },
|
|
81
|
+
`migrate-shape: skipped — ${providerResult.reason}\nThis provider needs a manual migration; do not bump its SDK pin without one.`,
|
|
82
|
+
);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ── Pass 2: operation currying across the provider's source tree.
|
|
87
|
+
// The index.ts input for this pass is pass 1's OUTPUT, so a provider
|
|
88
|
+
// whose index both holds the declaration and defines operations gets
|
|
89
|
+
// both transforms in one write.
|
|
90
|
+
const indexAfterProvider = providerResult.code;
|
|
91
|
+
const outcomes: FileOutcome[] = [];
|
|
92
|
+
const pendingWrites = new Map<string, string>();
|
|
93
|
+
let operationRewrites = 0;
|
|
94
|
+
|
|
95
|
+
for (const sourcePath of collectSourceFiles(providerRoot)) {
|
|
96
|
+
const isIndex = sourcePath === indexPath;
|
|
97
|
+
const input = isIndex
|
|
98
|
+
? indexAfterProvider
|
|
99
|
+
: readFileSync(sourcePath, "utf8");
|
|
100
|
+
// Operation modules import the alias from the provider entry; the
|
|
101
|
+
// entry file declares it itself.
|
|
102
|
+
const contextSpecifier = isIndex
|
|
103
|
+
? "./index"
|
|
104
|
+
: relativeImportToIndex(sourcePath, providerRoot);
|
|
105
|
+
const result = migrateOperationShape(input, sourcePath, contextSpecifier);
|
|
106
|
+
|
|
107
|
+
if (result.status === "skipped") {
|
|
108
|
+
report(
|
|
109
|
+
{
|
|
110
|
+
status: "skipped",
|
|
111
|
+
stage: "operation-shape",
|
|
112
|
+
file: relative(providerRoot, sourcePath),
|
|
113
|
+
reason: result.reason,
|
|
114
|
+
},
|
|
115
|
+
`migrate-shape: skipped at ${relative(providerRoot, sourcePath)} — ${result.reason}\nThis provider needs a manual migration; do not bump its SDK pin without one.`,
|
|
116
|
+
);
|
|
117
|
+
process.exit(1);
|
|
118
|
+
}
|
|
119
|
+
if (result.status === "migrated") {
|
|
120
|
+
operationRewrites += result.rewrites;
|
|
121
|
+
pendingWrites.set(sourcePath, result.code);
|
|
122
|
+
outcomes.push({
|
|
123
|
+
path: relative(providerRoot, sourcePath),
|
|
124
|
+
status: "curried",
|
|
125
|
+
detail: `${result.rewrites} call site(s)`,
|
|
126
|
+
});
|
|
127
|
+
} else if (isIndex && providerResult.status === "migrated") {
|
|
128
|
+
// Provider shape changed even though no operation calls did.
|
|
129
|
+
pendingWrites.set(sourcePath, result.code);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const providerChanged = providerResult.status === "migrated";
|
|
134
|
+
const anythingChanged = providerChanged || operationRewrites > 0;
|
|
135
|
+
|
|
136
|
+
if (!anythingChanged) {
|
|
137
|
+
report(
|
|
138
|
+
{ status: "unchanged" },
|
|
139
|
+
"migrate-shape: already migrated; nothing to do.",
|
|
140
|
+
);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (check) {
|
|
145
|
+
report(
|
|
146
|
+
{
|
|
147
|
+
status: "would-migrate",
|
|
148
|
+
providerShape: providerChanged ? providerResult.kind : "unchanged",
|
|
149
|
+
operationCallSites: operationRewrites,
|
|
150
|
+
files: outcomes,
|
|
151
|
+
},
|
|
152
|
+
`migrate-shape: would migrate (provider: ${providerChanged ? providerResult.kind : "unchanged"}, operation call sites: ${operationRewrites}). Run without --check to write.`,
|
|
153
|
+
);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
for (const [path, code] of pendingWrites) {
|
|
158
|
+
writeFileSync(path, code, "utf8");
|
|
159
|
+
}
|
|
160
|
+
report(
|
|
161
|
+
{
|
|
162
|
+
status: "migrated",
|
|
163
|
+
providerShape: providerChanged ? providerResult.kind : "unchanged",
|
|
164
|
+
operationCallSites: operationRewrites,
|
|
165
|
+
files: outcomes,
|
|
166
|
+
},
|
|
167
|
+
`migrate-shape: migrated (provider: ${providerChanged ? providerResult.kind : "unchanged"}, operation call sites: ${operationRewrites} across ${pendingWrites.size} file(s)). Review the diff, then run \`apifuse check\` and \`bun test\`.`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Provider-authored .ts sources, excluding tests, fixtures, and build output. */
|
|
172
|
+
function collectSourceFiles(root: string): string[] {
|
|
173
|
+
const files: string[] = [];
|
|
174
|
+
const walk = (directory: string): void => {
|
|
175
|
+
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
|
176
|
+
if (entry.isDirectory()) {
|
|
177
|
+
if (SOURCE_SKIP_DIRECTORIES.has(entry.name)) continue;
|
|
178
|
+
walk(join(directory, entry.name));
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (!entry.name.endsWith(".ts")) continue;
|
|
182
|
+
if (entry.name.endsWith(".d.ts")) continue;
|
|
183
|
+
if (entry.name.endsWith(".test.ts")) continue;
|
|
184
|
+
files.push(join(directory, entry.name));
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
walk(root);
|
|
188
|
+
return files.sort();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** `operations/foo.ts` -> `../index`; `operations/a/b.ts` -> `../../index`. */
|
|
192
|
+
function relativeImportToIndex(sourcePath: string, providerRoot: string): string {
|
|
193
|
+
const fromDirectory = dirname(sourcePath);
|
|
194
|
+
let specifier = relative(fromDirectory, join(providerRoot, "index"));
|
|
195
|
+
specifier = specifier.split("\\").join("/");
|
|
196
|
+
if (!specifier.startsWith(".")) specifier = `./${specifier}`;
|
|
197
|
+
return specifier;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (import.meta.main) {
|
|
201
|
+
await main();
|
|
202
|
+
}
|
|
@@ -82,11 +82,18 @@ const requiredPaths = [
|
|
|
82
82
|
"dist/auth-turn/fixtures/invalid/unknown-top-level-field.json",
|
|
83
83
|
"src/auth-turn/auth-turn.v1.schema.json",
|
|
84
84
|
];
|
|
85
|
+
// Test material must never reach the published tarball: it carries no consumer
|
|
86
|
+
// value and the `.deploy.ts.txt` codemod fixtures describe internal provider
|
|
87
|
+
// deployment intent. The `files` negations in package.json do the excluding;
|
|
88
|
+
// these patterns are the ratchet that fails the build when a new test directory
|
|
89
|
+
// escapes them (top-level negations do not cover nested `__tests__`).
|
|
90
|
+
const isPackagedTestMaterial = (path: string): boolean =>
|
|
91
|
+
path.startsWith("__tests__/") ||
|
|
92
|
+
path.includes("/__tests__/") ||
|
|
93
|
+
path.endsWith(".test.ts") ||
|
|
94
|
+
path.endsWith(".spec.ts");
|
|
85
95
|
const forbiddenMatches = filePaths.filter(
|
|
86
|
-
(path) =>
|
|
87
|
-
path.startsWith("src/__tests__/") ||
|
|
88
|
-
path === "src/index.test.ts" ||
|
|
89
|
-
path === "bin/apifuse-init.ts",
|
|
96
|
+
(path) => isPackagedTestMaterial(path) || path === "bin/apifuse-init.ts",
|
|
90
97
|
);
|
|
91
98
|
const missingRequiredPaths = requiredPaths.filter(
|
|
92
99
|
(path) => !filePaths.includes(path),
|
|
@@ -156,9 +163,9 @@ function assertPublicSmokeDocs(label: string, content: string): void {
|
|
|
156
163
|
);
|
|
157
164
|
}
|
|
158
165
|
|
|
159
|
-
if (!content.includes("
|
|
166
|
+
if (!content.includes("wreq-js")) {
|
|
160
167
|
throw new Error(
|
|
161
|
-
`${label} must include
|
|
168
|
+
`${label} must include wreq-js stealth runtime guidance for TLS/browser bounties.`,
|
|
162
169
|
);
|
|
163
170
|
}
|
|
164
171
|
|
|
@@ -168,6 +175,12 @@ function assertPublicSmokeDocs(label: string, content: string): void {
|
|
|
168
175
|
);
|
|
169
176
|
}
|
|
170
177
|
|
|
178
|
+
if (!content.includes("Chrome, Firefox, and Safari")) {
|
|
179
|
+
throw new Error(
|
|
180
|
+
`${label} must document the browser families supported by the TypeScript stealth runtime.`,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
171
184
|
if (
|
|
172
185
|
!content.includes('browser.engine: "playwright-stealth"') ||
|
|
173
186
|
!content.includes("nodriver")
|
|
@@ -59,6 +59,21 @@ try {
|
|
|
59
59
|
);
|
|
60
60
|
|
|
61
61
|
run("bun", ["install"], consumerDir);
|
|
62
|
+
run(
|
|
63
|
+
"bun",
|
|
64
|
+
[
|
|
65
|
+
"--eval",
|
|
66
|
+
[
|
|
67
|
+
'import { resolveProxy } from "@apifuse/provider-sdk";',
|
|
68
|
+
'if (typeof resolveProxy !== "function") throw new Error("resolveProxy is not exported");',
|
|
69
|
+
'const resolved = await resolveProxy({ proxy: "http://127.0.0.1:8080" });',
|
|
70
|
+
'if (resolved.url !== "http://127.0.0.1:8080") throw new Error("resolveProxy returned the wrong URL");',
|
|
71
|
+
'console.log("packed root resolveProxy export OK");',
|
|
72
|
+
].join("\n"),
|
|
73
|
+
],
|
|
74
|
+
consumerDir,
|
|
75
|
+
);
|
|
76
|
+
smokePackedStealthNative(consumerDir);
|
|
62
77
|
|
|
63
78
|
const cliBin = join(consumerDir, "node_modules", ".bin", "apifuse");
|
|
64
79
|
if (!existsSync(cliBin)) {
|
|
@@ -202,6 +217,43 @@ function run(command: string, args: string[], cwd: string): void {
|
|
|
202
217
|
}
|
|
203
218
|
}
|
|
204
219
|
|
|
220
|
+
function smokePackedStealthNative(consumerDir: string): void {
|
|
221
|
+
run(
|
|
222
|
+
"bun",
|
|
223
|
+
[
|
|
224
|
+
"--eval",
|
|
225
|
+
[
|
|
226
|
+
'import { createServer } from "node:http";',
|
|
227
|
+
'import { createStealthClient } from "@apifuse/provider-sdk/runtime/stealth";',
|
|
228
|
+
"const server = createServer((_request, response) => {",
|
|
229
|
+
' response.setHeader("set-cookie", "pack_native_cookie=landed; Path=/");',
|
|
230
|
+
' response.end("packed native stealth ok");',
|
|
231
|
+
"});",
|
|
232
|
+
"await new Promise((resolve, reject) => {",
|
|
233
|
+
' server.once("error", reject);',
|
|
234
|
+
' server.listen(0, "127.0.0.1", resolve);',
|
|
235
|
+
"});",
|
|
236
|
+
"const address = server.address();",
|
|
237
|
+
'if (!address || typeof address === "string") throw new Error("Local server has no TCP address");',
|
|
238
|
+
'const baseUrl = "http://127.0.0.1:" + address.port;',
|
|
239
|
+
'const session = createStealthClient(baseUrl).createSession({ stealth: { browser: "safari", os: "macos" } });',
|
|
240
|
+
"try {",
|
|
241
|
+
' const response = await session.fetch("/native");',
|
|
242
|
+
' if (response.body !== "packed native stealth ok") throw new Error("Unexpected stealth body: " + response.body);',
|
|
243
|
+
' if (session.cookies.get("pack_native_cookie", baseUrl + "/native") !== "landed") {',
|
|
244
|
+
' throw new Error("Packed stealth Set-Cookie did not land in the SDK jar");',
|
|
245
|
+
" }",
|
|
246
|
+
' console.log("packed native Safari stealth request OK");',
|
|
247
|
+
"} finally {",
|
|
248
|
+
" session.close();",
|
|
249
|
+
" await new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));",
|
|
250
|
+
"}",
|
|
251
|
+
].join("\n"),
|
|
252
|
+
],
|
|
253
|
+
consumerDir,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
205
257
|
function assertGeneratedReadme(providerDir: string): void {
|
|
206
258
|
const readme = readFileSync(join(providerDir, "README.md"), "utf8");
|
|
207
259
|
if (!readme.includes('"requestId":"req_local_ping"')) {
|
|
@@ -213,8 +265,11 @@ function assertGeneratedReadme(providerDir: string): void {
|
|
|
213
265
|
if (!readme.includes("bunx playwright install chromium")) {
|
|
214
266
|
throw new Error("Generated README is missing browser runtime troubleshooting guidance.");
|
|
215
267
|
}
|
|
216
|
-
if (!readme.includes("
|
|
217
|
-
throw new Error("Generated README is missing
|
|
268
|
+
if (!readme.includes("wreq-js")) {
|
|
269
|
+
throw new Error("Generated README is missing wreq-js stealth runtime guidance.");
|
|
270
|
+
}
|
|
271
|
+
if (!readme.includes("Chrome, Firefox, and Safari")) {
|
|
272
|
+
throw new Error("Generated README is missing supported stealth browser families.");
|
|
218
273
|
}
|
|
219
274
|
if (!readme.includes("bun run submit-check")) {
|
|
220
275
|
throw new Error("Generated README must document the submit-check pre-submission workflow.");
|