Skip to content

Mixing JSDoc + Typescript #916

@edflips

Description

@edflips

Hey 👋

I've been adding TS and Glint to a large, messy codebase which has some JSDoc annotations around the place, so I'm focussed on interop between the two. I've noticed that with "allowJs": true set in tsconfig.json that running Glint from the CLI throws an error. See the bottom for that error.

This is using:

    "@glint/core": "^1.5.2",
    "@glint/environment-ember-loose": "^1.5.2",
    "@glint/template": "^1.5.2",

Ember 3.28

From a little digging it looks like in /packages/core/src/transform/template/rewrite-module.ts in calculateTransformedSource the span starts in the wrong place. Changing it to this resolves it.

function calculateTransformedSource(originalFile, sparseSpans) {
    let correlatedSpans = [];
    let originalOffset = 0;
    let transformedOffset = 0;
    for (let span of sparseSpans) {
        let interstitial = originalFile.contents.slice(originalOffset, span.insertionPoint);
        if (interstitial.length) {
    correlatedSpans.push({
                originalFile,
                originalStart: originalOffset,
                originalLength: interstitial.length,
                insertionPoint: originalOffset,
                transformedStart: transformedOffset,
                transformedLength: interstitial.length,
                transformedSource: interstitial,
            });
        }
        correlatedSpans.push(span);
        transformedOffset += interstitial.length + span.transformedLength;
        originalOffset +=
            interstitial.length + (span.originalFile === originalFile ? span.originalLength : 0);
    }
    let trailingContent = originalFile.contents.slice(originalOffset);
+    const trailingStart = trailingContent.length === 0 ? transformedOffset - 1 : transformedOffset;
+    const trailingLength = trailingContent.length === 0 ? 1 : trailingContent.length;
    correlatedSpans.push({
        originalFile,
        originalStart: originalOffset,
-      originalLength: trailingContent.length + 1
+      originalLength: trailingLength,
        insertionPoint: originalOffset,
-      transformedStart: transformedOffset,
+     transformedStart: trailingStart,
-      transformedLength: trailingContent.length + 1,
+     transformedLength: trailingLength,
        transformedSource: trailingContent,
    });
    return {
        contents: correlatedSpans.map((span) => span.transformedSource).join(''),
        correlatedSpans,
    };
}

The original error

file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/transform/util.js:6
        throw new Error(typeof message === 'string' ? message : message());
              ^

Error: Internal error: offset out of bounds
    at assert (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/transform/util.js:6:15)
    at TransformedModule.determineOriginalOffsetAndSpan (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/transform/template/transformed-module.js:98:9)
    at TransformedModule.getOriginalRange (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/transform/template/transformed-module.js:37:28)
    at rewriteDiagnostic (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/transform/diagnostics/rewrite-diagnostic.js:17:61)
    at TransformManager.rewriteDiagnostic (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/common/transform-manager.js:234:35)
    at TransformManager.rewriteDiagnostics (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/common/transform-manager.js:127:66)
    at performCheck (file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/cli/perform-check.js:27:44)
    at file:///Users/edflips/apps/oops/frontend/node_modules/@glint/core/lib/cli/index.js:117:9
    at ModuleJob.run (node:internal/modules/esm/module_job:195:25)
    at async ModuleLoader.import (node:internal/modules/esm/loader:336:24)

Node.js v18.19.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions