@marinoscar/platform-api 0.0.0-stage → 0.1.0-next.3
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/CHANGELOG.md +54 -0
- package/LICENSE +21 -0
- package/README.md +106 -2
- package/dist/core/crypto/encryption-key-startup-check.d.ts +29 -0
- package/dist/core/crypto/encryption-key-startup-check.d.ts.map +1 -0
- package/dist/core/crypto/encryption-key-startup-check.js +221 -0
- package/dist/core/crypto/encryption-key-startup-check.js.map +1 -0
- package/dist/core/crypto/secret-cipher.d.ts +151 -0
- package/dist/core/crypto/secret-cipher.d.ts.map +1 -0
- package/dist/core/crypto/secret-cipher.js +452 -0
- package/dist/core/crypto/secret-cipher.js.map +1 -0
- package/dist/core/data-access/index.d.ts +6 -0
- package/dist/core/data-access/index.d.ts.map +1 -0
- package/dist/core/data-access/index.js +19 -0
- package/dist/core/data-access/index.js.map +1 -0
- package/dist/core/data-access/scoped-access.error.d.ts +35 -0
- package/dist/core/data-access/scoped-access.error.d.ts.map +1 -0
- package/dist/core/data-access/scoped-access.error.js +43 -0
- package/dist/core/data-access/scoped-access.error.js.map +1 -0
- package/dist/core/data-access/scoped-client.d.ts +104 -0
- package/dist/core/data-access/scoped-client.d.ts.map +1 -0
- package/dist/core/data-access/scoped-client.js +270 -0
- package/dist/core/data-access/scoped-client.js.map +1 -0
- package/dist/core/data-access/types.d.ts +85 -0
- package/dist/core/data-access/types.d.ts.map +1 -0
- package/dist/core/data-access/types.js +12 -0
- package/dist/core/data-access/types.js.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts +60 -0
- package/dist/core/data-access/user-owned-data.registry.d.ts.map +1 -0
- package/dist/core/data-access/user-owned-data.registry.js +140 -0
- package/dist/core/data-access/user-owned-data.registry.js.map +1 -0
- package/dist/core/errors/database-seed.exception.d.ts +23 -0
- package/dist/core/errors/database-seed.exception.d.ts.map +1 -0
- package/dist/core/errors/database-seed.exception.js +49 -0
- package/dist/core/errors/database-seed.exception.js.map +1 -0
- package/dist/core/errors/error.dto.d.ts +47 -0
- package/dist/core/errors/error.dto.d.ts.map +1 -0
- package/dist/core/errors/error.dto.js +121 -0
- package/dist/core/errors/error.dto.js.map +1 -0
- package/dist/core/errors/http-exception.filter.d.ts +63 -0
- package/dist/core/errors/http-exception.filter.d.ts.map +1 -0
- package/dist/core/errors/http-exception.filter.js +234 -0
- package/dist/core/errors/http-exception.filter.js.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts +46 -0
- package/dist/core/errors/verbatim-error-body.exception.d.ts.map +1 -0
- package/dist/core/errors/verbatim-error-body.exception.js +135 -0
- package/dist/core/errors/verbatim-error-body.exception.js.map +1 -0
- package/dist/core/host/index.d.ts +7 -0
- package/dist/core/host/index.d.ts.map +1 -0
- package/dist/core/host/index.js +14 -0
- package/dist/core/host/index.js.map +1 -0
- package/dist/core/host/platform-host.d.ts +58 -0
- package/dist/core/host/platform-host.d.ts.map +1 -0
- package/dist/core/host/platform-host.js +104 -0
- package/dist/core/host/platform-host.js.map +1 -0
- package/dist/core/host/platform-host.module.d.ts +53 -0
- package/dist/core/host/platform-host.module.d.ts.map +1 -0
- package/dist/core/host/platform-host.module.js +90 -0
- package/dist/core/host/platform-host.module.js.map +1 -0
- package/dist/core/host/ports.d.ts +132 -0
- package/dist/core/host/ports.d.ts.map +1 -0
- package/dist/core/host/ports.js +48 -0
- package/dist/core/host/ports.js.map +1 -0
- package/dist/core/index.d.ts +15 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +77 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts +80 -0
- package/dist/core/openapi/openapi-tag.registry.d.ts.map +1 -0
- package/dist/core/openapi/openapi-tag.registry.js +72 -0
- package/dist/core/openapi/openapi-tag.registry.js.map +1 -0
- package/dist/core/principal/index.d.ts +6 -0
- package/dist/core/principal/index.d.ts.map +1 -0
- package/dist/core/principal/index.js +3 -0
- package/dist/core/principal/index.js.map +1 -0
- package/dist/core/principal/principal.types.d.ts +222 -0
- package/dist/core/principal/principal.types.d.ts.map +1 -0
- package/dist/core/principal/principal.types.js +22 -0
- package/dist/core/principal/principal.types.js.map +1 -0
- package/dist/core/registry/index.d.ts +4 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +19 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/registry-freeze.service.d.ts +14 -0
- package/dist/core/registry/registry-freeze.service.d.ts.map +1 -0
- package/dist/core/registry/registry-freeze.service.js +55 -0
- package/dist/core/registry/registry-freeze.service.js.map +1 -0
- package/dist/core/registry/registry.d.ts +268 -0
- package/dist/core/registry/registry.d.ts.map +1 -0
- package/dist/core/registry/registry.js +351 -0
- package/dist/core/registry/registry.js.map +1 -0
- package/dist/core/registry/testing.d.ts +29 -0
- package/dist/core/registry/testing.d.ts.map +1 -0
- package/dist/core/registry/testing.js +63 -0
- package/dist/core/registry/testing.js.map +1 -0
- package/dist/doctor/doctor-check.interface.d.ts +100 -0
- package/dist/doctor/doctor-check.interface.d.ts.map +1 -0
- package/dist/doctor/doctor-check.interface.js +95 -0
- package/dist/doctor/doctor-check.interface.js.map +1 -0
- package/dist/doctor/doctor-check.registry.d.ts +37 -0
- package/dist/doctor/doctor-check.registry.d.ts.map +1 -0
- package/dist/doctor/doctor-check.registry.js +96 -0
- package/dist/doctor/doctor-check.registry.js.map +1 -0
- package/dist/doctor/doctor.controller.factory.d.ts +29 -0
- package/dist/doctor/doctor.controller.factory.d.ts.map +1 -0
- package/dist/doctor/doctor.controller.factory.js +121 -0
- package/dist/doctor/doctor.controller.factory.js.map +1 -0
- package/dist/doctor/doctor.module.d.ts +78 -0
- package/dist/doctor/doctor.module.d.ts.map +1 -0
- package/dist/doctor/doctor.module.js +158 -0
- package/dist/doctor/doctor.module.js.map +1 -0
- package/dist/doctor/doctor.options.d.ts +39 -0
- package/dist/doctor/doctor.options.d.ts.map +1 -0
- package/dist/doctor/doctor.options.js +21 -0
- package/dist/doctor/doctor.options.js.map +1 -0
- package/dist/doctor/doctor.service.d.ts +80 -0
- package/dist/doctor/doctor.service.d.ts.map +1 -0
- package/dist/doctor/doctor.service.js +301 -0
- package/dist/doctor/doctor.service.js.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts +15 -0
- package/dist/doctor/dto/doctor-query.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-query.dto.js +16 -0
- package/dist/doctor/dto/doctor-query.dto.js.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts +27 -0
- package/dist/doctor/dto/doctor-report.dto.d.ts.map +1 -0
- package/dist/doctor/dto/doctor-report.dto.js +23 -0
- package/dist/doctor/dto/doctor-report.dto.js.map +1 -0
- package/dist/doctor/egress/classify-host.d.ts +73 -0
- package/dist/doctor/egress/classify-host.d.ts.map +1 -0
- package/dist/doctor/egress/classify-host.js +210 -0
- package/dist/doctor/egress/classify-host.js.map +1 -0
- package/dist/doctor/egress/egress.registry.d.ts +34 -0
- package/dist/doctor/egress/egress.registry.d.ts.map +1 -0
- package/dist/doctor/egress/egress.registry.js +70 -0
- package/dist/doctor/egress/egress.registry.js.map +1 -0
- package/dist/doctor/egress/egress.types.d.ts +135 -0
- package/dist/doctor/egress/egress.types.d.ts.map +1 -0
- package/dist/doctor/egress/egress.types.js +42 -0
- package/dist/doctor/egress/egress.types.js.map +1 -0
- package/dist/doctor/egress/index.d.ts +6 -0
- package/dist/doctor/egress/index.d.ts.map +1 -0
- package/dist/doctor/egress/index.js +23 -0
- package/dist/doctor/egress/index.js.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts +78 -0
- package/dist/doctor/egress/network-egress.doctor-check.d.ts.map +1 -0
- package/dist/doctor/egress/network-egress.doctor-check.js +226 -0
- package/dist/doctor/egress/network-egress.doctor-check.js.map +1 -0
- package/dist/doctor/index.d.ts +19 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +66 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/support-bundle/index.d.ts +12 -0
- package/dist/doctor/support-bundle/index.d.ts.map +1 -0
- package/dist/doctor/support-bundle/index.js +32 -0
- package/dist/doctor/support-bundle/index.js.map +1 -0
- package/dist/doctor/support-bundle/redact.d.ts +76 -0
- package/dist/doctor/support-bundle/redact.d.ts.map +1 -0
- package/dist/doctor/support-bundle/redact.js +236 -0
- package/dist/doctor/support-bundle/redact.js.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts +81 -0
- package/dist/doctor/support-bundle/sections/doctor.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js +83 -0
- package/dist/doctor/support-bundle/sections/doctor.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts +73 -0
- package/dist/doctor/support-bundle/sections/egress.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/egress.section.js +97 -0
- package/dist/doctor/support-bundle/sections/egress.section.js.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts +39 -0
- package/dist/doctor/support-bundle/sections/meta.section.d.ts.map +1 -0
- package/dist/doctor/support-bundle/sections/meta.section.js +89 -0
- package/dist/doctor/support-bundle/sections/meta.section.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts +100 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js +59 -0
- package/dist/doctor/support-bundle/support-bundle-section.interface.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts +57 -0
- package/dist/doctor/support-bundle/support-bundle.controller.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js +141 -0
- package/dist/doctor/support-bundle/support-bundle.controller.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts +92 -0
- package/dist/doctor/support-bundle/support-bundle.options.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.options.js +100 -0
- package/dist/doctor/support-bundle/support-bundle.options.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts +38 -0
- package/dist/doctor/support-bundle/support-bundle.registry.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js +90 -0
- package/dist/doctor/support-bundle/support-bundle.registry.js.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts +63 -0
- package/dist/doctor/support-bundle/support-bundle.service.d.ts.map +1 -0
- package/dist/doctor/support-bundle/support-bundle.service.js +244 -0
- package/dist/doctor/support-bundle/support-bundle.service.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/otel-core/index.d.ts +9 -0
- package/dist/otel-core/index.d.ts.map +1 -0
- package/dist/otel-core/index.js +58 -0
- package/dist/otel-core/index.js.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts +44 -0
- package/dist/otel-core/metrics/gauge-provider.d.ts.map +1 -0
- package/dist/otel-core/metrics/gauge-provider.js +37 -0
- package/dist/otel-core/metrics/gauge-provider.js.map +1 -0
- package/dist/otel-core/metrics/labels.d.ts +79 -0
- package/dist/otel-core/metrics/labels.d.ts.map +1 -0
- package/dist/otel-core/metrics/labels.js +135 -0
- package/dist/otel-core/metrics/labels.js.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts +130 -0
- package/dist/otel-core/metrics/metric-name.registry.d.ts.map +1 -0
- package/dist/otel-core/metrics/metric-name.registry.js +134 -0
- package/dist/otel-core/metrics/metric-name.registry.js.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts +163 -0
- package/dist/otel-core/metrics/metrics-host.service.d.ts.map +1 -0
- package/dist/otel-core/metrics/metrics-host.service.js +344 -0
- package/dist/otel-core/metrics/metrics-host.service.js.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts +54 -0
- package/dist/otel-core/metrics/otel-metrics.module.d.ts.map +1 -0
- package/dist/otel-core/metrics/otel-metrics.module.js +83 -0
- package/dist/otel-core/metrics/otel-metrics.module.js.map +1 -0
- package/dist/otel-core/sdk/index.d.ts +5 -0
- package/dist/otel-core/sdk/index.d.ts.map +1 -0
- package/dist/otel-core/sdk/index.js +27 -0
- package/dist/otel-core/sdk/index.js.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts +126 -0
- package/dist/otel-core/sdk/initialize-otel.d.ts.map +1 -0
- package/dist/otel-core/sdk/initialize-otel.js +204 -0
- package/dist/otel-core/sdk/initialize-otel.js.map +1 -0
- package/dist/otel-core/sdk/instance-id.d.ts +29 -0
- package/dist/otel-core/sdk/instance-id.d.ts.map +1 -0
- package/dist/otel-core/sdk/instance-id.js +65 -0
- package/dist/otel-core/sdk/instance-id.js.map +1 -0
- package/dist/otel-core/sdk/service-name.d.ts +28 -0
- package/dist/otel-core/sdk/service-name.d.ts.map +1 -0
- package/dist/otel-core/sdk/service-name.js +63 -0
- package/dist/otel-core/sdk/service-name.js.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts +116 -0
- package/dist/otel-core/sdk/telemetry-gate.d.ts.map +1 -0
- package/dist/otel-core/sdk/telemetry-gate.js +297 -0
- package/dist/otel-core/sdk/telemetry-gate.js.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts +58 -0
- package/dist/otel-core/spans/request-span-attributes.d.ts.map +1 -0
- package/dist/otel-core/spans/request-span-attributes.js +155 -0
- package/dist/otel-core/spans/request-span-attributes.js.map +1 -0
- package/dist/otel-core/spans/trace.decorator.d.ts +36 -0
- package/dist/otel-core/spans/trace.decorator.d.ts.map +1 -0
- package/dist/otel-core/spans/trace.decorator.js +74 -0
- package/dist/otel-core/spans/trace.decorator.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js +50 -0
- package/dist/telemetry/assistant/telemetry-ai-enabled.guard.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts +14 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js +178 -0
- package/dist/telemetry/assistant/telemetry-assistant.controller.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts +147 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js +495 -0
- package/dist/telemetry/assistant/telemetry-assistant.metrics.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts +216 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js +1256 -0
- package/dist/telemetry/assistant/telemetry-assistant.service.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts +69 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js +471 -0
- package/dist/telemetry/assistant/telemetry-assistant.sql.js.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts +15 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.d.ts.map +1 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js +68 -0
- package/dist/telemetry/assistant/telemetry-assistant.sse.js.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts +92 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.d.ts.map +1 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js +41 -0
- package/dist/telemetry/connection/dto/telemetry-connection.dto.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts +45 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js +303 -0
- package/dist/telemetry/connection/telemetry-connection-admin.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts +41 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js +187 -0
- package/dist/telemetry/connection/telemetry-connection-test.service.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts +14 -0
- package/dist/telemetry/connection/telemetry-connection.controller.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js +192 -0
- package/dist/telemetry/connection/telemetry-connection.controller.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts +28 -0
- package/dist/telemetry/connection/telemetry-connection.schema.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js +106 -0
- package/dist/telemetry/connection/telemetry-connection.schema.js.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts +197 -0
- package/dist/telemetry/connection/telemetry-connection.service.d.ts.map +1 -0
- package/dist/telemetry/connection/telemetry-connection.service.js +461 -0
- package/dist/telemetry/connection/telemetry-connection.service.js.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts +19 -0
- package/dist/telemetry/dashboard/sql-literals.d.ts.map +1 -0
- package/dist/telemetry/dashboard/sql-literals.js +75 -0
- package/dist/telemetry/dashboard/sql-literals.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts +14 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js +277 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.controller.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts +112 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js +904 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.service.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts +212 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js +486 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.sql.js.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts +235 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.d.ts.map +1 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js +269 -0
- package/dist/telemetry/dashboard/telemetry-dashboard.verdict.js.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts +51 -0
- package/dist/telemetry/dashboard/verdict-policy.d.ts.map +1 -0
- package/dist/telemetry/dashboard/verdict-policy.js +77 -0
- package/dist/telemetry/dashboard/verdict-policy.js.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts +21 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.d.ts.map +1 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js +59 -0
- package/dist/telemetry/doctor/egress/greptimedb.egress.contributor.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js +69 -0
- package/dist/telemetry/doctor/telemetry-connection.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts +33 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js +105 -0
- package/dist/telemetry/doctor/telemetry-export.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts +38 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js +104 -0
- package/dist/telemetry/doctor/telemetry-freshness.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js +65 -0
- package/dist/telemetry/doctor/telemetry-reachable.doctor-check.js.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts +23 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.d.ts.map +1 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js +91 -0
- package/dist/telemetry/doctor/telemetry-tables.doctor-check.js.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts +14 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js +29 -0
- package/dist/telemetry/dto/telemetry-assistant.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts +59 -0
- package/dist/telemetry/dto/telemetry-config.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-config.dto.js +18 -0
- package/dist/telemetry/dto/telemetry-config.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts +397 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js +118 -0
- package/dist/telemetry/dto/telemetry-dashboard.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts +44 -0
- package/dist/telemetry/dto/telemetry-query.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-query.dto.js +42 -0
- package/dist/telemetry/dto/telemetry-query.dto.js.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts +22 -0
- package/dist/telemetry/dto/telemetry-status.dto.d.ts.map +1 -0
- package/dist/telemetry/dto/telemetry-status.dto.js +12 -0
- package/dist/telemetry/dto/telemetry-status.dto.js.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts +13 -0
- package/dist/telemetry/export/parquet-writer.loader.d.ts.map +1 -0
- package/dist/telemetry/export/parquet-writer.loader.js +29 -0
- package/dist/telemetry/export/parquet-writer.loader.js.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts +39 -0
- package/dist/telemetry/export/telemetry-export.service.d.ts.map +1 -0
- package/dist/telemetry/export/telemetry-export.service.js +185 -0
- package/dist/telemetry/export/telemetry-export.service.js.map +1 -0
- package/dist/telemetry/greptime/greptime-host.d.ts +44 -0
- package/dist/telemetry/greptime/greptime-host.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime-host.js +114 -0
- package/dist/telemetry/greptime/greptime-host.js.map +1 -0
- package/dist/telemetry/greptime/greptime.client.d.ts +171 -0
- package/dist/telemetry/greptime/greptime.client.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.client.js +352 -0
- package/dist/telemetry/greptime/greptime.client.js.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts +59 -0
- package/dist/telemetry/greptime/greptime.errors.d.ts.map +1 -0
- package/dist/telemetry/greptime/greptime.errors.js +100 -0
- package/dist/telemetry/greptime/greptime.errors.js.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts +27 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.d.ts.map +1 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js +123 -0
- package/dist/telemetry/handlers/telemetry-retention.handler.js.map +1 -0
- package/dist/telemetry/index.d.ts +37 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +97 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/internal/blank-secret.d.ts +3 -0
- package/dist/telemetry/internal/blank-secret.d.ts.map +1 -0
- package/dist/telemetry/internal/blank-secret.js +14 -0
- package/dist/telemetry/internal/blank-secret.js.map +1 -0
- package/dist/telemetry/internal/csv.d.ts +9 -0
- package/dist/telemetry/internal/csv.d.ts.map +1 -0
- package/dist/telemetry/internal/csv.js +23 -0
- package/dist/telemetry/internal/csv.js.map +1 -0
- package/dist/telemetry/internal/sse.d.ts +23 -0
- package/dist/telemetry/internal/sse.d.ts.map +1 -0
- package/dist/telemetry/internal/sse.js +43 -0
- package/dist/telemetry/internal/sse.js.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/database.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/database.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/host.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js +146 -0
- package/dist/telemetry/metrics/groups/host.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js +159 -0
- package/dist/telemetry/metrics/groups/nodes.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js +144 -0
- package/dist/telemetry/metrics/groups/pipeline.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js +163 -0
- package/dist/telemetry/metrics/groups/queue.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts +7 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js +103 -0
- package/dist/telemetry/metrics/groups/uptime.metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts +324 -0
- package/dist/telemetry/metrics/metric-catalog.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts +30 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js +37 -0
- package/dist/telemetry/metrics/metric-catalog.helpers.js.map +1 -0
- package/dist/telemetry/metrics/metric-catalog.js +180 -0
- package/dist/telemetry/metrics/metric-catalog.js.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts +59 -0
- package/dist/telemetry/metrics/metric-group-registry.service.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js +99 -0
- package/dist/telemetry/metrics/metric-group-registry.service.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.d.ts +113 -0
- package/dist/telemetry/metrics/metric-group.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.js +647 -0
- package/dist/telemetry/metrics/metric-group.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts +2 -0
- package/dist/telemetry/metrics/metric-group.manifest.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.manifest.js +30 -0
- package/dist/telemetry/metrics/metric-group.manifest.js.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts +109 -0
- package/dist/telemetry/metrics/metric-group.registry.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-group.registry.js +181 -0
- package/dist/telemetry/metrics/metric-group.registry.js.map +1 -0
- package/dist/telemetry/metrics/metric-sql.d.ts +98 -0
- package/dist/telemetry/metrics/metric-sql.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-sql.js +259 -0
- package/dist/telemetry/metrics/metric-sql.js.map +1 -0
- package/dist/telemetry/metrics/metric-values.d.ts +19 -0
- package/dist/telemetry/metrics/metric-values.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-values.js +97 -0
- package/dist/telemetry/metrics/metric-values.js.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts +20 -0
- package/dist/telemetry/metrics/metric-verdict.d.ts.map +1 -0
- package/dist/telemetry/metrics/metric-verdict.js +218 -0
- package/dist/telemetry/metrics/metric-verdict.js.map +1 -0
- package/dist/telemetry/ports.d.ts +575 -0
- package/dist/telemetry/ports.d.ts.map +1 -0
- package/dist/telemetry/ports.js +78 -0
- package/dist/telemetry/ports.js.map +1 -0
- package/dist/telemetry/query/sql-guard.d.ts +71 -0
- package/dist/telemetry/query/sql-guard.d.ts.map +1 -0
- package/dist/telemetry/query/sql-guard.js +258 -0
- package/dist/telemetry/query/sql-guard.js.map +1 -0
- package/dist/telemetry/query/telemetry-availability.d.ts +11 -0
- package/dist/telemetry/query/telemetry-availability.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-availability.js +55 -0
- package/dist/telemetry/query/telemetry-availability.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts +48 -0
- package/dist/telemetry/query/telemetry-query.errors.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.errors.js +100 -0
- package/dist/telemetry/query/telemetry-query.errors.js.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts +57 -0
- package/dist/telemetry/query/telemetry-query.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-query.service.js +194 -0
- package/dist/telemetry/query/telemetry-query.service.js.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts +36 -0
- package/dist/telemetry/query/telemetry-schema.service.d.ts.map +1 -0
- package/dist/telemetry/query/telemetry-schema.service.js +154 -0
- package/dist/telemetry/query/telemetry-schema.service.js.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts +29 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.d.ts.map +1 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js +27 -0
- package/dist/telemetry/stack/dto/telemetry-stack.dto.js.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts +76 -0
- package/dist/telemetry/stack/stack-agent.client.d.ts.map +1 -0
- package/dist/telemetry/stack/stack-agent.client.js +208 -0
- package/dist/telemetry/stack/stack-agent.client.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts +43 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js +159 -0
- package/dist/telemetry/stack/telemetry-stack-deploy.handler.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts +14 -0
- package/dist/telemetry/stack/telemetry-stack.controller.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js +107 -0
- package/dist/telemetry/stack/telemetry-stack.controller.js.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts +19 -0
- package/dist/telemetry/stack/telemetry-stack.service.d.ts.map +1 -0
- package/dist/telemetry/stack/telemetry-stack.service.js +122 -0
- package/dist/telemetry/stack/telemetry-stack.service.js.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts +8 -0
- package/dist/telemetry/tasks/telemetry-retention.task.d.ts.map +1 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js +61 -0
- package/dist/telemetry/tasks/telemetry-retention.task.js.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-admin.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-admin.controller.js +148 -0
- package/dist/telemetry/telemetry-admin.controller.js.map +1 -0
- package/dist/telemetry/telemetry-config.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-config.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-config.controller.js +73 -0
- package/dist/telemetry/telemetry-config.controller.js.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts +14 -0
- package/dist/telemetry/telemetry-explorer.controller.d.ts.map +1 -0
- package/dist/telemetry/telemetry-explorer.controller.js +193 -0
- package/dist/telemetry/telemetry-explorer.controller.js.map +1 -0
- package/dist/telemetry/telemetry-settings.service.d.ts +85 -0
- package/dist/telemetry/telemetry-settings.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-settings.service.js +278 -0
- package/dist/telemetry/telemetry-settings.service.js.map +1 -0
- package/dist/telemetry/telemetry-status.service.d.ts +28 -0
- package/dist/telemetry/telemetry-status.service.d.ts.map +1 -0
- package/dist/telemetry/telemetry-status.service.js +185 -0
- package/dist/telemetry/telemetry-status.service.js.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts +163 -0
- package/dist/telemetry/telemetry-support-bundle.section.d.ts.map +1 -0
- package/dist/telemetry/telemetry-support-bundle.section.js +187 -0
- package/dist/telemetry/telemetry-support-bundle.section.js.map +1 -0
- package/dist/telemetry/telemetry.module.d.ts +35 -0
- package/dist/telemetry/telemetry.module.d.ts.map +1 -0
- package/dist/telemetry/telemetry.module.js +210 -0
- package/dist/telemetry/telemetry.module.js.map +1 -0
- package/dist/telemetry/telemetry.options.d.ts +176 -0
- package/dist/telemetry/telemetry.options.d.ts.map +1 -0
- package/dist/telemetry/telemetry.options.js +246 -0
- package/dist/telemetry/telemetry.options.js.map +1 -0
- package/dist/telemetry/telemetry.permissions.d.ts +76 -0
- package/dist/telemetry/telemetry.permissions.d.ts.map +1 -0
- package/dist/telemetry/telemetry.permissions.js +85 -0
- package/dist/telemetry/telemetry.permissions.js.map +1 -0
- package/dist/telemetry/telemetry.settings.d.ts +79 -0
- package/dist/telemetry/telemetry.settings.d.ts.map +1 -0
- package/dist/telemetry/telemetry.settings.js +92 -0
- package/dist/telemetry/telemetry.settings.js.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts +17 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js +128 -0
- package/dist/telemetry/testing/coach-metric-group.fixture.js.map +1 -0
- package/dist/telemetry/testing/conformance.d.ts +257 -0
- package/dist/telemetry/testing/conformance.d.ts.map +1 -0
- package/dist/telemetry/testing/conformance.js +626 -0
- package/dist/telemetry/testing/conformance.js.map +1 -0
- package/dist/telemetry/testing/index.d.ts +10 -0
- package/dist/telemetry/testing/index.d.ts.map +1 -0
- package/dist/telemetry/testing/index.js +41 -0
- package/dist/telemetry/testing/index.js.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts +73 -0
- package/dist/telemetry/testing/metric-schema.fixture.d.ts.map +1 -0
- package/dist/telemetry/testing/metric-schema.fixture.js +362 -0
- package/dist/telemetry/testing/metric-schema.fixture.js.map +1 -0
- package/dist/telemetry/testing/stub-ports.d.ts +46 -0
- package/dist/telemetry/testing/stub-ports.d.ts.map +1 -0
- package/dist/telemetry/testing/stub-ports.js +119 -0
- package/dist/telemetry/testing/stub-ports.js.map +1 -0
- package/dist/testing/conformance-suite.d.ts +106 -0
- package/dist/testing/conformance-suite.d.ts.map +1 -0
- package/dist/testing/conformance-suite.js +8 -0
- package/dist/testing/conformance-suite.js.map +1 -0
- package/dist/testing/conformance-suites.d.ts +14 -0
- package/dist/testing/conformance-suites.d.ts.map +1 -0
- package/dist/testing/conformance-suites.js +27 -0
- package/dist/testing/conformance-suites.js.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts +23 -0
- package/dist/testing/host/in-memory-audit-sink.d.ts.map +1 -0
- package/dist/testing/host/in-memory-audit-sink.js +30 -0
- package/dist/testing/host/in-memory-audit-sink.js.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts +31 -0
- package/dist/testing/host/in-memory-system-settings-store.d.ts.map +1 -0
- package/dist/testing/host/in-memory-system-settings-store.js +54 -0
- package/dist/testing/host/in-memory-system-settings-store.js.map +1 -0
- package/dist/testing/host/index.d.ts +4 -0
- package/dist/testing/host/index.d.ts.map +1 -0
- package/dist/testing/host/index.js +13 -0
- package/dist/testing/host/index.js.map +1 -0
- package/dist/testing/host/test-platform-host.d.ts +35 -0
- package/dist/testing/host/test-platform-host.d.ts.map +1 -0
- package/dist/testing/host/test-platform-host.js +81 -0
- package/dist/testing/host/test-platform-host.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +32 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/prisma-schema.d.ts +99 -0
- package/dist/testing/prisma-schema.d.ts.map +1 -0
- package/dist/testing/prisma-schema.js +175 -0
- package/dist/testing/prisma-schema.js.map +1 -0
- package/dist/testing/run-platform-conformance.d.ts +70 -0
- package/dist/testing/run-platform-conformance.d.ts.map +1 -0
- package/dist/testing/run-platform-conformance.js +77 -0
- package/dist/testing/run-platform-conformance.js.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts +46 -0
- package/dist/testing/suites/cron-enqueue-only.d.ts.map +1 -0
- package/dist/testing/suites/cron-enqueue-only.js +177 -0
- package/dist/testing/suites/cron-enqueue-only.js.map +1 -0
- package/dist/testing/suites/user-owned-data.d.ts +86 -0
- package/dist/testing/suites/user-owned-data.d.ts.map +1 -0
- package/dist/testing/suites/user-owned-data.js +329 -0
- package/dist/testing/suites/user-owned-data.js.map +1 -0
- package/package.json +129 -4
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Suite: every `@Cron` enqueues rather than working (issues #353, #694)
|
|
4
|
+
// =============================================================================
|
|
5
|
+
//
|
|
6
|
+
// Epic #345 decision 1: every long-running activity is a queue job. A `@Cron`
|
|
7
|
+
// only decides WHETHER work is due and enqueues it. This suite reads the BODY of
|
|
8
|
+
// every `@Cron`-decorated method under the app's source roots and requires two
|
|
9
|
+
// things of it: that it queues something, and that it contains none of the
|
|
10
|
+
// markers of doing the work itself.
|
|
11
|
+
//
|
|
12
|
+
// It does not follow calls into helper methods: a cron calling
|
|
13
|
+
// `this.fireDueBackup(...)` is trusted, and that helper's own spec is what pins
|
|
14
|
+
// that it only enqueues. This is a tripwire on the shape of a cron body, not a
|
|
15
|
+
// proof about the whole call graph.
|
|
16
|
+
//
|
|
17
|
+
// Known limit, kept on purpose: the body opens at the first `{` after `@Cron(`,
|
|
18
|
+
// so a decorator OPTIONS object is read as the body and reported as queueing
|
|
19
|
+
// nothing. That fails loudly, never silently; no cron in the base uses options.
|
|
20
|
+
//
|
|
21
|
+
// The scan was moved here UNCHANGED from apps/api/test/jobs/cron-enqueue-only.spec.ts:
|
|
22
|
+
// same markers, same enqueue pattern, same brace matching. What the app keeps
|
|
23
|
+
// is DATA: its exemption list (each one argued) and its vacuity minimum.
|
|
24
|
+
// =============================================================================
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.cronEnqueueOnlySuite = void 0;
|
|
27
|
+
const node_fs_1 = require("node:fs");
|
|
28
|
+
const node_path_1 = require("node:path");
|
|
29
|
+
/**
|
|
30
|
+
* Markers of a cron doing the work itself.
|
|
31
|
+
*
|
|
32
|
+
* Deliberately concrete rather than clever: these are the exact shapes the
|
|
33
|
+
* seven converted crons used to contain, so a revert reintroduces one of them
|
|
34
|
+
* almost by definition.
|
|
35
|
+
*/
|
|
36
|
+
const WORK_MARKERS = [
|
|
37
|
+
{ pattern: /\.deleteMany\(/, what: 'a bulk delete' },
|
|
38
|
+
{ pattern: /\.updateMany(AndReturn)?\(/, what: 'a bulk update' },
|
|
39
|
+
{ pattern: /\.\$executeRaw/, what: 'raw SQL' },
|
|
40
|
+
{ pattern: /withAdminConnection\(/, what: 'a cluster admin connection' },
|
|
41
|
+
{ pattern: /\bcleanupExpired\w*\(/, what: 'an inline cleanup call' },
|
|
42
|
+
{ pattern: /\.prune\(\)/, what: 'an inline retention prune' },
|
|
43
|
+
{ pattern: /\bdropExpired\w*\(/, what: 'an inline DROP DATABASE sweep' },
|
|
44
|
+
{ pattern: /\bthis\.sweep\(/, what: 'an inline sweep' },
|
|
45
|
+
{ pattern: /\bthis\.releaseStaleRuns\(/, what: 'an inline stale release' },
|
|
46
|
+
{ pattern: /\bthis\.storage(Provider)?\./, what: 'a direct storage-provider call' },
|
|
47
|
+
];
|
|
48
|
+
/** What a cron body must contain to count as queueing its work. */
|
|
49
|
+
const ENQUEUES = /enqueueHousekeepingJob\(|\.enqueue\(/;
|
|
50
|
+
/** Every `.ts` file under `dir`, excluding tests. */
|
|
51
|
+
function sourceFiles(dir) {
|
|
52
|
+
return (0, node_fs_1.readdirSync)(dir).flatMap((entry) => {
|
|
53
|
+
const full = (0, node_path_1.join)(dir, entry);
|
|
54
|
+
if ((0, node_fs_1.statSync)(full).isDirectory())
|
|
55
|
+
return sourceFiles(full);
|
|
56
|
+
if (!entry.endsWith('.ts') || entry.endsWith('.spec.ts'))
|
|
57
|
+
return [];
|
|
58
|
+
return [full];
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The body of every `@Cron`-decorated method in `source`, brace-matched.
|
|
63
|
+
*
|
|
64
|
+
* Brace matching rather than a regex over the whole method: a cron body
|
|
65
|
+
* contains braces (template literals, object arguments, nested blocks), and a
|
|
66
|
+
* lazy match would stop at the first `}` and declare every task compliant.
|
|
67
|
+
*/
|
|
68
|
+
function cronBodies(source) {
|
|
69
|
+
const bodies = [];
|
|
70
|
+
let index = source.indexOf('@Cron(');
|
|
71
|
+
while (index !== -1) {
|
|
72
|
+
const open = source.indexOf('{', index);
|
|
73
|
+
if (open === -1)
|
|
74
|
+
break;
|
|
75
|
+
let depth = 0;
|
|
76
|
+
let end = open;
|
|
77
|
+
for (; end < source.length; end += 1) {
|
|
78
|
+
if (source[end] === '{')
|
|
79
|
+
depth += 1;
|
|
80
|
+
else if (source[end] === '}') {
|
|
81
|
+
depth -= 1;
|
|
82
|
+
if (depth === 0)
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
bodies.push(source.slice(open, end + 1));
|
|
87
|
+
index = source.indexOf('@Cron(', end);
|
|
88
|
+
}
|
|
89
|
+
return bodies;
|
|
90
|
+
}
|
|
91
|
+
/** Runs the scan; see {@link cronEnqueueOnlySuite}. */
|
|
92
|
+
function check(context, options) {
|
|
93
|
+
if (context.sourceRoots.length === 0) {
|
|
94
|
+
throw new Error('cron-enqueue-only: sourceRoots is empty, so there is nothing to scan.');
|
|
95
|
+
}
|
|
96
|
+
if (!Number.isInteger(options.minCronFiles) || options.minCronFiles < 1) {
|
|
97
|
+
throw new Error('cron-enqueue-only: minCronFiles must be a positive integer, or the scan could pass vacuously.');
|
|
98
|
+
}
|
|
99
|
+
const markers = [...WORK_MARKERS, ...(options.extraWorkMarkers ?? [])];
|
|
100
|
+
const exemptFiles = new Set(options.exempt.map((entry) => entry.file));
|
|
101
|
+
const files = context.sourceRoots
|
|
102
|
+
.flatMap((root) => {
|
|
103
|
+
let found;
|
|
104
|
+
try {
|
|
105
|
+
found = sourceFiles(root);
|
|
106
|
+
}
|
|
107
|
+
catch (cause) {
|
|
108
|
+
throw new Error(`cron-enqueue-only: cannot read source root ${root}: ${cause.message}`);
|
|
109
|
+
}
|
|
110
|
+
return found.map((file) => ({ path: file, rel: (0, node_path_1.relative)(root, file).split('\\').join('/') }));
|
|
111
|
+
})
|
|
112
|
+
.map((file) => ({ ...file, source: (0, node_fs_1.readFileSync)(file.path, 'utf8') }))
|
|
113
|
+
.filter((file) => file.source.includes('@Cron('));
|
|
114
|
+
const findings = [];
|
|
115
|
+
for (const file of files) {
|
|
116
|
+
if (exemptFiles.has(file.rel))
|
|
117
|
+
continue;
|
|
118
|
+
for (const body of cronBodies(file.source)) {
|
|
119
|
+
if (!ENQUEUES.test(body)) {
|
|
120
|
+
findings.push({ file: file.rel, message: 'a @Cron body that queues nothing' });
|
|
121
|
+
}
|
|
122
|
+
for (const marker of markers) {
|
|
123
|
+
if (marker.pattern.test(body)) {
|
|
124
|
+
findings.push({ file: file.rel, message: `a @Cron body containing ${marker.what}` });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
scanned: { cronFiles: files.length },
|
|
131
|
+
scannedFiles: { cronFiles: files.map((file) => file.rel) },
|
|
132
|
+
findings,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/** The tests the harness registers for this suite. */
|
|
136
|
+
function cases(options) {
|
|
137
|
+
return [
|
|
138
|
+
{
|
|
139
|
+
// The failure this guards: a refactor moves the tasks, the scan finds
|
|
140
|
+
// nothing, and every case below passes over an empty list.
|
|
141
|
+
name: 'finds the crons at all, so a broken scan cannot pass vacuously',
|
|
142
|
+
run: (report, expect) => {
|
|
143
|
+
expect(report.scanned.cronFiles).toBeGreaterThanOrEqual(options.minCronFiles);
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
...options.exempt.map((entry) => ({
|
|
147
|
+
name: `exempts ${entry.file}, on the record`,
|
|
148
|
+
run: (report, expect) => {
|
|
149
|
+
// The exemption is only real if the file is: a stale entry would
|
|
150
|
+
// silently exempt nothing while looking like it exempted something.
|
|
151
|
+
expect(report.scannedFiles.cronFiles).toContain(entry.file);
|
|
152
|
+
expect(entry.why.length).toBeGreaterThanOrEqual(41);
|
|
153
|
+
},
|
|
154
|
+
})),
|
|
155
|
+
{
|
|
156
|
+
name: 'queues its work instead of doing it, in every non-exempt cron',
|
|
157
|
+
run: (report, expect) => {
|
|
158
|
+
expect(report.findings.map((finding) => `${finding.file}: ${finding.message}`)).toEqual([]);
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The suite behind `runPlatformConformance({ suites: { cronEnqueueOnly } })`:
|
|
165
|
+
* every `@Cron` body enqueues a job and contains no marker of inline work.
|
|
166
|
+
*
|
|
167
|
+
* @extensionPoint registry
|
|
168
|
+
* @stability experimental
|
|
169
|
+
*/
|
|
170
|
+
exports.cronEnqueueOnlySuite = {
|
|
171
|
+
id: 'cron-enqueue-only',
|
|
172
|
+
title: 'every @Cron enqueues rather than working',
|
|
173
|
+
description: 'A @Cron body only decides whether work is due and enqueues a job; it never does the work inline.',
|
|
174
|
+
check,
|
|
175
|
+
cases,
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=cron-enqueue-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-enqueue-only.js","sourceRoot":"","sources":["../../../src/testing/suites/cron-enqueue-only.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { UserOwnedModelDef } from '../../core/index';
|
|
2
|
+
import type { ConformanceFinding, ConformanceSuite } from '../conformance-suite';
|
|
3
|
+
import { type DatamodelModel } from '../prisma-schema';
|
|
4
|
+
/**
|
|
5
|
+
* How an app configures the user-owned data suite.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const options: UserOwnedDataOptions = {
|
|
10
|
+
* schemaPath: join(__dirname, '..', '..', 'prisma', 'schema'),
|
|
11
|
+
* policies: userOwnedModelRegistry.list(),
|
|
12
|
+
* rawSqlAllowlist: [{ file: 'health/indicators/database.indicator.ts', why: 'Health probe: SELECT 1.' }],
|
|
13
|
+
* registerIn: 'src/app-registrations/user-owned-models.ts',
|
|
14
|
+
* };
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @extensionPoint option
|
|
18
|
+
* @stability experimental
|
|
19
|
+
*/
|
|
20
|
+
export interface UserOwnedDataOptions {
|
|
21
|
+
/** Absolute path to the app's `schema.prisma`, or to a folder of `*.prisma` files (a composed schema). */
|
|
22
|
+
schemaPath: string;
|
|
23
|
+
/** The app's registry contents: import the module that fills it, then pass `userOwnedModelRegistry.list()`. */
|
|
24
|
+
policies: readonly UserOwnedModelDef[];
|
|
25
|
+
/**
|
|
26
|
+
* Files allowed to issue raw SQL, as paths relative to the source root that
|
|
27
|
+
* contains them (`/` separators), each with a non-empty reason. The suite
|
|
28
|
+
* fails for an allowlisted file that no longer uses raw SQL (or is gone).
|
|
29
|
+
*/
|
|
30
|
+
rawSqlAllowlist: ReadonlyArray<{
|
|
31
|
+
/** The file, relative to its source root, with `/` separators. */
|
|
32
|
+
file: string;
|
|
33
|
+
/** Why it needs raw SQL, and why no request-derived id reaches it unscoped. */
|
|
34
|
+
why: string;
|
|
35
|
+
}>;
|
|
36
|
+
/** The model whose foreign keys mark ownership. Default `'User'`. */
|
|
37
|
+
userModel?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Where the fix goes, completing "Register `Model.field` in ...", for
|
|
40
|
+
* example `'src/app-registrations/user-owned-models.ts'`. Default: "the
|
|
41
|
+
* user-owned data registry".
|
|
42
|
+
*/
|
|
43
|
+
registerIn?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Every disagreement between the registered definitions and the datamodel.
|
|
47
|
+
* An empty array means the registry is complete and consistent. Pure.
|
|
48
|
+
*
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
export declare function checkUserOwnedModels(datamodel: readonly DatamodelModel[], defs: readonly UserOwnedModelDef[], options?: {
|
|
52
|
+
userModel?: string;
|
|
53
|
+
registerIn?: string;
|
|
54
|
+
}): string[];
|
|
55
|
+
/**
|
|
56
|
+
* Replaces the contents of comments and of `'...'`/`"..."` strings with
|
|
57
|
+
* spaces, keeping line breaks. Template literals are kept: a raw call is a tag
|
|
58
|
+
* written before one, never inside it.
|
|
59
|
+
*
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
62
|
+
export declare function blankCommentsAndStrings(source: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* The raw SQL methods a source file uses, outside comments and strings.
|
|
65
|
+
*
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
68
|
+
export declare function rawSqlUses(source: string): string[];
|
|
69
|
+
/**
|
|
70
|
+
* One finding per unlisted file, per stale allowlist entry and per entry
|
|
71
|
+
* without a reason. Pure.
|
|
72
|
+
*
|
|
73
|
+
* @param found - every file using raw SQL, relative path → methods.
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
export declare function checkRawSqlAllowlist(found: ReadonlyMap<string, readonly string[]>, allowlist: UserOwnedDataOptions['rawSqlAllowlist']): ConformanceFinding[];
|
|
77
|
+
/**
|
|
78
|
+
* The suite behind `runPlatformConformance({ suites: { userOwnedData } })`:
|
|
79
|
+
* every foreign key to `User` is registered with policies that match the
|
|
80
|
+
* schema, and raw SQL appears only in allowlisted files.
|
|
81
|
+
*
|
|
82
|
+
* @extensionPoint registry
|
|
83
|
+
* @stability experimental
|
|
84
|
+
*/
|
|
85
|
+
export declare const userOwnedDataSuite: ConformanceSuite<UserOwnedDataOptions>;
|
|
86
|
+
//# sourceMappingURL=user-owned-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-owned-data.d.ts","sourceRoot":"","sources":["../../../src/testing/suites/user-owned-data.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAGV,kBAAkB,EAElB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA+D,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,oBAAoB;IACnC,0GAA0G;IAC1G,UAAU,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC;;;;OAIG;IACH,eAAe,EAAE,aAAa,CAAC;QAC7B,kEAAkE;QAClE,IAAI,EAAE,MAAM,CAAC;QACb,+EAA+E;QAC/E,GAAG,EAAE,MAAM,CAAC;KACb,CAAC,CAAC;IACH,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAuBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,IAAI,EAAE,SAAS,iBAAiB,EAAE,EAClC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,MAAM,EAAE,CAuFV;AAQD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAmC9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAWD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,EAC7C,SAAS,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,GACjD,kBAAkB,EAAE,CAkBtB;AA0FD;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,CAAC,oBAAoB,CAOrE,CAAC"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Suite: user-owned data is registered, and raw SQL is allowlisted
|
|
4
|
+
// (issue #688, moved to the harness by #699)
|
|
5
|
+
// =============================================================================
|
|
6
|
+
//
|
|
7
|
+
// Two tripwires around scoped data access (`@marinoscar/platform-api/core`,
|
|
8
|
+
// "Scoped data access"), moved here UNCHANGED from the reference app's
|
|
9
|
+
// apps/api/test/prisma/{user-owned-models,raw-sql-allowlist}.spec.ts:
|
|
10
|
+
//
|
|
11
|
+
// 1. Registry vs schema. Fails when a model gains a relation to `User`
|
|
12
|
+
// without a user-owned registry entry; when an entry names a model, field
|
|
13
|
+
// or exportOmit column that does not exist, or a field that is not a
|
|
14
|
+
// foreign key to `User`; when a purge policy contradicts the relation's
|
|
15
|
+
// `onDelete` ('delete' ⇔ Cascade, 'detach' ⇔ SetNull, 'retain' ⇔
|
|
16
|
+
// Restrict/NoAction); when an owner relation is not where `ownerRelation`
|
|
17
|
+
// points; or when an actor field on an owned model cascades.
|
|
18
|
+
// 2. Raw SQL. Raw SQL bypasses the scoped client, so every non-spec source
|
|
19
|
+
// file using `$queryRaw`, `$queryRawUnsafe`, `$executeRaw` or
|
|
20
|
+
// `$executeRawUnsafe` (outside comments and string literals) must be on
|
|
21
|
+
// the app's allowlist with a reason, and every allowlisted file must
|
|
22
|
+
// still use raw SQL.
|
|
23
|
+
//
|
|
24
|
+
// The app keeps the DATA: its registrations (passed as `policies`), its schema
|
|
25
|
+
// path and its allowlist.
|
|
26
|
+
// =============================================================================
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.userOwnedDataSuite = void 0;
|
|
29
|
+
exports.checkUserOwnedModels = checkUserOwnedModels;
|
|
30
|
+
exports.blankCommentsAndStrings = blankCommentsAndStrings;
|
|
31
|
+
exports.rawSqlUses = rawSqlUses;
|
|
32
|
+
exports.checkRawSqlAllowlist = checkRawSqlAllowlist;
|
|
33
|
+
const node_fs_1 = require("node:fs");
|
|
34
|
+
const node_path_1 = require("node:path");
|
|
35
|
+
const index_1 = require("../../core/index");
|
|
36
|
+
const prisma_schema_1 = require("../prisma-schema");
|
|
37
|
+
/** The `onDelete` values each purge policy accepts. */
|
|
38
|
+
const PURGE_ON_DELETE = {
|
|
39
|
+
delete: ['Cascade'],
|
|
40
|
+
detach: ['SetNull'],
|
|
41
|
+
retain: ['Restrict', 'NoAction'],
|
|
42
|
+
};
|
|
43
|
+
// -----------------------------------------------------------------------------
|
|
44
|
+
// Check 1: registry vs schema
|
|
45
|
+
// -----------------------------------------------------------------------------
|
|
46
|
+
/** Every relation to `userModel` that holds the foreign key on this side, keyed by FK field name. */
|
|
47
|
+
function userForeignKeys(model, userModel) {
|
|
48
|
+
const keys = new Map();
|
|
49
|
+
for (const field of model.fields) {
|
|
50
|
+
if (field.type !== userModel || !field.relation)
|
|
51
|
+
continue;
|
|
52
|
+
for (const fk of field.relation.fields)
|
|
53
|
+
keys.set(fk, field);
|
|
54
|
+
}
|
|
55
|
+
return keys;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Every disagreement between the registered definitions and the datamodel.
|
|
59
|
+
* An empty array means the registry is complete and consistent. Pure.
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
function checkUserOwnedModels(datamodel, defs, options = {}) {
|
|
64
|
+
const userModel = options.userModel ?? 'User';
|
|
65
|
+
const registerIn = options.registerIn ?? 'the user-owned data registry';
|
|
66
|
+
const registerHint = (model, field) => `Register ${model}.${field} in ${registerIn}, with a purge and export policy.`;
|
|
67
|
+
const problems = [];
|
|
68
|
+
const models = new Map(datamodel.map((model) => [model.name, model]));
|
|
69
|
+
const registered = new Map(defs.map((def) => [def.model, def]));
|
|
70
|
+
// 1. Every User foreign key is registered.
|
|
71
|
+
for (const model of datamodel) {
|
|
72
|
+
for (const fk of userForeignKeys(model, userModel).keys()) {
|
|
73
|
+
const def = registered.get(model.name);
|
|
74
|
+
const fields = def ? [def.ownerField, ...(def.actorFields ?? [])] : [];
|
|
75
|
+
if (!fields.includes(fk)) {
|
|
76
|
+
problems.push(`${model.name}.${fk} is a foreign key to ${userModel} with no registry entry. ${registerHint(model.name, fk)}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 2. Every registered model and field exists, and its policy matches onDelete.
|
|
81
|
+
for (const def of defs) {
|
|
82
|
+
const model = models.get(def.model);
|
|
83
|
+
if (!model) {
|
|
84
|
+
problems.push(`${def.model} is registered but schema.prisma has no such model. Remove or rename the entry.`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
const scalars = new Set(model.fields.filter((field) => !field.relation).map((field) => field.name));
|
|
88
|
+
const foreignKeys = userForeignKeys(model, userModel);
|
|
89
|
+
const checkField = (field, role) => {
|
|
90
|
+
if (!scalars.has(field)) {
|
|
91
|
+
problems.push(`${def.model}.${field} is registered as the ${role} field but schema.prisma has no such column.`);
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
const relation = foreignKeys.get(field);
|
|
95
|
+
if (!relation) {
|
|
96
|
+
problems.push(`${def.model}.${field} is registered as the ${role} field but is not a foreign key to ${userModel}.`);
|
|
97
|
+
}
|
|
98
|
+
return relation;
|
|
99
|
+
};
|
|
100
|
+
const checkPurge = (field, relation) => {
|
|
101
|
+
const onDelete = (0, prisma_schema_1.effectiveOnDelete)(relation);
|
|
102
|
+
const accepted = PURGE_ON_DELETE[def.purge];
|
|
103
|
+
if (!accepted.includes(onDelete)) {
|
|
104
|
+
problems.push(`${def.model}.${field}: purge '${def.purge}' requires onDelete ${accepted.join(' or ')}, but schema.prisma has ${onDelete} (relation ${relation.name}).`);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
if (def.ownerField !== undefined) {
|
|
108
|
+
const relation = checkField(def.ownerField, 'owner');
|
|
109
|
+
if (relation) {
|
|
110
|
+
checkPurge(def.ownerField, relation);
|
|
111
|
+
const expected = (0, index_1.ownerRelationOf)(def);
|
|
112
|
+
if (relation.name !== expected) {
|
|
113
|
+
problems.push(`${def.model}.${def.ownerField}: the owner relation field is "${relation.name}", not "${expected}". Set ownerRelation: '${relation.name}'.`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const field of def.actorFields ?? []) {
|
|
118
|
+
const relation = checkField(field, 'actor');
|
|
119
|
+
if (!relation)
|
|
120
|
+
continue;
|
|
121
|
+
if (def.ownerField === undefined) {
|
|
122
|
+
checkPurge(field, relation);
|
|
123
|
+
}
|
|
124
|
+
else if ((0, prisma_schema_1.effectiveOnDelete)(relation) === 'Cascade') {
|
|
125
|
+
problems.push(`${def.model}.${field}: an actor field on an owned model cannot be onDelete Cascade: deleting the actor would delete a row another user owns.`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const column of def.exportOmit ?? []) {
|
|
129
|
+
if (!scalars.has(column)) {
|
|
130
|
+
problems.push(`${def.model}.exportOmit names "${column}", which schema.prisma does not have.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return problems;
|
|
135
|
+
}
|
|
136
|
+
// -----------------------------------------------------------------------------
|
|
137
|
+
// Check 2: raw SQL only in allowlisted files
|
|
138
|
+
// -----------------------------------------------------------------------------
|
|
139
|
+
const RAW_SQL = /\$(?:queryRaw|executeRaw)(?:Unsafe)?\b/g;
|
|
140
|
+
/**
|
|
141
|
+
* Replaces the contents of comments and of `'...'`/`"..."` strings with
|
|
142
|
+
* spaces, keeping line breaks. Template literals are kept: a raw call is a tag
|
|
143
|
+
* written before one, never inside it.
|
|
144
|
+
*
|
|
145
|
+
* @internal
|
|
146
|
+
*/
|
|
147
|
+
function blankCommentsAndStrings(source) {
|
|
148
|
+
let out = '';
|
|
149
|
+
let i = 0;
|
|
150
|
+
while (i < source.length) {
|
|
151
|
+
const ch = source[i];
|
|
152
|
+
const next = source[i + 1];
|
|
153
|
+
if (ch === '/' && next === '/') {
|
|
154
|
+
const end = source.indexOf('\n', i);
|
|
155
|
+
const stop = end === -1 ? source.length : end;
|
|
156
|
+
out += ' '.repeat(stop - i);
|
|
157
|
+
i = stop;
|
|
158
|
+
}
|
|
159
|
+
else if (ch === '/' && next === '*') {
|
|
160
|
+
const end = source.indexOf('*/', i + 2);
|
|
161
|
+
const stop = end === -1 ? source.length : end + 2;
|
|
162
|
+
out += source.slice(i, stop).replace(/[^\n]/g, ' ');
|
|
163
|
+
i = stop;
|
|
164
|
+
}
|
|
165
|
+
else if (ch === '`') {
|
|
166
|
+
// Copied through, so a quote inside a template never starts a string.
|
|
167
|
+
let j = i + 1;
|
|
168
|
+
while (j < source.length && source[j] !== '`')
|
|
169
|
+
j += source[j] === '\\' ? 2 : 1;
|
|
170
|
+
out += source.slice(i, j + 1);
|
|
171
|
+
i = j + 1;
|
|
172
|
+
}
|
|
173
|
+
else if (ch === "'" || ch === '"') {
|
|
174
|
+
let j = i + 1;
|
|
175
|
+
while (j < source.length && source[j] !== ch && source[j] !== '\n') {
|
|
176
|
+
j += source[j] === '\\' ? 2 : 1;
|
|
177
|
+
}
|
|
178
|
+
out += ' '.repeat(Math.min(j + 1, source.length) - i);
|
|
179
|
+
i = j + 1;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
out += ch;
|
|
183
|
+
i += 1;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return out;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The raw SQL methods a source file uses, outside comments and strings.
|
|
190
|
+
*
|
|
191
|
+
* @internal
|
|
192
|
+
*/
|
|
193
|
+
function rawSqlUses(source) {
|
|
194
|
+
return [...new Set(blankCommentsAndStrings(source).match(RAW_SQL) ?? [])].sort();
|
|
195
|
+
}
|
|
196
|
+
/** Every `.ts` file under `dir`, excluding tests. */
|
|
197
|
+
function sourceFiles(dir) {
|
|
198
|
+
return (0, node_fs_1.readdirSync)(dir).flatMap((entry) => {
|
|
199
|
+
const full = (0, node_path_1.join)(dir, entry);
|
|
200
|
+
if ((0, node_fs_1.statSync)(full).isDirectory())
|
|
201
|
+
return sourceFiles(full);
|
|
202
|
+
return entry.endsWith('.ts') && !entry.endsWith('.spec.ts') ? [full] : [];
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* One finding per unlisted file, per stale allowlist entry and per entry
|
|
207
|
+
* without a reason. Pure.
|
|
208
|
+
*
|
|
209
|
+
* @param found - every file using raw SQL, relative path → methods.
|
|
210
|
+
* @internal
|
|
211
|
+
*/
|
|
212
|
+
function checkRawSqlAllowlist(found, allowlist) {
|
|
213
|
+
const findings = [];
|
|
214
|
+
const listed = new Set(allowlist.map((entry) => entry.file));
|
|
215
|
+
for (const [file, uses] of found) {
|
|
216
|
+
if (!listed.has(file)) {
|
|
217
|
+
findings.push({
|
|
218
|
+
file,
|
|
219
|
+
message: `uses ${uses.join(', ')}: add it to the raw-SQL allowlist with a reason, and make sure it never runs with request-derived ids unscoped.`,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
for (const entry of allowlist) {
|
|
224
|
+
if (!found.has(entry.file)) {
|
|
225
|
+
findings.push({ file: entry.file, message: 'is in the raw-SQL allowlist but no longer uses raw SQL (or no longer exists): remove the entry.' });
|
|
226
|
+
}
|
|
227
|
+
if (entry.why.trim() === '')
|
|
228
|
+
findings.push({ file: entry.file, message: 'the raw-SQL allowlist entry needs a reason.' });
|
|
229
|
+
}
|
|
230
|
+
return findings;
|
|
231
|
+
}
|
|
232
|
+
// -----------------------------------------------------------------------------
|
|
233
|
+
// The suite
|
|
234
|
+
// -----------------------------------------------------------------------------
|
|
235
|
+
/** The `file` of every registry finding: the schema's own name (never a `.ts` path). */
|
|
236
|
+
function schemaLabel(options) {
|
|
237
|
+
return (0, node_path_1.basename)(options.schemaPath);
|
|
238
|
+
}
|
|
239
|
+
/** Runs both scans; see {@link userOwnedDataSuite}. */
|
|
240
|
+
function check(context, options) {
|
|
241
|
+
if (context.sourceRoots.length === 0) {
|
|
242
|
+
throw new Error('user-owned-data: sourceRoots is empty, so there is nothing to scan.');
|
|
243
|
+
}
|
|
244
|
+
let datamodel;
|
|
245
|
+
try {
|
|
246
|
+
datamodel = (0, prisma_schema_1.readSchemaDatamodel)(options.schemaPath);
|
|
247
|
+
}
|
|
248
|
+
catch (cause) {
|
|
249
|
+
throw new Error(`user-owned-data: cannot read the schema at ${options.schemaPath}: ${cause.message}`);
|
|
250
|
+
}
|
|
251
|
+
const userModel = options.userModel ?? 'User';
|
|
252
|
+
const label = schemaLabel(options);
|
|
253
|
+
const registryFindings = checkUserOwnedModels(datamodel, options.policies, {
|
|
254
|
+
userModel,
|
|
255
|
+
...(options.registerIn !== undefined ? { registerIn: options.registerIn } : {}),
|
|
256
|
+
}).map((message) => ({ file: label, message }));
|
|
257
|
+
const found = new Map();
|
|
258
|
+
let scannedSources = 0;
|
|
259
|
+
for (const root of context.sourceRoots) {
|
|
260
|
+
let files;
|
|
261
|
+
try {
|
|
262
|
+
files = sourceFiles(root);
|
|
263
|
+
}
|
|
264
|
+
catch (cause) {
|
|
265
|
+
throw new Error(`user-owned-data: cannot read source root ${root}: ${cause.message}`);
|
|
266
|
+
}
|
|
267
|
+
for (const file of files) {
|
|
268
|
+
scannedSources += 1;
|
|
269
|
+
const uses = rawSqlUses((0, node_fs_1.readFileSync)(file, 'utf8'));
|
|
270
|
+
if (uses.length > 0)
|
|
271
|
+
found.set((0, node_path_1.relative)(root, file).split('\\').join('/'), uses);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const ownedModels = datamodel.filter((model) => userForeignKeys(model, userModel).size > 0);
|
|
275
|
+
return {
|
|
276
|
+
scanned: {
|
|
277
|
+
models: datamodel.length,
|
|
278
|
+
userForeignKeyModels: ownedModels.length,
|
|
279
|
+
sourceFiles: scannedSources,
|
|
280
|
+
rawSqlFiles: found.size,
|
|
281
|
+
},
|
|
282
|
+
scannedFiles: { rawSqlFiles: [...found.keys()] },
|
|
283
|
+
findings: [...registryFindings, ...checkRawSqlAllowlist(found, options.rawSqlAllowlist)],
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/** The tests the harness registers for this suite. */
|
|
287
|
+
function cases(options) {
|
|
288
|
+
const label = schemaLabel(options);
|
|
289
|
+
const describe = (finding) => `${finding.file}: ${finding.message}`;
|
|
290
|
+
return [
|
|
291
|
+
{
|
|
292
|
+
// The failure this guards: the schema moves, the parse finds nothing,
|
|
293
|
+
// and every case below passes over an empty datamodel.
|
|
294
|
+
name: 'reads the schema and the sources at all, so a broken scan cannot pass vacuously',
|
|
295
|
+
run: (report, expect) => {
|
|
296
|
+
expect(report.scanned.userForeignKeyModels).toBeGreaterThanOrEqual(1);
|
|
297
|
+
expect(report.scanned.sourceFiles).toBeGreaterThanOrEqual(1);
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
name: 'registers every User foreign key, with purge policies that match onDelete',
|
|
302
|
+
run: (report, expect) => {
|
|
303
|
+
expect(report.findings.filter((finding) => finding.file === label).map(describe)).toEqual([]);
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
{
|
|
307
|
+
name: 'issues raw SQL only from allowlisted files, each with a reason',
|
|
308
|
+
run: (report, expect) => {
|
|
309
|
+
expect(report.findings.filter((finding) => finding.file !== label).map(describe)).toEqual([]);
|
|
310
|
+
},
|
|
311
|
+
},
|
|
312
|
+
];
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* The suite behind `runPlatformConformance({ suites: { userOwnedData } })`:
|
|
316
|
+
* every foreign key to `User` is registered with policies that match the
|
|
317
|
+
* schema, and raw SQL appears only in allowlisted files.
|
|
318
|
+
*
|
|
319
|
+
* @extensionPoint registry
|
|
320
|
+
* @stability experimental
|
|
321
|
+
*/
|
|
322
|
+
exports.userOwnedDataSuite = {
|
|
323
|
+
id: 'user-owned-data',
|
|
324
|
+
title: 'user-owned data is registered and raw SQL is allowlisted',
|
|
325
|
+
description: 'Every foreign key to User has a user-owned registry entry whose purge policy matches onDelete, and only allowlisted files issue raw SQL.',
|
|
326
|
+
check,
|
|
327
|
+
cases,
|
|
328
|
+
};
|
|
329
|
+
//# sourceMappingURL=user-owned-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-owned-data.js","sourceRoot":"","sources":["../../../src/testing/suites/user-owned-data.ts"],"names":[],"mappings":"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"}
|