113 lines
5.4 KiB
Plaintext
113 lines
5.4 KiB
Plaintext
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.editShouldBeInFrontmatter = exports.getOpenFrontmatterEdit = exports.getNewFrontmatterEdit = exports.ensureRangeIsInFrontmatter = exports.ensureProperEditForFrontmatter = exports.isInsideFrontmatter = exports.isInsideExpression = exports.isInComponentStartTag = exports.isPossibleComponent = exports.isJSDocument = void 0;
|
|
const vscode_html_languageservice_1 = require("vscode-html-languageservice");
|
|
function isJSDocument(languageId) {
|
|
return (languageId === 'javascript' ||
|
|
languageId === 'typescript' ||
|
|
languageId === 'javascriptreact' ||
|
|
languageId === 'typescriptreact');
|
|
}
|
|
exports.isJSDocument = isJSDocument;
|
|
/**
|
|
* Return true if a specific node could be a component.
|
|
* This is not a 100% sure test as it'll return false for any component that does not match the standard format for a component
|
|
*/
|
|
function isPossibleComponent(node) {
|
|
return !!node.tag?.[0].match(/[A-Z]/) || !!node.tag?.match(/.+[.][A-Z]?/);
|
|
}
|
|
exports.isPossibleComponent = isPossibleComponent;
|
|
/**
|
|
* Return if a given offset is inside the start tag of a component
|
|
*/
|
|
function isInComponentStartTag(html, offset) {
|
|
const node = html.findNodeAt(offset);
|
|
return isPossibleComponent(node) && (!node.startTagEnd || offset < node.startTagEnd);
|
|
}
|
|
exports.isInComponentStartTag = isInComponentStartTag;
|
|
/**
|
|
* Return if a given position is inside a JSX expression
|
|
*/
|
|
function isInsideExpression(html, tagStart, position) {
|
|
const charactersInNode = html.substring(tagStart, position);
|
|
return charactersInNode.lastIndexOf('{') > charactersInNode.lastIndexOf('}');
|
|
}
|
|
exports.isInsideExpression = isInsideExpression;
|
|
/**
|
|
* Return if a given offset is inside the frontmatter
|
|
*/
|
|
function isInsideFrontmatter(offset, frontmatter) {
|
|
switch (frontmatter.status) {
|
|
case 'closed':
|
|
return offset > frontmatter.position.start.offset && offset < frontmatter.position.end.offset;
|
|
case 'open':
|
|
return offset > frontmatter.position.start.offset;
|
|
case 'doesnt-exist':
|
|
return false;
|
|
}
|
|
}
|
|
exports.isInsideFrontmatter = isInsideFrontmatter;
|
|
function ensureProperEditForFrontmatter(edit, metadata, newLine, position = 'top') {
|
|
switch (metadata.frontmatter.status) {
|
|
case 'open':
|
|
return getOpenFrontmatterEdit(edit, metadata, newLine);
|
|
case 'closed':
|
|
const newRange = ensureRangeIsInFrontmatter(edit.range, metadata, position);
|
|
return {
|
|
newText: newRange.start.line === metadata.frontmatter.position.start.line &&
|
|
edit.newText.startsWith(newLine)
|
|
? edit.newText.trimStart()
|
|
: edit.newText,
|
|
range: newRange,
|
|
};
|
|
case 'doesnt-exist':
|
|
return getNewFrontmatterEdit(edit, metadata, newLine);
|
|
}
|
|
}
|
|
exports.ensureProperEditForFrontmatter = ensureProperEditForFrontmatter;
|
|
/**
|
|
* Force a range to be at the start of the frontmatter if it is outside
|
|
*/
|
|
function ensureRangeIsInFrontmatter(range, metadata, position = 'top') {
|
|
if (metadata.frontmatter.status === 'open' || metadata.frontmatter.status === 'closed') {
|
|
const frontmatterEndPosition = metadata.frontmatter.position.end
|
|
? metadata.tsxRanges.frontmatter.end
|
|
: undefined;
|
|
// If the range start is outside the frontmatter, return a range at the start of the frontmatter
|
|
if (range.start.line < metadata.tsxRanges.frontmatter.start.line ||
|
|
(frontmatterEndPosition && range.start.line > frontmatterEndPosition.line)) {
|
|
if (frontmatterEndPosition && position === 'bottom') {
|
|
return vscode_html_languageservice_1.Range.create(frontmatterEndPosition, frontmatterEndPosition);
|
|
}
|
|
return vscode_html_languageservice_1.Range.create(metadata.tsxRanges.frontmatter.start, metadata.tsxRanges.frontmatter.start);
|
|
}
|
|
return range;
|
|
}
|
|
return range;
|
|
}
|
|
exports.ensureRangeIsInFrontmatter = ensureRangeIsInFrontmatter;
|
|
function getNewFrontmatterEdit(edit, astroMetadata, newLine) {
|
|
edit.newText = `---${edit.newText.startsWith(newLine) ? '' : newLine}${edit.newText}---${newLine}${newLine}`;
|
|
edit.range = vscode_html_languageservice_1.Range.create(astroMetadata.tsxRanges.frontmatter.start, astroMetadata.tsxRanges.frontmatter.start);
|
|
return edit;
|
|
}
|
|
exports.getNewFrontmatterEdit = getNewFrontmatterEdit;
|
|
function getOpenFrontmatterEdit(edit, astroMetadata, newLine) {
|
|
edit.newText = edit.newText.startsWith(newLine)
|
|
? `${edit.newText}---`
|
|
: `${newLine}${edit.newText}---`;
|
|
edit.range = vscode_html_languageservice_1.Range.create(astroMetadata.tsxRanges.frontmatter.start, astroMetadata.tsxRanges.frontmatter.start);
|
|
return edit;
|
|
}
|
|
exports.getOpenFrontmatterEdit = getOpenFrontmatterEdit;
|
|
// Most edits that are at the beginning of the TSX, or outside the document are intended for the frontmatter
|
|
function editShouldBeInFrontmatter(range, astroMetadata) {
|
|
const isAtTSXStart = range.start.line < astroMetadata.tsxRanges.frontmatter.start.line;
|
|
const isPastFile = range.start.line > astroMetadata.tsxRanges.body.end.line;
|
|
const shouldIt = isAtTSXStart || isPastFile;
|
|
return shouldIt
|
|
? { itShould: true, position: isPastFile ? 'bottom' : 'top' }
|
|
: { itShould: false, position: undefined };
|
|
}
|
|
exports.editShouldBeInFrontmatter = editShouldBeInFrontmatter;
|
|
//# sourceMappingURL=utils.js.map |