@cosmicdrift/kumiko-framework 0.1.0
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/README.md +159 -0
- package/package.json +91 -0
- package/src/__tests__/anonymous-access.integration.ts +325 -0
- package/src/__tests__/error-contract.integration.ts +435 -0
- package/src/__tests__/field-access.integration.ts +269 -0
- package/src/__tests__/full-stack.integration.ts +914 -0
- package/src/__tests__/ownership.integration.ts +449 -0
- package/src/__tests__/reference-data.integration.ts +198 -0
- package/src/__tests__/transition-guard.integration.ts +340 -0
- package/src/api/__tests__/api.test.ts +337 -0
- package/src/api/__tests__/auth-middleware-transport.test.ts +80 -0
- package/src/api/__tests__/auth-routes-cookie.test.ts +179 -0
- package/src/api/__tests__/batch.integration.ts +404 -0
- package/src/api/__tests__/body-limit.test.ts +88 -0
- package/src/api/__tests__/csrf-middleware.test.ts +97 -0
- package/src/api/__tests__/dispatcher-live.integration.ts +216 -0
- package/src/api/__tests__/metrics-endpoint.test.ts +126 -0
- package/src/api/__tests__/nested-write.integration.ts +213 -0
- package/src/api/__tests__/readiness.test.ts +76 -0
- package/src/api/__tests__/request-id-middleware.test.ts +72 -0
- package/src/api/__tests__/sse-broker.test.ts +58 -0
- package/src/api/__tests__/sse-route.test.ts +112 -0
- package/src/api/anonymous-cookie.ts +60 -0
- package/src/api/api-constants.ts +64 -0
- package/src/api/auth-middleware.ts +418 -0
- package/src/api/auth-routes.ts +982 -0
- package/src/api/csrf-middleware.ts +77 -0
- package/src/api/index.ts +31 -0
- package/src/api/jwt.ts +66 -0
- package/src/api/observability-middleware.ts +89 -0
- package/src/api/readiness.ts +132 -0
- package/src/api/request-context.ts +49 -0
- package/src/api/request-id-middleware.ts +50 -0
- package/src/api/route-registrars.ts +195 -0
- package/src/api/routes.ts +135 -0
- package/src/api/server.ts +640 -0
- package/src/api/sse-broker.ts +71 -0
- package/src/api/sse-route.ts +62 -0
- package/src/api/tokens.ts +16 -0
- package/src/db/__tests__/apply-entity-event-tenant.integration.ts +159 -0
- package/src/db/__tests__/compound-types.test.ts +114 -0
- package/src/db/__tests__/connection-options.test.ts +68 -0
- package/src/db/__tests__/cursor.test.ts +41 -0
- package/src/db/__tests__/db-helpers.test.ts +369 -0
- package/src/db/__tests__/dialect-instant.test.ts +50 -0
- package/src/db/__tests__/drizzle-helpers.integration.ts +186 -0
- package/src/db/__tests__/drizzle-table-types.test.ts +162 -0
- package/src/db/__tests__/encryption.test.ts +39 -0
- package/src/db/__tests__/event-store-executor-list.integration.ts +313 -0
- package/src/db/__tests__/event-store-executor.integration.ts +235 -0
- package/src/db/__tests__/implicit-projection-equivalence.integration.ts +304 -0
- package/src/db/__tests__/located-timestamp.test.ts +184 -0
- package/src/db/__tests__/money.test.ts +199 -0
- package/src/db/__tests__/multi-row-insert.integration.ts +76 -0
- package/src/db/__tests__/parse-auto-verb.test.ts +70 -0
- package/src/db/__tests__/required-not-null-migration-safety.integration.ts +105 -0
- package/src/db/__tests__/row-helpers.test.ts +59 -0
- package/src/db/__tests__/schema-migration.integration.ts +273 -0
- package/src/db/__tests__/table-builder-indexes.test.ts +153 -0
- package/src/db/__tests__/table-builder-required.test.ts +216 -0
- package/src/db/__tests__/tenant-db.integration.ts +606 -0
- package/src/db/__tests__/unique-violation-mapping.integration.ts +166 -0
- package/src/db/apply-entity-event.ts +188 -0
- package/src/db/assert-exists-in.ts +59 -0
- package/src/db/compound-types.ts +47 -0
- package/src/db/connection.ts +104 -0
- package/src/db/cursor.ts +83 -0
- package/src/db/dialect.ts +109 -0
- package/src/db/eagerload.ts +174 -0
- package/src/db/encryption.ts +39 -0
- package/src/db/event-store-executor.ts +906 -0
- package/src/db/index.ts +55 -0
- package/src/db/located-timestamp.ts +114 -0
- package/src/db/money.ts +120 -0
- package/src/db/pg-error.ts +46 -0
- package/src/db/reference-data.ts +77 -0
- package/src/db/row-helpers.ts +53 -0
- package/src/db/schema-inspection.ts +25 -0
- package/src/db/table-builder.ts +475 -0
- package/src/db/tenant-db.ts +434 -0
- package/src/engine/__tests__/auth-claims-registrar.test.ts +74 -0
- package/src/engine/__tests__/boot-validator-located-timestamps.test.ts +108 -0
- package/src/engine/__tests__/boot-validator.test.ts +1865 -0
- package/src/engine/__tests__/build-app-schema.test.ts +154 -0
- package/src/engine/__tests__/claim-keys.test.ts +274 -0
- package/src/engine/__tests__/config-helpers.test.ts +236 -0
- package/src/engine/__tests__/effective-features.test.ts +86 -0
- package/src/engine/__tests__/engine.test.ts +1461 -0
- package/src/engine/__tests__/entity-handlers.test.ts +274 -0
- package/src/engine/__tests__/event-helpers.test.ts +68 -0
- package/src/engine/__tests__/extends-registrar.test.ts +159 -0
- package/src/engine/__tests__/factories-long-text.test.ts +84 -0
- package/src/engine/__tests__/factories-time.test.ts +158 -0
- package/src/engine/__tests__/field-predicates.test.ts +48 -0
- package/src/engine/__tests__/hook-phases.test.ts +132 -0
- package/src/engine/__tests__/identifiers.test.ts +35 -0
- package/src/engine/__tests__/lifecycle-hooks.test.ts +237 -0
- package/src/engine/__tests__/nav.test.ts +267 -0
- package/src/engine/__tests__/ownership.test.ts +421 -0
- package/src/engine/__tests__/parse-ref-target.test.ts +43 -0
- package/src/engine/__tests__/projection-helpers.test.ts +62 -0
- package/src/engine/__tests__/projection.test.ts +191 -0
- package/src/engine/__tests__/qualified-name.test.ts +264 -0
- package/src/engine/__tests__/resolve-config-or-param.test.ts +315 -0
- package/src/engine/__tests__/run-in.test.ts +38 -0
- package/src/engine/__tests__/schema-builder.test.ts +380 -0
- package/src/engine/__tests__/screen.test.ts +408 -0
- package/src/engine/__tests__/state-machine.test.ts +148 -0
- package/src/engine/__tests__/system-user.test.ts +57 -0
- package/src/engine/__tests__/validation-hooks.test.ts +71 -0
- package/src/engine/access.ts +23 -0
- package/src/engine/boot-validator.ts +1528 -0
- package/src/engine/build-app-schema.ts +125 -0
- package/src/engine/config-helpers.ts +115 -0
- package/src/engine/constants.ts +85 -0
- package/src/engine/create-app.ts +98 -0
- package/src/engine/define-feature.ts +702 -0
- package/src/engine/define-handler.ts +78 -0
- package/src/engine/define-roles.ts +19 -0
- package/src/engine/effective-features.ts +87 -0
- package/src/engine/entity-handlers.ts +364 -0
- package/src/engine/event-helpers.ts +73 -0
- package/src/engine/factories.ts +328 -0
- package/src/engine/feature-ast/__tests__/canonical-form.test.ts +416 -0
- package/src/engine/feature-ast/__tests__/parse-happy-path.test.ts +197 -0
- package/src/engine/feature-ast/__tests__/parse-real-features.test.ts +128 -0
- package/src/engine/feature-ast/__tests__/parse.test.ts +888 -0
- package/src/engine/feature-ast/__tests__/patch.test.ts +360 -0
- package/src/engine/feature-ast/__tests__/patcher.test.ts +469 -0
- package/src/engine/feature-ast/__tests__/render-roundtrip.test.ts +287 -0
- package/src/engine/feature-ast/extractors.ts +2562 -0
- package/src/engine/feature-ast/index.ts +105 -0
- package/src/engine/feature-ast/parse.ts +369 -0
- package/src/engine/feature-ast/patch.ts +525 -0
- package/src/engine/feature-ast/patcher.ts +518 -0
- package/src/engine/feature-ast/patterns.ts +434 -0
- package/src/engine/feature-ast/render.ts +602 -0
- package/src/engine/feature-ast/source-location.ts +45 -0
- package/src/engine/field-access.ts +120 -0
- package/src/engine/index.ts +254 -0
- package/src/engine/ownership.ts +337 -0
- package/src/engine/parse-ref-target.ts +22 -0
- package/src/engine/pattern-library/__tests__/library.test.ts +351 -0
- package/src/engine/pattern-library/index.ts +24 -0
- package/src/engine/pattern-library/library.ts +1117 -0
- package/src/engine/pattern-library/types.ts +255 -0
- package/src/engine/projection-helpers.ts +85 -0
- package/src/engine/qualified-name.ts +122 -0
- package/src/engine/read-claim.ts +31 -0
- package/src/engine/registry.ts +1325 -0
- package/src/engine/resolve-config-or-param.ts +153 -0
- package/src/engine/run-in.ts +29 -0
- package/src/engine/schema-builder.ts +175 -0
- package/src/engine/screen-filter-ops.ts +51 -0
- package/src/engine/state-machine.ts +70 -0
- package/src/engine/system-user.ts +32 -0
- package/src/engine/types/config.ts +306 -0
- package/src/engine/types/event-type-map.ts +37 -0
- package/src/engine/types/feature.ts +574 -0
- package/src/engine/types/fields.ts +422 -0
- package/src/engine/types/handlers.ts +742 -0
- package/src/engine/types/hooks.ts +142 -0
- package/src/engine/types/http-route.ts +54 -0
- package/src/engine/types/identifiers.ts +47 -0
- package/src/engine/types/index.ts +208 -0
- package/src/engine/types/nav.ts +46 -0
- package/src/engine/types/projection.ts +132 -0
- package/src/engine/types/relations.ts +51 -0
- package/src/engine/types/screen.ts +452 -0
- package/src/engine/types/workspace.ts +42 -0
- package/src/engine/validation.ts +33 -0
- package/src/entrypoint/__tests__/entrypoint-job-wiring.integration.ts +173 -0
- package/src/entrypoint/__tests__/split-deploy.integration.ts +297 -0
- package/src/entrypoint/index.ts +442 -0
- package/src/errors/__tests__/classes.test.ts +371 -0
- package/src/errors/__tests__/write-failures.test.ts +109 -0
- package/src/errors/classes.ts +249 -0
- package/src/errors/i18n/de.yaml +83 -0
- package/src/errors/i18n/en.yaml +80 -0
- package/src/errors/index.ts +41 -0
- package/src/errors/kumiko-error.ts +67 -0
- package/src/errors/reasons.ts +36 -0
- package/src/errors/serialize.ts +136 -0
- package/src/errors/transition-details.ts +30 -0
- package/src/errors/write-error-info.ts +123 -0
- package/src/errors/zod-bridge.ts +49 -0
- package/src/event-store/__tests__/admin-api.integration.ts +361 -0
- package/src/event-store/__tests__/event-store.integration.ts +584 -0
- package/src/event-store/__tests__/get-stream-version-perf.integration.ts +83 -0
- package/src/event-store/__tests__/perf.integration.ts +255 -0
- package/src/event-store/__tests__/snapshot.integration.ts +267 -0
- package/src/event-store/__tests__/upcaster-dead-letter.integration.ts +204 -0
- package/src/event-store/__tests__/upcaster.integration.ts +460 -0
- package/src/event-store/admin-api.ts +257 -0
- package/src/event-store/archive.ts +106 -0
- package/src/event-store/errors.ts +35 -0
- package/src/event-store/event-store.ts +405 -0
- package/src/event-store/events-schema.ts +90 -0
- package/src/event-store/index.ts +50 -0
- package/src/event-store/snapshot.ts +210 -0
- package/src/event-store/upcaster-dead-letter.ts +119 -0
- package/src/event-store/upcaster.ts +147 -0
- package/src/files/__tests__/content-disposition.test.ts +123 -0
- package/src/files/__tests__/file-field-column.integration.ts +103 -0
- package/src/files/__tests__/file-field-pipeline.integration.ts +211 -0
- package/src/files/__tests__/file-handle.test.ts +122 -0
- package/src/files/__tests__/files.integration.ts +830 -0
- package/src/files/__tests__/storage-tracking.integration.ts +153 -0
- package/src/files/content-disposition.ts +55 -0
- package/src/files/file-handle.ts +63 -0
- package/src/files/file-ref-table.ts +22 -0
- package/src/files/file-routes.ts +353 -0
- package/src/files/in-memory-provider.ts +62 -0
- package/src/files/index.ts +29 -0
- package/src/files/local-provider.ts +35 -0
- package/src/files/storage-tracking.ts +60 -0
- package/src/files/types.ts +118 -0
- package/src/i18n/__tests__/i18n.test.ts +72 -0
- package/src/i18n/index.ts +29 -0
- package/src/jobs/__tests__/job-event-trigger.integration.ts +172 -0
- package/src/jobs/__tests__/job-multi-trigger.integration.ts +144 -0
- package/src/jobs/__tests__/jobs.integration.ts +566 -0
- package/src/jobs/index.ts +2 -0
- package/src/jobs/job-runner.ts +574 -0
- package/src/lifecycle/__tests__/create-test-lifecycle.ts +19 -0
- package/src/lifecycle/__tests__/lifecycle-server.integration.ts +108 -0
- package/src/lifecycle/__tests__/lifecycle.test.ts +212 -0
- package/src/lifecycle/__tests__/signal-handlers.test.ts +106 -0
- package/src/lifecycle/index.ts +13 -0
- package/src/lifecycle/lifecycle.ts +160 -0
- package/src/lifecycle/signal-handlers.ts +62 -0
- package/src/logging/__tests__/pino-trace-bridge.test.ts +50 -0
- package/src/logging/index.ts +3 -0
- package/src/logging/pino-logger.ts +64 -0
- package/src/logging/types.ts +7 -0
- package/src/migrations/__tests__/compare-snapshots.test.ts +150 -0
- package/src/migrations/__tests__/detect-drift.integration.ts +320 -0
- package/src/migrations/__tests__/detect-projections-to-rebuild.integration.ts +134 -0
- package/src/migrations/__tests__/rebuild-marker.test.ts +79 -0
- package/src/migrations/index.ts +28 -0
- package/src/migrations/projection-detection.ts +149 -0
- package/src/migrations/rebuild-marker.ts +64 -0
- package/src/migrations/schema-drift.ts +395 -0
- package/src/observability/__tests__/console-provider.test.ts +67 -0
- package/src/observability/__tests__/metric-validator.test.ts +87 -0
- package/src/observability/__tests__/noop-provider.test.ts +82 -0
- package/src/observability/__tests__/observability.integration.ts +559 -0
- package/src/observability/__tests__/prometheus-meter.test.ts +144 -0
- package/src/observability/__tests__/recording-meter.test.ts +101 -0
- package/src/observability/__tests__/recording-tracer.test.ts +110 -0
- package/src/observability/__tests__/sensitive-filter.test.ts +98 -0
- package/src/observability/console-provider.ts +130 -0
- package/src/observability/context.ts +26 -0
- package/src/observability/fallback.ts +34 -0
- package/src/observability/ids.ts +25 -0
- package/src/observability/index.ts +79 -0
- package/src/observability/metric-validator.ts +86 -0
- package/src/observability/metrics-handle.ts +56 -0
- package/src/observability/noop-provider.ts +146 -0
- package/src/observability/prometheus-meter.ts +284 -0
- package/src/observability/recording-meter.ts +156 -0
- package/src/observability/recording-tracer.ts +198 -0
- package/src/observability/redis-wrapper.ts +132 -0
- package/src/observability/sensitive-filter.ts +108 -0
- package/src/observability/standard-metrics.ts +213 -0
- package/src/observability/types/index.ts +29 -0
- package/src/observability/types/metric.ts +56 -0
- package/src/observability/types/provider.ts +32 -0
- package/src/observability/types/span.ts +64 -0
- package/src/pipeline/__tests__/archive-stream.integration.ts +220 -0
- package/src/pipeline/__tests__/auth-claims-resolver.test.ts +279 -0
- package/src/pipeline/__tests__/cascade-handler.integration.ts +419 -0
- package/src/pipeline/__tests__/cascade-handler.test.ts +52 -0
- package/src/pipeline/__tests__/causation-chain.integration.ts +206 -0
- package/src/pipeline/__tests__/ctx-bridge.integration.ts +234 -0
- package/src/pipeline/__tests__/dispatcher.test.ts +379 -0
- package/src/pipeline/__tests__/distributed-lock.integration.ts +67 -0
- package/src/pipeline/__tests__/domain-events-projections.integration.ts +323 -0
- package/src/pipeline/__tests__/event-dedup.integration.ts +153 -0
- package/src/pipeline/__tests__/event-define-event-strict.integration.ts +202 -0
- package/src/pipeline/__tests__/event-dispatcher-lifecycle.integration.ts +220 -0
- package/src/pipeline/__tests__/event-dispatcher-multi-instance.integration.ts +423 -0
- package/src/pipeline/__tests__/event-dispatcher-pg-listen.integration.ts +123 -0
- package/src/pipeline/__tests__/event-dispatcher-recovery.integration.ts +202 -0
- package/src/pipeline/__tests__/event-dispatcher-second-audit.integration.ts +290 -0
- package/src/pipeline/__tests__/event-dispatcher-strict.test.ts +65 -0
- package/src/pipeline/__tests__/event-dispatcher.integration.ts +287 -0
- package/src/pipeline/__tests__/event-retention.integration.ts +239 -0
- package/src/pipeline/__tests__/fetch-for-writing.integration.ts +281 -0
- package/src/pipeline/__tests__/lifecycle-pipeline.test.ts +430 -0
- package/src/pipeline/__tests__/load-aggregate-query.integration.ts +266 -0
- package/src/pipeline/__tests__/msp-error-mode.integration.ts +149 -0
- package/src/pipeline/__tests__/msp-multi-hop.integration.ts +228 -0
- package/src/pipeline/__tests__/msp-rebuild.integration.ts +368 -0
- package/src/pipeline/__tests__/multi-stream-projection.integration.ts +341 -0
- package/src/pipeline/__tests__/perf-rebuild.integration.ts +147 -0
- package/src/pipeline/__tests__/projection-rebuild.integration.ts +551 -0
- package/src/pipeline/__tests__/query-projection.integration.ts +201 -0
- package/src/pipeline/__tests__/redis-pipeline.integration.ts +306 -0
- package/src/pipeline/append-event-core.ts +117 -0
- package/src/pipeline/auth-claims-resolver.ts +103 -0
- package/src/pipeline/cascade-handler.ts +113 -0
- package/src/pipeline/dispatcher.ts +1585 -0
- package/src/pipeline/distributed-lock.ts +37 -0
- package/src/pipeline/entity-cache.ts +113 -0
- package/src/pipeline/event-consumer-state.ts +108 -0
- package/src/pipeline/event-dedup.ts +23 -0
- package/src/pipeline/event-dispatcher.ts +1016 -0
- package/src/pipeline/event-retention.ts +154 -0
- package/src/pipeline/idempotency.ts +76 -0
- package/src/pipeline/index.ts +66 -0
- package/src/pipeline/lifecycle-pipeline.ts +409 -0
- package/src/pipeline/msp-rebuild.ts +242 -0
- package/src/pipeline/multi-stream-apply-context.ts +115 -0
- package/src/pipeline/projection-rebuild.ts +334 -0
- package/src/pipeline/projection-state.ts +72 -0
- package/src/pipeline/projections-runner.ts +56 -0
- package/src/pipeline/redis-keys.ts +11 -0
- package/src/pipeline/system-hooks.ts +190 -0
- package/src/random/__tests__/generate.test.ts +149 -0
- package/src/random/generate.ts +141 -0
- package/src/random/index.ts +8 -0
- package/src/random/words.ts +392 -0
- package/src/rate-limit/__tests__/dispatcher-l3.integration.ts +111 -0
- package/src/rate-limit/__tests__/middleware.integration.ts +189 -0
- package/src/rate-limit/__tests__/resolver.integration.ts +189 -0
- package/src/rate-limit/bucket.ts +36 -0
- package/src/rate-limit/index.ts +14 -0
- package/src/rate-limit/middleware.ts +152 -0
- package/src/rate-limit/resolver.ts +267 -0
- package/src/redis/__tests__/redis-options.test.ts +54 -0
- package/src/redis/index.ts +74 -0
- package/src/search/__tests__/meilisearch-adapter.integration.ts +236 -0
- package/src/search/__tests__/search-adapter.test.ts +256 -0
- package/src/search/in-memory-adapter.ts +123 -0
- package/src/search/index.ts +12 -0
- package/src/search/meilisearch-adapter.ts +106 -0
- package/src/search/types.ts +39 -0
- package/src/secrets/__tests__/dek-cache.test.ts +213 -0
- package/src/secrets/__tests__/env-master-key-provider.test.ts +119 -0
- package/src/secrets/__tests__/envelope.test.ts +74 -0
- package/src/secrets/__tests__/leak-guard.test.ts +92 -0
- package/src/secrets/__tests__/rotation.test.ts +149 -0
- package/src/secrets/dek-cache.ts +116 -0
- package/src/secrets/env-master-key-provider.ts +162 -0
- package/src/secrets/envelope.ts +55 -0
- package/src/secrets/index.ts +19 -0
- package/src/secrets/leak-guard.ts +87 -0
- package/src/secrets/rotation.ts +34 -0
- package/src/secrets/types.ts +107 -0
- package/src/stack/db.ts +104 -0
- package/src/stack/event-collector.ts +23 -0
- package/src/stack/index.ts +32 -0
- package/src/stack/redis.ts +44 -0
- package/src/stack/request-helper.ts +168 -0
- package/src/stack/table-helpers.ts +104 -0
- package/src/stack/test-stack.ts +357 -0
- package/src/stack/test-users.ts +37 -0
- package/src/testing/__tests__/e2e-generator.test.ts +230 -0
- package/src/testing/__tests__/ensure-entity-table.integration.ts +54 -0
- package/src/testing/access-assertions.ts +15 -0
- package/src/testing/assertions.ts +35 -0
- package/src/testing/e2e-generator.ts +465 -0
- package/src/testing/expect-error.ts +25 -0
- package/src/testing/handler-context.ts +125 -0
- package/src/testing/http-cookies.ts +52 -0
- package/src/testing/index.ts +41 -0
- package/src/testing/late-bound.ts +39 -0
- package/src/testing/mutable-master-key-provider.ts +31 -0
- package/src/testing/observability-recorder.ts +54 -0
- package/src/testing/shared-entities.ts +49 -0
- package/src/testing/utils.ts +1 -0
- package/src/testing/wait-for.ts +31 -0
- package/src/time/__tests__/polyfill.test.ts +73 -0
- package/src/time/__tests__/tz-context.test.ts +121 -0
- package/src/time/index.ts +21 -0
- package/src/time/polyfill.ts +70 -0
- package/src/time/tz-context.ts +107 -0
- package/src/ui-types/app-schema.ts +57 -0
- package/src/ui-types/index.ts +65 -0
- package/src/utils/__tests__/assert.test.ts +17 -0
- package/src/utils/__tests__/env-parse.test.ts +54 -0
- package/src/utils/assert.ts +18 -0
- package/src/utils/env-parse.ts +16 -0
- package/src/utils/ids.ts +16 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/safe-json.ts +30 -0
- package/src/utils/serialization.ts +7 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Public API of the feature-ast module. Consumers (Designer, AI patcher,
|
|
2
|
+
// CLI) import exclusively from here.
|
|
3
|
+
|
|
4
|
+
// Forwarded barrel — keeps the pattern-library reachable through
|
|
5
|
+
// @cosmicdrift/kumiko-framework/engine without forcing a separate sub-path import.
|
|
6
|
+
export type {
|
|
7
|
+
FormFieldLabel,
|
|
8
|
+
FormFieldSpec,
|
|
9
|
+
FormInputType,
|
|
10
|
+
PatternCategory,
|
|
11
|
+
PatternFormSchema,
|
|
12
|
+
} from "../pattern-library";
|
|
13
|
+
export { getPatternSchema, groupByCategory, PATTERN_LIBRARY } from "../pattern-library";
|
|
14
|
+
export type { ParseError, ParseResult } from "./parse";
|
|
15
|
+
export { parseFeatureFile, parseSourceFile } from "./parse";
|
|
16
|
+
export type { PatternChange, PatternId } from "./patch";
|
|
17
|
+
export {
|
|
18
|
+
addPattern,
|
|
19
|
+
applyChanges,
|
|
20
|
+
removePattern,
|
|
21
|
+
replacePattern,
|
|
22
|
+
SINGLETON_KINDS,
|
|
23
|
+
} from "./patch";
|
|
24
|
+
export type {
|
|
25
|
+
AddAuthClaimsArgs,
|
|
26
|
+
AddClaimKeyArgs,
|
|
27
|
+
AddConfigArgs,
|
|
28
|
+
AddDefineEventArgs,
|
|
29
|
+
AddEntityArgs,
|
|
30
|
+
AddEntityHookArgs,
|
|
31
|
+
AddEventMigrationArgs,
|
|
32
|
+
AddHookArgs,
|
|
33
|
+
AddHttpRouteArgs,
|
|
34
|
+
AddJobArgs,
|
|
35
|
+
AddMetricArgs,
|
|
36
|
+
AddMultiStreamProjectionArgs,
|
|
37
|
+
AddNavArgs,
|
|
38
|
+
AddNotificationArgs,
|
|
39
|
+
AddOptionalRequiresArgs,
|
|
40
|
+
AddProjectionArgs,
|
|
41
|
+
AddQueryHandlerArgs,
|
|
42
|
+
AddReadsConfigArgs,
|
|
43
|
+
AddReferenceDataArgs,
|
|
44
|
+
AddRelationArgs,
|
|
45
|
+
AddRequiresArgs,
|
|
46
|
+
AddScreenArgs,
|
|
47
|
+
AddSecretArgs,
|
|
48
|
+
AddToggleableArgs,
|
|
49
|
+
AddTranslationsArgs,
|
|
50
|
+
AddUseExtensionArgs,
|
|
51
|
+
AddWorkspaceArgs,
|
|
52
|
+
AddWriteHandlerArgs,
|
|
53
|
+
FeaturePatcher,
|
|
54
|
+
} from "./patcher";
|
|
55
|
+
export { createFeaturePatcher } from "./patcher";
|
|
56
|
+
export type {
|
|
57
|
+
AuthClaimsPattern,
|
|
58
|
+
ClaimKeyPattern,
|
|
59
|
+
ConfigPattern,
|
|
60
|
+
DefineEventPattern,
|
|
61
|
+
Editability,
|
|
62
|
+
EntityHookPattern,
|
|
63
|
+
// Static patterns
|
|
64
|
+
EntityPattern,
|
|
65
|
+
EventMigrationPattern,
|
|
66
|
+
ExtendsRegistrarPattern,
|
|
67
|
+
FeaturePattern,
|
|
68
|
+
FeaturePatternKind,
|
|
69
|
+
HookPattern,
|
|
70
|
+
HttpRoutePattern,
|
|
71
|
+
JobPattern,
|
|
72
|
+
MetricPattern,
|
|
73
|
+
MultiStreamProjectionPattern,
|
|
74
|
+
NavPattern,
|
|
75
|
+
NotificationPattern,
|
|
76
|
+
OptionalRequiresPattern,
|
|
77
|
+
ProjectionPattern,
|
|
78
|
+
QueryHandlerPattern,
|
|
79
|
+
ReadsConfigPattern,
|
|
80
|
+
ReferenceDataPattern,
|
|
81
|
+
RelationPattern,
|
|
82
|
+
RequiresPattern,
|
|
83
|
+
// Mixed patterns
|
|
84
|
+
ScreenPattern,
|
|
85
|
+
SecretPattern,
|
|
86
|
+
SystemScopePattern,
|
|
87
|
+
ToggleablePattern,
|
|
88
|
+
TranslationsPattern,
|
|
89
|
+
// Catch-all
|
|
90
|
+
UnknownPattern,
|
|
91
|
+
UseExtensionPattern,
|
|
92
|
+
WorkspacePattern,
|
|
93
|
+
WriteHandlerPattern,
|
|
94
|
+
} from "./patterns";
|
|
95
|
+
export { getEditability } from "./patterns";
|
|
96
|
+
export type { RenderFeatureFileInput } from "./render";
|
|
97
|
+
export {
|
|
98
|
+
FEATURE_FILE_VERSION,
|
|
99
|
+
renderFeatureFile,
|
|
100
|
+
renderPattern,
|
|
101
|
+
renderValue,
|
|
102
|
+
VERSION_HEADER,
|
|
103
|
+
} from "./render";
|
|
104
|
+
export type { SourceLocation, SourcePosition } from "./source-location";
|
|
105
|
+
export { sourceLocationFromNode } from "./source-location";
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
// parseFeatureFile — entry-point for AST pattern detection. Reads a
|
|
2
|
+
// `defineFeature.ts` file, walks the `setup(r => { ... })` callback,
|
|
3
|
+
// and emits one FeaturePattern per recognised `r.*` call.
|
|
4
|
+
//
|
|
5
|
+
// **Pipeline position:**
|
|
6
|
+
//
|
|
7
|
+
// ┌──────────────────┐ parseFeatureFile ┌─────────────────────┐
|
|
8
|
+
// │ feature-file.ts │ ──────────────────────► │ ParseResult │
|
|
9
|
+
// │ (defineFeature │ │ - featureName │
|
|
10
|
+
// │ with r.* calls) │ │ - patterns: FP[] │
|
|
11
|
+
// └──────────────────┘ │ - errors: PE[] │
|
|
12
|
+
// └─────────────────────┘
|
|
13
|
+
//
|
|
14
|
+
// **What is NOT extracted:**
|
|
15
|
+
// - Imports, helper functions, local consts between the `r.*` calls.
|
|
16
|
+
// Those stay in the file buffer and survive every patch unchanged.
|
|
17
|
+
// - Top-level code outside `defineFeature(...)`. Designer/AI treat
|
|
18
|
+
// such files as "not a feature file".
|
|
19
|
+
//
|
|
20
|
+
// **Skeleton status (C1.3):** interface fixed, extractors are TODO.
|
|
21
|
+
// Per-pattern extractors fill in iteratively (C1.5) — each round adds
|
|
22
|
+
// one extractor + a focused test.
|
|
23
|
+
|
|
24
|
+
import type { ArrowFunction, CallExpression, ParameterDeclaration, SourceFile } from "ts-morph";
|
|
25
|
+
import { Project, SyntaxKind } from "ts-morph";
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
type ExtractOutput,
|
|
29
|
+
extractAuthClaims,
|
|
30
|
+
extractClaimKey,
|
|
31
|
+
extractConfig,
|
|
32
|
+
extractDefineEvent,
|
|
33
|
+
extractEntity,
|
|
34
|
+
extractEntityHook,
|
|
35
|
+
extractEventMigration,
|
|
36
|
+
extractExtendsRegistrar,
|
|
37
|
+
extractHook,
|
|
38
|
+
extractHttpRoute,
|
|
39
|
+
extractJob,
|
|
40
|
+
extractMetric,
|
|
41
|
+
extractMultiStreamProjection,
|
|
42
|
+
extractNav,
|
|
43
|
+
extractNotification,
|
|
44
|
+
extractOptionalRequires,
|
|
45
|
+
extractProjection,
|
|
46
|
+
extractQueryHandler,
|
|
47
|
+
extractReadsConfig,
|
|
48
|
+
extractReferenceData,
|
|
49
|
+
extractRelation,
|
|
50
|
+
extractRequires,
|
|
51
|
+
extractScreen,
|
|
52
|
+
extractSecret,
|
|
53
|
+
extractSystemScope,
|
|
54
|
+
extractToggleable,
|
|
55
|
+
extractTranslations,
|
|
56
|
+
extractUseExtension,
|
|
57
|
+
extractWorkspace,
|
|
58
|
+
extractWriteHandler,
|
|
59
|
+
} from "./extractors";
|
|
60
|
+
import type { FeaturePattern, UnknownPattern } from "./patterns";
|
|
61
|
+
import { type SourceLocation, sourceLocationFromNode } from "./source-location";
|
|
62
|
+
|
|
63
|
+
// =============================================================================
|
|
64
|
+
// Public API
|
|
65
|
+
// =============================================================================
|
|
66
|
+
|
|
67
|
+
export type ParseError = {
|
|
68
|
+
// Which r.* call could not be parsed (only the method name —
|
|
69
|
+
// a call without a method name isn't an r.* call and never lands
|
|
70
|
+
// here).
|
|
71
|
+
readonly methodName: string;
|
|
72
|
+
// Where in the file. The Designer can highlight the spot
|
|
73
|
+
// ("call not understood here").
|
|
74
|
+
readonly source: SourceLocation;
|
|
75
|
+
// Free-form description (e.g. "argument 0 is not an object literal,
|
|
76
|
+
// cannot read EntityDefinition statically").
|
|
77
|
+
readonly reason: string;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export type ParseResult = {
|
|
81
|
+
// Extracted from `defineFeature("name", ...)`. Undefined when the
|
|
82
|
+
// file has no `defineFeature` call (then `patterns` is empty too).
|
|
83
|
+
readonly featureName: string | undefined;
|
|
84
|
+
// Recognised r.* calls in source order.
|
|
85
|
+
readonly patterns: readonly FeaturePattern[];
|
|
86
|
+
// Calls whose arguments we could not statically read. The method
|
|
87
|
+
// name is known; only the payload was unreachable. Designer renders
|
|
88
|
+
// them as "cannot edit", AI patcher leaves them alone. Distinct from
|
|
89
|
+
// UnknownPattern (where the method name itself is unknown).
|
|
90
|
+
readonly errors: readonly ParseError[];
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Parse the given feature file and return all recognised r.* calls
|
|
95
|
+
* as a FeaturePattern list.
|
|
96
|
+
*
|
|
97
|
+
* Does NOT throw on TypeScript errors — the visitor works on the syntax
|
|
98
|
+
* tree, not on the type checker. Files with type errors can still be
|
|
99
|
+
* parsed structurally (Designer keeps showing them, AI can suggest fixes).
|
|
100
|
+
*
|
|
101
|
+
* Throws on filesystem / parse errors that ts-morph cannot recover from.
|
|
102
|
+
*/
|
|
103
|
+
export function parseFeatureFile(filePath: string): ParseResult {
|
|
104
|
+
const project = new Project({
|
|
105
|
+
// Skip tsconfig file discovery: we only ever load this single file.
|
|
106
|
+
// Without these flags ts-morph would resolve the whole tsconfig
|
|
107
|
+
// tree, which is expensive on large repos and unnecessary for
|
|
108
|
+
// structural analysis.
|
|
109
|
+
skipAddingFilesFromTsConfig: true,
|
|
110
|
+
skipFileDependencyResolution: true,
|
|
111
|
+
});
|
|
112
|
+
const sourceFile = project.addSourceFileAtPath(filePath);
|
|
113
|
+
return parseSourceFile(sourceFile);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Same as parseFeatureFile, but for SourceFiles already loaded by the
|
|
118
|
+
* caller. Useful for tests + the Designer (which keeps its own Project
|
|
119
|
+
* instance and avoids re-IO per parse).
|
|
120
|
+
*/
|
|
121
|
+
export function parseSourceFile(sourceFile: SourceFile): ParseResult {
|
|
122
|
+
const setupCall = findDefineFeatureCall(sourceFile);
|
|
123
|
+
if (!setupCall) {
|
|
124
|
+
return { featureName: undefined, patterns: [], errors: [] };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const featureName = extractFeatureName(setupCall);
|
|
128
|
+
const setupCallback = extractSetupCallback(setupCall);
|
|
129
|
+
if (!setupCallback) {
|
|
130
|
+
return { featureName, patterns: [], errors: [] };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const registrarParamName = extractRegistrarParamName(setupCallback);
|
|
134
|
+
if (!registrarParamName) {
|
|
135
|
+
return { featureName, patterns: [], errors: [] };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const patterns: FeaturePattern[] = [];
|
|
139
|
+
const errors: ParseError[] = [];
|
|
140
|
+
|
|
141
|
+
walkSetupCallback(setupCallback, registrarParamName, sourceFile, patterns, errors);
|
|
142
|
+
|
|
143
|
+
return { featureName, patterns, errors };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// =============================================================================
|
|
147
|
+
// Internal — locate defineFeature + setup callback
|
|
148
|
+
// =============================================================================
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Find the `defineFeature(name, setup)` call in the source file.
|
|
152
|
+
* Convention: each feature file invokes `defineFeature` exactly once
|
|
153
|
+
* at top level. If multiple calls exist (unusual outside of test
|
|
154
|
+
* helpers) we take the first.
|
|
155
|
+
*/
|
|
156
|
+
function findDefineFeatureCall(sourceFile: SourceFile): CallExpression | undefined {
|
|
157
|
+
for (const stmt of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
158
|
+
const expr = stmt.getExpression();
|
|
159
|
+
if (expr.getText() === "defineFeature") {
|
|
160
|
+
return stmt;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Read the feature name from the first argument of `defineFeature(...)`.
|
|
168
|
+
* Returns undefined when the argument is not a string literal (e.g.
|
|
169
|
+
* dynamic name from a const). Designer can still load the file but the
|
|
170
|
+
* AI generator will never produce such a setup.
|
|
171
|
+
*/
|
|
172
|
+
function extractFeatureName(call: CallExpression): string | undefined {
|
|
173
|
+
const arg = call.getArguments()[0];
|
|
174
|
+
if (!arg) return undefined;
|
|
175
|
+
const literal = arg.asKind(SyntaxKind.StringLiteral);
|
|
176
|
+
if (!literal) return undefined;
|
|
177
|
+
return literal.getLiteralValue();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Read the `setup` callback (second argument) from `defineFeature(...)`.
|
|
182
|
+
* We only support the arrow-function form here — function expressions
|
|
183
|
+
* have not turned up in any sample so far. If a future feature needs
|
|
184
|
+
* them, this is the single hook to extend.
|
|
185
|
+
*/
|
|
186
|
+
function extractSetupCallback(call: CallExpression): ArrowFunction | undefined {
|
|
187
|
+
const arg = call.getArguments()[1];
|
|
188
|
+
if (!arg) return undefined;
|
|
189
|
+
return arg.asKind(SyntaxKind.ArrowFunction);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Read the parameter name of the setup callback's first parameter.
|
|
194
|
+
* Idiomatic feature files call it `r`, but `(registrar) => { ... }` or
|
|
195
|
+
* `(reg) => { ... }` are equally legal — the visitor must follow the
|
|
196
|
+
* author's choice or it would silently miss every call.
|
|
197
|
+
*
|
|
198
|
+
* Returns undefined when the callback takes no parameter at all (a
|
|
199
|
+
* feature that does nothing — empty patterns list, no error).
|
|
200
|
+
*/
|
|
201
|
+
function extractRegistrarParamName(setup: ArrowFunction): string | undefined {
|
|
202
|
+
const param: ParameterDeclaration | undefined = setup.getParameters()[0];
|
|
203
|
+
if (!param) return undefined;
|
|
204
|
+
return param.getName();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// =============================================================================
|
|
208
|
+
// Internal — walk + dispatch
|
|
209
|
+
// =============================================================================
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Walk the body of the setup callback and route every `<param>.<method>(...)`
|
|
213
|
+
* call to the matching extractor. Helper functions / local variables /
|
|
214
|
+
* imports are ignored.
|
|
215
|
+
*
|
|
216
|
+
* We rely on `getDescendantsOfKind` rather than walking only direct
|
|
217
|
+
* children: the `r.*` API is always called on the registrar variable,
|
|
218
|
+
* which the closure rules keep scoped to the setup callback. Nested
|
|
219
|
+
* calls inside a writeHandler closure would not see `r` and therefore
|
|
220
|
+
* cannot pose as feature-level patterns — collisions are
|
|
221
|
+
* structurally impossible.
|
|
222
|
+
*/
|
|
223
|
+
function walkSetupCallback(
|
|
224
|
+
setup: ArrowFunction,
|
|
225
|
+
registrarParamName: string,
|
|
226
|
+
sourceFile: SourceFile,
|
|
227
|
+
patterns: FeaturePattern[],
|
|
228
|
+
errors: ParseError[],
|
|
229
|
+
): void {
|
|
230
|
+
const body = setup.getBody();
|
|
231
|
+
for (const call of body.getDescendantsOfKind(SyntaxKind.CallExpression)) {
|
|
232
|
+
const methodName = extractRegistrarMethodName(call, registrarParamName);
|
|
233
|
+
if (!methodName) continue; // Not a registrar call — ignore.
|
|
234
|
+
const result = dispatchExtractor(methodName, call, sourceFile);
|
|
235
|
+
if (result.kind === "pattern") {
|
|
236
|
+
patterns.push(result.pattern);
|
|
237
|
+
} else {
|
|
238
|
+
errors.push(result.error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Returns the method name when the call has the form
|
|
245
|
+
* `<registrarParamName>.<method>(...)`, otherwise undefined.
|
|
246
|
+
*
|
|
247
|
+
* Reads the property-access expression on the call's left-hand side
|
|
248
|
+
* and matches the receiver against the captured parameter name. Any
|
|
249
|
+
* other shape (free function call, method call on something else)
|
|
250
|
+
* returns undefined and is skipped by the walker.
|
|
251
|
+
*/
|
|
252
|
+
function extractRegistrarMethodName(
|
|
253
|
+
call: CallExpression,
|
|
254
|
+
registrarParamName: string,
|
|
255
|
+
): string | undefined {
|
|
256
|
+
const expr = call.getExpression();
|
|
257
|
+
const propAccess = expr.asKind(SyntaxKind.PropertyAccessExpression);
|
|
258
|
+
if (!propAccess) return undefined;
|
|
259
|
+
const receiver = propAccess.getExpression();
|
|
260
|
+
if (receiver.getText() !== registrarParamName) return undefined;
|
|
261
|
+
return propAccess.getName();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// =============================================================================
|
|
265
|
+
// Internal — pattern extractors (skeleton, implementation in C1.5)
|
|
266
|
+
// =============================================================================
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Route an `<r>.<method>(...)` call to its concrete extractor. New
|
|
270
|
+
* r.* APIs → new case + new extractor + new pattern type in patterns.ts.
|
|
271
|
+
* The discriminated union forces consumers (Designer, AI patcher) to
|
|
272
|
+
* commit to the new kind via compile errors.
|
|
273
|
+
*
|
|
274
|
+
* Skeleton: every recognised method currently returns an UnknownPattern
|
|
275
|
+
* with the right method name. C1.5 replaces the cases with concrete
|
|
276
|
+
* extractors one at a time.
|
|
277
|
+
*/
|
|
278
|
+
function dispatchExtractor(
|
|
279
|
+
methodName: string,
|
|
280
|
+
call: CallExpression,
|
|
281
|
+
sourceFile: SourceFile,
|
|
282
|
+
): ExtractOutput<FeaturePattern> {
|
|
283
|
+
switch (methodName) {
|
|
284
|
+
// Round 1 — simplest static patterns
|
|
285
|
+
case "requires":
|
|
286
|
+
return extractRequires(call, sourceFile);
|
|
287
|
+
case "optionalRequires":
|
|
288
|
+
return extractOptionalRequires(call, sourceFile);
|
|
289
|
+
case "readsConfig":
|
|
290
|
+
return extractReadsConfig(call, sourceFile);
|
|
291
|
+
case "systemScope":
|
|
292
|
+
return extractSystemScope(call, sourceFile);
|
|
293
|
+
case "toggleable":
|
|
294
|
+
return extractToggleable(call, sourceFile);
|
|
295
|
+
// Round 2 — object-literal-based static patterns
|
|
296
|
+
case "entity":
|
|
297
|
+
return extractEntity(call, sourceFile);
|
|
298
|
+
case "relation":
|
|
299
|
+
return extractRelation(call, sourceFile);
|
|
300
|
+
case "nav":
|
|
301
|
+
return extractNav(call, sourceFile);
|
|
302
|
+
case "workspace":
|
|
303
|
+
return extractWorkspace(call, sourceFile);
|
|
304
|
+
// Round 3 — complex static patterns
|
|
305
|
+
case "config":
|
|
306
|
+
return extractConfig(call, sourceFile);
|
|
307
|
+
case "translations":
|
|
308
|
+
return extractTranslations(call, sourceFile);
|
|
309
|
+
case "metric":
|
|
310
|
+
return extractMetric(call, sourceFile);
|
|
311
|
+
case "secret":
|
|
312
|
+
return extractSecret(call, sourceFile);
|
|
313
|
+
case "claimKey":
|
|
314
|
+
return extractClaimKey(call, sourceFile);
|
|
315
|
+
case "referenceData":
|
|
316
|
+
return extractReferenceData(call, sourceFile);
|
|
317
|
+
case "useExtension":
|
|
318
|
+
return extractUseExtension(call, sourceFile);
|
|
319
|
+
// Round 4 — mixed (header + body) patterns
|
|
320
|
+
case "hook":
|
|
321
|
+
return extractHook(call, sourceFile);
|
|
322
|
+
case "entityHook":
|
|
323
|
+
return extractEntityHook(call, sourceFile);
|
|
324
|
+
case "authClaims":
|
|
325
|
+
return extractAuthClaims(call, sourceFile);
|
|
326
|
+
case "writeHandler":
|
|
327
|
+
return extractWriteHandler(call, sourceFile);
|
|
328
|
+
case "queryHandler":
|
|
329
|
+
return extractQueryHandler(call, sourceFile);
|
|
330
|
+
case "job":
|
|
331
|
+
return extractJob(call, sourceFile);
|
|
332
|
+
case "httpRoute":
|
|
333
|
+
return extractHttpRoute(call, sourceFile);
|
|
334
|
+
case "defineEvent":
|
|
335
|
+
return extractDefineEvent(call, sourceFile);
|
|
336
|
+
case "eventMigration":
|
|
337
|
+
return extractEventMigration(call, sourceFile);
|
|
338
|
+
case "notification":
|
|
339
|
+
return extractNotification(call, sourceFile);
|
|
340
|
+
case "projection":
|
|
341
|
+
return extractProjection(call, sourceFile);
|
|
342
|
+
case "multiStreamProjection":
|
|
343
|
+
return extractMultiStreamProjection(call, sourceFile);
|
|
344
|
+
case "screen":
|
|
345
|
+
return extractScreen(call, sourceFile);
|
|
346
|
+
// Round 5 — opaque patterns
|
|
347
|
+
case "extendsRegistrar":
|
|
348
|
+
return extractExtendsRegistrar(call, sourceFile);
|
|
349
|
+
// Unknown method — UnknownPattern signal so Designer/AI surface it
|
|
350
|
+
// as "custom call" without losing the source location.
|
|
351
|
+
default:
|
|
352
|
+
return {
|
|
353
|
+
kind: "pattern",
|
|
354
|
+
pattern: makeUnknownPattern(methodName, call, sourceFile),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function makeUnknownPattern(
|
|
360
|
+
methodName: string,
|
|
361
|
+
call: CallExpression,
|
|
362
|
+
sourceFile: SourceFile,
|
|
363
|
+
): UnknownPattern {
|
|
364
|
+
return {
|
|
365
|
+
kind: "unknown",
|
|
366
|
+
methodName,
|
|
367
|
+
source: sourceLocationFromNode(call, sourceFile),
|
|
368
|
+
};
|
|
369
|
+
}
|