@travetto/transformer
Advanced tools
Comparing version 1.1.1 to 2.0.0-alpha.1
@@ -10,3 +10,3 @@ { | ||
"dependencies": { | ||
"@travetto/base": "^1.1.1" | ||
"@travetto/base": "^2.0.0-alpha.1" | ||
}, | ||
@@ -26,4 +26,4 @@ "title": "Transformation", | ||
"src", | ||
"support", | ||
"tsconfig.json" | ||
"test-support", | ||
"support" | ||
], | ||
@@ -35,4 +35,4 @@ "name": "@travetto/transformer", | ||
}, | ||
"version": "1.1.1", | ||
"gitHead": "6c99d86d8962c547025235b56e7c28ac2604c0fb" | ||
"version": "2.0.0-alpha.1", | ||
"gitHead": "a3b2c1e550fdc551138c1e1f396718760cd18007" | ||
} |
<!-- This file was generated by the framweork and should not be modified directly --> | ||
<!-- Please modify https://github.com/travetto/travetto/tree/master/module/transformer/DOCS.js and execute "npm run docs" to rebuild --> | ||
<!-- Please modify https://github.com/travetto/travetto/tree/master/module/transformer/doc.ts and execute "npm run docs" to rebuild --> | ||
# Transformation | ||
@@ -25,7 +25,7 @@ ## Functionality for AST transformations, with transformer registration, and general utils | ||
import { OnProperty, TransformerState, OnMethod, OnClass } from '@travetto/transformer'; | ||
import { OnProperty, TransformerState, OnMethod, OnClass, TransformerId } from '@travetto/transformer'; | ||
export class MakeUpper { | ||
static key = '@trv:transformer-test'; | ||
static [TransformerId] = '@trv:transformer-test'; | ||
@@ -32,0 +32,0 @@ @OnProperty() |
@@ -5,2 +5,3 @@ import * as ts from 'typescript'; | ||
import { FsUtil } from '@travetto/boot'; | ||
import { SystemUtil } from '@travetto/base/src/internal/system'; | ||
@@ -17,3 +18,2 @@ import { AnyType, ExternalType } from './resolver/types'; | ||
private newImports = new Map<string, Import>(); | ||
@@ -42,3 +42,5 @@ private imports: Map<string, Import>; | ||
*/ | ||
importFile(file: string) { | ||
importFile(file: string, base?: string) { | ||
file = SystemUtil.convertFileToModule(file, base); | ||
if (!file.endsWith('.d.ts') && !this.newImports.has(file)) { | ||
@@ -65,3 +67,3 @@ const id = this.getId(file); | ||
if (type.key === 'external' && type.source && type.source !== this.source.fileName) { | ||
this.importFile(type.source); | ||
this.importFile(type.source, this.source.fileName); | ||
} | ||
@@ -91,3 +93,3 @@ switch (type.key) { | ||
this.factory.createImportClause(false, undefined, this.factory.createNamespaceImport(ident)), | ||
this.factory.createStringLiteral(path.replace(/^.*node_modules\//, '').replace(FsUtil.cwd, '@app')) | ||
this.factory.createStringLiteral(path) | ||
); | ||
@@ -102,3 +104,3 @@ return imptStmt; | ||
} catch (err) { // Missing import | ||
const out = new Error(`${err.message} in ${file.fileName.replace(`${FsUtil.cwd}/`, '')}`); | ||
const out = new Error(`${err.message} in ${file.fileName.replace(FsUtil.cwd, '.')}`); | ||
out.stack = err.stack; | ||
@@ -123,3 +125,3 @@ throw out; | ||
} else { | ||
const { ident } = this.imports.get(type.source) ?? this.importFile(type.source); | ||
const { ident } = this.imports.get(type.source) ?? this.importFile(type.source, this.source.fileName); | ||
return factory.createPropertyAccessExpression(ident, type.name!); | ||
@@ -126,0 +128,0 @@ } |
import * as ts from 'typescript'; | ||
import { DecoratorMeta, NodeTransformer, State, TransformPhase, TransformerType, Transformer } from './types/visitor'; | ||
import { DecoratorMeta, NodeTransformer, State, TransformPhase, TransformerType, Transformer, TransformerId } from './types/visitor'; | ||
const HANDLERS = Symbol.for('@trv:transformer/handlers'); | ||
const HandlersProp = Symbol.for('@trv:transformer/handlers'); | ||
type TransformerWithHandlers = Transformer & { [HANDLERS]?: NodeTransformer[] }; | ||
type TransformerWithHandlers = Transformer & { [HandlersProp]?: NodeTransformer[] }; | ||
@@ -12,4 +12,4 @@ /** | ||
*/ | ||
export function getAllTransformers(obj: any) { | ||
return Object.values(obj).flatMap((x: any) => x[HANDLERS] as NodeTransformer[] ?? []); | ||
export function getAllTransformers(obj: Record<string, { [HandlersProp]?: NodeTransformer[] }>) { | ||
return Object.values(obj).flatMap(x => x[HandlersProp] ?? []); | ||
} | ||
@@ -20,6 +20,7 @@ | ||
if (target) { | ||
target = target.map(x => x.startsWith('@') ? x : `${cls.key}/${x}`); | ||
const ns = cls[TransformerId].split('/')[0]; // Everything before the '/' | ||
target = target.map(x => x.startsWith('@') ? x : `${ns}/${x}`); | ||
} | ||
cls[HANDLERS] = cls[HANDLERS] ?? []; | ||
cls[HANDLERS]!.push({ key: `${cls.key}/${fn.name}`, [phase]: fn.bind(cls), type, target }); | ||
cls[HandlersProp] = cls[HandlersProp] ?? []; | ||
cls[HandlersProp]!.push({ key: `${cls[TransformerId]}/${fn.name}`, [phase]: fn.bind(cls), type, target }); | ||
} | ||
@@ -32,3 +33,3 @@ | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.CallExpression) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.CallExpression) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'call', target); | ||
@@ -42,3 +43,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.FunctionDeclaration) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.FunctionDeclaration | ts.FunctionExpression) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'function', target); | ||
@@ -52,3 +53,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.ParameterDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.ParameterDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'parameter', target); | ||
@@ -62,3 +63,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.PropertyDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.PropertyDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'property', target); | ||
@@ -72,3 +73,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'method', target); | ||
@@ -82,3 +83,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'static-method', target); | ||
@@ -92,3 +93,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.ClassDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.ClassDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'before', 'class', target); | ||
@@ -102,3 +103,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.CallExpression, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.CallExpression, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'call', target); | ||
@@ -112,3 +113,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.FunctionDeclaration) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.FunctionDeclaration | ts.FunctionExpression) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'function', target); | ||
@@ -122,3 +123,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.ParameterDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.ParameterDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'parameter', target); | ||
@@ -132,3 +133,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.PropertyDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.PropertyDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'property', target); | ||
@@ -142,3 +143,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'method', target); | ||
@@ -152,3 +153,3 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.MethodDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'static-method', target); | ||
@@ -162,4 +163,4 @@ } | ||
return <S extends State = State, R extends ts.Node = ts.Node>( | ||
inst: Transformer, __: any, d: TypedPropertyDescriptor<(state: S, node: ts.ClassDeclaration, dm?: DecoratorMeta) => R> | ||
inst: Transformer, __: unknown, d: TypedPropertyDescriptor<(state: S, node: ts.ClassDeclaration, dm?: DecoratorMeta) => R> | ||
) => storeHandler(inst, d.value!, 'after', 'class', target); | ||
} |
@@ -206,3 +206,3 @@ /* eslint-disable no-bitwise */ | ||
const sourceFile = DeclarationUtil.getDeclarations(type) | ||
?.find(x => ts.getAllJSDocTags(x, (t): t is any => t.tagName.getText() === 'concrete').length) | ||
?.find(x => ts.getAllJSDocTags(x, (t): t is ts.JSDocTag => t.tagName.getText() === 'concrete').length) | ||
?.getSourceFile().fileName as string; | ||
@@ -209,0 +209,0 @@ |
import * as ts from 'typescript'; | ||
import { SystemUtil } from '@travetto/base/src/internal/system'; | ||
import { Util } from '@travetto/base'; | ||
import { ExternalType, AnyType } from './resolver/types'; | ||
import { State, DecoratorMeta, Transformer } from './types/visitor'; | ||
import { State, DecoratorMeta, Transformer, TransformerId } from './types/visitor'; | ||
import { TypeResolver } from './resolver/service'; | ||
@@ -14,2 +16,10 @@ import { ImportManager } from './importer'; | ||
function hasOriginal(n: unknown): n is { original: ts.Node } { | ||
return !!n && !(n as { parent?: unknown }).parent && !!(n as { original: unknown }).original; | ||
} | ||
function hasEscapedName(n: unknown): n is { name: { escapedText: string } } { | ||
return !!n && !!(n as { name?: { escapedText?: string } }).name?.escapedText; | ||
} | ||
/** | ||
@@ -19,6 +29,10 @@ * Transformer runtime state | ||
export class TransformerState implements State { | ||
static SYNTHETIC_EXT = 'ᚕsyn'; | ||
private resolver: TypeResolver; | ||
private imports: ImportManager; | ||
private syntheticIdentifiers = new Map<string, ts.Identifier>(); | ||
private decorators = new Map<string, ts.PropertyAccessExpression>(); | ||
added = new Map<number, ts.Statement[]>(); | ||
module: string; | ||
@@ -28,2 +42,3 @@ constructor(public source: ts.SourceFile, public factory: ts.NodeFactory, checker: ts.TypeChecker) { | ||
this.resolver = new TypeResolver(checker); | ||
this.module = SystemUtil.convertFileToModule(this.source.fileName); | ||
} | ||
@@ -60,3 +75,3 @@ | ||
if (resolved.key !== 'external') { | ||
throw new Error(`Unable to import non-external type: ${node.getText()} ${resolved.key}`); | ||
throw new Error(`Unable to import non-external type: ${node.getText()} ${resolved.key}: ${node.getSourceFile().fileName}`); | ||
} | ||
@@ -125,2 +140,3 @@ return resolved; | ||
file: decl?.getSourceFile().fileName, | ||
module: SystemUtil.convertFileToModule(decl?.getSourceFile().fileName), // All decorators will be absolute | ||
targets: DocUtil.readAugments(this.resolver.getType(ident)), | ||
@@ -158,4 +174,4 @@ name: ident ? | ||
let n = before; | ||
if (n && !n.parent && (n as any).original) { | ||
n = (n as any).original; | ||
if (hasOriginal(n)) { | ||
n = n.original; | ||
} | ||
@@ -198,6 +214,6 @@ while (n && !ts.isSourceFile(n.parent)) { | ||
fromLiteral(val: object): ts.ObjectLiteralExpression; | ||
fromLiteral(val: any[]): ts.ArrayLiteralExpression; | ||
fromLiteral(val: unknown[]): ts.ArrayLiteralExpression; | ||
fromLiteral(val: string | boolean | number): ts.LiteralExpression; | ||
fromLiteral(val: any) { | ||
return LiteralUtil.fromLiteral(this.factory, val); | ||
fromLiteral(val: unknown): ts.Node { | ||
return LiteralUtil.fromLiteral(this.factory, val as object); | ||
} | ||
@@ -226,2 +242,6 @@ | ||
/** | ||
* Ceate identifier from node or text | ||
* @param name | ||
*/ | ||
createIdentifier(name: string | { getText(): string }) { | ||
@@ -231,3 +251,2 @@ return this.factory.createIdentifier(typeof name === 'string' ? name : name.getText()); | ||
/** | ||
@@ -238,9 +257,48 @@ * Find decorator, relative to registered key | ||
* @param name | ||
* @param file | ||
* @param module | ||
*/ | ||
findDecorator(cls: Transformer, node: ts.Node, name: string, file?: string) { | ||
const target = `${cls.key}/${name}`; | ||
findDecorator(cls: Transformer, node: ts.Node, name: string, module?: string) { | ||
const target = `${cls[TransformerId]}/${name}`; | ||
return this.getDecoratorList(node) | ||
.find(x => x.targets?.includes(target) && (file ? x.name === name && x.file === file : true))?.dec; | ||
.find(x => x.targets?.includes(target) && (!module || x.name === name && x.module === module))?.dec; | ||
} | ||
/** | ||
* Generate unique identifier for node | ||
* @param node | ||
* @param type | ||
*/ | ||
generateUniqueIdentifier(node: ts.Node, type: AnyType) { | ||
let unique: string; | ||
try { | ||
// Tie to source location if possible | ||
const tgt = DeclarationUtil.getPrimaryDeclarationNode(type.original!); | ||
unique = `${ts.getLineAndCharacterOfPosition(tgt.getSourceFile(), tgt.getStart()).line}_${tgt.getEnd() - tgt.getStart()}`; | ||
if (tgt.getSourceFile().fileName !== this.source.fileName) { // if in same file | ||
unique = `${SystemUtil.naiveHash(tgt.getSourceFile().fileName)}_${unique}`; | ||
} | ||
} catch { | ||
// Determine type unique ident | ||
unique = Util.uuid(type.name ? 5 : 10); | ||
} | ||
// Otherwise read name with uuid | ||
let name = type.name && !type.name.startsWith('_') ? type.name : ''; | ||
if (!name && hasEscapedName(node)) { | ||
name = `${node.name.escapedText}`; | ||
} | ||
return `${name}_${unique}`; | ||
} | ||
/** | ||
* Register synthetic idetnifier | ||
*/ | ||
createSyntheticIdentifier(id: string) { | ||
id = `${id}${TransformerState.SYNTHETIC_EXT}`; | ||
let exists = true; | ||
if (!this.syntheticIdentifiers.has(id)) { | ||
this.syntheticIdentifiers.set(id, this.factory.createIdentifier(id)); | ||
exists = false; | ||
} | ||
return [this.syntheticIdentifiers.get(id), exists] as [id: ts.Identifier, exists: boolean]; | ||
} | ||
} |
@@ -9,2 +9,3 @@ import * as ts from 'typescript'; | ||
ident: ts.Identifier; | ||
module?: string; | ||
file?: string; | ||
@@ -17,2 +18,3 @@ targets?: string[]; | ||
source: ts.SourceFile; | ||
module: string; | ||
added: Map<number, ts.Statement[]>; | ||
@@ -27,4 +29,6 @@ getDecoratorList(node: ts.Node): DecoratorMeta[]; | ||
export const TransformerId = Symbol.for('@trv:transformer/id'); | ||
export type Transformer = { | ||
key: string; | ||
[TransformerId]: string; | ||
name: string; | ||
@@ -31,0 +35,0 @@ }; |
@@ -20,3 +20,3 @@ import * as ts from 'typescript'; | ||
if (o) { | ||
const start = ts.getLineAndCharacterOfPosition(source, o.getStart()); | ||
const start = ts.getLineAndCharacterOfPosition(source, o.getStart(source)); | ||
const end = ts.getLineAndCharacterOfPosition(source, o.getEnd()); | ||
@@ -33,5 +33,5 @@ return { | ||
*/ | ||
static getPrimaryArgument<T extends ts.Expression = ts.Expression>(node: ts.CallExpression | undefined): T | undefined { | ||
if (node && node!.arguments && node!.arguments.length) { | ||
return node.arguments[0] as T; | ||
static getArgument<T extends ts.Expression = ts.Expression>(node: ts.CallExpression | undefined, position = 0): T | undefined { | ||
if (node && node!.arguments && node!.arguments.length >= position + 1) { | ||
return node.arguments[position] as T; | ||
} | ||
@@ -38,0 +38,0 @@ return; |
@@ -56,3 +56,2 @@ import * as ts from 'typescript'; | ||
/** | ||
@@ -59,0 +58,0 @@ * Resolve the `ts.ObjectFlags` |
@@ -42,4 +42,4 @@ import * as ts from 'typescript'; | ||
static getPrimaryArgument<T extends ts.Expression = ts.Expression>(node: ts.Decorator | undefined): T | undefined { | ||
return CoreUtil.getPrimaryArgument(node && ts.isCallExpression(node.expression) ? node.expression : undefined); | ||
return CoreUtil.getArgument(node && ts.isCallExpression(node.expression) ? node.expression : undefined); | ||
} | ||
} |
@@ -5,3 +5,2 @@ import * as ts from 'typescript'; | ||
import { FsUtil } from '@travetto/boot'; | ||
import { FrameworkUtil } from '@travetto/boot/src/framework'; | ||
@@ -37,4 +36,3 @@ import { Import } from '../types/shared'; | ||
if (ts.isImportDeclaration(stmt) && ts.isStringLiteral(stmt.moduleSpecifier)) { | ||
let path = this.optionalResolve(stmt.moduleSpecifier.text, base); | ||
path = FrameworkUtil.resolvePath(path); | ||
const path = this.optionalResolve(stmt.moduleSpecifier.text, base); | ||
@@ -41,0 +39,0 @@ if (stmt.importClause) { |
@@ -25,7 +25,7 @@ import * as ts from 'typescript'; | ||
static fromLiteral(factory: ts.NodeFactory, val: object): ts.ObjectLiteralExpression; | ||
static fromLiteral(factory: ts.NodeFactory, val: any[]): ts.ArrayLiteralExpression; | ||
static fromLiteral(factory: ts.NodeFactory, val: unknown[]): ts.ArrayLiteralExpression; | ||
static fromLiteral(factory: ts.NodeFactory, val: string | boolean | number): ts.LiteralExpression; | ||
static fromLiteral(factory: ts.NodeFactory, val: any) { | ||
if (val && val.kind) { // If already a node | ||
return val; | ||
static fromLiteral(factory: ts.NodeFactory, val: unknown): ts.Node { | ||
if (val && (val as ts.Expression).kind) { // If already a node | ||
return val as ts.Node; | ||
} else if (Array.isArray(val)) { | ||
@@ -44,9 +44,10 @@ val = factory.createArrayLiteralExpression(val.map(v => this.fromLiteral(factory, v))); | ||
} else if (val === String || val === Number || val === Boolean || val === Date || val === RegExp) { | ||
val = factory.createIdentifier(val.name); | ||
val = factory.createIdentifier((val as Function).name); | ||
} else { | ||
const ov = val as object; | ||
const pairs: ts.PropertyAssignment[] = []; | ||
for (const k of Object.keys(val)) { | ||
if (val[k] !== undefined) { | ||
for (const k of Object.keys(ov) as (keyof typeof ov)[]) { | ||
if (ov[k] !== undefined) { | ||
pairs.push( | ||
factory.createPropertyAssignment(k, this.fromLiteral(factory, val[k])) | ||
factory.createPropertyAssignment(k, this.fromLiteral(factory, ov[k])) | ||
); | ||
@@ -57,3 +58,3 @@ } | ||
} | ||
return val; | ||
return val as ts.Expression; | ||
} | ||
@@ -64,3 +65,3 @@ | ||
*/ | ||
static toLiteral(val: ts.Node, strict = true): any { | ||
static toLiteral(val: ts.Node, strict = true): unknown { | ||
if (!val) { | ||
@@ -79,5 +80,5 @@ throw new Error('Val is not defined'); | ||
} else if (ts.isStringLiteral(val)) { | ||
return val.getText().substring(1, val.getText().length - 1); | ||
return val.text; | ||
} else if (ts.isNumericLiteral(val)) { | ||
const txt = val.getText(); | ||
const txt = val.text; | ||
if (txt.includes('.')) { | ||
@@ -93,3 +94,3 @@ return parseFloat(txt); | ||
} else if (ts.isObjectLiteralExpression(val)) { | ||
const out: Record<string, any> = {}; | ||
const out: Record<string, unknown> = {}; | ||
for (const pair of val.properties) { | ||
@@ -121,3 +122,2 @@ if (ts.isPropertyAssignment(pair)) { | ||
/** | ||
@@ -124,0 +124,0 @@ * Get a value from the an object expression |
@@ -17,3 +17,3 @@ import { Util } from '@travetto/base'; | ||
*/ | ||
static collapseNodes(all: any[]) { | ||
static collapseNodes(all: unknown[]) { | ||
return all.map(x => this.collapseNode(x)); | ||
@@ -25,3 +25,3 @@ } | ||
*/ | ||
static collapseNode(x: any, cache: Set<string> = new Set()): any { | ||
static collapseNode(x: unknown, cache: Set<unknown> = new Set()): unknown { | ||
if (!x || Util.isPrimitive(x)) { | ||
@@ -40,9 +40,10 @@ return x; | ||
} else { | ||
const out: Record<string, any> = {}; | ||
for (const key of Object.keys(x)) { | ||
if (Util.isFunction(x[key]) || exclude.has(key) || x[key] === undefined) { | ||
const ox = x as object; | ||
const out: Record<string, unknown> = {}; | ||
for (const key of Object.keys(ox) as (keyof typeof x)[]) { | ||
if (Util.isFunction(ox[key]) || exclude.has(key) || ox[key] === undefined) { | ||
continue; | ||
} | ||
try { | ||
out[key] = this.collapseNode(x[key], cache); | ||
out[key] = this.collapseNode(ox[key], cache); | ||
} catch (err) { | ||
@@ -49,0 +50,0 @@ return undefined; |
import * as ts from 'typescript'; | ||
import * as fs from 'fs'; | ||
import { ConsoleManager } from '@travetto/base/src/console'; | ||
import { AppCache } from '@travetto/boot'; | ||
@@ -29,3 +31,3 @@ import { DecoratorMeta, TransformerType, NodeTransformer, TransformerSet, State, TransformPhase } from './types/visitor'; | ||
return 'parameter'; | ||
} else if (ts.isFunctionDeclaration(node)) { | ||
} else if (ts.isFunctionDeclaration(node) || (ts.isFunctionExpression(node) && !ts.isArrowFunction(node))) { | ||
return 'function'; | ||
@@ -39,4 +41,4 @@ } | ||
private getState: (context: ts.TransformationContext, src: ts.SourceFile) => S, | ||
transformers: NodeTransformer<S, any, any>[], | ||
private logTarget = '!compiler.log' | ||
transformers: NodeTransformer<S, TransformerType, ts.Node>[], | ||
private logTarget = 'compiler.log' | ||
) { | ||
@@ -49,3 +51,3 @@ this.init(transformers); | ||
*/ | ||
private init(transformers: NodeTransformer<S, any, any>[]) { | ||
private init(transformers: NodeTransformer<S, TransformerType, ts.Node>[]) { | ||
for (const trn of transformers) { | ||
@@ -80,4 +82,12 @@ if (!this.transformers.has(trn.type)) { | ||
try { | ||
ConsoleManager.setFile(this.logTarget, { processArgs: (__, args) => LogUtil.collapseNodes(args) }); // Suppress logging into an output file | ||
console.debug(process.pid, 'Processing', file.fileName); | ||
const c = new console.Console({ | ||
stdout: fs.createWriteStream(AppCache.toEntryName(this.logTarget), { flags: 'a' }), | ||
inspectOptions: { depth: 4 }, | ||
}); | ||
ConsoleManager.set({ | ||
onLog: (level, ctx, args) => c[level](level, ctx, ...LogUtil.collapseNodes(args)) | ||
}); | ||
console.debug('Processing', { file: file.fileName, pid: process.pid }); | ||
const state = this.getState(context, file); | ||
@@ -106,3 +116,3 @@ let ret = this.visit(state, context, file); | ||
} catch (e) { | ||
console.error(e.stack); | ||
console.error('Failed transforming', { error: e }); | ||
throw e; | ||
@@ -109,0 +119,0 @@ } finally { |
import { TranspileUtil } from '@travetto/boot'; | ||
declare const global: { ts: any }; // Used for transformers | ||
declare const global: { ts: unknown }; // Used for transformers | ||
@@ -5,0 +5,0 @@ /** |
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
65331
1729
1
+ Added@travetto/base@2.2.4(transitive)
+ Added@travetto/boot@2.2.2(transitive)
+ Added@types/node@18.19.78(transitive)
+ Addedundici-types@5.26.5(transitive)
- Removed@travetto/base@1.1.1(transitive)
- Removed@travetto/boot@1.1.2(transitive)
- Removed@types/node@12.20.55(transitive)