fix(core): re-expose strip-source-code (#18955)

This commit is contained in:
Jason Jean 2023-09-01 12:11:45 -04:00 committed by GitHub
parent 193206ac86
commit 610ac979f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 179 additions and 171 deletions

View File

@ -0,0 +1,178 @@
import type { Scanner } from 'typescript';
let SyntaxKind: typeof import('typescript').SyntaxKind;
/**
* @deprecated This is deprecated and will be removed in Nx 18.
* This was not intended to be exposed.
* Please talk to us if you need this.
*/
export function stripSourceCode(scanner: Scanner, contents: string): string {
if (!SyntaxKind) {
SyntaxKind = require('typescript').SyntaxKind;
}
if (contents.indexOf('loadChildren') > -1) {
return contents;
}
scanner.setText(contents);
let token = scanner.scan();
let lastNonTriviaToken = SyntaxKind.Unknown;
const statements = [];
const templateStack = [];
let ignoringLine = false;
let braceDepth = 0;
let start = null;
while (token !== SyntaxKind.EndOfFileToken) {
const currentToken = token;
const potentialStart = scanner.getStartPos();
switch (token) {
case SyntaxKind.MultiLineCommentTrivia:
case SyntaxKind.SingleLineCommentTrivia: {
const isMultiLineCommentTrivia =
token === SyntaxKind.MultiLineCommentTrivia;
const start = potentialStart + 2;
token = scanner.scan();
const end = scanner.getStartPos() - (isMultiLineCommentTrivia ? 2 : 0);
const comment = contents.substring(start, end).trim();
if (comment === 'nx-ignore-next-line') {
// reading till the end of the line
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
ignoringLine = true;
}
break;
}
case SyntaxKind.NewLineTrivia: {
ignoringLine = false;
token = scanner.scan();
break;
}
case SyntaxKind.RequireKeyword:
case SyntaxKind.ImportKeyword: {
token = scanner.scan();
if (ignoringLine) {
break;
}
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
start = potentialStart;
break;
}
case SyntaxKind.TemplateHead: {
templateStack.push(braceDepth);
braceDepth = 0;
token = scanner.scan();
break;
}
case SyntaxKind.SlashToken: {
if (shouldRescanSlashToken(lastNonTriviaToken)) {
token = scanner.reScanSlashToken();
}
token = scanner.scan();
break;
}
case SyntaxKind.OpenBraceToken: {
++braceDepth;
token = scanner.scan();
break;
}
case SyntaxKind.CloseBraceToken: {
if (braceDepth) {
--braceDepth;
} else if (templateStack.length) {
token = scanner.reScanTemplateToken(false);
if (token === SyntaxKind.LastTemplateToken) {
braceDepth = templateStack.pop();
}
}
token = scanner.scan();
break;
}
case SyntaxKind.ExportKeyword: {
token = scanner.scan();
if (ignoringLine) {
break;
}
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
if (
token === SyntaxKind.OpenBraceToken ||
token === SyntaxKind.AsteriskToken ||
token === SyntaxKind.TypeKeyword
) {
start = potentialStart;
}
break;
}
case SyntaxKind.StringLiteral: {
if (start !== null) {
token = scanner.scan();
if (token === SyntaxKind.CloseParenToken) {
token = scanner.scan();
}
const end = scanner.getStartPos();
statements.push(contents.substring(start, end));
start = null;
} else {
token = scanner.scan();
}
break;
}
default: {
token = scanner.scan();
}
}
if (currentToken > SyntaxKind.LastTriviaToken) {
lastNonTriviaToken = currentToken;
}
}
return statements.join('\n');
}
function shouldRescanSlashToken(
lastNonTriviaToken: import('typescript').SyntaxKind
) {
switch (lastNonTriviaToken) {
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.BigIntLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.ThisKeyword:
case SyntaxKind.PlusPlusToken:
case SyntaxKind.MinusMinusToken:
case SyntaxKind.CloseParenToken:
case SyntaxKind.CloseBracketToken:
case SyntaxKind.CloseBraceToken:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
return false;
default:
return true;
}
}

View File

@ -9,8 +9,7 @@ import type {
import * as path from 'path'; import * as path from 'path';
import { DependencyType } from '../../../../config/project-graph'; import { DependencyType } from '../../../../config/project-graph';
import { defaultFileRead } from '../../../../project-graph/file-utils'; import { defaultFileRead } from '../../../../project-graph/file-utils';
import { stripSourceCode } from './strip-source-code';
let SyntaxKind: typeof import('typescript').SyntaxKind;
let tsModule: typeof import('typescript'); let tsModule: typeof import('typescript');
@ -174,172 +173,3 @@ export class TypeScriptImportLocator {
return node.getText().slice(1, -1); return node.getText().slice(1, -1);
} }
} }
function shouldRescanSlashToken(
lastNonTriviaToken: import('typescript').SyntaxKind
) {
switch (lastNonTriviaToken) {
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.BigIntLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.ThisKeyword:
case SyntaxKind.PlusPlusToken:
case SyntaxKind.MinusMinusToken:
case SyntaxKind.CloseParenToken:
case SyntaxKind.CloseBracketToken:
case SyntaxKind.CloseBraceToken:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
return false;
default:
return true;
}
}
export function stripSourceCode(scanner: Scanner, contents: string): string {
if (!SyntaxKind) {
SyntaxKind = require('typescript').SyntaxKind;
}
if (contents.indexOf('loadChildren') > -1) {
return contents;
}
scanner.setText(contents);
let token = scanner.scan();
let lastNonTriviaToken = SyntaxKind.Unknown;
const statements = [];
const templateStack = [];
let ignoringLine = false;
let braceDepth = 0;
let start = null;
while (token !== SyntaxKind.EndOfFileToken) {
const currentToken = token;
const potentialStart = scanner.getStartPos();
switch (token) {
case SyntaxKind.MultiLineCommentTrivia:
case SyntaxKind.SingleLineCommentTrivia: {
const isMultiLineCommentTrivia =
token === SyntaxKind.MultiLineCommentTrivia;
const start = potentialStart + 2;
token = scanner.scan();
const end = scanner.getStartPos() - (isMultiLineCommentTrivia ? 2 : 0);
const comment = contents.substring(start, end).trim();
if (comment === 'nx-ignore-next-line') {
// reading till the end of the line
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
ignoringLine = true;
}
break;
}
case SyntaxKind.NewLineTrivia: {
ignoringLine = false;
token = scanner.scan();
break;
}
case SyntaxKind.RequireKeyword:
case SyntaxKind.ImportKeyword: {
token = scanner.scan();
if (ignoringLine) {
break;
}
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
start = potentialStart;
break;
}
case SyntaxKind.TemplateHead: {
templateStack.push(braceDepth);
braceDepth = 0;
token = scanner.scan();
break;
}
case SyntaxKind.SlashToken: {
if (shouldRescanSlashToken(lastNonTriviaToken)) {
token = scanner.reScanSlashToken();
}
token = scanner.scan();
break;
}
case SyntaxKind.OpenBraceToken: {
++braceDepth;
token = scanner.scan();
break;
}
case SyntaxKind.CloseBraceToken: {
if (braceDepth) {
--braceDepth;
} else if (templateStack.length) {
token = scanner.reScanTemplateToken(false);
if (token === SyntaxKind.LastTemplateToken) {
braceDepth = templateStack.pop();
}
}
token = scanner.scan();
break;
}
case SyntaxKind.ExportKeyword: {
token = scanner.scan();
if (ignoringLine) {
break;
}
while (
token === SyntaxKind.WhitespaceTrivia ||
token === SyntaxKind.NewLineTrivia
) {
token = scanner.scan();
}
if (
token === SyntaxKind.OpenBraceToken ||
token === SyntaxKind.AsteriskToken ||
token === SyntaxKind.TypeKeyword
) {
start = potentialStart;
}
break;
}
case SyntaxKind.StringLiteral: {
if (start !== null) {
token = scanner.scan();
if (token === SyntaxKind.CloseParenToken) {
token = scanner.scan();
}
const end = scanner.getStartPos();
statements.push(contents.substring(start, end));
start = null;
} else {
token = scanner.scan();
}
break;
}
default: {
token = scanner.scan();
}
}
if (currentToken > SyntaxKind.LastTriviaToken) {
lastNonTriviaToken = currentToken;
}
}
return statements.join('\n');
}