@canonical/terrazzo-lsp-extension 0.4.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 +45 -0
- package/dist/esm/cli/expandGlobs.js +21 -0
- package/dist/esm/cli/expandGlobs.js.map +1 -0
- package/dist/esm/cli/index.js +61 -0
- package/dist/esm/cli/index.js.map +1 -0
- package/dist/esm/cli/loadArtifactFiles.js +21 -0
- package/dist/esm/cli/loadArtifactFiles.js.map +1 -0
- package/dist/esm/cli/printHelp.js +19 -0
- package/dist/esm/cli/printHelp.js.map +1 -0
- package/dist/esm/cli/runCheck.js +52 -0
- package/dist/esm/cli/runCheck.js.map +1 -0
- package/dist/esm/cli/runGraph.js +41 -0
- package/dist/esm/cli/runGraph.js.map +1 -0
- package/dist/esm/cli/runInspect.js +27 -0
- package/dist/esm/cli/runInspect.js.map +1 -0
- package/dist/esm/cli/runInstall.js +126 -0
- package/dist/esm/cli/runInstall.js.map +1 -0
- package/dist/esm/cli/runResolve.js +17 -0
- package/dist/esm/cli/runResolve.js.map +1 -0
- package/dist/esm/cli/runStatus.js +18 -0
- package/dist/esm/cli/runStatus.js.map +1 -0
- package/dist/esm/cli.js +4 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/css/colorSetup.js +13 -0
- package/dist/esm/css/colorSetup.js.map +1 -0
- package/dist/esm/css/createDocumentIndex.js +43 -0
- package/dist/esm/css/createDocumentIndex.js.map +1 -0
- package/dist/esm/css/imports/extractCssImports.js +41 -0
- package/dist/esm/css/imports/extractCssImports.js.map +1 -0
- package/dist/esm/css/imports/extractJsImports.js +14 -0
- package/dist/esm/css/imports/extractJsImports.js.map +1 -0
- package/dist/esm/css/imports/extractPackageName.js +20 -0
- package/dist/esm/css/imports/extractPackageName.js.map +1 -0
- package/dist/esm/css/imports/formatFileUri.js +6 -0
- package/dist/esm/css/imports/formatFileUri.js.map +1 -0
- package/dist/esm/css/imports/index.js +9 -0
- package/dist/esm/css/imports/index.js.map +1 -0
- package/dist/esm/css/imports/isBareSpecifier.js +13 -0
- package/dist/esm/css/imports/isBareSpecifier.js.map +1 -0
- package/dist/esm/css/imports/isExternalPath.js +5 -0
- package/dist/esm/css/imports/isExternalPath.js.map +1 -0
- package/dist/esm/css/imports/parseFileUri.js +6 -0
- package/dist/esm/css/imports/parseFileUri.js.map +1 -0
- package/dist/esm/css/imports/resolveImportSpecifier.js +27 -0
- package/dist/esm/css/imports/resolveImportSpecifier.js.map +1 -0
- package/dist/esm/css/index.js +7 -0
- package/dist/esm/css/index.js.map +1 -0
- package/dist/esm/css/lezer/applyTreeChanges.js +5 -0
- package/dist/esm/css/lezer/applyTreeChanges.js.map +1 -0
- package/dist/esm/css/lezer/computeChangedRange.js +23 -0
- package/dist/esm/css/lezer/computeChangedRange.js.map +1 -0
- package/dist/esm/css/lezer/createTreeFragments.js +5 -0
- package/dist/esm/css/lezer/createTreeFragments.js.map +1 -0
- package/dist/esm/css/lezer/index.js +6 -0
- package/dist/esm/css/lezer/index.js.map +1 -0
- package/dist/esm/css/lezer/nodeText.js +4 -0
- package/dist/esm/css/lezer/nodeText.js.map +1 -0
- package/dist/esm/css/lezer/parseCSS.js +5 -0
- package/dist/esm/css/lezer/parseCSS.js.map +1 -0
- package/dist/esm/css/lezer/types.js +2 -0
- package/dist/esm/css/lezer/types.js.map +1 -0
- package/dist/esm/css/scanners/extractPropertyAtPosition.js +23 -0
- package/dist/esm/css/scanners/extractPropertyAtPosition.js.map +1 -0
- package/dist/esm/css/scanners/index.js +6 -0
- package/dist/esm/css/scanners/index.js.map +1 -0
- package/dist/esm/css/scanners/parseSuppressionDirectives.js +88 -0
- package/dist/esm/css/scanners/parseSuppressionDirectives.js.map +1 -0
- package/dist/esm/css/scanners/scanDeclarations.js +38 -0
- package/dist/esm/css/scanners/scanDeclarations.js.map +1 -0
- package/dist/esm/css/scanners/scanProperties.js +49 -0
- package/dist/esm/css/scanners/scanProperties.js.map +1 -0
- package/dist/esm/css/scanners/scanUsages.js +64 -0
- package/dist/esm/css/scanners/scanUsages.js.map +1 -0
- package/dist/esm/css/selectors/buildSelectorContext.js +9 -0
- package/dist/esm/css/selectors/buildSelectorContext.js.map +1 -0
- package/dist/esm/css/selectors/classifySelectorScope.js +32 -0
- package/dist/esm/css/selectors/classifySelectorScope.js.map +1 -0
- package/dist/esm/css/selectors/index.js +3 -0
- package/dist/esm/css/selectors/index.js.map +1 -0
- package/dist/esm/css/tree/ancestors.js +74 -0
- package/dist/esm/css/tree/ancestors.js.map +1 -0
- package/dist/esm/css/tree/declarations.js +6 -0
- package/dist/esm/css/tree/declarations.js.map +1 -0
- package/dist/esm/css/tree/index.js +5 -0
- package/dist/esm/css/tree/index.js.map +1 -0
- package/dist/esm/css/tree/lineage.js +10 -0
- package/dist/esm/css/tree/lineage.js.map +1 -0
- package/dist/esm/css/tree/lines.js +25 -0
- package/dist/esm/css/tree/lines.js.map +1 -0
- package/dist/esm/css/values/compareFallbackStaleness.js +34 -0
- package/dist/esm/css/values/compareFallbackStaleness.js.map +1 -0
- package/dist/esm/css/values/constants.js +33 -0
- package/dist/esm/css/values/constants.js.map +1 -0
- package/dist/esm/css/values/expectedTypeForProperty.js +117 -0
- package/dist/esm/css/values/expectedTypeForProperty.js.map +1 -0
- package/dist/esm/css/values/extractUnit.js +6 -0
- package/dist/esm/css/values/extractUnit.js.map +1 -0
- package/dist/esm/css/values/index.js +11 -0
- package/dist/esm/css/values/index.js.map +1 -0
- package/dist/esm/css/values/inferValueType.js +104 -0
- package/dist/esm/css/values/inferValueType.js.map +1 -0
- package/dist/esm/css/values/isAssignable.js +13 -0
- package/dist/esm/css/values/isAssignable.js.map +1 -0
- package/dist/esm/css/values/isSuppressed.js +47 -0
- package/dist/esm/css/values/isSuppressed.js.map +1 -0
- package/dist/esm/css/values/mapDtcgType.js +20 -0
- package/dist/esm/css/values/mapDtcgType.js.map +1 -0
- package/dist/esm/css/values/parseSyntaxType.js +50 -0
- package/dist/esm/css/values/parseSyntaxType.js.map +1 -0
- package/dist/esm/css/values/resolveDimensionValue.js +62 -0
- package/dist/esm/css/values/resolveDimensionValue.js.map +1 -0
- package/dist/esm/diagnosticCodes.js +18 -0
- package/dist/esm/diagnosticCodes.js.map +1 -0
- package/dist/esm/extension/findBundledVsixPath.js +20 -0
- package/dist/esm/extension/findBundledVsixPath.js.map +1 -0
- package/dist/esm/extension/index.js +4 -0
- package/dist/esm/extension/index.js.map +1 -0
- package/dist/esm/extension/installBundledVscodeExtension.js +25 -0
- package/dist/esm/extension/installBundledVscodeExtension.js.map +1 -0
- package/dist/esm/extension/updateVscodeSettings.js +8 -0
- package/dist/esm/extension/updateVscodeSettings.js.map +1 -0
- package/dist/esm/graph/ReachabilityCache.js +91 -0
- package/dist/esm/graph/ReachabilityCache.js.map +1 -0
- package/dist/esm/graph/TokenGraph.js +370 -0
- package/dist/esm/graph/TokenGraph.js.map +1 -0
- package/dist/esm/graph/index.js +5 -0
- package/dist/esm/graph/index.js.map +1 -0
- package/dist/esm/graph/loadArtifact.js +157 -0
- package/dist/esm/graph/loadArtifact.js.map +1 -0
- package/dist/esm/graph/parseArtifactToken.js +113 -0
- package/dist/esm/graph/parseArtifactToken.js.map +1 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/protocol/createRequest.js +10 -0
- package/dist/esm/protocol/createRequest.js.map +1 -0
- package/dist/esm/protocol/index.js +5 -0
- package/dist/esm/protocol/index.js.map +1 -0
- package/dist/esm/protocol/matchResponse.js +5 -0
- package/dist/esm/protocol/matchResponse.js.map +1 -0
- package/dist/esm/protocol/resolveConfig.js +222 -0
- package/dist/esm/protocol/resolveConfig.js.map +1 -0
- package/dist/esm/protocol/typeGuards.js +16 -0
- package/dist/esm/protocol/typeGuards.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/checkBrokenAlias.js +15 -0
- package/dist/esm/providers/artifactDiagnostics/checkBrokenAlias.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/checkCircularAlias.js +22 -0
- package/dist/esm/providers/artifactDiagnostics/checkCircularAlias.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/checkDraftSyntax.js +15 -0
- package/dist/esm/providers/artifactDiagnostics/checkDraftSyntax.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/checkMissingType.js +10 -0
- package/dist/esm/providers/artifactDiagnostics/checkMissingType.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/checkSchemaViolation.js +15 -0
- package/dist/esm/providers/artifactDiagnostics/checkSchemaViolation.js.map +1 -0
- package/dist/esm/providers/artifactDiagnostics/index.js +28 -0
- package/dist/esm/providers/artifactDiagnostics/index.js.map +1 -0
- package/dist/esm/providers/classifyProvenance.js +19 -0
- package/dist/esm/providers/classifyProvenance.js.map +1 -0
- package/dist/esm/providers/completions/buildCompletionItem.js +132 -0
- package/dist/esm/providers/completions/buildCompletionItem.js.map +1 -0
- package/dist/esm/providers/completions/buildSortText.js +39 -0
- package/dist/esm/providers/completions/buildSortText.js.map +1 -0
- package/dist/esm/providers/completions/index.js +6 -0
- package/dist/esm/providers/completions/index.js.map +1 -0
- package/dist/esm/providers/completions/provideCompletions.js +64 -0
- package/dist/esm/providers/completions/provideCompletions.js.map +1 -0
- package/dist/esm/providers/completions/resolveCompletionItem.js +26 -0
- package/dist/esm/providers/completions/resolveCompletionItem.js.map +1 -0
- package/dist/esm/providers/completions/resolveExpectedType.js +17 -0
- package/dist/esm/providers/completions/resolveExpectedType.js.map +1 -0
- package/dist/esm/providers/constants.js +53 -0
- package/dist/esm/providers/constants.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkMissingFallback.js +20 -0
- package/dist/esm/providers/diagnostics/checkMissingFallback.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkNoColorScheme.js +27 -0
- package/dist/esm/providers/diagnostics/checkNoColorScheme.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkPrimitiveToken.js +20 -0
- package/dist/esm/providers/diagnostics/checkPrimitiveToken.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkScopedUsage.js +28 -0
- package/dist/esm/providers/diagnostics/checkScopedUsage.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkStaleFallback.js +22 -0
- package/dist/esm/providers/diagnostics/checkStaleFallback.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkTypeMismatch.js +24 -0
- package/dist/esm/providers/diagnostics/checkTypeMismatch.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkTypeUncertain.js +19 -0
- package/dist/esm/providers/diagnostics/checkTypeUncertain.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkUnknownVar.js +18 -0
- package/dist/esm/providers/diagnostics/checkUnknownVar.js.map +1 -0
- package/dist/esm/providers/diagnostics/checkUnreachableToken.js +25 -0
- package/dist/esm/providers/diagnostics/checkUnreachableToken.js.map +1 -0
- package/dist/esm/providers/diagnostics/index.js +2 -0
- package/dist/esm/providers/diagnostics/index.js.map +1 -0
- package/dist/esm/providers/diagnostics/orchestrateDiagnostics.js +90 -0
- package/dist/esm/providers/diagnostics/orchestrateDiagnostics.js.map +1 -0
- package/dist/esm/providers/diagnostics/types.js +2 -0
- package/dist/esm/providers/diagnostics/types.js.map +1 -0
- package/dist/esm/providers/formatCheckReport.js +90 -0
- package/dist/esm/providers/formatCheckReport.js.map +1 -0
- package/dist/esm/providers/index.js +20 -0
- package/dist/esm/providers/index.js.map +1 -0
- package/dist/esm/providers/makeDiagnostic.js +13 -0
- package/dist/esm/providers/makeDiagnostic.js.map +1 -0
- package/dist/esm/providers/prepareRename.js +36 -0
- package/dist/esm/providers/prepareRename.js.map +1 -0
- package/dist/esm/providers/provideCodeActions.js +154 -0
- package/dist/esm/providers/provideCodeActions.js.map +1 -0
- package/dist/esm/providers/provideDocumentColors.js +90 -0
- package/dist/esm/providers/provideDocumentColors.js.map +1 -0
- package/dist/esm/providers/provideDocumentLinks.js +55 -0
- package/dist/esm/providers/provideDocumentLinks.js.map +1 -0
- package/dist/esm/providers/provideHover.js +20 -0
- package/dist/esm/providers/provideHover.js.map +1 -0
- package/dist/esm/providers/provideInlayHints.js +82 -0
- package/dist/esm/providers/provideInlayHints.js.map +1 -0
- package/dist/esm/providers/provideReferences.js +39 -0
- package/dist/esm/providers/provideReferences.js.map +1 -0
- package/dist/esm/providers/provideRename.js +63 -0
- package/dist/esm/providers/provideRename.js.map +1 -0
- package/dist/esm/providers/provideSemanticTokens.js +74 -0
- package/dist/esm/providers/provideSemanticTokens.js.map +1 -0
- package/dist/esm/providers/provideWorkspaceSymbols.js +175 -0
- package/dist/esm/providers/provideWorkspaceSymbols.js.map +1 -0
- package/dist/esm/providers/resolveDefinition.js +42 -0
- package/dist/esm/providers/resolveDefinition.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/buildResolutionTable.js +121 -0
- package/dist/esm/providers/tokenTooltip/buildResolutionTable.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/buildTokenTooltip.js +60 -0
- package/dist/esm/providers/tokenTooltip/buildTokenTooltip.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/constants.js +14 -0
- package/dist/esm/providers/tokenTooltip/constants.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/formatDeclarationSites.js +53 -0
- package/dist/esm/providers/tokenTooltip/formatDeclarationSites.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/formatProvenanceLine.js +86 -0
- package/dist/esm/providers/tokenTooltip/formatProvenanceLine.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/index.js +6 -0
- package/dist/esm/providers/tokenTooltip/index.js.map +1 -0
- package/dist/esm/providers/tokenTooltip/resolveToLiteral.js +19 -0
- package/dist/esm/providers/tokenTooltip/resolveToLiteral.js.map +1 -0
- package/dist/esm/providers/truncate.js +6 -0
- package/dist/esm/providers/truncate.js.map +1 -0
- package/dist/esm/providers/types.js +38 -0
- package/dist/esm/providers/types.js.map +1 -0
- package/dist/esm/runtime/ConfigNotFoundError.js +21 -0
- package/dist/esm/runtime/ConfigNotFoundError.js.map +1 -0
- package/dist/esm/runtime/artifacts/index.js +2 -0
- package/dist/esm/runtime/artifacts/index.js.map +1 -0
- package/dist/esm/runtime/artifacts/loadConfiguredArtifacts.js +32 -0
- package/dist/esm/runtime/artifacts/loadConfiguredArtifacts.js.map +1 -0
- package/dist/esm/runtime/buildImportGraph.js +61 -0
- package/dist/esm/runtime/buildImportGraph.js.map +1 -0
- package/dist/esm/runtime/config/ensureServerConfig.js +64 -0
- package/dist/esm/runtime/config/ensureServerConfig.js.map +1 -0
- package/dist/esm/runtime/config/index.js +2 -0
- package/dist/esm/runtime/config/index.js.map +1 -0
- package/dist/esm/runtime/createConfigCandidatePath.js +7 -0
- package/dist/esm/runtime/createConfigCandidatePath.js.map +1 -0
- package/dist/esm/runtime/createGraphWorker.js +23 -0
- package/dist/esm/runtime/createGraphWorker.js.map +1 -0
- package/dist/esm/runtime/createServerState.js +39 -0
- package/dist/esm/runtime/createServerState.js.map +1 -0
- package/dist/esm/runtime/detectRuntime.js +40 -0
- package/dist/esm/runtime/detectRuntime.js.map +1 -0
- package/dist/esm/runtime/dispatch/LogMessageType.js +8 -0
- package/dist/esm/runtime/dispatch/LogMessageType.js.map +1 -0
- package/dist/esm/runtime/dispatch/handleWorkerResponse.js +58 -0
- package/dist/esm/runtime/dispatch/handleWorkerResponse.js.map +1 -0
- package/dist/esm/runtime/dispatch/index.js +5 -0
- package/dist/esm/runtime/dispatch/index.js.map +1 -0
- package/dist/esm/runtime/dispatch/routeLspRequest.js +233 -0
- package/dist/esm/runtime/dispatch/routeLspRequest.js.map +1 -0
- package/dist/esm/runtime/dispatch/routeWorkerRequest.js +162 -0
- package/dist/esm/runtime/dispatch/routeWorkerRequest.js.map +1 -0
- package/dist/esm/runtime/dispatch/types.js +2 -0
- package/dist/esm/runtime/dispatch/types.js.map +1 -0
- package/dist/esm/runtime/documents/handleArtifactChanged.js +18 -0
- package/dist/esm/runtime/documents/handleArtifactChanged.js.map +1 -0
- package/dist/esm/runtime/documents/handleChangeDocument.js +41 -0
- package/dist/esm/runtime/documents/handleChangeDocument.js.map +1 -0
- package/dist/esm/runtime/documents/handleCloseDocument.js +10 -0
- package/dist/esm/runtime/documents/handleCloseDocument.js.map +1 -0
- package/dist/esm/runtime/documents/handleFileChanged.js +14 -0
- package/dist/esm/runtime/documents/handleFileChanged.js.map +1 -0
- package/dist/esm/runtime/documents/handleOpenDocument.js +37 -0
- package/dist/esm/runtime/documents/handleOpenDocument.js.map +1 -0
- package/dist/esm/runtime/documents/index.js +6 -0
- package/dist/esm/runtime/documents/index.js.map +1 -0
- package/dist/esm/runtime/getServerCapabilities.js +35 -0
- package/dist/esm/runtime/getServerCapabilities.js.map +1 -0
- package/dist/esm/runtime/index.js +14 -0
- package/dist/esm/runtime/index.js.map +1 -0
- package/dist/esm/runtime/indexing/index.js +5 -0
- package/dist/esm/runtime/indexing/index.js.map +1 -0
- package/dist/esm/runtime/indexing/indexDocument.js +32 -0
- package/dist/esm/runtime/indexing/indexDocument.js.map +1 -0
- package/dist/esm/runtime/indexing/indexGlobalStylesheets.js +12 -0
- package/dist/esm/runtime/indexing/indexGlobalStylesheets.js.map +1 -0
- package/dist/esm/runtime/indexing/reindexDocument.js +16 -0
- package/dist/esm/runtime/indexing/reindexDocument.js.map +1 -0
- package/dist/esm/runtime/indexing/updateImportEdges.js +5 -0
- package/dist/esm/runtime/indexing/updateImportEdges.js.map +1 -0
- package/dist/esm/runtime/scheduleBufferUpdate.js +39 -0
- package/dist/esm/runtime/scheduleBufferUpdate.js.map +1 -0
- package/dist/esm/runtime/startLspServer.js +66 -0
- package/dist/esm/runtime/startLspServer.js.map +1 -0
- package/dist/esm/runtime/types.js +2 -0
- package/dist/esm/runtime/types.js.map +1 -0
- package/dist/esm/testing/index.js +8 -0
- package/dist/esm/testing/index.js.map +1 -0
- package/dist/esm/testing/makeArtifactToken.js +31 -0
- package/dist/esm/testing/makeArtifactToken.js.map +1 -0
- package/dist/esm/testing/makeConfig.js +40 -0
- package/dist/esm/testing/makeConfig.js.map +1 -0
- package/dist/esm/testing/makeDeclarationNode.js +18 -0
- package/dist/esm/testing/makeDeclarationNode.js.map +1 -0
- package/dist/esm/testing/makePropertyNode.js +12 -0
- package/dist/esm/testing/makePropertyNode.js.map +1 -0
- package/dist/esm/testing/makeServerState.js +21 -0
- package/dist/esm/testing/makeServerState.js.map +1 -0
- package/dist/esm/testing/makeTokenNode.js +34 -0
- package/dist/esm/testing/makeTokenNode.js.map +1 -0
- package/dist/esm/testing/makeTransport.js +9 -0
- package/dist/esm/testing/makeTransport.js.map +1 -0
- package/dist/esm/transport/index.js +2 -0
- package/dist/esm/transport/index.js.map +1 -0
- package/dist/esm/transport/stdio/createMessageStream.js +50 -0
- package/dist/esm/transport/stdio/createMessageStream.js.map +1 -0
- package/dist/esm/transport/stdio/index.js +2 -0
- package/dist/esm/transport/stdio/index.js.map +1 -0
- package/dist/esm/types/config.js +6 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/css.js +6 -0
- package/dist/esm/types/css.js.map +1 -0
- package/dist/esm/types/graph.js +6 -0
- package/dist/esm/types/graph.js.map +1 -0
- package/dist/esm/types/index.js +16 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/lsp.js +10 -0
- package/dist/esm/types/lsp.js.map +1 -0
- package/dist/esm/types/protocol.js +35 -0
- package/dist/esm/types/protocol.js.map +1 -0
- package/dist/esm/types/worker.js +6 -0
- package/dist/esm/types/worker.js.map +1 -0
- package/dist/esm/version.js +21 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/extension.js +17910 -0
- package/install.sh +29 -0
- package/package.json +94 -0
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Terrazzo LSP
|
|
2
|
+
|
|
3
|
+
Terrazzo LSP adds CSS custom property intelligence for Canonical design token workflows in VS Code.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Completions for `var(--token)` references
|
|
8
|
+
- Hover details with resolved token values and provenance
|
|
9
|
+
- Diagnostics for missing fallbacks, stale fallbacks, primitive token use, and type mismatches
|
|
10
|
+
- Go to definition and rename for custom properties
|
|
11
|
+
- Workspace symbol search across token names
|
|
12
|
+
|
|
13
|
+
## Quick start
|
|
14
|
+
|
|
15
|
+
1. Install `@canonical/design-tokens` in your project.
|
|
16
|
+
2. Run `npx @canonical/terrazzo-lsp-extension` to install the extension.
|
|
17
|
+
3. Create a `terrazzo-lsp.config.json` file in your workspace root:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"artifacts": ["@canonical/design-tokens/dist/tokens.json"]
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
### `terrazzo-lsp.serverPath`
|
|
28
|
+
|
|
29
|
+
Optional path to a custom `dist/esm/cli.js` server build.
|
|
30
|
+
|
|
31
|
+
### `terrazzo-lsp.runtime`
|
|
32
|
+
|
|
33
|
+
Optional runtime override. Leave empty to auto-detect `bun` first and `node >= 22` second.
|
|
34
|
+
|
|
35
|
+
### `terrazzo-lsp.trace.server`
|
|
36
|
+
|
|
37
|
+
Controls the VS Code language client trace level.
|
|
38
|
+
|
|
39
|
+
## Troubleshooting
|
|
40
|
+
|
|
41
|
+
If the extension cannot find a runtime, install `bun` or `node >= 22`, or set `terrazzo-lsp.runtime` explicitly in your workspace settings.
|
|
42
|
+
|
|
43
|
+
If no `terrazzo-lsp.config.json` is present, the extension output logs the
|
|
44
|
+
candidate paths it tried and includes a starter example you can paste into a
|
|
45
|
+
new config file.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Expand glob patterns to matching file paths (deduplicated).
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads the file system via `fs.glob`.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
export async function expandGlobs(patterns, rootDir) {
|
|
8
|
+
const results = [];
|
|
9
|
+
for (const pattern of patterns) {
|
|
10
|
+
try {
|
|
11
|
+
for await (const entry of fs.glob(pattern, { cwd: rootDir })) {
|
|
12
|
+
results.push(entry);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Pattern didn't match — skip
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return [...new Set(results)];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=expandGlobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expandGlobs.js","sourceRoot":"","sources":["../../../src/cli/expandGlobs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAkB,EAClB,OAAe;IAEf,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC7D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI entry-point dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* Parses `process.argv`, dispatches to the appropriate sub-command,
|
|
5
|
+
* then tail-calls `run()`.
|
|
6
|
+
*/
|
|
7
|
+
import startLspServer from "../runtime/startLspServer.js";
|
|
8
|
+
import { VERSION } from "../version.js";
|
|
9
|
+
import { printHelp } from "./printHelp.js";
|
|
10
|
+
import { runCheck } from "./runCheck.js";
|
|
11
|
+
import { runGraph } from "./runGraph.js";
|
|
12
|
+
import { runInspect } from "./runInspect.js";
|
|
13
|
+
import { runResolve } from "./runResolve.js";
|
|
14
|
+
import { runStatus } from "./runStatus.js";
|
|
15
|
+
const args = process.argv.slice(2).filter((arg) => arg !== "--allow-degraded");
|
|
16
|
+
const allowDegraded = process.argv.includes("--allow-degraded");
|
|
17
|
+
const command = args[0] ?? "--stdio";
|
|
18
|
+
const rootDir = process.cwd();
|
|
19
|
+
/**
|
|
20
|
+
* Run the CLI.
|
|
21
|
+
*
|
|
22
|
+
* @note This function is impure — it reads files, writes to stdout,
|
|
23
|
+
* and may exit the process.
|
|
24
|
+
*/
|
|
25
|
+
async function run() {
|
|
26
|
+
switch (command) {
|
|
27
|
+
case "--stdio":
|
|
28
|
+
case "serve":
|
|
29
|
+
startLspServer(rootDir, { allowDegraded });
|
|
30
|
+
break;
|
|
31
|
+
case "check":
|
|
32
|
+
await runCheck(args.slice(1), rootDir);
|
|
33
|
+
break;
|
|
34
|
+
case "status":
|
|
35
|
+
await runStatus(rootDir);
|
|
36
|
+
break;
|
|
37
|
+
case "inspect":
|
|
38
|
+
await runInspect(args[1], rootDir);
|
|
39
|
+
break;
|
|
40
|
+
case "resolve":
|
|
41
|
+
await runResolve(args[1], rootDir);
|
|
42
|
+
break;
|
|
43
|
+
case "graph":
|
|
44
|
+
await runGraph(args[1], rootDir);
|
|
45
|
+
break;
|
|
46
|
+
case "--help":
|
|
47
|
+
case "-h":
|
|
48
|
+
printHelp();
|
|
49
|
+
break;
|
|
50
|
+
case "--version":
|
|
51
|
+
case "-v":
|
|
52
|
+
console.log(`terrazzo-lsp ${VERSION}`);
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
console.error(`Unknown command: ${command}`);
|
|
56
|
+
printHelp();
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
void run();
|
|
61
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC;AAC/E,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAChE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE9B;;;;;GAKG;AACH,KAAK,UAAU,GAAG;IAChB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,cAAc,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;YAC3C,MAAM;QACR,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACnC,MAAM;QACR,KAAK,OAAO;YACV,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACjC,MAAM;QACR,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,MAAM;QACR,KAAK,WAAW,CAAC;QACjB,KAAK,IAAI;YACP,OAAO,CAAC,GAAG,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;YACvC,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read JSON artifact files from disk and load them into the token graph.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads files from disk.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import { dirname } from "node:path";
|
|
8
|
+
import { loadArtifact } from "../graph/index.js";
|
|
9
|
+
export async function loadArtifactFiles(paths, graph) {
|
|
10
|
+
for (const p of paths) {
|
|
11
|
+
try {
|
|
12
|
+
const raw = await fs.readFile(p, "utf-8");
|
|
13
|
+
const artifact = JSON.parse(raw);
|
|
14
|
+
loadArtifact(artifact, graph, "", dirname(p));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Skip missing artifacts
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=loadArtifactFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadArtifactFiles.js","sourceRoot":"","sources":["../../../src/cli/loadArtifactFiles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AAGlE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAe,EACf,KAAiB;IAEjB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9C,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Print CLI usage help. */
|
|
2
|
+
export function printHelp() {
|
|
3
|
+
console.log(`terrazzo-lsp — CSS custom property intelligence for design tokens
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
terrazzo-lsp Start LSP server (stdio)
|
|
7
|
+
terrazzo-lsp check [globs] Run diagnostics on CSS files
|
|
8
|
+
terrazzo-lsp status Show config and artifact status
|
|
9
|
+
terrazzo-lsp inspect <var> Inspect a CSS custom property
|
|
10
|
+
terrazzo-lsp resolve <spec> Resolve an import specifier
|
|
11
|
+
terrazzo-lsp graph <file> Show import graph from a file
|
|
12
|
+
|
|
13
|
+
Options:
|
|
14
|
+
--stdio Start LSP server on stdio (default)
|
|
15
|
+
--allow-degraded Keep the server alive without config, with reduced capabilities
|
|
16
|
+
-h, --help Show this help
|
|
17
|
+
-v, --version Show version`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=printHelp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printHelp.js","sourceRoot":"","sources":["../../../src/cli/printHelp.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;6CAc+B,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `check` command — run diagnostics on CSS files and report.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads files, writes to stdout, may exit the process.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { ReachabilityCache, TokenGraph } from "../graph/index.js";
|
|
9
|
+
import { loadConfigFile, resolveConfig } from "../protocol/index.js";
|
|
10
|
+
import { produceDiagnostics } from "../providers/index.js";
|
|
11
|
+
import { DiagnosticSeverity } from "../types/index.js";
|
|
12
|
+
import { expandGlobs } from "./expandGlobs.js";
|
|
13
|
+
import { loadArtifactFiles } from "./loadArtifactFiles.js";
|
|
14
|
+
export async function runCheck(globs, rootDir) {
|
|
15
|
+
const { raw, configDir } = await loadConfigFile(rootDir);
|
|
16
|
+
const config = resolveConfig(raw, configDir ?? rootDir);
|
|
17
|
+
const graph = new TokenGraph();
|
|
18
|
+
const cache = new ReachabilityCache();
|
|
19
|
+
await loadArtifactFiles(config.artifactPaths, graph);
|
|
20
|
+
const patterns = globs.length > 0 ? globs : config.scanGlobs;
|
|
21
|
+
const files = await expandGlobs(patterns, rootDir);
|
|
22
|
+
let errorCount = 0;
|
|
23
|
+
let warningCount = 0;
|
|
24
|
+
for (const file of files) {
|
|
25
|
+
const absPath = resolve(rootDir, file);
|
|
26
|
+
const source = await fs.readFile(absPath, "utf-8");
|
|
27
|
+
const uri = `file://${absPath}`;
|
|
28
|
+
const diagnostics = produceDiagnostics(uri, source, graph, cache, config);
|
|
29
|
+
for (const diag of diagnostics) {
|
|
30
|
+
const severity = diag.severity === DiagnosticSeverity.Error
|
|
31
|
+
? "error"
|
|
32
|
+
: diag.severity === DiagnosticSeverity.Warning
|
|
33
|
+
? "warning"
|
|
34
|
+
: "info";
|
|
35
|
+
if (diag.severity === DiagnosticSeverity.Error)
|
|
36
|
+
errorCount++;
|
|
37
|
+
if (diag.severity === DiagnosticSeverity.Warning)
|
|
38
|
+
warningCount++;
|
|
39
|
+
const loc = `${file}:${diag.range.start.line + 1}:${diag.range.start.character + 1}`;
|
|
40
|
+
console.log(`${loc} ${severity} ${diag.code} ${diag.message}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const total = errorCount + warningCount;
|
|
44
|
+
if (total > 0) {
|
|
45
|
+
console.log(`\n${errorCount} errors, ${warningCount} warnings`);
|
|
46
|
+
process.exit(errorCount > 0 ? 1 : 0);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log("No issues found.");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=runCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runCheck.js","sourceRoot":"","sources":["../../../src/cli/runCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAe,EACf,OAAe;IAEf,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACtC,MAAM,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEnD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,UAAU,OAAO,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAE1E,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK;gBACxC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO;oBAC5C,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,MAAM,CAAC;YAEf,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,KAAK;gBAAE,UAAU,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC,OAAO;gBAAE,YAAY,EAAE,CAAC;YAEjE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,GAAG,YAAY,CAAC;IACxC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,YAAY,YAAY,WAAW,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `graph` command — show the import graph from a file.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads files, writes to stdout/stderr, may exit the process.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { TokenGraph } from "../graph/index.js";
|
|
9
|
+
import buildImportGraph from "../runtime/buildImportGraph.js";
|
|
10
|
+
export async function runGraph(file, rootDir) {
|
|
11
|
+
if (!file) {
|
|
12
|
+
console.error("Usage: terrazzo-lsp graph <file>");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const graph = new TokenGraph();
|
|
16
|
+
const absPath = resolve(rootDir, file);
|
|
17
|
+
const uri = `file://${absPath}`;
|
|
18
|
+
const nodeFs = {
|
|
19
|
+
rootDir,
|
|
20
|
+
async readFile(fileUri) {
|
|
21
|
+
const fsPath = fileUri.startsWith("file://") ? fileUri.slice(7) : fileUri;
|
|
22
|
+
try {
|
|
23
|
+
return await fs.readFile(fsPath, "utf-8");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
await buildImportGraph(uri, graph, nodeFs);
|
|
31
|
+
console.log(`Import graph from ${file}:`);
|
|
32
|
+
for (const [importer, imported] of graph.importEntries()) {
|
|
33
|
+
for (const dep of imported) {
|
|
34
|
+
const short = (s) => s.startsWith("file://") ? s.slice(7).replace(rootDir, ".") : s;
|
|
35
|
+
console.log(` ${short(importer)} → ${short(dep)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
console.log(`\nFiles: ${graph.fileCount}`);
|
|
39
|
+
console.log(`Declarations: ${graph.varCount}`);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=runGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runGraph.js","sourceRoot":"","sources":["../../../src/cli/runGraph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAG9D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAwB,EACxB,OAAe;IAEf,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU,OAAO,EAAE,CAAC;IAEhC,MAAM,MAAM,GAAe;QACzB,OAAO;QACP,KAAK,CAAC,QAAQ,CAAC,OAAe;YAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1E,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;IAEF,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;IAC1C,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `inspect` command — inspect a CSS custom property.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads config + artifacts, writes to stdout/stderr,
|
|
5
|
+
* may exit the process.
|
|
6
|
+
*/
|
|
7
|
+
import { TokenGraph } from "../graph/index.js";
|
|
8
|
+
import { loadConfigFile, resolveConfig } from "../protocol/index.js";
|
|
9
|
+
import { loadArtifactFiles } from "./loadArtifactFiles.js";
|
|
10
|
+
export async function runInspect(cssVar, rootDir) {
|
|
11
|
+
if (!cssVar) {
|
|
12
|
+
console.error("Usage: terrazzo-lsp inspect <--custom-property>");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const { raw, configDir } = await loadConfigFile(rootDir);
|
|
16
|
+
const config = resolveConfig(raw, configDir ?? rootDir);
|
|
17
|
+
const graph = new TokenGraph();
|
|
18
|
+
await loadArtifactFiles(config.artifactPaths, graph);
|
|
19
|
+
const token = graph.resolveToken(cssVar);
|
|
20
|
+
if (token) {
|
|
21
|
+
console.log(JSON.stringify(token, null, 2));
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.log(`Token "${cssVar}" not found in loaded artifacts.`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=runInspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runInspect.js","sourceRoot":"","sources":["../../../src/cli/runInspect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAA0B,EAC1B,OAAe;IAEf,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,MAAM,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,kCAAkC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `install` command — install LSP configuration for an editor.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — writes config files to disk, may exit the process.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from "node:fs/promises";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { dirname, join, resolve } from "node:path";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { findBundledVsixPath, installBundledVscodeExtension, updateVscodeSettings, } from "../extension/index.js";
|
|
11
|
+
const NEOVIM_CONFIG = `-- terrazzo-lsp configuration for Neovim
|
|
12
|
+
-- Add this to your init.lua or lspconfig setup
|
|
13
|
+
--
|
|
14
|
+
-- Requires: bun (recommended) or node >= 22
|
|
15
|
+
-- Update the cmd path to point to your project's dist/esm/cli.js
|
|
16
|
+
require('lspconfig').terrazzo_lsp.setup({
|
|
17
|
+
cmd = { 'bun', 'run', '<path-to-repo>/dist/esm/cli.js', '--stdio' },
|
|
18
|
+
filetypes = { 'css', 'scss', 'json' },
|
|
19
|
+
root_dir = require('lspconfig').util.root_pattern(
|
|
20
|
+
'terrazzo-lsp.config.json', 'package.json', '.git'
|
|
21
|
+
),
|
|
22
|
+
on_attach = function(client, bufnr)
|
|
23
|
+
local o = { buffer = bufnr, noremap = true, silent = true }
|
|
24
|
+
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, o)
|
|
25
|
+
vim.keymap.set('n', 'gr', vim.lsp.buf.references, o)
|
|
26
|
+
vim.keymap.set('n', 'K', vim.lsp.buf.hover, o)
|
|
27
|
+
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, o)
|
|
28
|
+
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, o)
|
|
29
|
+
end,
|
|
30
|
+
})
|
|
31
|
+
`;
|
|
32
|
+
const HELIX_CONFIG = `# terrazzo-lsp configuration for Helix
|
|
33
|
+
# Add this to your ~/.config/helix/languages.toml
|
|
34
|
+
#
|
|
35
|
+
# Requires: bun (recommended) or node >= 22
|
|
36
|
+
# Update the command path to point to your project's dist/esm/cli.js
|
|
37
|
+
|
|
38
|
+
[language-server.terrazzo]
|
|
39
|
+
command = "bun"
|
|
40
|
+
args = ["run", "<path-to-repo>/dist/esm/cli.js", "--stdio"]
|
|
41
|
+
|
|
42
|
+
[[language]]
|
|
43
|
+
name = "css"
|
|
44
|
+
language-servers = ["terrazzo", "vscode-css-language-server"]
|
|
45
|
+
|
|
46
|
+
[[language]]
|
|
47
|
+
name = "scss"
|
|
48
|
+
language-servers = ["terrazzo", "vscode-css-language-server"]
|
|
49
|
+
`;
|
|
50
|
+
/**
|
|
51
|
+
* Install LSP configuration for the specified editor.
|
|
52
|
+
*
|
|
53
|
+
* @note This function is impure — it writes config files.
|
|
54
|
+
*/
|
|
55
|
+
export async function runInstall(editor, rootDir) {
|
|
56
|
+
if (!editor) {
|
|
57
|
+
console.error("Usage: terrazzo-lsp install <editor>\nEditors: neovim, helix, vscode");
|
|
58
|
+
process.exit(1);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
switch (editor) {
|
|
62
|
+
case "neovim": {
|
|
63
|
+
const configDir = join(homedir(), ".config", "nvim", "lsp");
|
|
64
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
65
|
+
const configPath = join(configDir, "terrazzo_lsp.lua");
|
|
66
|
+
await fs.writeFile(configPath, NEOVIM_CONFIG, "utf-8");
|
|
67
|
+
console.log(`Wrote Neovim LSP config to ${configPath}`);
|
|
68
|
+
console.log("Ensure nvim-lspconfig is installed. Update the cmd path in the config.");
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "helix": {
|
|
72
|
+
const configDir = join(homedir(), ".config", "helix");
|
|
73
|
+
const configPath = join(configDir, "languages.toml");
|
|
74
|
+
let existing = "";
|
|
75
|
+
try {
|
|
76
|
+
existing = await fs.readFile(configPath, "utf-8");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// File doesn't exist yet
|
|
80
|
+
}
|
|
81
|
+
if (existing.includes("terrazzo")) {
|
|
82
|
+
console.log(`Helix config at ${configPath} already contains terrazzo configuration.`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
86
|
+
const updated = existing
|
|
87
|
+
? `${existing}\n${HELIX_CONFIG}`
|
|
88
|
+
: HELIX_CONFIG;
|
|
89
|
+
await fs.writeFile(configPath, updated, "utf-8");
|
|
90
|
+
console.log(`Appended terrazzo-lsp config to ${configPath}`);
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case "vscode": {
|
|
95
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
96
|
+
const vsixPath = await findBundledVsixPath(packageRoot);
|
|
97
|
+
const extDir = join(rootDir, ".vscode");
|
|
98
|
+
await fs.mkdir(extDir, { recursive: true });
|
|
99
|
+
const settingsPath = join(extDir, "settings.json");
|
|
100
|
+
let settings = {};
|
|
101
|
+
try {
|
|
102
|
+
const raw = await fs.readFile(settingsPath, "utf-8");
|
|
103
|
+
settings = JSON.parse(raw);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// New file
|
|
107
|
+
}
|
|
108
|
+
if (vsixPath) {
|
|
109
|
+
const installResult = await installBundledVscodeExtension(vsixPath);
|
|
110
|
+
console.log(installResult.message);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.log("Bundled VS Code extension not found. Build it with `bun run build:extension`.");
|
|
114
|
+
}
|
|
115
|
+
settings = updateVscodeSettings(settings);
|
|
116
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
117
|
+
console.log(`Updated VS Code settings at ${settingsPath}`);
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
default:
|
|
121
|
+
console.error(`Unknown editor: ${editor}`);
|
|
122
|
+
console.error("Supported editors: neovim, helix, vscode");
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=runInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runInstall.js","sourceRoot":"","sources":["../../../src/cli/runInstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `resolve` command — resolve an import specifier.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — dynamically imports css module, writes to stdout/stderr,
|
|
5
|
+
* may exit the process.
|
|
6
|
+
*/
|
|
7
|
+
export async function runResolve(specifier, rootDir) {
|
|
8
|
+
if (!specifier) {
|
|
9
|
+
console.error("Usage: terrazzo-lsp resolve <import-specifier>");
|
|
10
|
+
process.exit(1);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const { resolveImportSpecifier } = await import("../css/index.js");
|
|
14
|
+
const resolved = resolveImportSpecifier(specifier, rootDir, rootDir);
|
|
15
|
+
console.log(resolved ?? "(unresolvable)");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=runResolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runResolve.js","sourceRoot":"","sources":["../../../src/cli/runResolve.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA6B,EAC7B,OAAe;IAEf,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `status` command — show current config and artifact status.
|
|
3
|
+
*
|
|
4
|
+
* @note Impure — reads config, writes to stdout.
|
|
5
|
+
*/
|
|
6
|
+
import { loadConfigFile, resolveConfig } from "../protocol/index.js";
|
|
7
|
+
export async function runStatus(rootDir) {
|
|
8
|
+
const { raw, configDir } = await loadConfigFile(rootDir);
|
|
9
|
+
const config = resolveConfig(raw, configDir ?? rootDir);
|
|
10
|
+
console.log("terrazzo-lsp status");
|
|
11
|
+
console.log("---");
|
|
12
|
+
console.log(`Root: ${rootDir}`);
|
|
13
|
+
console.log(`Dist: ${config.distDir}`);
|
|
14
|
+
console.log(`Artifacts: ${config.artifactPaths.length > 0 ? config.artifactPaths.join(", ") : "(none)"}`);
|
|
15
|
+
console.log(`Scan globs: ${config.scanGlobs.join(", ")}`);
|
|
16
|
+
console.log(`Global CSS: ${config.globalStylesheets === null ? "(auto)" : config.globalStylesheets.join(", ") || "(none)"}`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=runStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runStatus.js","sourceRoot":"","sources":["../../../src/cli/runStatus.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC9F,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAChH,CAAC;AACJ,CAAC"}
|
package/dist/esm/cli.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,8DAA8D;AAC9D,OAAO,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @note impure — mutates the colorjs.io global ColorSpace registry.
|
|
3
|
+
*/
|
|
4
|
+
import { ColorSpace, OKLCH, sRGB } from "colorjs.io/fn";
|
|
5
|
+
let isRegistered = false;
|
|
6
|
+
export default function ensureColorSetup() {
|
|
7
|
+
if (isRegistered)
|
|
8
|
+
return;
|
|
9
|
+
ColorSpace.register(sRGB);
|
|
10
|
+
ColorSpace.register(OKLCH);
|
|
11
|
+
isRegistered = true;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=colorSetup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorSetup.js","sourceRoot":"","sources":["../../../src/css/colorSetup.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAExD,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,IAAI,YAAY;QAAE,OAAO;IACzB,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import extractCssImports from "./imports/extractCssImports.js";
|
|
2
|
+
import extractJsImports from "./imports/extractJsImports.js";
|
|
3
|
+
import extractPackageName from "./imports/extractPackageName.js";
|
|
4
|
+
import formatFileUri from "./imports/formatFileUri.js";
|
|
5
|
+
import isExternalPath from "./imports/isExternalPath.js";
|
|
6
|
+
import parseFileUri from "./imports/parseFileUri.js";
|
|
7
|
+
import resolveImportSpecifier from "./imports/resolveImportSpecifier.js";
|
|
8
|
+
import scanDeclarations from "./scanners/scanDeclarations.js";
|
|
9
|
+
import scanProperties from "./scanners/scanProperties.js";
|
|
10
|
+
import scanUsages from "./scanners/scanUsages.js";
|
|
11
|
+
export default function createDocumentIndex(options) {
|
|
12
|
+
const { fileUri, rootDir, source, tree } = options;
|
|
13
|
+
const path = parseFileUri(fileUri);
|
|
14
|
+
return {
|
|
15
|
+
declarations: scanDeclarations(source, fileUri, tree),
|
|
16
|
+
file: {
|
|
17
|
+
uri: fileUri,
|
|
18
|
+
path,
|
|
19
|
+
isExternal: isExternalPath(path),
|
|
20
|
+
packageName: isExternalPath(path) ? extractPackageName(path) : null,
|
|
21
|
+
},
|
|
22
|
+
importedUris: rootDir
|
|
23
|
+
? resolveImportedUris(source, tree, path, rootDir)
|
|
24
|
+
: [],
|
|
25
|
+
properties: scanProperties(source, fileUri, tree),
|
|
26
|
+
usages: scanUsages(source, fileUri, tree),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function resolveImportedUris(source, tree, importerPath, rootDir) {
|
|
30
|
+
const importedUris = new Set();
|
|
31
|
+
const specifiers = [
|
|
32
|
+
...extractCssImports(source, tree),
|
|
33
|
+
...extractJsImports(source),
|
|
34
|
+
];
|
|
35
|
+
for (const specifier of specifiers) {
|
|
36
|
+
const resolvedPath = resolveImportSpecifier(specifier, importerPath, rootDir);
|
|
37
|
+
if (resolvedPath) {
|
|
38
|
+
importedUris.add(formatFileUri(resolvedPath));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return [...importedUris];
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=createDocumentIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createDocumentIndex.js","sourceRoot":"","sources":["../../../src/css/createDocumentIndex.ts"],"names":[],"mappings":"AASA,OAAO,iBAAiB,MAAM,gCAAgC,CAAC;AAC/D,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAC7D,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,sBAAsB,MAAM,qCAAqC,CAAC;AAEzE,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,cAAc,MAAM,8BAA8B,CAAC;AAC1D,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAiBlD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CACzC,OAAmC;IAEnC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACnD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEnC,OAAO;QACL,YAAY,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;QACrD,IAAI,EAAE;YACJ,GAAG,EAAE,OAAO;YACZ,IAAI;YACJ,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC;YAChC,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;SACpE;QACD,YAAY,EAAE,OAAO;YACnB,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;YAClD,CAAC,CAAC,EAAE;QACN,UAAU,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;QACjD,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAc,EACd,IAAU,EACV,YAAoB,EACpB,OAAe;IAEf,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,UAAU,GAAG;QACjB,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC;QAClC,GAAG,gBAAgB,CAAC,MAAM,CAAC;KAC5B,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,sBAAsB,CACzC,SAAS,EACT,YAAY,EACZ,OAAO,CACR,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as lezer from "../lezer/index.js";
|
|
2
|
+
/** Extract CSS @import paths from CSS/SCSS source text. */
|
|
3
|
+
export default function extractCssImports(source, tree) {
|
|
4
|
+
const results = [];
|
|
5
|
+
const parsed = tree ?? lezer.parseCSS(source);
|
|
6
|
+
visit(parsed.topNode, (node) => {
|
|
7
|
+
if (node.name !== "ImportStatement")
|
|
8
|
+
return;
|
|
9
|
+
const stringNode = node.getChild("StringLiteral");
|
|
10
|
+
if (stringNode) {
|
|
11
|
+
results.push(stripQuotes(lezer.getNodeText(source, stringNode)));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const callNode = node.getChild("CallLiteral");
|
|
15
|
+
if (!callNode)
|
|
16
|
+
return;
|
|
17
|
+
const callString = callNode.getChild("StringLiteral");
|
|
18
|
+
if (callString) {
|
|
19
|
+
results.push(stripQuotes(lezer.getNodeText(source, callString)));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const raw = lezer.getNodeText(source, callNode).trim();
|
|
23
|
+
const inner = raw
|
|
24
|
+
.replace(/^url\(/i, "")
|
|
25
|
+
.replace(/\)$/, "")
|
|
26
|
+
.trim();
|
|
27
|
+
if (inner)
|
|
28
|
+
results.push(stripQuotes(inner));
|
|
29
|
+
});
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
function stripQuotes(value) {
|
|
33
|
+
return value.replace(/^['"]|['"]$/g, "").trim();
|
|
34
|
+
}
|
|
35
|
+
function visit(node, onNode) {
|
|
36
|
+
onNode(node);
|
|
37
|
+
for (let child = node.firstChild; child; child = child.nextSibling) {
|
|
38
|
+
visit(child, onNode);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=extractCssImports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractCssImports.js","sourceRoot":"","sources":["../../../../src/css/imports/extractCssImports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,2DAA2D;AAC3D,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACvC,MAAc,EACd,IAAW;IAEX,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE9C,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;YAAE,OAAO;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG;aACd,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;aACtB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;aAClB,IAAI,EAAE,CAAC;QACV,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,KAAK,CACZ,IAA4C,EAC5C,MAA8D;IAE9D,MAAM,CAAC,IAAI,CAAC,CAAC;IACb,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|