@zuplo/cli 7.10.0 → 7.11.1
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/common/worker-output.d.ts +7 -0
- package/dist/common/worker-output.d.ts.map +1 -1
- package/dist/common/worker-output.js +39 -0
- package/dist/common/worker-output.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@hono/node-server/README.md +2 -0
- package/node_modules/@hono/node-server/dist/index.cjs +1 -1
- package/node_modules/@hono/node-server/dist/index.mjs +1 -1
- package/node_modules/@hono/node-server/dist/serve-static.cjs +2 -1
- package/node_modules/@hono/node-server/dist/serve-static.mjs +2 -1
- package/node_modules/@hono/node-server/package.json +1 -1
- package/node_modules/@posthog/core/dist/metrics/index.d.ts +9 -0
- package/node_modules/@posthog/core/dist/metrics/index.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/metrics/index.js +38 -3
- package/node_modules/@posthog/core/dist/metrics/index.mjs +38 -3
- package/node_modules/@posthog/core/dist/metrics/types.d.ts +7 -2
- package/node_modules/@posthog/core/dist/metrics/types.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/traces/ids.d.ts.map +1 -1
- package/node_modules/@posthog/core/dist/traces/ids.js +2 -2
- package/node_modules/@posthog/core/dist/traces/ids.mjs +2 -2
- package/node_modules/@posthog/core/dist/types.d.ts +1 -1
- package/node_modules/@posthog/core/dist/types.d.ts.map +1 -1
- package/node_modules/@posthog/core/package.json +4 -3
- package/node_modules/@posthog/core/src/metrics/index.spec.ts +75 -0
- package/node_modules/@posthog/core/src/metrics/index.ts +60 -0
- package/node_modules/@posthog/core/src/metrics/types.ts +7 -1
- package/node_modules/@posthog/core/src/traces/ids.ts +4 -2
- package/node_modules/@posthog/core/src/types.ts +1 -1
- package/node_modules/@posthog/types/dist/capture-metric.d.ts +10 -0
- package/node_modules/@posthog/types/dist/capture-metric.d.ts.map +1 -1
- package/node_modules/@posthog/types/dist/capture.d.ts +1 -1
- package/node_modules/@posthog/types/dist/capture.d.ts.map +1 -1
- package/node_modules/@posthog/types/dist/index.d.ts +1 -1
- package/node_modules/@posthog/types/dist/index.d.ts.map +1 -1
- package/node_modules/@posthog/types/package.json +1 -1
- package/node_modules/@posthog/types/src/capture-metric.ts +11 -0
- package/node_modules/@posthog/types/src/capture.ts +1 -1
- package/node_modules/@posthog/types/src/index.ts +1 -0
- package/node_modules/@zuplo/core/customer.cli.minified.js +272 -261
- package/node_modules/@zuplo/core/index.minified.js +276 -265
- package/node_modules/@zuplo/core/package.json +1 -1
- package/node_modules/@zuplo/graphql/package.json +1 -1
- package/node_modules/@zuplo/openapi-tools/package.json +5 -2
- package/node_modules/@zuplo/otel/package.json +1 -1
- package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js → chunk-CDEAY3VY.js} +2 -2
- package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js +37 -0
- package/node_modules/@zuplo/runtime/out/esm/chunk-LVSZ3WTO.js.map +1 -0
- package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js → chunk-NUVXDVLJ.js} +2 -2
- package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js → chunk-RHU3Z7DA.js} +108 -108
- package/node_modules/@zuplo/runtime/out/esm/chunk-RHU3Z7DA.js.map +1 -0
- package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/internal/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/sdks/aws/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/types/index.d.ts +15 -24
- package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +14 -0
- package/node_modules/@zuplo/runtime/package.json +1 -1
- package/package.json +15 -12
- package/dist/__tests__/archive-utils.test.d.ts +0 -2
- package/dist/__tests__/archive-utils.test.d.ts.map +0 -1
- package/dist/__tests__/archive-utils.test.js +0 -50
- package/dist/__tests__/archive-utils.test.js.map +0 -1
- package/dist/__tests__/import-openapi.test.d.ts +0 -2
- package/dist/__tests__/import-openapi.test.d.ts.map +0 -1
- package/dist/__tests__/import-openapi.test.js +0 -251
- package/dist/__tests__/import-openapi.test.js.map +0 -1
- package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/confirm-linked-config.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/confirm-linked-config.integration.test.js +0 -202
- package/dist/__tests__/integration/confirm-linked-config.integration.test.js.map +0 -1
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.js +0 -184
- package/dist/__tests__/integration/confirm-production-deploy.integration.test.js.map +0 -1
- package/dist/__tests__/integration/custom-domain.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/custom-domain.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/custom-domain.integration.test.js +0 -563
- package/dist/__tests__/integration/custom-domain.integration.test.js.map +0 -1
- package/dist/__tests__/integration/delete.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/delete.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/delete.integration.test.js +0 -262
- package/dist/__tests__/integration/delete.integration.test.js.map +0 -1
- package/dist/__tests__/integration/deploy.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/deploy.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/deploy.integration.test.js +0 -519
- package/dist/__tests__/integration/deploy.integration.test.js.map +0 -1
- package/dist/__tests__/integration/get-project-param.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/get-project-param.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/get-project-param.integration.test.js +0 -305
- package/dist/__tests__/integration/get-project-param.integration.test.js.map +0 -1
- package/dist/__tests__/integration/info.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/info.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/info.integration.test.js +0 -293
- package/dist/__tests__/integration/info.integration.test.js.map +0 -1
- package/dist/__tests__/integration/jest-mocks-setup.d.ts +0 -2
- package/dist/__tests__/integration/jest-mocks-setup.d.ts.map +0 -1
- package/dist/__tests__/integration/jest-mocks-setup.js +0 -104
- package/dist/__tests__/integration/jest-mocks-setup.js.map +0 -1
- package/dist/__tests__/integration/jest-setup.d.ts +0 -2
- package/dist/__tests__/integration/jest-setup.d.ts.map +0 -1
- package/dist/__tests__/integration/jest-setup.js +0 -12
- package/dist/__tests__/integration/jest-setup.js.map +0 -1
- package/dist/__tests__/integration/link.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/link.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/link.integration.test.js +0 -395
- package/dist/__tests__/integration/link.integration.test.js.map +0 -1
- package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/linked-config-cascade.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/linked-config-cascade.integration.test.js +0 -179
- package/dist/__tests__/integration/linked-config-cascade.integration.test.js.map +0 -1
- package/dist/__tests__/integration/list.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/list.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/list.integration.test.js +0 -300
- package/dist/__tests__/integration/list.integration.test.js.map +0 -1
- package/dist/__tests__/integration/source-upgrade.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/source-upgrade.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/source-upgrade.integration.test.js +0 -100
- package/dist/__tests__/integration/source-upgrade.integration.test.js.map +0 -1
- package/dist/__tests__/integration/test-utils.d.ts +0 -30
- package/dist/__tests__/integration/test-utils.d.ts.map +0 -1
- package/dist/__tests__/integration/test-utils.js +0 -82
- package/dist/__tests__/integration/test-utils.js.map +0 -1
- package/dist/__tests__/integration/tunnel.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/tunnel.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/tunnel.integration.test.js +0 -486
- package/dist/__tests__/integration/tunnel.integration.test.js.map +0 -1
- package/dist/__tests__/integration/variable.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/variable.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/variable.integration.test.js +0 -258
- package/dist/__tests__/integration/variable.integration.test.js.map +0 -1
- package/dist/__tests__/integration/whoami.integration.test.d.ts +0 -2
- package/dist/__tests__/integration/whoami.integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/whoami.integration.test.js +0 -116
- package/dist/__tests__/integration/whoami.integration.test.js.map +0 -1
- package/dist/__tests__/outdated.test.d.ts +0 -2
- package/dist/__tests__/outdated.test.d.ts.map +0 -1
- package/dist/__tests__/outdated.test.js +0 -67
- package/dist/__tests__/outdated.test.js.map +0 -1
- package/dist/__tests__/populate.test.d.ts +0 -2
- package/dist/__tests__/populate.test.d.ts.map +0 -1
- package/dist/__tests__/populate.test.js +0 -445
- package/dist/__tests__/populate.test.js.map +0 -1
- package/dist/__tests__/tsconfig-upgrader.test.d.ts +0 -2
- package/dist/__tests__/tsconfig-upgrader.test.d.ts.map +0 -1
- package/dist/__tests__/tsconfig-upgrader.test.js +0 -31
- package/dist/__tests__/tsconfig-upgrader.test.js.map +0 -1
- package/dist/ca-certificate/validation.test.d.ts +0 -2
- package/dist/ca-certificate/validation.test.d.ts.map +0 -1
- package/dist/ca-certificate/validation.test.js +0 -131
- package/dist/ca-certificate/validation.test.js.map +0 -1
- package/dist/common/analytics/cli-invocation.test.d.ts +0 -2
- package/dist/common/analytics/cli-invocation.test.d.ts.map +0 -1
- package/dist/common/analytics/cli-invocation.test.js +0 -51
- package/dist/common/analytics/cli-invocation.test.js.map +0 -1
- package/dist/common/analytics/package-manager.test.d.ts +0 -2
- package/dist/common/analytics/package-manager.test.d.ts.map +0 -1
- package/dist/common/analytics/package-manager.test.js +0 -163
- package/dist/common/analytics/package-manager.test.js.map +0 -1
- package/dist/common/cli-dispatcher.test.d.ts +0 -2
- package/dist/common/cli-dispatcher.test.d.ts.map +0 -1
- package/dist/common/cli-dispatcher.test.js +0 -80
- package/dist/common/cli-dispatcher.test.js.map +0 -1
- package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts +0 -2
- package/dist/common/middleware/check-pnpm-lifecycle.test.d.ts.map +0 -1
- package/dist/common/middleware/check-pnpm-lifecycle.test.js +0 -125
- package/dist/common/middleware/check-pnpm-lifecycle.test.js.map +0 -1
- package/dist/common/middleware/get-environment-param.test.d.ts +0 -2
- package/dist/common/middleware/get-environment-param.test.d.ts.map +0 -1
- package/dist/common/middleware/get-environment-param.test.js +0 -57
- package/dist/common/middleware/get-environment-param.test.js.map +0 -1
- package/dist/common/read-linked-config.test.d.ts +0 -2
- package/dist/common/read-linked-config.test.d.ts.map +0 -1
- package/dist/common/read-linked-config.test.js +0 -363
- package/dist/common/read-linked-config.test.js.map +0 -1
- package/dist/common/terminal.test.d.ts +0 -2
- package/dist/common/terminal.test.d.ts.map +0 -1
- package/dist/common/terminal.test.js +0 -101
- package/dist/common/terminal.test.js.map +0 -1
- package/dist/common/utils/build-environment-prompt-choices.test.d.ts +0 -2
- package/dist/common/utils/build-environment-prompt-choices.test.d.ts.map +0 -1
- package/dist/common/utils/build-environment-prompt-choices.test.js +0 -97
- package/dist/common/utils/build-environment-prompt-choices.test.js.map +0 -1
- package/dist/common/utils/format-environment-type.test.d.ts +0 -2
- package/dist/common/utils/format-environment-type.test.d.ts.map +0 -1
- package/dist/common/utils/format-environment-type.test.js +0 -32
- package/dist/common/utils/format-environment-type.test.js.map +0 -1
- package/dist/common/utils/pnpm-lifecycle.test.d.ts +0 -2
- package/dist/common/utils/pnpm-lifecycle.test.d.ts.map +0 -1
- package/dist/common/utils/pnpm-lifecycle.test.js +0 -196
- package/dist/common/utils/pnpm-lifecycle.test.js.map +0 -1
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts +0 -2
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts.map +0 -1
- package/dist/common/utils/pretty-print-environment-prompt.test.js +0 -42
- package/dist/common/utils/pretty-print-environment-prompt.test.js.map +0 -1
- package/dist/common/utils/sort-environments-for-prompt.test.d.ts +0 -2
- package/dist/common/utils/sort-environments-for-prompt.test.d.ts.map +0 -1
- package/dist/common/utils/sort-environments-for-prompt.test.js +0 -82
- package/dist/common/utils/sort-environments-for-prompt.test.js.map +0 -1
- package/dist/common/utils/stringify-config.test.d.ts +0 -2
- package/dist/common/utils/stringify-config.test.d.ts.map +0 -1
- package/dist/common/utils/stringify-config.test.js +0 -80
- package/dist/common/utils/stringify-config.test.js.map +0 -1
- package/dist/common/validators/argument-validators.spec.d.ts +0 -2
- package/dist/common/validators/argument-validators.spec.d.ts.map +0 -1
- package/dist/common/validators/argument-validators.spec.js +0 -181
- package/dist/common/validators/argument-validators.spec.js.map +0 -1
- package/dist/deploy/archive.local-registry.test.d.ts +0 -2
- package/dist/deploy/archive.local-registry.test.d.ts.map +0 -1
- package/dist/deploy/archive.local-registry.test.js +0 -100
- package/dist/deploy/archive.local-registry.test.js.map +0 -1
- package/dist/deploy/archive.test.d.ts +0 -2
- package/dist/deploy/archive.test.d.ts.map +0 -1
- package/dist/deploy/archive.test.js +0 -248
- package/dist/deploy/archive.test.js.map +0 -1
- package/dist/deploy/classify-build-probe.test.d.ts +0 -2
- package/dist/deploy/classify-build-probe.test.d.ts.map +0 -1
- package/dist/deploy/classify-build-probe.test.js +0 -51
- package/dist/deploy/classify-build-probe.test.js.map +0 -1
- package/dist/deploy/poll-deployment.test.d.ts +0 -2
- package/dist/deploy/poll-deployment.test.d.ts.map +0 -1
- package/dist/deploy/poll-deployment.test.js +0 -158
- package/dist/deploy/poll-deployment.test.js.map +0 -1
- package/dist/dev/zuplo-local-gitignore.test.d.ts +0 -2
- package/dist/dev/zuplo-local-gitignore.test.d.ts.map +0 -1
- package/dist/dev/zuplo-local-gitignore.test.js +0 -58
- package/dist/dev/zuplo-local-gitignore.test.js.map +0 -1
- package/dist/editor/e2e/editor.spec.d.ts +0 -2
- package/dist/editor/e2e/editor.spec.d.ts.map +0 -1
- package/dist/editor/e2e/editor.spec.js +0 -44
- package/dist/editor/e2e/editor.spec.js.map +0 -1
- package/dist/link/project-type.test.d.ts +0 -2
- package/dist/link/project-type.test.d.ts.map +0 -1
- package/dist/link/project-type.test.js +0 -225
- package/dist/link/project-type.test.js.map +0 -1
- package/dist/lint/resolve-binary.test.d.ts +0 -2
- package/dist/lint/resolve-binary.test.d.ts.map +0 -1
- package/dist/lint/resolve-binary.test.js +0 -155
- package/dist/lint/resolve-binary.test.js.map +0 -1
- package/dist/open-api/convert/handler.spec.d.ts +0 -2
- package/dist/open-api/convert/handler.spec.d.ts.map +0 -1
- package/dist/open-api/convert/handler.spec.js +0 -301
- package/dist/open-api/convert/handler.spec.js.map +0 -1
- package/dist/open-api/merge/handler.spec.d.ts +0 -2
- package/dist/open-api/merge/handler.spec.d.ts.map +0 -1
- package/dist/open-api/merge/handler.spec.js +0 -673
- package/dist/open-api/merge/handler.spec.js.map +0 -1
- package/dist/open-api/overlay/handler.spec.d.ts +0 -2
- package/dist/open-api/overlay/handler.spec.d.ts.map +0 -1
- package/dist/open-api/overlay/handler.spec.js +0 -346
- package/dist/open-api/overlay/handler.spec.js.map +0 -1
- package/dist/source/ai-gateway/files.test.d.ts +0 -2
- package/dist/source/ai-gateway/files.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/files.test.js +0 -135
- package/dist/source/ai-gateway/files.test.js.map +0 -1
- package/dist/source/ai-gateway/handler.test.d.ts +0 -2
- package/dist/source/ai-gateway/handler.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/handler.test.js +0 -113
- package/dist/source/ai-gateway/handler.test.js.map +0 -1
- package/dist/source/ai-gateway/package.test.d.ts +0 -2
- package/dist/source/ai-gateway/package.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/package.test.js +0 -30
- package/dist/source/ai-gateway/package.test.js.map +0 -1
- package/dist/source/ai-gateway/planner.test.d.ts +0 -2
- package/dist/source/ai-gateway/planner.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/planner.test.js +0 -330
- package/dist/source/ai-gateway/planner.test.js.map +0 -1
- package/dist/source/ai-gateway/release.test.d.ts +0 -2
- package/dist/source/ai-gateway/release.test.d.ts.map +0 -1
- package/dist/source/ai-gateway/release.test.js +0 -62
- package/dist/source/ai-gateway/release.test.js.map +0 -1
- package/dist/test/invoke-test.test.d.ts +0 -2
- package/dist/test/invoke-test.test.d.ts.map +0 -1
- package/dist/test/invoke-test.test.js +0 -150
- package/dist/test/invoke-test.test.js.map +0 -1
- package/dist/test/test-files.test.d.ts +0 -2
- package/dist/test/test-files.test.d.ts.map +0 -1
- package/dist/test/test-files.test.js +0 -57
- package/dist/test/test-files.test.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js +0 -289
- package/node_modules/@zuplo/openapi-tools/dist/file-format.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js +0 -181
- package/node_modules/@zuplo/openapi-tools/dist/merge-fixtures.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js +0 -399
- package/node_modules/@zuplo/openapi-tools/dist/merge.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js +0 -779
- package/node_modules/@zuplo/openapi-tools/dist/overlay.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js +0 -269
- package/node_modules/@zuplo/openapi-tools/dist/path-transform.spec.js.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts +0 -2
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.d.ts.map +0 -1
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js +0 -93
- package/node_modules/@zuplo/openapi-tools/dist/url-utils.spec.js.map +0 -1
- package/node_modules/@zuplo/runtime/out/esm/chunk-6YPRGG62.js.map +0 -1
- package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js +0 -37
- package/node_modules/@zuplo/runtime/out/esm/chunk-PBDT4FDO.js.map +0 -1
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-YJ2BHVUH.js.map → chunk-CDEAY3VY.js.map} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-PBDT4FDO.js.LEGAL.txt → chunk-LVSZ3WTO.js.LEGAL.txt} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-VTO3F6DK.js.map → chunk-NUVXDVLJ.js.map} +0 -0
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-6YPRGG62.js.LEGAL.txt → chunk-RHU3Z7DA.js.LEGAL.txt} +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
|
+
import { LogLevel } from "@zuplo/core/cli";
|
|
2
3
|
import { ChalkInstance } from "chalk";
|
|
4
|
+
export declare function classifyGatewayLine(line: string):
|
|
5
|
+
| {
|
|
6
|
+
level: LogLevel;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
| undefined;
|
|
3
10
|
export declare function createRuntimeStdioHandler(options?: {
|
|
4
11
|
prefix?: string;
|
|
5
12
|
prefixColor?: ChalkInstance;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-output.d.ts","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-output.d.ts","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAiC,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAgC7C,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAqBlD;AAED,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B,IACoC,QAAQ,QAAQ,EAAE,QAAQ,QAAQ,UAoNtE"}
|
|
@@ -4,6 +4,37 @@ import chalk from "chalk";
|
|
|
4
4
|
const logFormatter = new LogFormatter(async (path) => {
|
|
5
5
|
return readFile(path, { encoding: "utf8" });
|
|
6
6
|
});
|
|
7
|
+
const ANSI_ESCAPE = /\u001b\[[0-9;]*m/g;
|
|
8
|
+
const GATEWAY_TRACING_LINE = /^\d{4}-\d{2}-\d{2}T[\d:.]+Z\s+(TRACE|DEBUG|INFO|WARN|ERROR)\s+[\w:]+:\s?(.*)$/;
|
|
9
|
+
const GATEWAY_PLAIN_LINES = [
|
|
10
|
+
[/^error: /, "error"],
|
|
11
|
+
[/^warning: /, "warn"],
|
|
12
|
+
[/^(note|hint): /, "info"],
|
|
13
|
+
[/^rebuild failed; still serving the previous build$/, "warn"],
|
|
14
|
+
[/^watching .+ for changes$/, "info"],
|
|
15
|
+
[/^.+ changed; rebuilding$/, "info"],
|
|
16
|
+
[/^rebuilt in \d+ ms$/, "info"],
|
|
17
|
+
];
|
|
18
|
+
export function classifyGatewayLine(line) {
|
|
19
|
+
const plain = line.replace(ANSI_ESCAPE, "");
|
|
20
|
+
const tracing = GATEWAY_TRACING_LINE.exec(plain);
|
|
21
|
+
if (tracing) {
|
|
22
|
+
const levels = {
|
|
23
|
+
TRACE: "debug",
|
|
24
|
+
DEBUG: "debug",
|
|
25
|
+
INFO: "info",
|
|
26
|
+
WARN: "warn",
|
|
27
|
+
ERROR: "error",
|
|
28
|
+
};
|
|
29
|
+
return { level: levels[tracing[1]], message: tracing[2] };
|
|
30
|
+
}
|
|
31
|
+
for (const [pattern, level] of GATEWAY_PLAIN_LINES) {
|
|
32
|
+
if (pattern.test(plain)) {
|
|
33
|
+
return { level, message: plain };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
7
38
|
export function createRuntimeStdioHandler(options) {
|
|
8
39
|
return function handleRuntimeStdio(stdout, stderr) {
|
|
9
40
|
const { prefix, prefixColor } = options ?? {};
|
|
@@ -51,6 +82,7 @@ export function createRuntimeStdioHandler(options) {
|
|
|
51
82
|
line = line.trim();
|
|
52
83
|
if (!line)
|
|
53
84
|
continue;
|
|
85
|
+
const gateway = classifyGatewayLine(line);
|
|
54
86
|
if (classifiers.isBarf(line)) {
|
|
55
87
|
logConsole("debug", line, prefix, prefixColor);
|
|
56
88
|
}
|
|
@@ -69,6 +101,9 @@ export function createRuntimeStdioHandler(options) {
|
|
|
69
101
|
logConsole("info", line, prefix, prefixColor);
|
|
70
102
|
}
|
|
71
103
|
}
|
|
104
|
+
else if (gateway) {
|
|
105
|
+
logConsole(gateway.level, gateway.message, prefix, prefixColor);
|
|
106
|
+
}
|
|
72
107
|
else {
|
|
73
108
|
logConsole("error", line, prefix, prefixColor);
|
|
74
109
|
}
|
|
@@ -91,6 +126,7 @@ export function createRuntimeStdioHandler(options) {
|
|
|
91
126
|
line = line.trim();
|
|
92
127
|
if (!line)
|
|
93
128
|
continue;
|
|
129
|
+
const gateway = classifyGatewayLine(line);
|
|
94
130
|
if (classifiers.isBarf(line)) {
|
|
95
131
|
if (classifiers.isAddressInUse(line)) {
|
|
96
132
|
const address = line.match(/Address already in use; toString\(\) = (.+)\n/)?.[1];
|
|
@@ -122,6 +158,9 @@ export function createRuntimeStdioHandler(options) {
|
|
|
122
158
|
line = line.substring("[ERROR]".length);
|
|
123
159
|
logConsole("error", line, prefix, prefixColor);
|
|
124
160
|
}
|
|
161
|
+
else if (gateway) {
|
|
162
|
+
logConsole(gateway.level, gateway.message, prefix, prefixColor);
|
|
163
|
+
}
|
|
125
164
|
else {
|
|
126
165
|
logConsole("error", line, prefix, prefixColor);
|
|
127
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-output.js","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"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","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: Output */\n\nimport { readFile } from \"node:fs/promises\";\nimport { Readable } from \"node:stream\";\nimport { ConsoleLogEntry, LogFormatter, LogLevel } from \"@zuplo/core/cli\";\nimport chalk, { ChalkInstance } from \"chalk\";\n\nconst logFormatter = new LogFormatter(async (path: string) => {\n return readFile(path, { encoding: \"utf8\" });\n});\n\nexport function createRuntimeStdioHandler(options?: {\n prefix?: string;\n prefixColor?: ChalkInstance;\n}) {\n return function handleRuntimeStdio(stdout: Readable, stderr: Readable) {\n const { prefix, prefixColor } = options ?? {};\n let stdoutAccumulator = \"\";\n let stderrAccumulator = \"\";\n\n const classifiers = {\n // Is this chunk a big chonky barf from workerd that we want to hijack to cleanup/ignore?\n isBarf(chunk: string) {\n const containsLlvmSymbolizerWarning = chunk.includes(\n \"Not symbolizing stack traces because $LLVM_SYMBOLIZER is not set\"\n );\n const containsRecursiveIsolateLockWarning = chunk.includes(\n \"took recursive isolate lock\"\n );\n // Matches stack traces from workerd\n // - on unix: groups of 9 hex digits separated by spaces\n // - on windows: groups of 12 hex digits, or a single digit 0, separated by spaces\n const containsHexStack = /stack:( (0|[a-f\\d]{4,})){3,}/.test(chunk);\n\n return (\n containsLlvmSymbolizerWarning ||\n containsRecursiveIsolateLockWarning ||\n containsHexStack\n );\n },\n // Is this chunk an Address In Use error?\n isAddressInUse(chunk: string) {\n return chunk.includes(\"Address already in use; toString() = \");\n },\n isWarning(chunk: string) {\n return /\\.c\\+\\+:\\d+: warning:/.test(chunk);\n },\n isCodeMovedWarning(chunk: string) {\n return /CODE_MOVED for unknown code block/.test(chunk);\n },\n isAccessViolation(chunk: string) {\n return chunk.includes(\"access violation;\");\n },\n isZenoLog(chunk: string) {\n return chunk.startsWith(\"[ZENO]:\");\n },\n };\n\n stdout.on(\"data\", (chunk: Buffer | string) => {\n const fullStreamOutput = `${stdoutAccumulator}${chunk}`;\n\n let currentLogsStr = \"\";\n const lastNewlineIdx = fullStreamOutput.lastIndexOf(\"\\n\");\n\n if (lastNewlineIdx > 0) {\n // Extract complete logs up to the last newline\n currentLogsStr = fullStreamOutput.slice(0, lastNewlineIdx);\n // Save the partial/incomplete log for next iteration\n stdoutAccumulator = fullStreamOutput.slice(lastNewlineIdx + 1);\n } else {\n // No complete log found, accumulate entire output\n stdoutAccumulator = fullStreamOutput;\n return;\n }\n\n const lines = currentLogsStr.split(\"\\n\");\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n\n if (classifiers.isBarf(line)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // there are no known cases to cleanup yet\n // but, as they are identified, we will do that here\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n\n // known case: warnings are not info, log them as such\n else if (classifiers.isWarning(line)) {\n logConsole(\"warn\", line, prefix, prefixColor);\n } else if (classifiers.isZenoLog(line)) {\n // Route to the specified logging level\n const levels = [\"debug\", \"info\", \"warn\", \"error\"];\n const level = levels.find((level) =>\n line.includes(`[${level.toUpperCase()}]`)\n );\n // Strip the prefixes for zeno and the zeno logging level\n line = line.substring(\"[ZENO]:\".length);\n line = line.substring(`[${level?.toUpperCase()}]`.length);\n if (level) {\n logConsole(level as LogLevel, line, prefix, prefixColor);\n } else {\n logConsole(\"info\", line, prefix, prefixColor);\n }\n }\n\n // anything not explicitly handled above should be logged as info (via stdout)\n else {\n logConsole(\"error\", line, prefix, prefixColor);\n }\n }\n });\n\n stderr.on(\"data\", (chunk: Buffer | string) => {\n const fullStreamOutput = `${stderrAccumulator}${chunk}`;\n\n let currentLogsStr = \"\";\n const lastNewlineIdx = fullStreamOutput.lastIndexOf(\"\\n\");\n\n if (lastNewlineIdx > 0) {\n // Extract complete logs up to the last newline\n currentLogsStr = fullStreamOutput.slice(0, lastNewlineIdx);\n // Save the partial/incomplete log for next iteration\n stderrAccumulator = fullStreamOutput.slice(lastNewlineIdx + 1);\n } else {\n // No complete log found, accumulate entire output\n stderrAccumulator = fullStreamOutput;\n return;\n }\n\n const lines = currentLogsStr.split(\"\\n\");\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n\n if (classifiers.isBarf(line)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // known case to cleanup: Address in use errors\n if (classifiers.isAddressInUse(line)) {\n const address = line.match(\n /Address already in use; toString\\(\\) = (.+)\\n/\n )?.[1];\n\n logConsole(\n \"error\",\n `Address already in use (${address}). Please check that you are not already running a server on this address or specify a different port with --port.`,\n prefix,\n prefixColor\n );\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n // In the past we have seen Access Violation errors on Windows, which may be caused by an outdated\n // version of the Windows OS or the Microsoft Visual C++ Redistributable.\n // See https://github.com/cloudflare/workers-sdk/issues/6170#issuecomment-2245209918\n else if (classifiers.isAccessViolation(line)) {\n let error = \"There was an access violation in the runtime.\";\n if (process.platform === \"win32\") {\n error +=\n \"\\nOn Windows, this may be caused by an outdated Microsoft Visual C++ Redistributable library.\\n\" +\n \"Check that you have the latest version installed.\\n\" +\n \"See https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist.\";\n }\n logConsole(\"error\", error, prefix, prefixColor);\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n else {\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n }\n\n // known case: warnings are not errors, log them as such\n else if (classifiers.isWarning(line)) {\n logConsole(\"warn\", line, prefix, prefixColor);\n }\n\n // known case: \"error: CODE_MOVED for unknown code block?\", warning for workerd devs, not application devs\n else if (classifiers.isCodeMovedWarning(line)) {\n // ignore entirely, don't even send it to the debug log file\n }\n\n // Handle Zeno error logs\n else if (classifiers.isZenoLog(line)) {\n // Strip the prefixes\n line = line.substring(\"[ZENO]:\".length);\n line = line.substring(\"[ERROR]\".length);\n logConsole(\"error\", line, prefix, prefixColor);\n }\n\n // anything not explicitly handled above should be logged as an error (via stderr)\n else {\n logConsole(\"error\", line, prefix, prefixColor);\n }\n }\n });\n };\n}\n\nfunction logConsole(\n level: LogLevel,\n data: string,\n prefix?: string,\n prefixColor?: ChalkInstance\n) {\n void logConsoleAsync(level, data, prefix, prefixColor);\n}\n\n/**\n * This is what is logged when the runtime calls console.log, etc.\n */\nasync function logConsoleAsync(\n level: LogLevel,\n data: string,\n prefix?: string,\n prefixColor?: ChalkInstance\n) {\n let outputPrefix = \"\";\n if (prefix && prefixColor) {\n const paddedName = prefix.padEnd(10);\n outputPrefix = prefixColor(paddedName) + chalk.gray(\" | \");\n }\n\n try {\n if (!data) {\n return;\n }\n\n // This shouldn't happen, but just in case\n if (typeof data !== \"string\") {\n console[level](outputPrefix + data);\n return;\n }\n\n let message = data?.trim();\n if (!message || message?.length === 0) {\n return;\n }\n\n // Probably a JSON object\n if (message.startsWith(`{`) && message.endsWith(`}`)) {\n let logEntry: ConsoleLogEntry;\n try {\n logEntry = JSON.parse(message);\n } catch {\n console[level](outputPrefix + data);\n return;\n }\n await Promise.all(\n logEntry.messages.map(async (msg) => {\n const line = await logFormatter.formatStructured(logEntry, msg);\n console[level](outputPrefix + line);\n })\n );\n } else {\n message = await logFormatter.formatMessage(message);\n\n const line = logFormatter.formatLine(level, message);\n console[level](outputPrefix + line);\n }\n } catch {\n const line = logFormatter.formatLine(level, data);\n\n console[level](outputPrefix + line);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"worker-output.js","sourceRoot":"","sources":["../../src/common/worker-output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAmB,YAAY,EAAY,MAAM,iBAAiB,CAAC;AAC1E,OAAO,KAAwB,MAAM,OAAO,CAAC;AAE7C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC3D,OAAO,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAGH,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAGxC,MAAM,oBAAoB,GACxB,+EAA+E,CAAC;AAGlF,MAAM,mBAAmB,GAAyB;IAChD,CAAC,UAAU,EAAE,OAAO,CAAC;IACrB,CAAC,YAAY,EAAE,MAAM,CAAC;IACtB,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAC1B,CAAC,oDAAoD,EAAE,MAAM,CAAC;IAC9D,CAAC,2BAA2B,EAAE,MAAM,CAAC;IACrC,CAAC,0BAA0B,EAAE,MAAM,CAAC;IACpC,CAAC,qBAAqB,EAAE,MAAM,CAAC;CAChC,CAAC;AAUF,MAAM,UAAU,mBAAmB,CACjC,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAA6B;YAEvC,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,OAAO;SAEf,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACnD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,OAAO,SAAS,kBAAkB,CAAC,MAAgB,EAAE,MAAgB;QACnE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAC9C,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAC3B,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAE3B,MAAM,WAAW,GAAG;YAElB,MAAM,CAAC,KAAa;gBAClB,MAAM,6BAA6B,GAAG,KAAK,CAAC,QAAQ,CAClD,kEAAkE,CACnE,CAAC;gBACF,MAAM,mCAAmC,GAAG,KAAK,CAAC,QAAQ,CACxD,6BAA6B,CAC9B,CAAC;gBAIF,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEpE,OAAO,CACL,6BAA6B;oBAC7B,mCAAmC;oBACnC,gBAAgB,CACjB,CAAC;YACJ,CAAC;YAED,cAAc,CAAC,KAAa;gBAC1B,OAAO,KAAK,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;YACjE,CAAC;YACD,SAAS,CAAC,KAAa;gBACrB,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;YACD,kBAAkB,CAAC,KAAa;gBAC9B,OAAO,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,CAAC;YACD,iBAAiB,CAAC,KAAa;gBAC7B,OAAO,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAC7C,CAAC;YACD,SAAS,CAAC,KAAa;gBACrB,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACrC,CAAC;SACF,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC3C,MAAM,gBAAgB,GAAG,GAAG,iBAAiB,GAAG,KAAK,EAAE,CAAC;YAExD,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAE1D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBAEvB,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAE3D,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBAEN,iBAAiB,GAAG,gBAAgB,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEzC,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAE1C,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAW7B,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;qBAGI,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAChD,CAAC;qBAAM,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBAEvC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAC1C,CAAC;oBAEF,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1D,IAAI,KAAK,EAAE,CAAC;wBACV,UAAU,CAAC,KAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBAC3D,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBAChD,CAAC;gBACH,CAAC;qBAGI,IAAI,OAAO,EAAE,CAAC;oBACjB,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAClE,CAAC;qBAGI,CAAC;oBACJ,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC3C,MAAM,gBAAgB,GAAG,GAAG,iBAAiB,GAAG,KAAK,EAAE,CAAC;YAExD,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,MAAM,cAAc,GAAG,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAE1D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBAEvB,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAE3D,iBAAiB,GAAG,gBAAgB,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBAEN,iBAAiB,GAAG,gBAAgB,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEzC,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAE1C,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;oBAK7B,IAAI,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;wBACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,+CAA+C,CAChD,EAAE,CAAC,CAAC,CAAC,CAAC;wBAEP,UAAU,CACR,OAAO,EACP,2BAA2B,OAAO,oHAAoH,EACtJ,MAAM,EACN,WAAW,CACZ,CAAC;wBAGF,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBACjD,CAAC;yBAII,IAAI,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC7C,IAAI,KAAK,GAAG,+CAA+C,CAAC;wBAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;4BACjC,KAAK;gCACH,iGAAiG;oCACjG,qDAAqD;oCACrD,+EAA+E,CAAC;wBACpF,CAAC;wBACD,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;wBAGhD,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBACjD,CAAC;yBAMI,CAAC;wBACJ,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;qBAGI,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAChD,CAAC;qBAGI,IAAI,WAAW,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAEhD,CAAC;qBAGI,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;oBAErC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACxC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACxC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;qBAGI,IAAI,OAAO,EAAE,CAAC;oBACjB,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBAClE,CAAC;qBAGI,CAAC;oBACJ,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,KAAe,EACf,IAAY,EACZ,MAAe,EACf,WAA2B;IAE3B,KAAK,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAKD,KAAK,UAAU,eAAe,CAC5B,KAAe,EACf,IAAY,EACZ,MAAe,EACf,WAA2B;IAE3B,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAGD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAGD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,QAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAClC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;YACtC,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElD,OAAO,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;AACH,CAAC","sourcesContent":["/** biome-ignore-all lint/suspicious/noConsole: Output */\n\nimport { readFile } from \"node:fs/promises\";\nimport { Readable } from \"node:stream\";\nimport { ConsoleLogEntry, LogFormatter, LogLevel } from \"@zuplo/core/cli\";\nimport chalk, { ChalkInstance } from \"chalk\";\n\nconst logFormatter = new LogFormatter(async (path: string) => {\n return readFile(path, { encoding: \"utf8\" });\n});\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: matches ANSI escapes\nconst ANSI_ESCAPE = /\\u001b\\[[0-9;]*m/g;\n\n/** `2026-10-11T01:42:43.470549Z INFO zuplo_gateway: listening addr=...` */\nconst GATEWAY_TRACING_LINE =\n /^\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z\\s+(TRACE|DEBUG|INFO|WARN|ERROR)\\s+[\\w:]+:\\s?(.*)$/;\n\n/** Diagnostics and lifecycle lines `zuplo-gateway dev --watch` prints. */\nconst GATEWAY_PLAIN_LINES: [RegExp, LogLevel][] = [\n [/^error: /, \"error\"],\n [/^warning: /, \"warn\"],\n [/^(note|hint): /, \"info\"],\n [/^rebuild failed; still serving the previous build$/, \"warn\"],\n [/^watching .+ for changes$/, \"info\"],\n [/^.+ changed; rebuilding$/, \"info\"],\n [/^rebuilt in \\d+ ms$/, \"info\"],\n];\n\n/**\n * The level and message of a line the Rust gateway (`zuplo-gateway`, the\n * opt-in managed-dedicated runtime) writes, or undefined for any other line.\n * The gateway logs through `tracing` (with its own timestamp, which is\n * dropped: the formatted line gets ours) and prints build diagnostics as\n * `error:` / `warning:` / `note:` / `hint:` lines. Without this every one of\n * them would be shown as an error.\n */\nexport function classifyGatewayLine(\n line: string\n): { level: LogLevel; message: string } | undefined {\n const plain = line.replace(ANSI_ESCAPE, \"\");\n const tracing = GATEWAY_TRACING_LINE.exec(plain);\n if (tracing) {\n const levels: Record<string, LogLevel> = {\n // biome-ignore-start lint/style/useNamingConvention: tracing level names\n TRACE: \"debug\",\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warn\",\n ERROR: \"error\",\n // biome-ignore-end lint/style/useNamingConvention: tracing level names\n };\n return { level: levels[tracing[1]], message: tracing[2] };\n }\n for (const [pattern, level] of GATEWAY_PLAIN_LINES) {\n if (pattern.test(plain)) {\n return { level, message: plain };\n }\n }\n return undefined;\n}\n\nexport function createRuntimeStdioHandler(options?: {\n prefix?: string;\n prefixColor?: ChalkInstance;\n}) {\n return function handleRuntimeStdio(stdout: Readable, stderr: Readable) {\n const { prefix, prefixColor } = options ?? {};\n let stdoutAccumulator = \"\";\n let stderrAccumulator = \"\";\n\n const classifiers = {\n // Is this chunk a big chonky barf from workerd that we want to hijack to cleanup/ignore?\n isBarf(chunk: string) {\n const containsLlvmSymbolizerWarning = chunk.includes(\n \"Not symbolizing stack traces because $LLVM_SYMBOLIZER is not set\"\n );\n const containsRecursiveIsolateLockWarning = chunk.includes(\n \"took recursive isolate lock\"\n );\n // Matches stack traces from workerd\n // - on unix: groups of 9 hex digits separated by spaces\n // - on windows: groups of 12 hex digits, or a single digit 0, separated by spaces\n const containsHexStack = /stack:( (0|[a-f\\d]{4,})){3,}/.test(chunk);\n\n return (\n containsLlvmSymbolizerWarning ||\n containsRecursiveIsolateLockWarning ||\n containsHexStack\n );\n },\n // Is this chunk an Address In Use error?\n isAddressInUse(chunk: string) {\n return chunk.includes(\"Address already in use; toString() = \");\n },\n isWarning(chunk: string) {\n return /\\.c\\+\\+:\\d+: warning:/.test(chunk);\n },\n isCodeMovedWarning(chunk: string) {\n return /CODE_MOVED for unknown code block/.test(chunk);\n },\n isAccessViolation(chunk: string) {\n return chunk.includes(\"access violation;\");\n },\n isZenoLog(chunk: string) {\n return chunk.startsWith(\"[ZENO]:\");\n },\n };\n\n stdout.on(\"data\", (chunk: Buffer | string) => {\n const fullStreamOutput = `${stdoutAccumulator}${chunk}`;\n\n let currentLogsStr = \"\";\n const lastNewlineIdx = fullStreamOutput.lastIndexOf(\"\\n\");\n\n if (lastNewlineIdx > 0) {\n // Extract complete logs up to the last newline\n currentLogsStr = fullStreamOutput.slice(0, lastNewlineIdx);\n // Save the partial/incomplete log for next iteration\n stdoutAccumulator = fullStreamOutput.slice(lastNewlineIdx + 1);\n } else {\n // No complete log found, accumulate entire output\n stdoutAccumulator = fullStreamOutput;\n return;\n }\n\n const lines = currentLogsStr.split(\"\\n\");\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n const gateway = classifyGatewayLine(line);\n\n if (classifiers.isBarf(line)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // there are no known cases to cleanup yet\n // but, as they are identified, we will do that here\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n\n // known case: warnings are not info, log them as such\n else if (classifiers.isWarning(line)) {\n logConsole(\"warn\", line, prefix, prefixColor);\n } else if (classifiers.isZenoLog(line)) {\n // Route to the specified logging level\n const levels = [\"debug\", \"info\", \"warn\", \"error\"];\n const level = levels.find((level) =>\n line.includes(`[${level.toUpperCase()}]`)\n );\n // Strip the prefixes for zeno and the zeno logging level\n line = line.substring(\"[ZENO]:\".length);\n line = line.substring(`[${level?.toUpperCase()}]`.length);\n if (level) {\n logConsole(level as LogLevel, line, prefix, prefixColor);\n } else {\n logConsole(\"info\", line, prefix, prefixColor);\n }\n }\n\n // the Rust gateway's own log and diagnostic lines\n else if (gateway) {\n logConsole(gateway.level, gateway.message, prefix, prefixColor);\n }\n\n // anything not explicitly handled above should be logged as info (via stdout)\n else {\n logConsole(\"error\", line, prefix, prefixColor);\n }\n }\n });\n\n stderr.on(\"data\", (chunk: Buffer | string) => {\n const fullStreamOutput = `${stderrAccumulator}${chunk}`;\n\n let currentLogsStr = \"\";\n const lastNewlineIdx = fullStreamOutput.lastIndexOf(\"\\n\");\n\n if (lastNewlineIdx > 0) {\n // Extract complete logs up to the last newline\n currentLogsStr = fullStreamOutput.slice(0, lastNewlineIdx);\n // Save the partial/incomplete log for next iteration\n stderrAccumulator = fullStreamOutput.slice(lastNewlineIdx + 1);\n } else {\n // No complete log found, accumulate entire output\n stderrAccumulator = fullStreamOutput;\n return;\n }\n\n const lines = currentLogsStr.split(\"\\n\");\n\n for (let line of lines) {\n line = line.trim();\n if (!line) continue;\n const gateway = classifyGatewayLine(line);\n\n if (classifiers.isBarf(line)) {\n // this is a big chonky barf from workerd that we want to hijack to cleanup/ignore\n\n // CLEANABLE:\n // known case to cleanup: Address in use errors\n if (classifiers.isAddressInUse(line)) {\n const address = line.match(\n /Address already in use; toString\\(\\) = (.+)\\n/\n )?.[1];\n\n logConsole(\n \"error\",\n `Address already in use (${address}). Please check that you are not already running a server on this address or specify a different port with --port.`,\n prefix,\n prefixColor\n );\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n // In the past we have seen Access Violation errors on Windows, which may be caused by an outdated\n // version of the Windows OS or the Microsoft Visual C++ Redistributable.\n // See https://github.com/cloudflare/workers-sdk/issues/6170#issuecomment-2245209918\n else if (classifiers.isAccessViolation(line)) {\n let error = \"There was an access violation in the runtime.\";\n if (process.platform === \"win32\") {\n error +=\n \"\\nOn Windows, this may be caused by an outdated Microsoft Visual C++ Redistributable library.\\n\" +\n \"Check that you have the latest version installed.\\n\" +\n \"See https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist.\";\n }\n logConsole(\"error\", error, prefix, prefixColor);\n\n // Log the original error to the debug logs.\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n\n // IGNORABLE:\n // anything else not handled above is considered ignorable\n // so send it to the debug logs which are discarded unless\n // the user explicitly sets a logLevel indicating they care\n else {\n logConsole(\"debug\", line, prefix, prefixColor);\n }\n }\n\n // known case: warnings are not errors, log them as such\n else if (classifiers.isWarning(line)) {\n logConsole(\"warn\", line, prefix, prefixColor);\n }\n\n // known case: \"error: CODE_MOVED for unknown code block?\", warning for workerd devs, not application devs\n else if (classifiers.isCodeMovedWarning(line)) {\n // ignore entirely, don't even send it to the debug log file\n }\n\n // Handle Zeno error logs\n else if (classifiers.isZenoLog(line)) {\n // Strip the prefixes\n line = line.substring(\"[ZENO]:\".length);\n line = line.substring(\"[ERROR]\".length);\n logConsole(\"error\", line, prefix, prefixColor);\n }\n\n // the Rust gateway's own log and diagnostic lines\n else if (gateway) {\n logConsole(gateway.level, gateway.message, prefix, prefixColor);\n }\n\n // anything not explicitly handled above should be logged as an error (via stderr)\n else {\n logConsole(\"error\", line, prefix, prefixColor);\n }\n }\n });\n };\n}\n\nfunction logConsole(\n level: LogLevel,\n data: string,\n prefix?: string,\n prefixColor?: ChalkInstance\n) {\n void logConsoleAsync(level, data, prefix, prefixColor);\n}\n\n/**\n * This is what is logged when the runtime calls console.log, etc.\n */\nasync function logConsoleAsync(\n level: LogLevel,\n data: string,\n prefix?: string,\n prefixColor?: ChalkInstance\n) {\n let outputPrefix = \"\";\n if (prefix && prefixColor) {\n const paddedName = prefix.padEnd(10);\n outputPrefix = prefixColor(paddedName) + chalk.gray(\" | \");\n }\n\n try {\n if (!data) {\n return;\n }\n\n // This shouldn't happen, but just in case\n if (typeof data !== \"string\") {\n console[level](outputPrefix + data);\n return;\n }\n\n let message = data?.trim();\n if (!message || message?.length === 0) {\n return;\n }\n\n // Probably a JSON object\n if (message.startsWith(`{`) && message.endsWith(`}`)) {\n let logEntry: ConsoleLogEntry;\n try {\n logEntry = JSON.parse(message);\n } catch {\n console[level](outputPrefix + data);\n return;\n }\n await Promise.all(\n logEntry.messages.map(async (msg) => {\n const line = await logFormatter.formatStructured(logEntry, msg);\n console[level](outputPrefix + line);\n })\n );\n } else {\n message = await logFormatter.formatMessage(message);\n\n const line = logFormatter.formatLine(level, message);\n console[level](outputPrefix + line);\n }\n } catch {\n const line = logFormatter.formatLine(level, data);\n\n console[level](outputPrefix + line);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/confirm-linked-config.integration.test.ts","../src/__tests__/integration/confirm-production-deploy.integration.test.ts","../src/__tests__/integration/custom-domain.integration.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/get-project-param.integration.test.ts","../src/__tests__/integration/info.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/linked-config-cascade.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/source-upgrade.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/__tests__/integration/whoami.integration.test.ts","../src/bucket/models.ts","../src/bucket/list/handler.ts","../src/build/handler.ts","../src/ca-certificate/models.ts","../src/ca-certificate/validation.test.ts","../src/ca-certificate/validation.ts","../src/ca-certificate/create/handler.ts","../src/ca-certificate/delete/handler.ts","../src/ca-certificate/describe/handler.ts","../src/ca-certificate/list/handler.ts","../src/ca-certificate/update/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/info.ts","../src/cmds/init.ts","../src/cmds/link.ts","../src/cmds/lint.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/logout.ts","../src/cmds/test.ts","../src/cmds/whoami.ts","../src/cmds/bucket/index.ts","../src/cmds/bucket/list.ts","../src/cmds/ca-certificate/create.ts","../src/cmds/ca-certificate/delete.ts","../src/cmds/ca-certificate/describe.ts","../src/cmds/ca-certificate/index.ts","../src/cmds/ca-certificate/list.ts","../src/cmds/ca-certificate/update.ts","../src/cmds/custom-domain/create.ts","../src/cmds/custom-domain/delete.ts","../src/cmds/custom-domain/index.ts","../src/cmds/custom-domain/list.ts","../src/cmds/custom-domain/update.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/project/info.ts","../src/cmds/project/list.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/cli-dispatcher.test.ts","../src/common/cli-dispatcher.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/populate.ts","../src/common/read-linked-config.test.ts","../src/common/read-linked-config.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/terminal.test.ts","../src/common/terminal.ts","../src/common/worker-output.ts","../src/common/analytics/cli-invocation.test.ts","../src/common/analytics/cli-invocation.ts","../src/common/analytics/lib.ts","../src/common/analytics/package-manager.test.ts","../src/common/analytics/package-manager.ts","../src/common/api/client.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/check-pnpm-lifecycle.test.ts","../src/common/middleware/check-pnpm-lifecycle.ts","../src/common/middleware/confirm-linked-config.ts","../src/common/middleware/confirm-production-deploy.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.test.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/branch.ts","../src/common/utils/build-environment-prompt-choices.test.ts","../src/common/utils/build-environment-prompt-choices.ts","../src/common/utils/format-environment-type.test.ts","../src/common/utils/format-environment-type.ts","../src/common/utils/pnpm-lifecycle.test.ts","../src/common/utils/pnpm-lifecycle.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.test.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/sort-environments-for-prompt.test.ts","../src/common/utils/sort-environments-for-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/argument-validators.spec.ts","../src/common/validators/argument-validators.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/custom-domain/models.ts","../src/custom-domain/create/handler.ts","../src/custom-domain/delete/handler.ts","../src/custom-domain/list/handler.ts","../src/custom-domain/update/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.local-registry.test.ts","../src/deploy/archive.test.ts","../src/deploy/archive.ts","../src/deploy/classify-build-probe.test.ts","../src/deploy/classify-build-probe.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.test.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/dev/zuplo-local-gitignore.test.ts","../src/dev/zuplo-local-gitignore.ts","../src/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/init/handler.ts","../src/link/handler.ts","../src/link/project-type.test.ts","../src/link/project-type.ts","../src/lint/handler.ts","../src/lint/resolve-binary.test.ts","../src/lint/resolve-binary.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/logout.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/project/create/handler.ts","../src/project/info/handler.ts","../src/project/list/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/ai-gateway/files.test.ts","../src/source/ai-gateway/files.ts","../src/source/ai-gateway/handler.test.ts","../src/source/ai-gateway/handler.ts","../src/source/ai-gateway/package.test.ts","../src/source/ai-gateway/planner.test.ts","../src/source/ai-gateway/planner.ts","../src/source/ai-gateway/release.test.ts","../src/source/ai-gateway/release.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.test.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts","../src/whoami/handler.ts"],"version":"5.8.3"}
|
|
1
|
+
{"root":["../src/cli.ts","../src/internal.ts","../src/types.d.ts","../src/__tests__/archive-utils.test.ts","../src/__tests__/import-openapi.test.ts","../src/__tests__/outdated.test.ts","../src/__tests__/populate.test.ts","../src/__tests__/tsconfig-upgrader.test.ts","../src/__tests__/integration/confirm-linked-config.integration.test.ts","../src/__tests__/integration/confirm-production-deploy.integration.test.ts","../src/__tests__/integration/custom-domain.integration.test.ts","../src/__tests__/integration/delete.integration.test.ts","../src/__tests__/integration/deploy.integration.test.ts","../src/__tests__/integration/get-project-param.integration.test.ts","../src/__tests__/integration/info.integration.test.ts","../src/__tests__/integration/jest-mocks-setup.ts","../src/__tests__/integration/jest-setup.ts","../src/__tests__/integration/link.integration.test.ts","../src/__tests__/integration/linked-config-cascade.integration.test.ts","../src/__tests__/integration/list.integration.test.ts","../src/__tests__/integration/source-upgrade.integration.test.ts","../src/__tests__/integration/test-utils.ts","../src/__tests__/integration/tunnel.integration.test.ts","../src/__tests__/integration/variable.integration.test.ts","../src/__tests__/integration/whoami.integration.test.ts","../src/bucket/models.ts","../src/bucket/list/handler.ts","../src/build/handler.ts","../src/ca-certificate/models.ts","../src/ca-certificate/validation.test.ts","../src/ca-certificate/validation.ts","../src/ca-certificate/create/handler.ts","../src/ca-certificate/delete/handler.ts","../src/ca-certificate/describe/handler.ts","../src/ca-certificate/list/handler.ts","../src/ca-certificate/update/handler.ts","../src/cmds/build.ts","../src/cmds/compile.ts","../src/cmds/delete.ts","../src/cmds/deploy.ts","../src/cmds/dev.ts","../src/cmds/docs.ts","../src/cmds/editor.ts","../src/cmds/info.ts","../src/cmds/init.ts","../src/cmds/link.ts","../src/cmds/lint.ts","../src/cmds/list.ts","../src/cmds/login.ts","../src/cmds/logout.ts","../src/cmds/test.ts","../src/cmds/whoami.ts","../src/cmds/bucket/index.ts","../src/cmds/bucket/list.ts","../src/cmds/ca-certificate/create.ts","../src/cmds/ca-certificate/delete.ts","../src/cmds/ca-certificate/describe.ts","../src/cmds/ca-certificate/index.ts","../src/cmds/ca-certificate/list.ts","../src/cmds/ca-certificate/update.ts","../src/cmds/custom-domain/create.ts","../src/cmds/custom-domain/delete.ts","../src/cmds/custom-domain/index.ts","../src/cmds/custom-domain/list.ts","../src/cmds/custom-domain/update.ts","../src/cmds/mtls-certificates/create.ts","../src/cmds/mtls-certificates/delete.ts","../src/cmds/mtls-certificates/describe.ts","../src/cmds/mtls-certificates/disable.ts","../src/cmds/mtls-certificates/index.ts","../src/cmds/mtls-certificates/list.ts","../src/cmds/mtls-certificates/update.ts","../src/cmds/open-api/convert.ts","../src/cmds/open-api/index.ts","../src/cmds/open-api/merge.ts","../src/cmds/open-api/overlay.ts","../src/cmds/project/create.ts","../src/cmds/project/index.ts","../src/cmds/project/info.ts","../src/cmds/project/list.ts","../src/cmds/proxies/create.ts","../src/cmds/proxies/delete.ts","../src/cmds/proxies/describe.ts","../src/cmds/proxies/index.ts","../src/cmds/proxies/update.ts","../src/cmds/source/import-openapi.ts","../src/cmds/source/index.ts","../src/cmds/source/migrate.ts","../src/cmds/source/upgrade.ts","../src/cmds/tunnel/create.ts","../src/cmds/tunnel/delete.ts","../src/cmds/tunnel/describe.ts","../src/cmds/tunnel/index.ts","../src/cmds/tunnel/list.ts","../src/cmds/tunnel/rotate-token.ts","../src/cmds/tunnel/services/describe.ts","../src/cmds/tunnel/services/index.ts","../src/cmds/tunnel/services/update.ts","../src/cmds/variable/create.ts","../src/cmds/variable/index.ts","../src/cmds/variable/update.ts","../src/common/alias.ts","../src/common/args.ts","../src/common/cli-dispatcher.test.ts","../src/common/cli-dispatcher.ts","../src/common/constants.ts","../src/common/handler.ts","../src/common/logger.ts","../src/common/models.ts","../src/common/outdated.ts","../src/common/output.ts","../src/common/populate.ts","../src/common/read-linked-config.test.ts","../src/common/read-linked-config.ts","../src/common/runner.ts","../src/common/settings.ts","../src/common/terminal.test.ts","../src/common/terminal.ts","../src/common/worker-output.test.ts","../src/common/worker-output.ts","../src/common/analytics/cli-invocation.test.ts","../src/common/analytics/cli-invocation.ts","../src/common/analytics/lib.ts","../src/common/analytics/package-manager.test.ts","../src/common/analytics/package-manager.ts","../src/common/api/client.ts","../src/common/api/lib.ts","../src/common/machine-id/lib.ts","../src/common/middleware/authentication.ts","../src/common/middleware/check-pnpm-lifecycle.test.ts","../src/common/middleware/check-pnpm-lifecycle.ts","../src/common/middleware/confirm-linked-config.ts","../src/common/middleware/confirm-production-deploy.ts","../src/common/middleware/get-account-param.ts","../src/common/middleware/get-environment-param.test.ts","../src/common/middleware/get-environment-param.ts","../src/common/middleware/get-project-param.ts","../src/common/middleware/logging.ts","../src/common/middleware/user-configuration.ts","../src/common/middleware/user-identification.ts","../src/common/middleware/validate-fleet.ts","../src/common/upgraders/lib.ts","../src/common/upgraders/package-json-upgrader.ts","../src/common/upgraders/tsconfig-upgrader.ts","../src/common/upgraders/vscode-settings-json-upgrader.ts","../src/common/utils/box.ts","../src/common/utils/branch.ts","../src/common/utils/build-environment-prompt-choices.test.ts","../src/common/utils/build-environment-prompt-choices.ts","../src/common/utils/format-environment-type.test.ts","../src/common/utils/format-environment-type.ts","../src/common/utils/pnpm-lifecycle.test.ts","../src/common/utils/pnpm-lifecycle.ts","../src/common/utils/ports.ts","../src/common/utils/prefixed-output.ts","../src/common/utils/pretty-print-environment-prompt.test.ts","../src/common/utils/pretty-print-environment-prompt.ts","../src/common/utils/sort-environments-for-prompt.test.ts","../src/common/utils/sort-environments-for-prompt.ts","../src/common/utils/stringify-config.test.ts","../src/common/utils/stringify-config.ts","../src/common/utils/types.ts","../src/common/utils/urls.ts","../src/common/validators/argument-validators.spec.ts","../src/common/validators/argument-validators.ts","../src/common/validators/file-system-validator.ts","../src/common/validators/lib.ts","../src/common/validators/project-name-validator.ts","../src/common/xdg/lib.ts","../src/compile/handler.ts","../src/custom-domain/models.ts","../src/custom-domain/create/handler.ts","../src/custom-domain/delete/handler.ts","../src/custom-domain/list/handler.ts","../src/custom-domain/update/handler.ts","../src/delete/handler.ts","../src/delete/poll-deployment.ts","../src/deploy/archive.local-registry.test.ts","../src/deploy/archive.test.ts","../src/deploy/archive.ts","../src/deploy/classify-build-probe.test.ts","../src/deploy/classify-build-probe.ts","../src/deploy/environments.ts","../src/deploy/file-upload.ts","../src/deploy/handler.ts","../src/deploy/poll-deployment.test.ts","../src/deploy/poll-deployment.ts","../src/dev/handler.ts","../src/dev/zuplo-local-gitignore.test.ts","../src/dev/zuplo-local-gitignore.ts","../src/docs/handler.ts","../src/editor/handler.ts","../src/editor/e2e/editor.spec.ts","../src/init/handler.ts","../src/link/handler.ts","../src/link/project-type.test.ts","../src/link/project-type.ts","../src/lint/handler.ts","../src/lint/resolve-binary.test.ts","../src/lint/resolve-binary.ts","../src/list/handler.ts","../src/login/login.ts","../src/login/logout.ts","../src/login/tokens.ts","../src/mtls-certificates/models.ts","../src/mtls-certificates/create/handler.ts","../src/mtls-certificates/delete/handler.ts","../src/mtls-certificates/describe/handler.ts","../src/mtls-certificates/disable/handler.ts","../src/mtls-certificates/list/handler.ts","../src/mtls-certificates/update/handler.ts","../src/open-api/convert/handler.spec.ts","../src/open-api/convert/handler.ts","../src/open-api/merge/handler.spec.ts","../src/open-api/merge/handler.ts","../src/open-api/overlay/handler.spec.ts","../src/open-api/overlay/handler.ts","../src/project/create/handler.ts","../src/project/info/handler.ts","../src/project/list/handler.ts","../src/proxies/models.ts","../src/proxies/create/handler.ts","../src/proxies/delete/handler.ts","../src/proxies/describe/handler.ts","../src/proxies/update/handler.ts","../src/source/ai-gateway/files.test.ts","../src/source/ai-gateway/files.ts","../src/source/ai-gateway/handler.test.ts","../src/source/ai-gateway/handler.ts","../src/source/ai-gateway/package.test.ts","../src/source/ai-gateway/planner.test.ts","../src/source/ai-gateway/planner.ts","../src/source/ai-gateway/release.test.ts","../src/source/ai-gateway/release.ts","../src/source/migrate/dev-portal/handler.ts","../src/source/migrate/dev-portal/types.ts","../src/source/update/handler.ts","../src/test/esbuild-config.ts","../src/test/handler.ts","../src/test/invoke-test.test.ts","../src/test/invoke-test.ts","../src/test/test-files.test.ts","../src/test/test-files.ts","../src/test/esbuild-plugins/node-test-prep-plugin.ts","../src/tunnel/models.ts","../src/tunnel/create/handler.ts","../src/tunnel/delete/handler.ts","../src/tunnel/delete/poll-teardown-operation.ts","../src/tunnel/describe/handler.ts","../src/tunnel/list/handler.ts","../src/tunnel/rotate-token/handler.ts","../src/tunnel/services/describe/handler.ts","../src/tunnel/services/update/handler.ts","../src/tunnel/services/update/poll-provisioning-operations.ts","../src/variable/models.ts","../src/variable/create/handler.ts","../src/variable/update/handler.ts","../src/whoami/handler.ts"],"version":"5.8.3"}
|
|
@@ -224,6 +224,8 @@ app.use('/static/*', serveStatic({ root: './static' }))
|
|
|
224
224
|
|
|
225
225
|
Notice that `root` here is not relative to `src/index.ts`, rather to `my-hono-project`.
|
|
226
226
|
|
|
227
|
+
Only `GET` and `HEAD` requests are served. Requests with other methods are passed to the next middleware.
|
|
228
|
+
|
|
227
229
|
### Options
|
|
228
230
|
|
|
229
231
|
#### `allowPercentInPath`
|
|
@@ -846,7 +846,7 @@ const makeCloseHandler = (req, incoming, outgoing, needsBodyCleanup) => () => {
|
|
|
846
846
|
if (incoming.errored) {
|
|
847
847
|
recordBodyBufferedBeforeDisconnect(incoming);
|
|
848
848
|
req[abortRequest](incoming.errored.toString());
|
|
849
|
-
} else if (!outgoing.writableFinished) {
|
|
849
|
+
} else if (!outgoing.writableFinished || incoming instanceof node_http2.Http2ServerRequest && incoming.aborted) {
|
|
850
850
|
recordBodyBufferedBeforeDisconnect(incoming);
|
|
851
851
|
req[abortRequest]("Client connection prematurely closed.");
|
|
852
852
|
}
|
|
@@ -845,7 +845,7 @@ const makeCloseHandler = (req, incoming, outgoing, needsBodyCleanup) => () => {
|
|
|
845
845
|
if (incoming.errored) {
|
|
846
846
|
recordBodyBufferedBeforeDisconnect(incoming);
|
|
847
847
|
req[abortRequest](incoming.errored.toString());
|
|
848
|
-
} else if (!outgoing.writableFinished) {
|
|
848
|
+
} else if (!outgoing.writableFinished || incoming instanceof Http2ServerRequest && incoming.aborted) {
|
|
849
849
|
recordBodyBufferedBeforeDisconnect(incoming);
|
|
850
850
|
req[abortRequest]("Client connection prematurely closed.");
|
|
851
851
|
}
|
|
@@ -74,6 +74,7 @@ const serveStatic = (options = { root: "" }) => {
|
|
|
74
74
|
if (root !== "" && !(0, node_fs.existsSync)(root)) console.error(`serveStatic: root path '${root}' is not found, are you sure it's correct?`);
|
|
75
75
|
return async (c, next) => {
|
|
76
76
|
if (c.finalized) return next();
|
|
77
|
+
if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
|
|
77
78
|
let filename;
|
|
78
79
|
if (optionPath) filename = optionPath;
|
|
79
80
|
else try {
|
|
@@ -115,7 +116,7 @@ const serveStatic = (options = { root: "" }) => {
|
|
|
115
116
|
const size = stats.size;
|
|
116
117
|
const range = c.req.header("range") || "";
|
|
117
118
|
c.header("Last-Modified", stats.mtime.toUTCString());
|
|
118
|
-
if (c.req.method
|
|
119
|
+
if (c.req.method === "HEAD") {
|
|
119
120
|
c.header("Content-Length", size.toString());
|
|
120
121
|
c.status(200);
|
|
121
122
|
result = c.body(null);
|
|
@@ -73,6 +73,7 @@ const serveStatic = (options = { root: "" }) => {
|
|
|
73
73
|
if (root !== "" && !existsSync(root)) console.error(`serveStatic: root path '${root}' is not found, are you sure it's correct?`);
|
|
74
74
|
return async (c, next) => {
|
|
75
75
|
if (c.finalized) return next();
|
|
76
|
+
if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
|
|
76
77
|
let filename;
|
|
77
78
|
if (optionPath) filename = optionPath;
|
|
78
79
|
else try {
|
|
@@ -114,7 +115,7 @@ const serveStatic = (options = { root: "" }) => {
|
|
|
114
115
|
const size = stats.size;
|
|
115
116
|
const range = c.req.header("range") || "";
|
|
116
117
|
c.header("Last-Modified", stats.mtime.toUTCString());
|
|
117
|
-
if (c.req.method
|
|
118
|
+
if (c.req.method === "HEAD") {
|
|
118
119
|
c.header("Content-Length", size.toString());
|
|
119
120
|
c.status(200);
|
|
120
121
|
result = c.body(null);
|
|
@@ -14,6 +14,10 @@ import type { MetricsHost, ResolvedPostHogMetricsConfig } from './types';
|
|
|
14
14
|
* Deliberately unlike logs, no per-user context (distinct ID, session ID) is
|
|
15
15
|
* attached: every attribute value creates a new series, and per-user series
|
|
16
16
|
* are the canonical metrics-cardinality explosion.
|
|
17
|
+
*
|
|
18
|
+
* A sample recorded inside a sampled span stamps its series with an exemplar
|
|
19
|
+
* (trace ID, span ID, value). One per series per window, last sample wins, so a
|
|
20
|
+
* metric point links to one representative trace at no cardinality cost.
|
|
17
21
|
*/
|
|
18
22
|
export declare class PostHogMetrics {
|
|
19
23
|
private readonly _instance;
|
|
@@ -46,6 +50,11 @@ export declare class PostHogMetrics {
|
|
|
46
50
|
/** Clears the flush timer, drops the current window, and invalidates in-flight flushes. */
|
|
47
51
|
reset(): void;
|
|
48
52
|
private _capture;
|
|
53
|
+
/**
|
|
54
|
+
* The sampled span a sample is recorded in. An unsampled span is never
|
|
55
|
+
* exported, so an exemplar pointing at it would link to a missing trace.
|
|
56
|
+
*/
|
|
57
|
+
private _activeTraceContext;
|
|
49
58
|
/**
|
|
50
59
|
* Cardinality gate for adding a series to the live window — warns once per
|
|
51
60
|
* window when the cap is hit. Applied on capture and on merge-back alike.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAOpB,kBAAkB,EAEnB,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAetC,OAAO,KAAK,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAA;AAoCxE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IA0BvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IA3B1B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAI3B;IAGD,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,CAAC,gBAAgB,CAAQ;IAIhC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,oBAAoB,CAAoB;IAChD,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,yBAAyB,CAAI;IACrC,OAAO,CAAC,YAAY,CAAY;IAIhC,OAAO,CAAC,WAAW,CAAI;IAEvB,YACmB,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,4BAA4B,EACrC,OAAO,EAAE,MAAM,EAC9B;IAEJ,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAE3E;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAEvE;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAE3E;IAED,iFAAiF;IACjF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAerB;IAED;;;;;;OAMG;IACH,WAAW,IAAI,kBAAkB,GAAG,IAAI,CAUvC;IAED,2FAA2F;IAC3F,KAAK,IAAI,IAAI,CAWZ;IAED,OAAO,CAAC,QAAQ;IA0EhB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IA6Bb,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,eAAe;YAYT,QAAQ;IAyDtB,OAAO,CAAC,aAAa;IASrB;;;OAGG;IACH,OAAO,CAAC,aAAa;IA4DrB,oFAAoF;IACpF,OAAO,CAAC,gBAAgB;CAuCzB;AAqBD,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AACnH,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -39,6 +39,7 @@ const flush_timer_js_namespaceObject = require("../utils/flush-timer.js");
|
|
|
39
39
|
const retry_after_js_namespaceObject = require("../utils/retry-after.js");
|
|
40
40
|
const backoff_js_namespaceObject = require("../utils/backoff.js");
|
|
41
41
|
const otlp_any_value_js_namespaceObject = require("../utils/otlp-any-value.js");
|
|
42
|
+
const traceparent_js_namespaceObject = require("../traces/traceparent.js");
|
|
42
43
|
const external_metrics_utils_js_namespaceObject = require("./metrics-utils.js");
|
|
43
44
|
const external_config_js_namespaceObject = require("./config.js");
|
|
44
45
|
const OTLP_TEMPORALITY_DELTA = 1;
|
|
@@ -157,8 +158,23 @@ class PostHogMetrics {
|
|
|
157
158
|
this._logger.warn(`Metric name '${filtered.name}' is already used as a ${seenType}; recording it as a ${filtered.type} too will blend both series in charts. Use a distinct name.`);
|
|
158
159
|
}
|
|
159
160
|
this._fold(state, filtered.value);
|
|
161
|
+
const traceContext = this._activeTraceContext();
|
|
162
|
+
if (traceContext) state.exemplar = {
|
|
163
|
+
...traceContext,
|
|
164
|
+
value: filtered.value,
|
|
165
|
+
timeMs: Date.now()
|
|
166
|
+
};
|
|
160
167
|
this._armFlushTimer();
|
|
161
168
|
}
|
|
169
|
+
_activeTraceContext() {
|
|
170
|
+
try {
|
|
171
|
+
const parsed = (0, traceparent_js_namespaceObject.parseTraceparent)(this._instance.getActiveSpan?.()?.traceparent());
|
|
172
|
+
if (parsed && parsed.flags === traceparent_js_namespaceObject.TRACE_FLAGS_SAMPLED) return {
|
|
173
|
+
traceId: parsed.traceId,
|
|
174
|
+
spanId: parsed.spanId
|
|
175
|
+
};
|
|
176
|
+
} catch {}
|
|
177
|
+
}
|
|
162
178
|
_admitNewSeries() {
|
|
163
179
|
if (this._series.size < this._config.maxSeriesPerFlush) return true;
|
|
164
180
|
if (!this._seriesCapWarned) {
|
|
@@ -288,19 +304,22 @@ class PostHogMetrics {
|
|
|
288
304
|
}
|
|
289
305
|
const attributes = (0, otlp_any_value_js_namespaceObject.toOtlpKeyValueList)(state.attributes ?? {}, this._logger);
|
|
290
306
|
const startNano = (0, external_metrics_utils_js_namespaceObject.msToUnixNano)(state.windowStartMs);
|
|
307
|
+
const exemplars = toOtlpExemplars(state.exemplar);
|
|
291
308
|
if ('count' === state.type) {
|
|
292
309
|
const dp = {
|
|
293
310
|
attributes,
|
|
294
311
|
startTimeUnixNano: startNano,
|
|
295
312
|
timeUnixNano: nowNano,
|
|
296
|
-
asDouble: state.total ?? 0
|
|
313
|
+
asDouble: state.total ?? 0,
|
|
314
|
+
...exemplars
|
|
297
315
|
};
|
|
298
316
|
metric.sum.dataPoints.push(dp);
|
|
299
317
|
} else if ('gauge' === state.type) {
|
|
300
318
|
const dp = {
|
|
301
319
|
attributes,
|
|
302
320
|
timeUnixNano: nowNano,
|
|
303
|
-
asDouble: state.last ?? 0
|
|
321
|
+
asDouble: state.last ?? 0,
|
|
322
|
+
...exemplars
|
|
304
323
|
};
|
|
305
324
|
metric.gauge.dataPoints.push(dp);
|
|
306
325
|
} else if (state.hist) {
|
|
@@ -313,7 +332,8 @@ class PostHogMetrics {
|
|
|
313
332
|
min: state.hist.min,
|
|
314
333
|
max: state.hist.max,
|
|
315
334
|
bucketCounts: state.hist.bucketCounts,
|
|
316
|
-
explicitBounds: external_metrics_utils_js_namespaceObject.DEFAULT_HISTOGRAM_BOUNDS
|
|
335
|
+
explicitBounds: external_metrics_utils_js_namespaceObject.DEFAULT_HISTOGRAM_BOUNDS,
|
|
336
|
+
...exemplars
|
|
317
337
|
};
|
|
318
338
|
metric.histogram.dataPoints.push(dp);
|
|
319
339
|
}
|
|
@@ -328,6 +348,7 @@ class PostHogMetrics {
|
|
|
328
348
|
continue;
|
|
329
349
|
}
|
|
330
350
|
current.windowStartMs = Math.min(current.windowStartMs, old.windowStartMs);
|
|
351
|
+
current.exemplar = current.exemplar ?? old.exemplar;
|
|
331
352
|
switch(current.type){
|
|
332
353
|
case 'count':
|
|
333
354
|
current.total = (current.total ?? 0) + (old.total ?? 0);
|
|
@@ -347,6 +368,20 @@ class PostHogMetrics {
|
|
|
347
368
|
}
|
|
348
369
|
}
|
|
349
370
|
}
|
|
371
|
+
function toOtlpExemplars(exemplar) {
|
|
372
|
+
if (!exemplar) return {};
|
|
373
|
+
return {
|
|
374
|
+
exemplars: [
|
|
375
|
+
{
|
|
376
|
+
filteredAttributes: [],
|
|
377
|
+
timeUnixNano: (0, external_metrics_utils_js_namespaceObject.msToUnixNano)(exemplar.timeMs),
|
|
378
|
+
asDouble: exemplar.value,
|
|
379
|
+
traceId: exemplar.traceId,
|
|
380
|
+
spanId: exemplar.spanId
|
|
381
|
+
}
|
|
382
|
+
]
|
|
383
|
+
};
|
|
384
|
+
}
|
|
350
385
|
exports.DEFAULT_HISTOGRAM_BOUNDS = __webpack_exports__.DEFAULT_HISTOGRAM_BOUNDS;
|
|
351
386
|
exports.PostHogMetrics = __webpack_exports__.PostHogMetrics;
|
|
352
387
|
exports.buildMetricsResourceAttributes = __webpack_exports__.buildMetricsResourceAttributes;
|
|
@@ -3,6 +3,7 @@ import { FlushTimer } from "../utils/flush-timer.mjs";
|
|
|
3
3
|
import { RetryAfterWindow } from "../utils/retry-after.mjs";
|
|
4
4
|
import { MAX_FLUSH_BACKOFF_MS, NO_JITTER, backoffDelayMs, drawJitter } from "../utils/backoff.mjs";
|
|
5
5
|
import { toOtlpKeyValueList } from "../utils/otlp-any-value.mjs";
|
|
6
|
+
import { TRACE_FLAGS_SAMPLED, parseTraceparent } from "../traces/traceparent.mjs";
|
|
6
7
|
import { DEFAULT_HISTOGRAM_BOUNDS, bucketIndexFor, buildMetricsResourceAttributes, buildOtlpMetricsPayload, msToUnixNano, seriesKey } from "./metrics-utils.mjs";
|
|
7
8
|
const OTLP_TEMPORALITY_DELTA = 1;
|
|
8
9
|
class PostHogMetrics {
|
|
@@ -120,8 +121,23 @@ class PostHogMetrics {
|
|
|
120
121
|
this._logger.warn(`Metric name '${filtered.name}' is already used as a ${seenType}; recording it as a ${filtered.type} too will blend both series in charts. Use a distinct name.`);
|
|
121
122
|
}
|
|
122
123
|
this._fold(state, filtered.value);
|
|
124
|
+
const traceContext = this._activeTraceContext();
|
|
125
|
+
if (traceContext) state.exemplar = {
|
|
126
|
+
...traceContext,
|
|
127
|
+
value: filtered.value,
|
|
128
|
+
timeMs: Date.now()
|
|
129
|
+
};
|
|
123
130
|
this._armFlushTimer();
|
|
124
131
|
}
|
|
132
|
+
_activeTraceContext() {
|
|
133
|
+
try {
|
|
134
|
+
const parsed = parseTraceparent(this._instance.getActiveSpan?.()?.traceparent());
|
|
135
|
+
if (parsed && parsed.flags === TRACE_FLAGS_SAMPLED) return {
|
|
136
|
+
traceId: parsed.traceId,
|
|
137
|
+
spanId: parsed.spanId
|
|
138
|
+
};
|
|
139
|
+
} catch {}
|
|
140
|
+
}
|
|
125
141
|
_admitNewSeries() {
|
|
126
142
|
if (this._series.size < this._config.maxSeriesPerFlush) return true;
|
|
127
143
|
if (!this._seriesCapWarned) {
|
|
@@ -251,19 +267,22 @@ class PostHogMetrics {
|
|
|
251
267
|
}
|
|
252
268
|
const attributes = toOtlpKeyValueList(state.attributes ?? {}, this._logger);
|
|
253
269
|
const startNano = msToUnixNano(state.windowStartMs);
|
|
270
|
+
const exemplars = toOtlpExemplars(state.exemplar);
|
|
254
271
|
if ('count' === state.type) {
|
|
255
272
|
const dp = {
|
|
256
273
|
attributes,
|
|
257
274
|
startTimeUnixNano: startNano,
|
|
258
275
|
timeUnixNano: nowNano,
|
|
259
|
-
asDouble: state.total ?? 0
|
|
276
|
+
asDouble: state.total ?? 0,
|
|
277
|
+
...exemplars
|
|
260
278
|
};
|
|
261
279
|
metric.sum.dataPoints.push(dp);
|
|
262
280
|
} else if ('gauge' === state.type) {
|
|
263
281
|
const dp = {
|
|
264
282
|
attributes,
|
|
265
283
|
timeUnixNano: nowNano,
|
|
266
|
-
asDouble: state.last ?? 0
|
|
284
|
+
asDouble: state.last ?? 0,
|
|
285
|
+
...exemplars
|
|
267
286
|
};
|
|
268
287
|
metric.gauge.dataPoints.push(dp);
|
|
269
288
|
} else if (state.hist) {
|
|
@@ -276,7 +295,8 @@ class PostHogMetrics {
|
|
|
276
295
|
min: state.hist.min,
|
|
277
296
|
max: state.hist.max,
|
|
278
297
|
bucketCounts: state.hist.bucketCounts,
|
|
279
|
-
explicitBounds: DEFAULT_HISTOGRAM_BOUNDS
|
|
298
|
+
explicitBounds: DEFAULT_HISTOGRAM_BOUNDS,
|
|
299
|
+
...exemplars
|
|
280
300
|
};
|
|
281
301
|
metric.histogram.dataPoints.push(dp);
|
|
282
302
|
}
|
|
@@ -291,6 +311,7 @@ class PostHogMetrics {
|
|
|
291
311
|
continue;
|
|
292
312
|
}
|
|
293
313
|
current.windowStartMs = Math.min(current.windowStartMs, old.windowStartMs);
|
|
314
|
+
current.exemplar = current.exemplar ?? old.exemplar;
|
|
294
315
|
switch(current.type){
|
|
295
316
|
case 'count':
|
|
296
317
|
current.total = (current.total ?? 0) + (old.total ?? 0);
|
|
@@ -310,5 +331,19 @@ class PostHogMetrics {
|
|
|
310
331
|
}
|
|
311
332
|
}
|
|
312
333
|
}
|
|
334
|
+
function toOtlpExemplars(exemplar) {
|
|
335
|
+
if (!exemplar) return {};
|
|
336
|
+
return {
|
|
337
|
+
exemplars: [
|
|
338
|
+
{
|
|
339
|
+
filteredAttributes: [],
|
|
340
|
+
timeUnixNano: msToUnixNano(exemplar.timeMs),
|
|
341
|
+
asDouble: exemplar.value,
|
|
342
|
+
traceId: exemplar.traceId,
|
|
343
|
+
spanId: exemplar.spanId
|
|
344
|
+
}
|
|
345
|
+
]
|
|
346
|
+
};
|
|
347
|
+
}
|
|
313
348
|
export { resolveMetricsConfig } from "./config.mjs";
|
|
314
349
|
export { DEFAULT_HISTOGRAM_BOUNDS, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpMetricsPayload };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export type { MetricAttributeValue, MetricAttributes, MetricType, MetricsConfig, CaptureMetricOptions, MetricSample, BeforeSendMetricFn, Metrics, OtlpNumberDataPoint, OtlpHistogramDataPoint, OtlpMetric, OtlpMetricsPayload, } from '@posthog/types';
|
|
2
|
-
import type { BeforeSendMetricFn, MetricAttributeValue, OtlpMetricsPayload } from '@posthog/types';
|
|
1
|
+
export type { MetricAttributeValue, MetricAttributes, MetricType, MetricsConfig, CaptureMetricOptions, MetricSample, BeforeSendMetricFn, Metrics, OtlpNumberDataPoint, OtlpHistogramDataPoint, OtlpMetric, OtlpMetricsPayload, OtlpExemplar, } from '@posthog/types';
|
|
2
|
+
import type { BeforeSendMetricFn, MetricAttributeValue, OtlpMetricsPayload, Span } from '@posthog/types';
|
|
3
3
|
/** Same tagged outcome shape as `SendLogsBatchOutcome` — one policy for both signals. */
|
|
4
4
|
export type SendMetricsBatchOutcome = {
|
|
5
5
|
kind: 'ok';
|
|
@@ -30,6 +30,11 @@ export interface MetricsHost {
|
|
|
30
30
|
_sendMetricsBatch(payload: OtlpMetricsPayload): Promise<SendMetricsBatchOutcome>;
|
|
31
31
|
getLibraryId(): string;
|
|
32
32
|
getLibraryVersion(): string;
|
|
33
|
+
/**
|
|
34
|
+
* The span active where a sample is recorded. A sampled one stamps the
|
|
35
|
+
* sample's series with an exemplar. Hosts without tracing leave it out.
|
|
36
|
+
*/
|
|
37
|
+
getActiveSpan?(): Span | null;
|
|
33
38
|
}
|
|
34
39
|
/**
|
|
35
40
|
* Configuration for the metrics feature on `new PostHog(key, { metrics: ... })`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,OAAO,EACP,mBAAmB,EACnB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/metrics/types.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,OAAO,EACP,mBAAmB,EACnB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,YAAY,GACb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAExG,yFAAyF;AACzF,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GACd;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D;IACE,IAAI,EAAE,WAAW,CAAA;IACjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAA;AAErC;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAA;IAChF,YAAY,IAAI,MAAM,CAAA;IACtB,iBAAiB,IAAI,MAAM,CAAA;IAC3B;;;OAGG;IACH,aAAa,CAAC,IAAI,IAAI,GAAG,IAAI,CAAA;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAEzD;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B;;;OAGG;IACH,UAAU,CAAC,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,CAAA;CACvD;AAID,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;CAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/traces/ids.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/traces/ids.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAe7D;AAiBD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAMD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE9D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE7D"}
|
|
@@ -31,8 +31,8 @@ const TRACE_ID_BYTES = 16;
|
|
|
31
31
|
const SPAN_ID_BYTES = 8;
|
|
32
32
|
const TRACE_ID_HEX = 2 * TRACE_ID_BYTES;
|
|
33
33
|
const SPAN_ID_HEX = 2 * SPAN_ID_BYTES;
|
|
34
|
-
const
|
|
35
|
-
const
|
|
34
|
+
const INVALID_SPAN_ID = '0000000000000000';
|
|
35
|
+
const INVALID_TRACE_ID = INVALID_SPAN_ID + INVALID_SPAN_ID;
|
|
36
36
|
const HEX_RE = /^[0-9a-f]+$/;
|
|
37
37
|
function getRandomBytes(byteLength) {
|
|
38
38
|
const bytes = new Uint8Array(byteLength);
|
|
@@ -2,8 +2,8 @@ const TRACE_ID_BYTES = 16;
|
|
|
2
2
|
const SPAN_ID_BYTES = 8;
|
|
3
3
|
const TRACE_ID_HEX = 2 * TRACE_ID_BYTES;
|
|
4
4
|
const SPAN_ID_HEX = 2 * SPAN_ID_BYTES;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const INVALID_SPAN_ID = '0000000000000000';
|
|
6
|
+
const INVALID_TRACE_ID = INVALID_SPAN_ID + INVALID_SPAN_ID;
|
|
7
7
|
const HEX_RE = /^[0-9a-f]+$/;
|
|
8
8
|
function getRandomBytes(byteLength) {
|
|
9
9
|
const bytes = new Uint8Array(byteLength);
|