@hydranium/core 1.0.0-next.37 → 1.0.0-next.370
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 +78 -82
- package/lib/browser/host-heads-in-worker.d.ts +77 -0
- package/lib/browser/host-heads-in-worker.d.ts.map +1 -0
- package/lib/browser/host-heads-in-worker.js +169 -0
- package/lib/browser/host-heads-in-worker.js.map +1 -0
- package/lib/browser/index.d.ts +12 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +17 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/indexeddb-file-system-store.d.ts +82 -0
- package/lib/browser/indexeddb-file-system-store.d.ts.map +1 -0
- package/lib/browser/indexeddb-file-system-store.js +181 -0
- package/lib/browser/indexeddb-file-system-store.js.map +1 -0
- package/lib/browser/start-language-server-in-worker.d.ts +32 -0
- package/lib/browser/start-language-server-in-worker.d.ts.map +1 -0
- package/lib/browser/start-language-server-in-worker.js +40 -0
- package/lib/browser/start-language-server-in-worker.js.map +1 -0
- package/lib/documents/ast-document-manager.d.ts +254 -140
- package/lib/documents/ast-document-manager.d.ts.map +1 -1
- package/lib/documents/ast-document-manager.js +311 -127
- package/lib/documents/ast-document-manager.js.map +1 -1
- package/lib/documents/client-ids.d.ts +5 -19
- package/lib/documents/client-ids.d.ts.map +1 -1
- package/lib/documents/client-ids.js +5 -19
- package/lib/documents/client-ids.js.map +1 -1
- package/lib/documents/client-session-errors.d.ts +15 -0
- package/lib/documents/client-session-errors.d.ts.map +1 -0
- package/lib/documents/client-session-errors.js +15 -0
- package/lib/documents/client-session-errors.js.map +1 -0
- package/lib/documents/client-session-registry.d.ts +146 -0
- package/lib/documents/client-session-registry.d.ts.map +1 -0
- package/lib/documents/client-session-registry.js +207 -0
- package/lib/documents/client-session-registry.js.map +1 -0
- package/lib/documents/dirty-state-tracker.d.ts +101 -0
- package/lib/documents/dirty-state-tracker.d.ts.map +1 -0
- package/lib/documents/dirty-state-tracker.js +85 -0
- package/lib/documents/dirty-state-tracker.js.map +1 -0
- package/lib/documents/document-release-handler.d.ts +204 -0
- package/lib/documents/document-release-handler.d.ts.map +1 -0
- package/lib/documents/document-release-handler.js +317 -0
- package/lib/documents/document-release-handler.js.map +1 -0
- package/lib/documents/document-release-scheduler.d.ts +67 -0
- package/lib/documents/document-release-scheduler.d.ts.map +1 -0
- package/lib/documents/document-release-scheduler.js +80 -0
- package/lib/documents/document-release-scheduler.js.map +1 -0
- package/lib/documents/file-system-task-queue.d.ts +52 -0
- package/lib/documents/file-system-task-queue.d.ts.map +1 -0
- package/lib/documents/file-system-task-queue.js +37 -0
- package/lib/documents/file-system-task-queue.js.map +1 -0
- package/lib/documents/hydranium-text-documents.d.ts +445 -282
- package/lib/documents/hydranium-text-documents.d.ts.map +1 -1
- package/lib/documents/hydranium-text-documents.js +903 -483
- package/lib/documents/hydranium-text-documents.js.map +1 -1
- package/lib/documents/index.d.ts +10 -2
- package/lib/documents/index.d.ts.map +1 -1
- package/lib/documents/index.js +10 -2
- package/lib/documents/index.js.map +1 -1
- package/lib/documents/language-client-shadow.d.ts +234 -0
- package/lib/documents/language-client-shadow.d.ts.map +1 -0
- package/lib/documents/language-client-shadow.js +306 -0
- package/lib/documents/language-client-shadow.js.map +1 -0
- package/lib/documents/model-ledger.d.ts +47 -0
- package/lib/documents/model-ledger.d.ts.map +1 -0
- package/lib/documents/model-ledger.js +30 -0
- package/lib/documents/model-ledger.js.map +1 -0
- package/lib/documents/text-ledger.d.ts +64 -0
- package/lib/documents/text-ledger.d.ts.map +1 -0
- package/lib/documents/text-ledger.js +63 -0
- package/lib/documents/text-ledger.js.map +1 -0
- package/lib/documents/version-sync-service.d.ts +138 -0
- package/lib/documents/version-sync-service.d.ts.map +1 -0
- package/lib/documents/version-sync-service.js +173 -0
- package/lib/documents/version-sync-service.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.d.ts +42 -31
- package/lib/langium/ast-extension/ast-extension-service.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-extension-service.js +45 -19
- package/lib/langium/ast-extension/ast-extension-service.js.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.d.ts +12 -7
- package/lib/langium/ast-extension/ast-node-builder.d.ts.map +1 -1
- package/lib/langium/ast-extension/ast-node-builder.js +25 -9
- package/lib/langium/ast-extension/ast-node-builder.js.map +1 -1
- package/lib/langium/bootstrap.d.ts +49 -36
- package/lib/langium/bootstrap.d.ts.map +1 -1
- package/lib/langium/bootstrap.js +75 -36
- package/lib/langium/bootstrap.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts +9 -9
- package/lib/langium/build-phase-pass/build-phase-pass-service.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass-service.js +25 -16
- package/lib/langium/build-phase-pass/build-phase-pass-service.js.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts +20 -8
- package/lib/langium/build-phase-pass/build-phase-pass.d.ts.map +1 -1
- package/lib/langium/build-phase-pass/build-phase-pass.js +20 -0
- package/lib/langium/build-phase-pass/build-phase-pass.js.map +1 -1
- package/lib/langium/composite-ast-reflection.d.ts +46 -0
- package/lib/langium/composite-ast-reflection.d.ts.map +1 -0
- package/lib/langium/composite-ast-reflection.js +97 -0
- package/lib/langium/composite-ast-reflection.js.map +1 -0
- package/lib/langium/config/configuration-provider.d.ts +81 -0
- package/lib/langium/config/configuration-provider.d.ts.map +1 -0
- package/lib/langium/config/configuration-provider.js +112 -0
- package/lib/langium/config/configuration-provider.js.map +1 -0
- package/lib/langium/config/index.d.ts +1 -0
- package/lib/langium/config/index.d.ts.map +1 -1
- package/lib/langium/config/index.js +1 -0
- package/lib/langium/config/index.js.map +1 -1
- package/lib/langium/config/settings.js.map +1 -1
- package/lib/langium/diagnostics/console-tee.d.ts +27 -0
- package/lib/langium/diagnostics/console-tee.d.ts.map +1 -0
- package/lib/langium/diagnostics/console-tee.js +141 -0
- package/lib/langium/diagnostics/console-tee.js.map +1 -0
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts +9 -20
- package/lib/langium/diagnostics/hydranium-langium-profiler.d.ts.map +1 -1
- package/lib/langium/diagnostics/hydranium-langium-profiler.js +15 -24
- package/lib/langium/diagnostics/hydranium-langium-profiler.js.map +1 -1
- package/lib/langium/diagnostics/log-preamble.js +1 -1
- package/lib/langium/diagnostics/log-preamble.js.map +1 -1
- package/lib/langium/diagnostics/logger.d.ts +25 -6
- package/lib/langium/diagnostics/logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/logger.js +49 -17
- package/lib/langium/diagnostics/logger.js.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.d.ts +25 -0
- package/lib/langium/diagnostics/lsp-logger.d.ts.map +1 -1
- package/lib/langium/diagnostics/lsp-logger.js +81 -46
- package/lib/langium/diagnostics/lsp-logger.js.map +1 -1
- package/lib/langium/diagnostics/server-tracer.d.ts.map +1 -1
- package/lib/langium/diagnostics/server-tracer.js.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts +21 -1
- package/lib/langium/document-builder/build-pipeline-integration.d.ts.map +1 -1
- package/lib/langium/document-builder/build-pipeline-integration.js +43 -30
- package/lib/langium/document-builder/build-pipeline-integration.js.map +1 -1
- package/lib/langium/document-builder/build-session.d.ts +6 -5
- package/lib/langium/document-builder/build-session.d.ts.map +1 -1
- package/lib/langium/document-builder/build-session.js +5 -5
- package/lib/langium/document-builder/build-session.js.map +1 -1
- package/lib/langium/document-builder/document-builder.d.ts +308 -39
- package/lib/langium/document-builder/document-builder.d.ts.map +1 -1
- package/lib/langium/document-builder/document-builder.js +490 -79
- package/lib/langium/document-builder/document-builder.js.map +1 -1
- package/lib/langium/documentation/comment-provider.d.ts.map +1 -1
- package/lib/langium/documentation/comment-provider.js.map +1 -1
- package/lib/langium/integration-services.d.ts +39 -23
- package/lib/langium/integration-services.d.ts.map +1 -1
- package/lib/langium/integration-services.js +7 -4
- package/lib/langium/integration-services.js.map +1 -1
- package/lib/langium/integrity/integrity-rule.d.ts +17 -8
- package/lib/langium/integrity/integrity-rule.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-rule.js.map +1 -1
- package/lib/langium/integrity/integrity-service.d.ts +95 -27
- package/lib/langium/integrity/integrity-service.d.ts.map +1 -1
- package/lib/langium/integrity/integrity-service.js +303 -63
- package/lib/langium/integrity/integrity-service.js.map +1 -1
- package/lib/langium/keys/containment.d.ts +3 -2
- package/lib/langium/keys/containment.d.ts.map +1 -1
- package/lib/langium/keys/containment.js.map +1 -1
- package/lib/langium/keys/name-based-key-provider.d.ts +17 -10
- package/lib/langium/keys/name-based-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/name-based-key-provider.js +24 -12
- package/lib/langium/keys/name-based-key-provider.js.map +1 -1
- package/lib/langium/keys/positional-key-provider.d.ts.map +1 -1
- package/lib/langium/keys/positional-key-provider.js.map +1 -1
- package/lib/langium/labeling/label-provider.d.ts.map +1 -1
- package/lib/langium/labeling/label-provider.js.map +1 -1
- package/lib/langium/language-module.d.ts +30 -5
- package/lib/langium/language-module.d.ts.map +1 -1
- package/lib/langium/language-module.js +21 -5
- package/lib/langium/language-module.js.map +1 -1
- package/lib/langium/model-service/client-session.d.ts +383 -0
- package/lib/langium/model-service/client-session.d.ts.map +1 -0
- package/lib/langium/model-service/client-session.js +455 -0
- package/lib/langium/model-service/client-session.js.map +1 -0
- package/lib/langium/model-service/index.d.ts +2 -0
- package/lib/langium/model-service/index.d.ts.map +1 -1
- package/lib/langium/model-service/index.js +2 -0
- package/lib/langium/model-service/index.js.map +1 -1
- package/lib/langium/model-service/model-events.d.ts +68 -0
- package/lib/langium/model-service/model-events.d.ts.map +1 -0
- package/lib/langium/model-service/model-events.js +10 -0
- package/lib/langium/model-service/model-events.js.map +1 -0
- package/lib/langium/model-service/model-service.d.ts +440 -323
- package/lib/langium/model-service/model-service.d.ts.map +1 -1
- package/lib/langium/model-service/model-service.js +601 -397
- package/lib/langium/model-service/model-service.js.map +1 -1
- package/lib/langium/module.d.ts +89 -30
- package/lib/langium/module.d.ts.map +1 -1
- package/lib/langium/module.js +39 -27
- package/lib/langium/module.js.map +1 -1
- package/lib/langium/naming/name-provider.d.ts +32 -7
- package/lib/langium/naming/name-provider.d.ts.map +1 -1
- package/lib/langium/naming/name-provider.js +10 -4
- package/lib/langium/naming/name-provider.js.map +1 -1
- package/lib/langium/naming/name-separator-validation.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.d.ts.map +1 -1
- package/lib/langium/project/abstract-project-manager.js +13 -6
- package/lib/langium/project/abstract-project-manager.js.map +1 -1
- package/lib/langium/project/project-change-event.d.ts +2 -2
- package/lib/langium/project/single-project-manager.d.ts.map +1 -1
- package/lib/langium/project/single-project-manager.js.map +1 -1
- package/lib/langium/residency/cst-residency-service.d.ts +15 -11
- package/lib/langium/residency/cst-residency-service.d.ts.map +1 -1
- package/lib/langium/residency/cst-residency-service.js +15 -3
- package/lib/langium/residency/cst-residency-service.js.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.d.ts +46 -10
- package/lib/langium/scope/ast-node-description-provider.d.ts.map +1 -1
- package/lib/langium/scope/ast-node-description-provider.js +88 -15
- package/lib/langium/scope/ast-node-description-provider.js.map +1 -1
- package/lib/langium/scope/built-local-symbols.d.ts +12 -0
- package/lib/langium/scope/built-local-symbols.d.ts.map +1 -0
- package/lib/langium/scope/built-local-symbols.js +11 -0
- package/lib/langium/scope/built-local-symbols.js.map +1 -0
- package/lib/langium/scope/fallback-scope.d.ts +27 -0
- package/lib/langium/scope/fallback-scope.d.ts.map +1 -0
- package/lib/langium/scope/fallback-scope.js +35 -0
- package/lib/langium/scope/fallback-scope.js.map +1 -0
- package/lib/langium/scope/hydranium-scope-computation.d.ts +21 -18
- package/lib/langium/scope/hydranium-scope-computation.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-computation.js +38 -39
- package/lib/langium/scope/hydranium-scope-computation.js.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.d.ts +122 -32
- package/lib/langium/scope/hydranium-scope-provider.d.ts.map +1 -1
- package/lib/langium/scope/hydranium-scope-provider.js +217 -39
- package/lib/langium/scope/hydranium-scope-provider.js.map +1 -1
- package/lib/langium/scope/index.d.ts +1 -0
- package/lib/langium/scope/index.d.ts.map +1 -1
- package/lib/langium/scope/index.js +1 -0
- package/lib/langium/scope/index.js.map +1 -1
- package/lib/langium/scope/reference-builder.d.ts.map +1 -1
- package/lib/langium/scope/reference-builder.js.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.d.ts +6 -5
- package/lib/langium/scope/reference-candidate-provider.d.ts.map +1 -1
- package/lib/langium/scope/reference-candidate-provider.js +3 -2
- package/lib/langium/scope/reference-candidate-provider.js.map +1 -1
- package/lib/langium/scope/scope-extension-service.d.ts +69 -37
- package/lib/langium/scope/scope-extension-service.d.ts.map +1 -1
- package/lib/langium/scope/scope-extension-service.js +102 -29
- package/lib/langium/scope/scope-extension-service.js.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.d.ts +1 -3
- package/lib/langium/scope/scoped-ast-node-description.d.ts.map +1 -1
- package/lib/langium/scope/scoped-ast-node-description.js +1 -3
- package/lib/langium/scope/scoped-ast-node-description.js.map +1 -1
- package/lib/langium/serialization/abstract-serializer.d.ts +38 -27
- package/lib/langium/serialization/abstract-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/abstract-serializer.js +54 -30
- package/lib/langium/serialization/abstract-serializer.js.map +1 -1
- package/lib/langium/serialization/json-serializer.d.ts +8 -1
- package/lib/langium/serialization/json-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/json-serializer.js +13 -3
- package/lib/langium/serialization/json-serializer.js.map +1 -1
- package/lib/langium/serialization/serializer.d.ts +1 -1
- package/lib/langium/serialization/yaml-serializer.d.ts +12 -0
- package/lib/langium/serialization/yaml-serializer.d.ts.map +1 -1
- package/lib/langium/serialization/yaml-serializer.js +24 -4
- package/lib/langium/serialization/yaml-serializer.js.map +1 -1
- package/lib/langium/service-registry.d.ts +29 -1
- package/lib/langium/service-registry.d.ts.map +1 -1
- package/lib/langium/service-registry.js +37 -0
- package/lib/langium/service-registry.js.map +1 -1
- package/lib/langium/shared-services.d.ts +10 -4
- package/lib/langium/shared-services.d.ts.map +1 -1
- package/lib/langium/shared-services.js.map +1 -1
- package/lib/langium/single-langium-copy.d.ts +22 -0
- package/lib/langium/single-langium-copy.d.ts.map +1 -0
- package/lib/langium/single-langium-copy.js +36 -0
- package/lib/langium/single-langium-copy.js.map +1 -0
- package/lib/langium/transfer/transfer-encoder.d.ts +60 -39
- package/lib/langium/transfer/transfer-encoder.d.ts.map +1 -1
- package/lib/langium/transfer/transfer-encoder.js +35 -24
- package/lib/langium/transfer/transfer-encoder.js.map +1 -1
- package/lib/langium/trivia/comment-preserver.d.ts +543 -0
- package/lib/langium/trivia/comment-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/comment-preserver.js +1164 -0
- package/lib/langium/trivia/comment-preserver.js.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts +51 -0
- package/lib/langium/trivia/document-ending-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/document-ending-preserver.js +62 -0
- package/lib/langium/trivia/document-ending-preserver.js.map +1 -0
- package/lib/langium/trivia/index.d.ts +14 -0
- package/lib/langium/trivia/index.d.ts.map +1 -0
- package/lib/langium/trivia/index.js +14 -0
- package/lib/langium/trivia/index.js.map +1 -0
- package/lib/langium/trivia/trivia-contribution.d.ts +37 -0
- package/lib/langium/trivia/trivia-contribution.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-contribution.js +10 -0
- package/lib/langium/trivia/trivia-contribution.js.map +1 -0
- package/lib/langium/trivia/trivia-preserver.d.ts +52 -0
- package/lib/langium/trivia/trivia-preserver.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-preserver.js +10 -0
- package/lib/langium/trivia/trivia-preserver.js.map +1 -0
- package/lib/langium/trivia/trivia-service.d.ts +70 -0
- package/lib/langium/trivia/trivia-service.d.ts.map +1 -0
- package/lib/langium/trivia/trivia-service.js +56 -0
- package/lib/langium/trivia/trivia-service.js.map +1 -0
- package/lib/langium/update-rewrite/normalize-empty-strings.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.d.ts.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite-service.js.map +1 -1
- package/lib/langium/update-rewrite/update-rewrite.d.ts +1 -1
- package/lib/langium/validation/document-validator.d.ts +168 -23
- package/lib/langium/validation/document-validator.d.ts.map +1 -1
- package/lib/langium/validation/document-validator.js +264 -26
- package/lib/langium/validation/document-validator.js.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts +9 -1
- package/lib/langium/validation/validation-contribution-collector.d.ts.map +1 -1
- package/lib/langium/validation/validation-contribution-collector.js +1 -1
- package/lib/langium/validation/validation-contribution-collector.js.map +1 -1
- package/lib/langium/workspace/ast-node-locator.d.ts +24 -0
- package/lib/langium/workspace/ast-node-locator.d.ts.map +1 -0
- package/lib/langium/workspace/ast-node-locator.js +32 -0
- package/lib/langium/workspace/ast-node-locator.js.map +1 -0
- package/lib/langium/workspace/document-uri-policy.d.ts +24 -15
- package/lib/langium/workspace/document-uri-policy.d.ts.map +1 -1
- package/lib/langium/workspace/document-uri-policy.js +22 -13
- package/lib/langium/workspace/document-uri-policy.js.map +1 -1
- package/lib/langium/workspace/file-not-found.d.ts +23 -0
- package/lib/langium/workspace/file-not-found.d.ts.map +1 -0
- package/lib/langium/workspace/file-not-found.js +31 -0
- package/lib/langium/workspace/file-not-found.js.map +1 -0
- package/lib/langium/workspace/file-system-provider.d.ts +167 -8
- package/lib/langium/workspace/file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/file-system-provider.js +115 -13
- package/lib/langium/workspace/file-system-provider.js.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts +31 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-langium-document-factory.js +54 -0
- package/lib/langium/workspace/hydranium-langium-document-factory.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts +43 -1
- package/lib/langium/workspace/hydranium-workspace-lock.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js +58 -1
- package/lib/langium/workspace/hydranium-workspace-lock.js.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts +103 -21
- package/lib/langium/workspace/hydranium-workspace-manager.d.ts.map +1 -1
- package/lib/langium/workspace/hydranium-workspace-manager.js +184 -31
- package/lib/langium/workspace/hydranium-workspace-manager.js.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts +26 -9
- package/lib/langium/workspace/in-memory-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/in-memory-file-system-provider.js +45 -22
- package/lib/langium/workspace/in-memory-file-system-provider.js.map +1 -1
- package/lib/langium/workspace/index-manager.d.ts.map +1 -1
- package/lib/langium/workspace/index-manager.js.map +1 -1
- package/lib/langium/workspace/index.d.ts +2 -0
- package/lib/langium/workspace/index.d.ts.map +1 -1
- package/lib/langium/workspace/index.js +2 -0
- package/lib/langium/workspace/index.js.map +1 -1
- package/lib/langium/workspace/initialize-workspace.d.ts +40 -3
- package/lib/langium/workspace/initialize-workspace.d.ts.map +1 -1
- package/lib/langium/workspace/initialize-workspace.js +68 -3
- package/lib/langium/workspace/initialize-workspace.js.map +1 -1
- package/lib/langium/workspace/langium-documents.d.ts +7 -0
- package/lib/langium/workspace/langium-documents.d.ts.map +1 -1
- package/lib/langium/workspace/langium-documents.js +18 -1
- package/lib/langium/workspace/langium-documents.js.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.d.ts +16 -10
- package/lib/langium/workspace/persistent-file-system-provider.d.ts.map +1 -1
- package/lib/langium/workspace/persistent-file-system-provider.js +25 -13
- package/lib/langium/workspace/persistent-file-system-provider.js.map +1 -1
- package/lib/{documents → langium/workspace}/self-save-registry.d.ts +7 -9
- package/lib/langium/workspace/self-save-registry.d.ts.map +1 -0
- package/lib/{documents → langium/workspace}/self-save-registry.js +9 -11
- package/lib/langium/workspace/self-save-registry.js.map +1 -0
- package/lib/langium/workspace/virtual-document.d.ts +55 -21
- package/lib/langium/workspace/virtual-document.d.ts.map +1 -1
- package/lib/langium/workspace/virtual-document.js +87 -24
- package/lib/langium/workspace/virtual-document.js.map +1 -1
- package/lib/langium/workspace/write-lock-scope.d.ts +22 -10
- package/lib/langium/workspace/write-lock-scope.d.ts.map +1 -1
- package/lib/langium/workspace/write-lock-scope.js +15 -5
- package/lib/langium/workspace/write-lock-scope.js.map +1 -1
- package/lib/launcher/integrated-server.d.ts +3 -1
- package/lib/launcher/integrated-server.d.ts.map +1 -1
- package/lib/locale/server-locale.d.ts +6 -6
- package/lib/locale/server-locale.d.ts.map +1 -1
- package/lib/locale/server-locale.js.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.d.ts +44 -2
- package/lib/lsp/completion/hydranium-completion-provider.d.ts.map +1 -1
- package/lib/lsp/completion/hydranium-completion-provider.js +68 -0
- package/lib/lsp/completion/hydranium-completion-provider.js.map +1 -1
- package/lib/lsp/connection-features.d.ts +23 -0
- package/lib/lsp/connection-features.d.ts.map +1 -0
- package/lib/lsp/connection-features.js +60 -0
- package/lib/lsp/connection-features.js.map +1 -0
- package/lib/lsp/diagnostics-connection.d.ts +27 -0
- package/lib/lsp/diagnostics-connection.d.ts.map +1 -0
- package/lib/lsp/diagnostics-connection.js +53 -0
- package/lib/lsp/diagnostics-connection.js.map +1 -0
- package/lib/lsp/edit-requests-guard.d.ts +31 -0
- package/lib/lsp/edit-requests-guard.d.ts.map +1 -0
- package/lib/lsp/edit-requests-guard.js +125 -0
- package/lib/lsp/edit-requests-guard.js.map +1 -0
- package/lib/lsp/hydranium-document-update-handler.d.ts +126 -82
- package/lib/lsp/hydranium-document-update-handler.d.ts.map +1 -1
- package/lib/lsp/hydranium-document-update-handler.js +234 -101
- package/lib/lsp/hydranium-document-update-handler.js.map +1 -1
- package/lib/lsp/index.d.ts +6 -2
- package/lib/lsp/index.d.ts.map +1 -1
- package/lib/lsp/index.js +6 -2
- package/lib/lsp/index.js.map +1 -1
- package/lib/lsp/lsp-latency.d.ts +39 -0
- package/lib/lsp/lsp-latency.d.ts.map +1 -0
- package/lib/lsp/lsp-latency.js +58 -0
- package/lib/lsp/lsp-latency.js.map +1 -0
- package/lib/lsp/save-text-document.d.ts +31 -0
- package/lib/lsp/save-text-document.d.ts.map +1 -0
- package/lib/lsp/save-text-document.js +52 -0
- package/lib/lsp/save-text-document.js.map +1 -0
- package/lib/lsp/semantic-token-provider.d.ts +58 -2
- package/lib/lsp/semantic-token-provider.d.ts.map +1 -1
- package/lib/lsp/semantic-token-provider.js +98 -9
- package/lib/lsp/semantic-token-provider.js.map +1 -1
- package/lib/lsp/shared-module.d.ts +4 -8
- package/lib/lsp/shared-module.d.ts.map +1 -1
- package/lib/lsp/shared-module.js.map +1 -1
- package/lib/lsp/start-language-server.d.ts +12 -7
- package/lib/lsp/start-language-server.d.ts.map +1 -1
- package/lib/lsp/start-language-server.js +21 -7
- package/lib/lsp/start-language-server.js.map +1 -1
- package/lib/messages/carriers.d.ts +4 -6
- package/lib/messages/carriers.d.ts.map +1 -1
- package/lib/messages/carriers.js +4 -6
- package/lib/messages/carriers.js.map +1 -1
- package/lib/messages/index.d.ts +2 -2
- package/lib/messages/index.d.ts.map +1 -1
- package/lib/messages/index.js +2 -2
- package/lib/messages/index.js.map +1 -1
- package/lib/messages/renderer.d.ts +10 -4
- package/lib/messages/renderer.d.ts.map +1 -1
- package/lib/messages/renderer.js +6 -0
- package/lib/messages/renderer.js.map +1 -1
- package/lib/node/event-loop-monitor.d.ts.map +1 -1
- package/lib/node/event-loop-monitor.js +2 -1
- package/lib/node/event-loop-monitor.js.map +1 -1
- package/lib/node/heap-ceiling.d.ts +61 -0
- package/lib/node/heap-ceiling.d.ts.map +1 -0
- package/lib/node/heap-ceiling.js +72 -0
- package/lib/node/heap-ceiling.js.map +1 -0
- package/lib/node/index.d.ts +1 -1
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +5 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/latency-from-env.d.ts +1 -1
- package/lib/node/latency-from-env.js +1 -1
- package/lib/node/lint-grammar.js.map +1 -1
- package/lib/node/log-file-sink.d.ts +3 -2
- package/lib/node/log-file-sink.d.ts.map +1 -1
- package/lib/node/log-file-sink.js +6 -2
- package/lib/node/log-file-sink.js.map +1 -1
- package/lib/node/log-preamble-node.d.ts +5 -3
- package/lib/node/log-preamble-node.d.ts.map +1 -1
- package/lib/node/log-preamble-node.js +13 -10
- package/lib/node/log-preamble-node.js.map +1 -1
- package/lib/node/measure-memory.d.ts.map +1 -1
- package/lib/node/measure-memory.js +5 -4
- package/lib/node/measure-memory.js.map +1 -1
- package/lib/node/memory-monitor.d.ts +2 -2
- package/lib/node/memory-monitor.d.ts.map +1 -1
- package/lib/node/memory-monitor.js +9 -10
- package/lib/node/memory-monitor.js.map +1 -1
- package/lib/node/node-file-system-provider.d.ts +67 -9
- package/lib/node/node-file-system-provider.d.ts.map +1 -1
- package/lib/node/node-file-system-provider.js +198 -53
- package/lib/node/node-file-system-provider.js.map +1 -1
- package/lib/node/profile-capture.d.ts +12 -4
- package/lib/node/profile-capture.d.ts.map +1 -1
- package/lib/node/profile-capture.js +8 -6
- package/lib/node/profile-capture.js.map +1 -1
- package/lib/node/profile-digest.js.map +1 -1
- package/lib/node/profiling-run.d.ts +13 -3
- package/lib/node/profiling-run.d.ts.map +1 -1
- package/lib/node/profiling-run.js +17 -8
- package/lib/node/profiling-run.js.map +1 -1
- package/lib/node/rename-over-open-readers.d.ts +61 -0
- package/lib/node/rename-over-open-readers.d.ts.map +1 -0
- package/lib/node/rename-over-open-readers.js +80 -0
- package/lib/node/rename-over-open-readers.js.map +1 -0
- package/lib/node/server-diagnostics.js +1 -1
- package/lib/node/server-diagnostics.js.map +1 -1
- package/lib/node/server-state-snapshot.js +4 -4
- package/lib/node/server-state-snapshot.js.map +1 -1
- package/lib/node/socket-launcher.d.ts +43 -7
- package/lib/node/socket-launcher.d.ts.map +1 -1
- package/lib/node/socket-launcher.js +42 -7
- package/lib/node/socket-launcher.js.map +1 -1
- package/lib/node/startup-cpu-profile.d.ts +29 -0
- package/lib/node/startup-cpu-profile.d.ts.map +1 -0
- package/lib/node/startup-cpu-profile.js +91 -0
- package/lib/node/startup-cpu-profile.js.map +1 -0
- package/lib/node/stdio-launcher.d.ts +13 -13
- package/lib/node/stdio-launcher.d.ts.map +1 -1
- package/lib/node/stdio-launcher.js +21 -11
- package/lib/node/stdio-launcher.js.map +1 -1
- package/lib/node/validate-workspace.d.ts +1 -1
- package/lib/node/validate-workspace.d.ts.map +1 -1
- package/lib/node/validate-workspace.js +5 -1
- package/lib/node/validate-workspace.js.map +1 -1
- package/lib/testing/document-uri-policy-conformance.js +1 -1
- package/lib/testing/document-uri-policy-conformance.js.map +1 -1
- package/lib/testing/fake-description.js.map +1 -1
- package/lib/testing/fake-document.d.ts +2 -1
- package/lib/testing/fake-document.d.ts.map +1 -1
- package/lib/testing/fake-document.js.map +1 -1
- package/lib/testing/index.d.ts +1 -1
- package/lib/testing/index.d.ts.map +1 -1
- package/lib/testing/index.js +2 -1
- package/lib/testing/index.js.map +1 -1
- package/lib/testing/langium-test-helpers.d.ts.map +1 -1
- package/lib/testing/langium-test-helpers.js +1 -0
- package/lib/testing/langium-test-helpers.js.map +1 -1
- package/lib/testing/make-noop-language-services.js.map +1 -1
- package/lib/testing/make-noop-shared-services.js.map +1 -1
- package/lib/testing/make-test-services.d.ts +45 -14
- package/lib/testing/make-test-services.d.ts.map +1 -1
- package/lib/testing/make-test-services.js +23 -7
- package/lib/testing/make-test-services.js.map +1 -1
- package/lib/testing/make-test-tracer.d.ts +12 -0
- package/lib/testing/make-test-tracer.d.ts.map +1 -1
- package/lib/testing/make-test-tracer.js +13 -0
- package/lib/testing/make-test-tracer.js.map +1 -1
- package/lib/testing/node/applied-edit-capture.d.ts +29 -0
- package/lib/testing/node/applied-edit-capture.d.ts.map +1 -0
- package/lib/testing/node/applied-edit-capture.js +117 -0
- package/lib/testing/node/applied-edit-capture.js.map +1 -0
- package/lib/testing/node/golden-corpus.js.map +1 -1
- package/lib/testing/node/index.d.ts +1 -0
- package/lib/testing/node/index.d.ts.map +1 -1
- package/lib/testing/node/index.js +1 -0
- package/lib/testing/node/index.js.map +1 -1
- package/lib/testing/node/lsp-harness.d.ts.map +1 -1
- package/lib/testing/node/lsp-harness.js +2 -0
- package/lib/testing/node/lsp-harness.js.map +1 -1
- package/lib/testing/node/lsp-server-connection.d.ts +21 -6
- package/lib/testing/node/lsp-server-connection.d.ts.map +1 -1
- package/lib/testing/node/lsp-server-connection.js +49 -106
- package/lib/testing/node/lsp-server-connection.js.map +1 -1
- package/lib/testing/node/scratch-workspace.d.ts.map +1 -1
- package/lib/testing/node/scratch-workspace.js +10 -5
- package/lib/testing/node/scratch-workspace.js.map +1 -1
- package/lib/testing/node/spawned-server.d.ts +30 -1
- package/lib/testing/node/spawned-server.d.ts.map +1 -1
- package/lib/testing/node/spawned-server.js +39 -2
- package/lib/testing/node/spawned-server.js.map +1 -1
- package/lib/testing/node/unhandled-rejections.d.ts +20 -0
- package/lib/testing/node/unhandled-rejections.d.ts.map +1 -0
- package/lib/testing/node/unhandled-rejections.js +32 -0
- package/lib/testing/node/unhandled-rejections.js.map +1 -0
- package/lib/testing/playwright/browser-capture-bridge.js.map +1 -1
- package/lib/testing/playwright/e2e-profiling.js.map +1 -1
- package/lib/testing/playwright/flaky-network-proxy.d.ts +76 -0
- package/lib/testing/playwright/flaky-network-proxy.d.ts.map +1 -0
- package/lib/testing/playwright/flaky-network-proxy.js +164 -0
- package/lib/testing/playwright/flaky-network-proxy.js.map +1 -0
- package/lib/testing/playwright/index.d.ts +1 -0
- package/lib/testing/playwright/index.d.ts.map +1 -1
- package/lib/testing/playwright/index.js +1 -0
- package/lib/testing/playwright/index.js.map +1 -1
- package/lib/testing/playwright/server-log-capture.d.ts +46 -16
- package/lib/testing/playwright/server-log-capture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-capture.js +111 -40
- package/lib/testing/playwright/server-log-capture.js.map +1 -1
- package/lib/testing/playwright/server-log-fixture.d.ts +16 -0
- package/lib/testing/playwright/server-log-fixture.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-fixture.js +25 -6
- package/lib/testing/playwright/server-log-fixture.js.map +1 -1
- package/lib/testing/playwright/server-log-region.d.ts +15 -0
- package/lib/testing/playwright/server-log-region.d.ts.map +1 -0
- package/lib/testing/playwright/server-log-region.js +30 -0
- package/lib/testing/playwright/server-log-region.js.map +1 -0
- package/lib/testing/playwright/server-log-rename-reporter.d.ts.map +1 -1
- package/lib/testing/playwright/server-log-rename-reporter.js +4 -3
- package/lib/testing/playwright/server-log-rename-reporter.js.map +1 -1
- package/lib/testing/run-update-pipeline.d.ts +8 -5
- package/lib/testing/run-update-pipeline.d.ts.map +1 -1
- package/lib/testing/run-update-pipeline.js.map +1 -1
- package/lib/testing/stub-ast-document-manager.d.ts +11 -51
- package/lib/testing/stub-ast-document-manager.d.ts.map +1 -1
- package/lib/testing/stub-ast-document-manager.js +31 -59
- package/lib/testing/stub-ast-document-manager.js.map +1 -1
- package/lib/testing/stub-document-builder.d.ts +33 -11
- package/lib/testing/stub-document-builder.d.ts.map +1 -1
- package/lib/testing/stub-document-builder.js +103 -5
- package/lib/testing/stub-document-builder.js.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.d.ts +33 -10
- package/lib/testing/stub-hydranium-text-documents.d.ts.map +1 -1
- package/lib/testing/stub-hydranium-text-documents.js +132 -16
- package/lib/testing/stub-hydranium-text-documents.js.map +1 -1
- package/lib/testing/stub-index-manager.js.map +1 -1
- package/lib/testing/stub-langium-documents.d.ts +3 -2
- package/lib/testing/stub-langium-documents.d.ts.map +1 -1
- package/lib/testing/stub-langium-documents.js.map +1 -1
- package/lib/testing/stub-model-service.d.ts +8 -7
- package/lib/testing/stub-model-service.d.ts.map +1 -1
- package/lib/testing/stub-model-service.js +4 -4
- package/lib/testing/stub-model-service.js.map +1 -1
- package/lib/testing/stub-project-manager.js.map +1 -1
- package/lib/testing/stub-self-save-registry.d.ts +1 -1
- package/lib/testing/stub-self-save-registry.d.ts.map +1 -1
- package/lib/testing/stub-service-registry.d.ts +1 -1
- package/lib/testing/stub-service-registry.js.map +1 -1
- package/lib/testing/stub-writable-file-system.d.ts +1 -1
- package/lib/testing/stub-writable-file-system.d.ts.map +1 -1
- package/lib/testing/stub-writable-file-system.js +2 -1
- package/lib/testing/stub-writable-file-system.js.map +1 -1
- package/lib/util/connection-liveness.d.ts +22 -6
- package/lib/util/connection-liveness.d.ts.map +1 -1
- package/lib/util/connection-liveness.js +75 -15
- package/lib/util/connection-liveness.js.map +1 -1
- package/lib/util/environment.d.ts +7 -0
- package/lib/util/environment.d.ts.map +1 -1
- package/lib/util/environment.js +15 -1
- package/lib/util/environment.js.map +1 -1
- package/lib/util/registry.d.ts.map +1 -1
- package/package.json +41 -60
- package/src/browser/host-heads-in-worker.ts +218 -0
- package/src/browser/index.ts +17 -0
- package/src/browser/indexeddb-file-system-store.ts +192 -0
- package/src/browser/start-language-server-in-worker.ts +56 -0
- package/src/documents/ast-document-manager.ts +477 -249
- package/src/documents/client-ids.ts +5 -22
- package/src/documents/client-session-errors.ts +24 -0
- package/src/documents/client-session-registry.ts +262 -0
- package/src/documents/dirty-state-tracker.ts +167 -0
- package/src/documents/document-release-handler.ts +404 -0
- package/src/documents/document-release-scheduler.ts +121 -0
- package/src/documents/file-system-task-queue.ts +74 -0
- package/src/documents/hydranium-text-documents.ts +1029 -595
- package/src/documents/index.ts +10 -2
- package/src/documents/language-client-shadow.ts +501 -0
- package/src/documents/model-ledger.ts +66 -0
- package/src/documents/text-ledger.ts +112 -0
- package/src/documents/version-sync-service.ts +275 -0
- package/src/index.ts +3 -0
- package/src/langium/ast-extension/ast-extension-service.ts +77 -41
- package/src/langium/ast-extension/ast-node-builder.ts +35 -13
- package/src/langium/bootstrap.ts +79 -43
- package/src/langium/build-phase-pass/build-phase-pass-service.ts +29 -19
- package/src/langium/build-phase-pass/build-phase-pass.ts +37 -8
- package/src/langium/composite-ast-reflection.ts +112 -0
- package/src/langium/config/configuration-provider.ts +119 -0
- package/src/langium/config/index.ts +1 -0
- package/src/langium/diagnostics/console-tee.ts +150 -0
- package/src/langium/diagnostics/hydranium-langium-profiler.ts +15 -39
- package/src/langium/diagnostics/log-preamble.ts +1 -1
- package/src/langium/diagnostics/logger.ts +51 -17
- package/src/langium/diagnostics/lsp-logger.ts +83 -45
- package/src/langium/document-builder/build-pipeline-integration.ts +57 -32
- package/src/langium/document-builder/build-session.ts +4 -3
- package/src/langium/document-builder/document-builder.ts +613 -77
- package/src/langium/integration-services.ts +58 -27
- package/src/langium/integrity/integrity-rule.ts +17 -8
- package/src/langium/integrity/integrity-service.ts +332 -69
- package/src/langium/keys/containment.ts +3 -2
- package/src/langium/keys/name-based-key-provider.ts +24 -12
- package/src/langium/language-module.ts +52 -9
- package/src/langium/model-service/client-session.ts +726 -0
- package/src/langium/model-service/index.ts +2 -0
- package/src/langium/model-service/model-events.ts +82 -0
- package/src/langium/model-service/model-service.ts +887 -522
- package/src/langium/module.ts +132 -56
- package/src/langium/naming/name-provider.ts +34 -8
- package/src/langium/project/abstract-project-manager.ts +13 -5
- package/src/langium/project/project-change-event.ts +2 -2
- package/src/langium/residency/cst-residency-service.ts +30 -14
- package/src/langium/scope/ast-node-description-provider.ts +111 -16
- package/src/langium/scope/built-local-symbols.ts +13 -0
- package/src/langium/scope/fallback-scope.ts +38 -0
- package/src/langium/scope/hydranium-scope-computation.ts +45 -44
- package/src/langium/scope/hydranium-scope-provider.ts +245 -41
- package/src/langium/scope/index.ts +1 -0
- package/src/langium/scope/reference-candidate-provider.ts +6 -5
- package/src/langium/scope/scope-extension-service.ts +148 -56
- package/src/langium/scope/scoped-ast-node-description.ts +1 -3
- package/src/langium/serialization/abstract-serializer.ts +57 -41
- package/src/langium/serialization/json-serializer.ts +14 -3
- package/src/langium/serialization/serializer.ts +1 -1
- package/src/langium/serialization/yaml-serializer.ts +26 -4
- package/src/langium/service-registry.ts +41 -2
- package/src/langium/shared-services.ts +13 -4
- package/src/langium/single-langium-copy.ts +42 -0
- package/src/langium/transfer/transfer-encoder.ts +76 -50
- package/src/langium/trivia/comment-preserver.ts +1409 -0
- package/src/langium/trivia/document-ending-preserver.ts +71 -0
- package/src/langium/trivia/index.ts +14 -0
- package/src/langium/trivia/trivia-contribution.ts +39 -0
- package/src/langium/trivia/trivia-preserver.ts +56 -0
- package/src/langium/trivia/trivia-service.ts +99 -0
- package/src/langium/update-rewrite/update-rewrite-service.ts +1 -1
- package/src/langium/update-rewrite/update-rewrite.ts +1 -1
- package/src/langium/validation/document-validator.ts +312 -31
- package/src/langium/validation/validation-contribution-collector.ts +10 -1
- package/src/langium/workspace/ast-node-locator.ts +33 -0
- package/src/langium/workspace/document-uri-policy.ts +32 -18
- package/src/langium/workspace/file-not-found.ts +35 -0
- package/src/langium/workspace/file-system-provider.ts +258 -16
- package/src/langium/workspace/hydranium-langium-document-factory.ts +83 -0
- package/src/langium/workspace/hydranium-workspace-lock.ts +86 -2
- package/src/langium/workspace/hydranium-workspace-manager.ts +212 -35
- package/src/langium/workspace/in-memory-file-system-provider.ts +54 -23
- package/src/langium/workspace/index.ts +2 -0
- package/src/langium/workspace/initialize-workspace.ts +96 -4
- package/src/langium/workspace/langium-documents.ts +19 -1
- package/src/langium/workspace/persistent-file-system-provider.ts +27 -15
- package/src/{documents → langium/workspace}/self-save-registry.ts +12 -14
- package/src/langium/workspace/virtual-document.ts +106 -25
- package/src/langium/workspace/write-lock-scope.ts +27 -12
- package/src/launcher/integrated-server.ts +3 -1
- package/src/locale/server-locale.ts +6 -6
- package/src/lsp/completion/hydranium-completion-provider.ts +82 -2
- package/src/lsp/connection-features.ts +67 -0
- package/src/lsp/diagnostics-connection.ts +56 -0
- package/src/lsp/edit-requests-guard.ts +152 -0
- package/src/lsp/hydranium-document-update-handler.ts +284 -110
- package/src/lsp/index.ts +6 -2
- package/src/lsp/lsp-latency.ts +62 -0
- package/src/lsp/save-text-document.ts +63 -0
- package/src/lsp/semantic-token-provider.ts +146 -8
- package/src/lsp/shared-module.ts +4 -8
- package/src/lsp/start-language-server.ts +21 -7
- package/src/messages/carriers.ts +4 -6
- package/src/messages/index.ts +11 -2
- package/src/messages/renderer.ts +11 -3
- package/src/node/event-loop-monitor.ts +2 -1
- package/src/node/heap-ceiling.ts +108 -0
- package/src/node/index.ts +5 -1
- package/src/node/latency-from-env.ts +1 -1
- package/src/node/log-file-sink.ts +6 -2
- package/src/node/log-preamble-node.ts +20 -10
- package/src/node/measure-memory.ts +5 -4
- package/src/node/memory-monitor.ts +10 -10
- package/src/node/node-file-system-provider.ts +214 -57
- package/src/node/profile-capture.ts +16 -15
- package/src/node/profiling-run.ts +30 -8
- package/src/node/rename-over-open-readers.ts +94 -0
- package/src/node/server-diagnostics.ts +1 -1
- package/src/node/server-state-snapshot.ts +5 -5
- package/src/node/socket-launcher.ts +78 -14
- package/src/node/startup-cpu-profile.ts +94 -0
- package/src/node/stdio-launcher.ts +29 -19
- package/src/node/validate-workspace.ts +8 -2
- package/src/testing/document-uri-policy-conformance.ts +1 -1
- package/src/testing/fake-document.ts +2 -1
- package/src/testing/index.ts +2 -1
- package/src/testing/langium-test-helpers.ts +1 -0
- package/src/testing/make-test-services.ts +83 -31
- package/src/testing/make-test-tracer.ts +26 -0
- package/src/testing/node/applied-edit-capture.ts +141 -0
- package/src/testing/node/index.ts +1 -0
- package/src/testing/node/lsp-harness.ts +2 -0
- package/src/testing/node/lsp-server-connection.ts +83 -119
- package/src/testing/node/scratch-workspace.ts +10 -5
- package/src/testing/node/spawned-server.ts +57 -3
- package/src/testing/node/unhandled-rejections.ts +31 -0
- package/src/testing/parse-semantic-root.ts +1 -1
- package/src/testing/playwright/flaky-network-proxy.ts +240 -0
- package/src/testing/playwright/index.ts +1 -0
- package/src/testing/playwright/server-log-capture.ts +137 -47
- package/src/testing/playwright/server-log-fixture.ts +46 -6
- package/src/testing/playwright/server-log-region.ts +32 -0
- package/src/testing/playwright/server-log-rename-reporter.ts +4 -3
- package/src/testing/run-update-pipeline.ts +8 -5
- package/src/testing/stub-ast-document-manager.ts +47 -123
- package/src/testing/stub-document-builder.ts +138 -18
- package/src/testing/stub-hydranium-text-documents.ts +184 -27
- package/src/testing/stub-langium-documents.ts +3 -2
- package/src/testing/stub-model-service.ts +9 -8
- package/src/testing/stub-self-save-registry.ts +1 -1
- package/src/testing/stub-service-registry.ts +1 -1
- package/src/testing/stub-writable-file-system.ts +3 -2
- package/src/util/connection-liveness.ts +81 -15
- package/src/util/environment.ts +24 -2
- package/lib/documents/language-client-text-shadow.d.ts +0 -101
- package/lib/documents/language-client-text-shadow.d.ts.map +0 -1
- package/lib/documents/language-client-text-shadow.js +0 -156
- package/lib/documents/language-client-text-shadow.js.map +0 -1
- package/lib/documents/self-save-registry.d.ts.map +0 -1
- package/lib/documents/self-save-registry.js.map +0 -1
- package/lib/lsp/instrument-connection.d.ts +0 -36
- package/lib/lsp/instrument-connection.d.ts.map +0 -1
- package/lib/lsp/instrument-connection.js +0 -62
- package/lib/lsp/instrument-connection.js.map +0 -1
- package/lib/node/process-memory.d.ts +0 -66
- package/lib/node/process-memory.d.ts.map +0 -1
- package/lib/node/process-memory.js +0 -252
- package/lib/node/process-memory.js.map +0 -1
- package/src/documents/language-client-text-shadow.ts +0 -175
- package/src/lsp/instrument-connection.ts +0 -66
- package/src/node/process-memory.ts +0 -299
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { type ConfigurationInitializedParams, DefaultConfigurationProvider } from '@hydranium/langium';
|
|
11
|
+
import type { ConfigurationItem, DidChangeConfigurationRegistrationOptions } from 'vscode-languageserver';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Configuration provider that asks the client about a section the first time
|
|
15
|
+
* something reads it.
|
|
16
|
+
*
|
|
17
|
+
* Langium's base requests one section per registered language, named after the
|
|
18
|
+
* language id, and never asks again. A read of any other section — including
|
|
19
|
+
* whatever `lsp.configurationRoot` is bound to — then resolves `undefined` with
|
|
20
|
+
* no request on the wire, which is indistinguishable from a setting the user has
|
|
21
|
+
* not set.
|
|
22
|
+
*
|
|
23
|
+
* Asking on first read rather than from a list collected up front: a reader
|
|
24
|
+
* names its section during DI, after `initialized` has taken its one-shot pass,
|
|
25
|
+
* so a list would have to be complete before the server initialized.
|
|
26
|
+
*/
|
|
27
|
+
export class HydraniumConfigurationProvider extends DefaultConfigurationProvider {
|
|
28
|
+
/**
|
|
29
|
+
* The client-facing hooks, captured because they arrive once as arguments to
|
|
30
|
+
* {@link initialized} and are needed on every later read. Absent in a
|
|
31
|
+
* headless composition, which has no connection to ask.
|
|
32
|
+
*/
|
|
33
|
+
protected registerForSection?: (params: DidChangeConfigurationRegistrationOptions) => void;
|
|
34
|
+
protected fetchSections?: (items: ConfigurationItem[]) => Promise<unknown>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Sections already dealt with, holding the in-flight work so concurrent
|
|
38
|
+
* readers share one round trip. Entries stay after they settle: they record
|
|
39
|
+
* that the section was HANDLED, and without that an unset section is
|
|
40
|
+
* re-requested on every read, "unset" and "not fetched" being the same
|
|
41
|
+
* absence in the store.
|
|
42
|
+
*
|
|
43
|
+
* A section the client's capabilities ruled out counts as handled, having
|
|
44
|
+
* been settled by asking nothing.
|
|
45
|
+
*/
|
|
46
|
+
protected readonly requestedSections = new Map<string, Promise<void>>();
|
|
47
|
+
|
|
48
|
+
override async initialized(params: ConfigurationInitializedParams): Promise<void> {
|
|
49
|
+
this.registerForSection = params.register;
|
|
50
|
+
this.fetchSections = params.fetchConfiguration;
|
|
51
|
+
await super.initialized(params);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The `ready` await precedes the emptiness check: the base resolves it at the
|
|
56
|
+
* end of its own initial fetch, so testing the store first calls every
|
|
57
|
+
* language section missing and re-requests what is already on its way.
|
|
58
|
+
*/
|
|
59
|
+
override async getConfiguration(language: string, configuration: string): Promise<unknown> {
|
|
60
|
+
await this.ready;
|
|
61
|
+
const section = this.toSectionName(language);
|
|
62
|
+
if (this.settings[section] === undefined) {
|
|
63
|
+
await this.requestSection(section);
|
|
64
|
+
}
|
|
65
|
+
return super.getConfiguration(language, configuration);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Ask about `section` once, sharing the request with any concurrent reader. */
|
|
69
|
+
protected requestSection(section: string): Promise<void> {
|
|
70
|
+
const existing = this.requestedSections.get(section);
|
|
71
|
+
if (existing) {
|
|
72
|
+
return existing;
|
|
73
|
+
}
|
|
74
|
+
const request = this.doRequestSection(section);
|
|
75
|
+
this.requestedSections.set(section, request);
|
|
76
|
+
return request;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The hooks are gated on the client having declared `workspace.configuration`.
|
|
81
|
+
* A connection binds them whatever the client said, so their presence is not
|
|
82
|
+
* consent: calling them sends a `client/registerCapability` and a
|
|
83
|
+
* `workspace/configuration` to a client that advertised support for neither,
|
|
84
|
+
* which is entitled to answer either with a method-not-found and may drop the
|
|
85
|
+
* connection.
|
|
86
|
+
*
|
|
87
|
+
* That flag is exact for the fetch and KNOWINGLY coarse for the registration,
|
|
88
|
+
* which the spec governs by
|
|
89
|
+
* `workspace.didChangeConfiguration.dynamicRegistration`. The base registers
|
|
90
|
+
* under `workspace.configuration` alone before any of this runs, so gating
|
|
91
|
+
* the registration on the narrower flag here would withhold a request whose
|
|
92
|
+
* twin has already gone out, sparing the client nothing. A client declaring
|
|
93
|
+
* `workspace.configuration` without dynamic registration is still registered
|
|
94
|
+
* for, by the base and by this; closing that means changing the base's pass,
|
|
95
|
+
* not this gate.
|
|
96
|
+
*
|
|
97
|
+
* Registering before fetching, so an edit landing between the two arrives as
|
|
98
|
+
* a notification instead of being lost; the reverse order drops it.
|
|
99
|
+
*
|
|
100
|
+
* A `null` result is left out of the store rather than written, so the
|
|
101
|
+
* section reads as unset, and no `onConfigurationSectionUpdate` fires — the
|
|
102
|
+
* value goes to the caller that asked for it, and an event would announce a
|
|
103
|
+
* change that is only this provider catching up.
|
|
104
|
+
*/
|
|
105
|
+
protected async doRequestSection(section: string): Promise<void> {
|
|
106
|
+
if (!this.workspaceConfig) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.registerForSection?.({ section });
|
|
110
|
+
if (!this.fetchSections) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const fetched = await this.fetchSections([{ section }]);
|
|
114
|
+
const value = Array.isArray(fetched) ? fetched[0] : fetched;
|
|
115
|
+
if (value !== null && value !== undefined) {
|
|
116
|
+
this.updateSectionConfiguration(section, value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2026 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the MIT License which is available in the project root.
|
|
6
|
+
*
|
|
7
|
+
* SPDX-License-Identifier: MIT
|
|
8
|
+
********************************************************************************/
|
|
9
|
+
|
|
10
|
+
import { Format, formatLogArg, LEVEL_LABELS, type LogLevel, SystemClock } from '@hydranium/protocol';
|
|
11
|
+
import { teeLogLine } from './logger.js';
|
|
12
|
+
import { hasProcessStderr } from '../../util/environment.js';
|
|
13
|
+
import { isConnectionGoneError } from '../../util/connection-liveness.js';
|
|
14
|
+
|
|
15
|
+
/** The `console` methods {@link installConsoleTee} wraps, with the level and label each line is written at. */
|
|
16
|
+
const CONSOLE_TEE: ReadonlyArray<readonly ['error' | 'warn' | 'info' | 'log' | 'debug', LogLevel, string]> = [
|
|
17
|
+
['error', 'error', LEVEL_LABELS.error],
|
|
18
|
+
['warn', 'warn', LEVEL_LABELS.warn],
|
|
19
|
+
['info', 'info', LEVEL_LABELS.info],
|
|
20
|
+
['log', 'info', 'Log'],
|
|
21
|
+
['debug', 'debug', LEVEL_LABELS.debug]
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
/** The wrappers this copy installed, so installing again wraps only a method that is none of them. */
|
|
25
|
+
const tees = new WeakSet<object>();
|
|
26
|
+
/**
|
|
27
|
+
* Whether a line is being written or handed on: a console call made meanwhile,
|
|
28
|
+
* by a sink or a library wrapper between two installs, is only handed on.
|
|
29
|
+
*/
|
|
30
|
+
let handling = false;
|
|
31
|
+
/**
|
|
32
|
+
* What a line is stamped with: not a logger's injected clock, whose service a
|
|
33
|
+
* console call made while another service is built could resolve into a cycle.
|
|
34
|
+
*/
|
|
35
|
+
const systemClock = new SystemClock();
|
|
36
|
+
/**
|
|
37
|
+
* How a line's arguments are rendered, Node's `util.format` where the `./node`
|
|
38
|
+
* entry set it: unlike JSON, it runs no ordinary getter and no proxy trap of an
|
|
39
|
+
* argument it inspects, the traps a services container builds a service in.
|
|
40
|
+
*/
|
|
41
|
+
let format: ((...args: unknown[]) => string) | undefined;
|
|
42
|
+
|
|
43
|
+
/** Render console lines with `render`, as `installNodeLogFileSink` does with Node's `util.format`. */
|
|
44
|
+
export function setConsoleFormat(render: (...args: unknown[]) => string): void {
|
|
45
|
+
format = render;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Write each line sent through a {@link CONSOLE_TEE} method, as Langium
|
|
50
|
+
* reports a linker or validator failure, to this copy's log file under a
|
|
51
|
+
* `console` component, then hand it to the method it replaced, even when
|
|
52
|
+
* writing the file fails. The file goes first because the method a stdio
|
|
53
|
+
* connection installs throws once the connection is closed, unless its remote
|
|
54
|
+
* console catches that, as `withHydraniumLspFeatures`'s does.
|
|
55
|
+
*
|
|
56
|
+
* Node only: in a browser no file is written, and a wrapper would only stand
|
|
57
|
+
* between devtools and the call site. Called by the first `LspLogger`, and by
|
|
58
|
+
* `startLanguageServer`, which wraps again where a logger existed before a
|
|
59
|
+
* stdio connection replaced `error`, `warn`, `log` and `debug`. A console
|
|
60
|
+
* replaced after that is not wrapped again, and each copy of this package
|
|
61
|
+
* wraps the console itself, so a file two copies share gets a line twice.
|
|
62
|
+
*/
|
|
63
|
+
export function installConsoleTee(): void {
|
|
64
|
+
if (!hasProcessStderr()) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const [method, level, label] of CONSOLE_TEE) {
|
|
68
|
+
try {
|
|
69
|
+
wrap(method, level, label);
|
|
70
|
+
} catch {
|
|
71
|
+
// A host whose console is read-only, or throws when read, keeps its methods, unwritten.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Replace `console[method]` by a tee writing its lines at `level` under `label`, unless it is already one of this copy's tees. */
|
|
77
|
+
function wrap(method: (typeof CONSOLE_TEE)[number][0], level: LogLevel, label: string): void {
|
|
78
|
+
const passOn = console[method];
|
|
79
|
+
if (tees.has(passOn)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const tee = (...args: unknown[]): void => {
|
|
83
|
+
if (handling) {
|
|
84
|
+
Reflect.apply(passOn, console, args);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
handling = true;
|
|
88
|
+
try {
|
|
89
|
+
try {
|
|
90
|
+
const [lineLevel, lineLabel] = isDebugLine(args)
|
|
91
|
+
? (['debug', LEVEL_LABELS.debug] as const)
|
|
92
|
+
: level === 'error' && isNodeWarning(args)
|
|
93
|
+
? (['warn', LEVEL_LABELS.warn] as const)
|
|
94
|
+
: [level, label];
|
|
95
|
+
// As `AbstractLogger.formatLinePrefix` starts a line.
|
|
96
|
+
teeLogLine(
|
|
97
|
+
lineLevel,
|
|
98
|
+
() => `[${lineLabel.padEnd(5)} - ${Format.timestamp(new Date(systemClock.now()))}] [console] ${formatArgs(args)}`
|
|
99
|
+
);
|
|
100
|
+
} catch {
|
|
101
|
+
// A failing log sink must not propagate, nor keep the line from `passOn`.
|
|
102
|
+
}
|
|
103
|
+
Reflect.apply(passOn, console, args);
|
|
104
|
+
} finally {
|
|
105
|
+
handling = false;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
console[method] = tee;
|
|
109
|
+
tees.add(tee);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** `args` as the console prints them, or by {@link formatLogArg} where that throws, as for an error whose stack throws when read. */
|
|
113
|
+
function formatArgs(args: unknown[]): string {
|
|
114
|
+
if (format) {
|
|
115
|
+
try {
|
|
116
|
+
return format(...args);
|
|
117
|
+
} catch {
|
|
118
|
+
// Described below instead.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return args.map(arg => formatLogArg(arg)).join(' ');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* How Node's default warning handler starts what it prints through
|
|
126
|
+
* `console.error`: the runtime's release name and pid, the warning's code if
|
|
127
|
+
* it has one, and its type, as `(node:42) [DEP0005] DeprecationWarning: `.
|
|
128
|
+
*/
|
|
129
|
+
const NODE_WARNING = /^\([\w-]+:\d+\) (\[\w+\] )?\w*Warning: /;
|
|
130
|
+
|
|
131
|
+
/** Whether `args` is a Node process warning, a deprecation say, which is written at `warn`. */
|
|
132
|
+
function isNodeWarning(args: readonly unknown[]): boolean {
|
|
133
|
+
return args.length === 1 && typeof args[0] === 'string' && NODE_WARNING.test(args[0]);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** What Langium's `initialized` handler logs when a service's start rejects. */
|
|
137
|
+
const LANGIUM_START_FAILURES = new Set<unknown>([
|
|
138
|
+
'Error in ConfigurationProvider initialization:',
|
|
139
|
+
'Error in WorkspaceManager initialization:'
|
|
140
|
+
]);
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Whether `args` reports routine teardown, which is written at `debug`:
|
|
144
|
+
* Langium's failed configuration or workspace start whose connection has gone.
|
|
145
|
+
* `vscode-languageserver`'s `Sending log message failed` is not, since it
|
|
146
|
+
* carries no reason; `withHydraniumLspFeatures` keeps teardown from printing it.
|
|
147
|
+
*/
|
|
148
|
+
function isDebugLine(args: readonly unknown[]): boolean {
|
|
149
|
+
return args.length === 2 && LANGIUM_START_FAILURES.has(args[0]) && isConnectionGoneError(args[1]);
|
|
150
|
+
}
|
|
@@ -8,14 +8,7 @@
|
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
10
|
import { Format, Logger, type Tracer } from '@hydranium/protocol';
|
|
11
|
-
import {
|
|
12
|
-
DefaultLangiumProfiler,
|
|
13
|
-
DocumentState,
|
|
14
|
-
MultiMap,
|
|
15
|
-
type ProfilingCategory,
|
|
16
|
-
type ProfilingRecord,
|
|
17
|
-
ProfilingTask
|
|
18
|
-
} from '@hydranium/langium';
|
|
11
|
+
import { DefaultLangiumProfiler, MultiMap, type ProfilingCategory, type ProfilingRecord, ProfilingTask } from '@hydranium/langium';
|
|
19
12
|
import { type LogNameOptions } from './logger.js';
|
|
20
13
|
import { type ServerSharedServicesMinimal } from '../shared-services.js';
|
|
21
14
|
|
|
@@ -29,18 +22,8 @@ export interface LangiumProfilerOptions extends LogNameOptions {
|
|
|
29
22
|
* {@link DefaultLangiumProfiler}) to Langium's full set when omitted.
|
|
30
23
|
*/
|
|
31
24
|
readonly activeCategories?: Set<ProfilingCategory>;
|
|
32
|
-
/**
|
|
33
|
-
* Priority of the per-build flush pass at the `Validated` phase. The flush is
|
|
34
|
-
* normally the only pass at `Validated`, so order is immaterial; the option
|
|
35
|
-
* exists for symmetry with the other framework passes. Default
|
|
36
|
-
* {@link PROFILER_FLUSH_PASS_PRIORITY}.
|
|
37
|
-
*/
|
|
38
|
-
readonly flushPriority?: number;
|
|
39
25
|
}
|
|
40
26
|
|
|
41
|
-
/** Default priority of the profiler's per-build flush pass (see {@link LangiumProfilerOptions.flushPriority}). */
|
|
42
|
-
export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
43
|
-
|
|
44
27
|
/**
|
|
45
28
|
* Framework adapter over Langium's {@link DefaultLangiumProfiler} that is
|
|
46
29
|
* **trace-gated** and emits a single **aggregated** per-category breakdown
|
|
@@ -54,9 +37,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
|
54
37
|
* task identifier), so the per-document records carry no distinguishing
|
|
55
38
|
* information anyway. We instead accumulate records in {@link records} and
|
|
56
39
|
* {@link flush} one breakdown per category — self-time and invocation counts
|
|
57
|
-
* summed per `$type` across the whole build —
|
|
58
|
-
*
|
|
59
|
-
* one per file.
|
|
40
|
+
* summed per `$type` across the whole build — when the build ends
|
|
41
|
+
* (subscribed in the constructor). One report per build, not one per file.
|
|
60
42
|
* - **Transport safety.** The stock per-record dump uses `console.table`, which
|
|
61
43
|
* is NOT in the set `patchConsole` reroutes; under `vscode-languageserver`'s
|
|
62
44
|
* `--stdio` transport `process.stdout` *is* the JSON-RPC channel, so the
|
|
@@ -74,8 +56,8 @@ export const PROFILER_FLUSH_PASS_PRIORITY = 0;
|
|
|
74
56
|
* restart. Langium's own `start`/`stop` category selection still applies *on
|
|
75
57
|
* top of* the trace gate.
|
|
76
58
|
*
|
|
77
|
-
* Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its
|
|
78
|
-
*
|
|
59
|
+
* Registered eagerly (see `DEFAULT_EAGER_SERVICES`) so its flush is
|
|
60
|
+
* subscribed before the first build. Gives the per-grammar-rule /
|
|
79
61
|
* per-`$type` parse/link/validate self-time the framework's own
|
|
80
62
|
* `ServerTracer` / `ProfileSession` passes
|
|
81
63
|
* cannot produce (those cover the framework's passes *outside* Langium's
|
|
@@ -88,16 +70,11 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
|
|
|
88
70
|
constructor(services: ServerSharedServicesMinimal, options: LangiumProfilerOptions = {}) {
|
|
89
71
|
super(options.activeCategories);
|
|
90
72
|
this.tracer = services.Tracer.for(options.logName ?? 'LangiumProfiler').trace('instantiated');
|
|
91
|
-
// Flush once per build
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
services.workspace.
|
|
96
|
-
id: 'framework:langium-profiler:flush',
|
|
97
|
-
state: DocumentState.Validated,
|
|
98
|
-
priority: options.flushPriority ?? PROFILER_FLUSH_PASS_PRIORITY,
|
|
99
|
-
run: () => this.flush()
|
|
100
|
-
});
|
|
73
|
+
// Flush once per build when it ends rather than once per document. Not at
|
|
74
|
+
// a `Validated` pass: that phase stays silent for a build that validates
|
|
75
|
+
// nothing, the workspace's initial one among them, and the records would
|
|
76
|
+
// then wait for a build that does.
|
|
77
|
+
services.workspace.DocumentBuilder.onBuildEnded(() => this.flush());
|
|
101
78
|
}
|
|
102
79
|
|
|
103
80
|
/**
|
|
@@ -142,14 +119,13 @@ export class HydraniumLangiumProfiler extends DefaultLangiumProfiler {
|
|
|
142
119
|
/**
|
|
143
120
|
* Emit one aggregated breakdown per category — self-time and invocation
|
|
144
121
|
* counts summed per `<languageId>.<$type>` across every record collected
|
|
145
|
-
* this build — then clear the window.
|
|
146
|
-
*
|
|
147
|
-
*
|
|
122
|
+
* this build — then clear the window. Called when a build ends, so it fires
|
|
123
|
+
* once per build, not per document. Pass explicit categories to flush a
|
|
124
|
+
* subset; defaults to all.
|
|
148
125
|
*
|
|
149
126
|
* `flush` is the sole reset point: because it clears each flushed category,
|
|
150
|
-
* memory is bounded per
|
|
151
|
-
*
|
|
152
|
-
* inflated counts, self-correcting) rather than accumulating without bound.
|
|
127
|
+
* memory is bounded per build. Builds that throw share one flush, once the
|
|
128
|
+
* lock has drained after them.
|
|
153
129
|
*/
|
|
154
130
|
flush(...categories: ProfilingCategory[]): void {
|
|
155
131
|
const toFlush = categories.length > 0 ? categories : ALL_CATEGORIES;
|
|
@@ -50,7 +50,7 @@ export function logPreamble(logger: Logger, options: LogPreambleOptions): void {
|
|
|
50
50
|
|
|
51
51
|
function logSessionInfo(logger: Logger, productName: string, version: string, systemInfoLines: readonly string[]): void {
|
|
52
52
|
const now = new Date();
|
|
53
|
-
const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD,
|
|
53
|
+
const dateStr = now.toISOString().slice(0, 10); // YYYY-MM-DD in UTC, which can differ from the reader's local date
|
|
54
54
|
const lines = [
|
|
55
55
|
DIVIDER,
|
|
56
56
|
`${productName} server session`,
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* SPDX-License-Identifier: MIT
|
|
8
8
|
********************************************************************************/
|
|
9
9
|
|
|
10
|
-
import { Format } from '@hydranium/protocol';
|
|
10
|
+
import { Format, LEVEL_ORDER, type LogLevel, Logger, type LogThreshold } from '@hydranium/protocol';
|
|
11
11
|
import { currentMemoryUsage, onProcessEvent, processPid } from '../../util/environment.js';
|
|
12
12
|
|
|
13
13
|
/** Only append a memory suffix when the heap has moved by at least this much since the last log line. */
|
|
@@ -39,7 +39,7 @@ export function setLogFileSink(sink: LogFileSink | undefined): void {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
|
-
* File-tee state for `LspLogger`'s emit. When
|
|
42
|
+
* File-tee state for `LspLogger`'s emit and the console tee. When
|
|
43
43
|
* non-empty, every formatted log line is appended to the path in addition to
|
|
44
44
|
* its LSP `window/logMessage` / console destination (see {@link teeLogLine}).
|
|
45
45
|
* Diagnostic surface only — once the LSP connection binds, server logs route
|
|
@@ -69,6 +69,28 @@ const pendingLogLines: string[] = [];
|
|
|
69
69
|
/** Matches any remaining `{name}` placeholder token. */
|
|
70
70
|
const PLACEHOLDER_PATTERN = /\{[^}]+\}/;
|
|
71
71
|
|
|
72
|
+
/**
|
|
73
|
+
* `template` with `{pid}` replaced by the process id, known from the start, and
|
|
74
|
+
* each placeholder supplied so far by its value.
|
|
75
|
+
*/
|
|
76
|
+
function substituteLogFilePlaceholders(template: string): string {
|
|
77
|
+
let path = template.split('{pid}').join(String(processPid() ?? 'unknown'));
|
|
78
|
+
for (const [name, value] of logFilePlaceholders) {
|
|
79
|
+
path = path.split(`{${name}}`).join(value);
|
|
80
|
+
}
|
|
81
|
+
return path;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Expand `template` the way the file-tee names its file: `{pid}` and each
|
|
86
|
+
* supplied placeholder by its value, each one still missing by
|
|
87
|
+
* `_startup-<pid>`. A file written beside the log, such as the CPU profile,
|
|
88
|
+
* names itself through this so both carry the same workspace token.
|
|
89
|
+
*/
|
|
90
|
+
export function expandLogFilePlaceholders(template: string): string {
|
|
91
|
+
return substituteLogFilePlaceholders(template).replace(new RegExp(PLACEHOLDER_PATTERN, 'g'), `_startup-${processPid() ?? 'unknown'}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
72
94
|
/**
|
|
73
95
|
* Recompute {@link resolvedLogFilePath} from the template + known placeholders.
|
|
74
96
|
* Resolves (and flushes the pending buffer) only once no `{...}` token remains.
|
|
@@ -78,10 +100,7 @@ function tryResolveLogFilePath(): void {
|
|
|
78
100
|
resolvedLogFilePath = undefined;
|
|
79
101
|
return;
|
|
80
102
|
}
|
|
81
|
-
|
|
82
|
-
for (const [name, value] of logFilePlaceholders) {
|
|
83
|
-
path = path.split(`{${name}}`).join(value);
|
|
84
|
-
}
|
|
103
|
+
const path = substituteLogFilePlaceholders(logFileTemplate);
|
|
85
104
|
if (PLACEHOLDER_PATTERN.test(path)) {
|
|
86
105
|
resolvedLogFilePath = undefined;
|
|
87
106
|
// Target is pending — guarantee the buffer is flushed even if the process
|
|
@@ -116,12 +135,19 @@ function flushPendingLogLines(): void {
|
|
|
116
135
|
/**
|
|
117
136
|
* Set the file-tee target programmatically. Pass `undefined` to disable. The
|
|
118
137
|
* path may contain `{placeholder}` tokens (e.g. `{workspace}`); lines buffer
|
|
119
|
-
* until every token is supplied via {@link resolveLogFilePlaceholder}
|
|
138
|
+
* until every token is supplied via {@link resolveLogFilePlaceholder}, except
|
|
139
|
+
* `{pid}`, which is the process id from the start.
|
|
120
140
|
* Called by the `LspLogger` constructor's
|
|
121
141
|
* one-time `HYDRANIUM_LOG_FILE` env baseline (and by tests).
|
|
142
|
+
*
|
|
143
|
+
* `level` becomes `Logger.setFileLevel`, cleared with the target and when
|
|
144
|
+
* omitted. Setting the file level apart from the target lets it outlive the
|
|
145
|
+
* file, and every sender keeps building lines above the process threshold
|
|
146
|
+
* that nothing writes.
|
|
122
147
|
*/
|
|
123
|
-
export function setLogFilePath(path: string | undefined): void {
|
|
148
|
+
export function setLogFilePath(path: string | undefined, level?: LogThreshold): void {
|
|
124
149
|
logFileTemplate = path && path.length > 0 ? path : undefined;
|
|
150
|
+
Logger.setFileLevel(logFileTemplate ? level : undefined);
|
|
125
151
|
logFilePlaceholders.clear();
|
|
126
152
|
pendingLogLines.length = 0;
|
|
127
153
|
resolvedLogFilePath = undefined;
|
|
@@ -150,7 +176,7 @@ export function flushLogFileFallback(): void {
|
|
|
150
176
|
if (!logFileTemplate || resolvedLogFilePath || pendingLogLines.length === 0) {
|
|
151
177
|
return;
|
|
152
178
|
}
|
|
153
|
-
resolvedLogFilePath = logFileTemplate
|
|
179
|
+
resolvedLogFilePath = expandLogFilePlaceholders(logFileTemplate);
|
|
154
180
|
ensureLogDir(resolvedLogFilePath);
|
|
155
181
|
flushPendingLogLines();
|
|
156
182
|
}
|
|
@@ -173,20 +199,28 @@ export function getLogFilePath(): string | undefined {
|
|
|
173
199
|
|
|
174
200
|
/**
|
|
175
201
|
* Fan a single already-formatted log line out to the file-tee target, if one is
|
|
176
|
-
* configured
|
|
177
|
-
*
|
|
202
|
+
* configured and `level` is within the file's threshold
|
|
203
|
+
* (`Logger.getFileLevel() ?? Logger.getLevel()`). Called by `LspLogger`'s emit in
|
|
204
|
+
* addition to the LSP/console sink, and by the console tee before the console
|
|
205
|
+
* method it wraps — log sinks fan out, they don't replace.
|
|
178
206
|
* While the target is still pending (unresolved `{placeholder}`), the line is
|
|
179
|
-
* buffered instead of dropped.
|
|
207
|
+
* buffered instead of dropped. Where no sink is installed, as in a process
|
|
208
|
+
* that never loaded `@hydranium/core/node`, nothing is built or buffered,
|
|
209
|
+
* since nothing will write it. A caller whose line is costly to build passes
|
|
210
|
+
* a function, called only when the file takes the line.
|
|
180
211
|
*/
|
|
181
|
-
export function teeLogLine(formatted: string): void {
|
|
182
|
-
if (!logFileTemplate) {
|
|
212
|
+
export function teeLogLine(level: LogLevel, formatted: string | (() => string)): void {
|
|
213
|
+
if (!logFileTemplate || LEVEL_ORDER[level] > LEVEL_ORDER[Logger.getFileLevel() ?? Logger.getLevel()]) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (!fileSink) {
|
|
183
217
|
return;
|
|
184
218
|
}
|
|
185
|
-
const line = `${formatted}\n`;
|
|
219
|
+
const line = `${typeof formatted === 'string' ? formatted : formatted()}\n`;
|
|
186
220
|
if (resolvedLogFilePath) {
|
|
187
221
|
// The sink swallows its own errors; recursing into the logger here would
|
|
188
|
-
// re-enter emit and loop. The
|
|
189
|
-
fileSink
|
|
222
|
+
// re-enter emit and loop. The caller delivers the line to its other sink.
|
|
223
|
+
fileSink.append(resolvedLogFilePath, line);
|
|
190
224
|
} else {
|
|
191
225
|
pendingLogLines.push(line);
|
|
192
226
|
}
|