97 lines
3.5 KiB
Plaintext
97 lines
3.5 KiB
Plaintext
import path from "path";
|
|
let ts;
|
|
let info;
|
|
let appDirRegExp;
|
|
export function log(message) {
|
|
info.project.projectService.logger.info(message);
|
|
}
|
|
// This function has to be called initially.
|
|
export function init(opts) {
|
|
ts = opts.ts;
|
|
info = opts.info;
|
|
const projectDir = info.project.getCurrentDirectory();
|
|
appDirRegExp = new RegExp("^" + (projectDir + "(/src)?/app").replace(/[\\/]/g, "[\\/]"));
|
|
log("Starting Next.js TypeScript plugin: " + projectDir);
|
|
}
|
|
export function getTs() {
|
|
return ts;
|
|
}
|
|
export function getInfo() {
|
|
return info;
|
|
}
|
|
export function getTypeChecker() {
|
|
var _info_languageService_getProgram;
|
|
return (_info_languageService_getProgram = info.languageService.getProgram()) == null ? void 0 : _info_languageService_getProgram.getTypeChecker();
|
|
}
|
|
export function getSource(fileName) {
|
|
var _info_languageService_getProgram;
|
|
return (_info_languageService_getProgram = info.languageService.getProgram()) == null ? void 0 : _info_languageService_getProgram.getSourceFile(fileName);
|
|
}
|
|
export function removeStringQuotes(str) {
|
|
return str.replace(/^['"`]|['"`]$/g, "");
|
|
}
|
|
export const isPositionInsideNode = (position, node)=>{
|
|
const start = node.getFullStart();
|
|
return start <= position && position <= node.getFullWidth() + start;
|
|
};
|
|
export const isDefaultFunctionExport = (node)=>{
|
|
if (ts.isFunctionDeclaration(node)) {
|
|
let hasExportKeyword = false;
|
|
let hasDefaultKeyword = false;
|
|
if (node.modifiers) {
|
|
for (const modifier of node.modifiers){
|
|
if (modifier.kind === ts.SyntaxKind.ExportKeyword) {
|
|
hasExportKeyword = true;
|
|
} else if (modifier.kind === ts.SyntaxKind.DefaultKeyword) {
|
|
hasDefaultKeyword = true;
|
|
}
|
|
}
|
|
}
|
|
// `export default function`
|
|
if (hasExportKeyword && hasDefaultKeyword) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
export const isInsideApp = (filePath)=>{
|
|
return appDirRegExp.test(filePath);
|
|
};
|
|
export const isAppEntryFile = (filePath)=>{
|
|
return appDirRegExp.test(filePath) && /^(page|layout)\.(mjs|js|jsx|ts|tsx)$/.test(path.basename(filePath));
|
|
};
|
|
export const isPageFile = (filePath)=>{
|
|
return appDirRegExp.test(filePath) && /^page\.(mjs|js|jsx|ts|tsx)$/.test(path.basename(filePath));
|
|
};
|
|
// Check if a module is a client entry.
|
|
export function getIsClientEntry(fileName, throwOnInvalidDirective) {
|
|
const source = getSource(fileName);
|
|
if (source) {
|
|
let isClientEntry = false;
|
|
let isDirective = true;
|
|
ts.forEachChild(source, (node)=>{
|
|
if (ts.isExpressionStatement(node) && ts.isStringLiteral(node.expression)) {
|
|
if (node.expression.text === "use client") {
|
|
if (isDirective) {
|
|
isClientEntry = true;
|
|
} else {
|
|
if (throwOnInvalidDirective) {
|
|
const e = {
|
|
messageText: 'The `"use client"` directive must be put at the top of the file.',
|
|
start: node.expression.getStart(),
|
|
length: node.expression.getWidth()
|
|
};
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
isDirective = false;
|
|
}
|
|
});
|
|
return isClientEntry;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//# sourceMappingURL=utils.js.map |