This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// one way... | |
function getDeepMutableClone<T extends ts.Node>(node: T): T { | |
return ts.transform(node, [ | |
context => node => deepCloneWithContext(node, context) | |
]).transformed[0]; | |
function deepCloneWithContext<T extends ts.Node>( | |
node: T, | |
context: ts.TransformationContext |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// I wrote this to test if it would be faster for my scenario and it wasn't... it was much much slower. | |
// So I'm throwing it away here on a gist. Perhaps someone would still find it useful. | |
/** | |
* Mimicks the behaviour of cloning via a proxy for when the underlying object | |
* will never change, but the clone might. | |
* @param originalObject - Object to create a proxied clone of. | |
*/ | |
export function proxiedClone<T extends object>(originalObject: T): T { | |
const proxies = new Map<object, object>(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Adapted from: https://github.com/Sciss/SpeechRecognitionHMM/blob/master/src/main/java/org/ioe/tprsa/audio/feature/MFCC.java | |
using System; | |
using System.Diagnostics; | |
namespace CommonShared.Audio | |
{ | |
public class MelFrequencyBinner | |
{ | |
private const int _melFiltersCount = Constants.MEL_FILTERS_COUNT; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// untested... | |
import { Project, SyntaxKind } from "ts-simple-ast"; | |
const project = new Project({ tsConfigFilePath: "tsconfig.json" }); | |
const srcDir = project.getDirectoryOrThrow("./src"); | |
for (const sourceFile of project.getSourceFiles().filter(s => srcDir.isAncestorOf(s))) { | |
for (const dec of [...sourceFile.getImportDeclarations(), ...sourceFile.getExportDeclarations()]) { | |
const moduleSpecifierSourceFile = dec.getModuleSpecifierSourceFile(); | |
if (moduleSpecifierSourceFile == null || !srcDir.isAncestorOf(moduleSpecifierSourceFile)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This script will look at all the exported class declarations from the main entrypoint of a library | |
// and ensure all private, protected, and @internal members are prefixed with an underscore. | |
import { Project, Node, SyntaxKind, TypeGuards, Scope, ClassMemberTypes, ParameterDeclaration } from "ts-simple-ast"; | |
const project = new Project({ tsConfigFilePath: "tsconfig.json" }); | |
const sourceFiles = project.getSourceFiles(); | |
for (const file of sourceFiles) | |
for (const classDec of file.getDescendantsOfKind(SyntaxKind.ClassDeclaration)) | |
for (const member of classDec.getMembers()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// this could be improved... (ex. ignore interfaces/type aliases that describe a parameter type in the same file) | |
import { Project, TypeGuards, Node } from "ts-morph"; | |
const project = new Project({ tsConfigFilePath: "tsconfig.json" }); | |
for (const file of project.getSourceFiles()) { | |
file.forEachChild(child => { | |
if (TypeGuards.isVariableStatement(child)) { | |
if (isExported(child)) | |
child.getDeclarations().forEach(checkNode); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Ensure Public API Has Tests | |
* --------------------------- | |
* This demonstrates analyzing code to find methods and properties from the public | |
* api that don't appear in the tests. | |
* | |
* This is a very basic implementation... a better implementation would examine more | |
* aspects of the code (ex. are the return values properly checked?) and report | |
* statistics about the tests that possibly indicate how they could be improved (ex. | |
* "this test has a lot of overlap with these other tests"). The goal would be to |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { tsquery } from "@phenomnomnominal/tsquery"; | |
import { Node } from "ts-morph"; | |
export function query(node: Node, query: string) { | |
return tsquery(node.compilerNode, query) | |
.map(n => (node as any)._getNodeFromCompilerNode(n) as Node); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export class WeakCache<T extends object, U> { | |
private readonly cacheItems: WeakDictionary<T, U>; | |
constructor() { | |
if (typeof WeakMap !== "undefined") | |
this.cacheItems = new WeakMap<T, U>(); | |
else | |
this.cacheItems = new Es5WeakMap(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// only works with number enums... | |
class EnumEx { | |
private constructor() { | |
} | |
static getMembersCount(e: any) { | |
return EnumEx.getNames(e).length; | |
} | |
static getMemberValue(e: any, memberName: string) { |
NewerOlder