From e6e1cbac49a5c3468d6273139089cdf5f5eec497 Mon Sep 17 00:00:00 2001 From: Ethan Zhang Date: Mon, 8 Jun 2020 09:25:15 +0800 Subject: [PATCH] chore(*) Update .gitignore --- .gitignore | 2 + compile.js | 43 --------- index.js | 2 - test/interface.js | 2 - test/transformer.test.js | 74 --------------- transformer.js | 192 --------------------------------------- 6 files changed, 2 insertions(+), 313 deletions(-) delete mode 100644 compile.js delete mode 100644 index.js delete mode 100644 test/interface.js delete mode 100644 test/transformer.test.js delete mode 100644 transformer.js diff --git a/.gitignore b/.gitignore index a865bc4..ae614e7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ node_modules coverage package-lock.json .npmrc +*.js +!jest.config.js \ No newline at end of file diff --git a/compile.js b/compile.js deleted file mode 100644 index 14d775f..0000000 --- a/compile.js +++ /dev/null @@ -1,43 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var ts = __importStar(require("typescript")); -var transformer_1 = __importDefault(require("./transformer")); -function compile(filePaths, writeFileCallback) { - var program = ts.createProgram(filePaths, { - strict: true, - noEmitOnError: true, - suppressImplicitAnyIndexErrors: true, - target: ts.ScriptTarget.ES5, - }); - var transformers = { - before: [transformer_1.default(program)], - after: [], - }; - var _a = program.emit(undefined, writeFileCallback, undefined, false, transformers), emitSkipped = _a.emitSkipped, diagnostics = _a.diagnostics; - if (emitSkipped) { - throw new Error(diagnostics.map(function (diagnostic) { return diagnostic.messageText; }).join('\n')); - } -} -exports.default = compile; diff --git a/index.js b/index.js deleted file mode 100644 index c8ad2e5..0000000 --- a/index.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/test/interface.js b/test/interface.js deleted file mode 100644 index c8ad2e5..0000000 --- a/test/interface.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/test/transformer.test.js b/test/transformer.test.js deleted file mode 100644 index 8f0b8a8..0000000 --- a/test/transformer.test.js +++ /dev/null @@ -1,74 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var index_1 = require("../index"); -describe('Test transformer.', function () { - test('Should get keys of interface 1.', function () { - expect([{"name":"a","modifiers":[],"optional":false,"type":"string"}, {"name":"b","modifiers":[],"optional":true,"type":"number"}, {"name":"c","modifiers":[],"optional":false,"type":"boolean"}, {"name":"d","modifiers":[],"optional":false,"type":"Function"}, {"name":"e","modifiers":[],"optional":false,"type":"unknown"}, {"name":"f","modifiers":[],"optional":false,"type":"any"}, {"name":"g","modifiers":[],"optional":false,"type":"unknown"}, {"name":"h","modifiers":[],"optional":false,"type":"unknown"}, {"name":"i","modifiers":[],"optional":true,"type":["number","unknown"]}, {"name":"j","modifiers":[],"optional":false,"type":"array","elementType":"number"}, {"name":"k","modifiers":[],"optional":false,"type":["array","unknown"]}, {"name":"l","modifiers":[],"optional":false,"type":"object"}, {"name":"l.a","modifiers":[],"optional":false,"type":"string"}, {"name":"l.b","modifiers":[],"optional":false,"type":"number"}, {"name":"m","modifiers":[],"optional":false,"type":"Bar"}, {"name":"n","modifiers":[],"optional":false,"type":"X"}, {"name":"n.a","modifiers":[],"optional":false,"type":"number"}, {"name":"n.b","modifiers":[],"optional":false,"type":"string"}, {"name":"n.c","modifiers":[],"optional":false,"type":"Y"}, {"name":"n.c.a","modifiers":[],"optional":false,"type":"number"}, {"name":"n.c.b","modifiers":[],"optional":false,"type":"string"}, {"name":"n.c.c","modifiers":[],"optional":false,"type":"Z"}, {"name":"n.c.c.a","modifiers":[],"optional":false,"type":"number"}, {"name":"n.c.c.b","modifiers":[],"optional":false,"type":"string"}, {"name":"n.c.c.c","modifiers":[],"optional":false,"type":"any"}, {"name":"o","modifiers":[],"optional":false,"type":"T"}, {"name":"p","modifiers":[],"optional":false,"type":["Bar","Baz"]}, {"name":"q","modifiers":[],"optional":false,"type":["Bar","Baz"]}]).toMatchObject([ - { name: 'a', optional: false }, - { name: 'b', optional: true }, - { name: 'c', optional: false }, - { name: 'd', optional: false }, - { name: 'e', optional: false }, - { name: 'f', optional: false }, - { name: 'g', optional: false }, - { name: 'h', optional: false }, - { name: 'i', optional: true }, - { name: 'j', optional: false }, - { name: 'k', optional: false }, - { name: 'l', optional: false }, - { name: 'l.a', optional: false }, - { name: 'l.b', optional: false }, - { name: 'm', optional: false }, - { name: 'n', optional: false }, - { name: 'n.a', optional: false }, - { name: 'n.b', optional: false }, - { name: 'n.c', optional: false }, - { name: 'n.c.a', optional: false }, - { name: 'n.c.b', optional: false }, - { name: 'n.c.c', optional: false }, - { name: 'n.c.c.a', optional: false }, - { name: 'n.c.c.b', optional: false }, - { name: 'n.c.c.c', optional: false }, - { name: 'o', optional: false }, - { name: 'p', optional: false }, - { name: 'q', optional: false } - ]); - }); - test('Should get keys of interface 2.', function () { - expect([{"name":"a","modifiers":[],"optional":false,"type":"unknown"}, {"name":"b","modifiers":[],"optional":false,"type":"unknown"}]).toMatchObject([ - { name: 'a', optional: false }, - { name: 'b', optional: false } - ]); - }); - test('Should get keys of interface 3.', function () { - expect([{"name":"a","modifiers":[],"optional":false,"type":"unknown"}, {"name":"b","modifiers":[],"optional":false,"type":"unknown"}, {"name":"c","modifiers":[],"optional":false,"type":"boolean"}, {"name":"d","modifiers":[],"optional":false,"type":"object"}, {"name":"d.a","modifiers":[],"optional":false,"type":"number"}, {"name":"d.b","modifiers":[],"optional":true,"type":"string"}]).toMatchObject([ - { name: 'a', optional: false }, - { name: 'b', optional: false }, - { name: 'c', optional: false }, - { name: 'd', optional: false }, - { name: 'd.a', optional: false }, - { name: 'd.b', optional: true } - ]); - }); - test('Should get keys of interface 4.', function () { - expect([{"name":"a","modifiers":[],"optional":false,"type":"number"}, {"name":"b","modifiers":[],"optional":false,"type":"string"}, {"name":"c","modifiers":[],"optional":false,"type":"Y"}, {"name":"c.a","modifiers":[],"optional":false,"type":"number"}, {"name":"c.b","modifiers":[],"optional":false,"type":"string"}, {"name":"c.c","modifiers":[],"optional":false,"type":"Z"}, {"name":"c.c.a","modifiers":[],"optional":false,"type":"number"}, {"name":"c.c.b","modifiers":[],"optional":false,"type":"string"}, {"name":"c.c.c","modifiers":[],"optional":false,"type":"any"}]).toMatchObject([ - { name: 'a', optional: false }, - { name: 'b', optional: false }, - { name: 'c', optional: false }, - { name: 'c.a', optional: false }, - { name: 'c.b', optional: false }, - { name: 'c.c', optional: false }, - { name: 'c.c.a', optional: false }, - { name: 'c.c.b', optional: false }, - { name: 'c.c.c', optional: false } - ]); - }); - test('Should get keys of interface 5.', function () { - var Bar = /** @class */ (function () { - function Bar() { - } - return Bar; - }()); - console.log(JSON.stringify([{"name":"a","modifiers":[],"optional":false,"type":"array","elementType":"string"}, {"name":"b","modifiers":["readonly"],"optional":false,"type":"array","elementKeys":[{"name":"b1","modifiers":["readonly"],"optional":false,"type":"string"},{"name":"b2","modifiers":[],"optional":false,"type":"number"},{"name":"b3","modifiers":[],"optional":false,"type":"object"},{"name":"b3.b31","modifiers":[],"optional":false,"type":"string"},{"name":"b3.b32","modifiers":[],"optional":false,"type":"string"}]}, {"name":"c","modifiers":[],"optional":false,"type":"number"}, {"name":"d","modifiers":[],"optional":false,"type":"boolean"}, {"name":"e","modifiers":[],"optional":false,"type":"Set"}, {"name":"f","modifiers":[],"optional":false,"type":"Symbol"}, {"name":"g","modifiers":[],"optional":false,"type":"Map"}, {"name":"h","modifiers":[],"optional":false,"type":"Bar"}, {"name":"i","modifiers":[],"optional":true,"type":"Function"}, {"name":"j","modifiers":[],"optional":false,"type":"Function"}], null, 4)); - }); -}); diff --git a/transformer.js b/transformer.js deleted file mode 100644 index d30ed5c..0000000 --- a/transformer.js +++ /dev/null @@ -1,192 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __spreadArrays = (this && this.__spreadArrays) || function () { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var path = __importStar(require("path")); -var _ = __importStar(require("lodash")); -var ts = __importStar(require("typescript")); -exports.default = (function (program) { - return function (ctx) { - return function (sourceFile) { - var visitor = function (node) { - return ts.visitEachChild(visitNode(node, program), visitor, ctx); - }; - return ts.visitEachChild(visitNode(sourceFile, program), visitor, ctx); - }; - }; -}); -var symbolMap = new Map(); -var visitNode = function (node, program) { - // collect all top level symbols in the source file - if (node.kind === ts.SyntaxKind.SourceFile) { - node['locals'].forEach(function (symbol, key) { - if (!symbolMap.has(key)) { - symbolMap.set(key, symbol); - } - }); - } - var typeChecker = program.getTypeChecker(); - if (!isKeysCallExpression(node, typeChecker)) { - return node; - } - if (!node.typeArguments) { - return ts.createArrayLiteral([]); - } - var type = typeChecker.getTypeFromTypeNode(node.typeArguments[0]); - var properties = []; - var symbols = typeChecker.getPropertiesOfType(type); - symbols.forEach(function (symbol) { - properties = __spreadArrays(properties, getSymbolProperties(symbol, [], symbolMap)); - }); - return ts.createArrayLiteral(properties.map(function (property) { return ts.createRegularExpressionLiteral(JSON.stringify(property)); })); -}; -var getSymbolProperties = function (symbol, outerLayerProperties, symbolMap) { - var properties = []; - var propertyPathElements = JSON.parse(JSON.stringify(outerLayerProperties.map(function (property) { return property; }))); - var propertyName = symbol.escapedName; - propertyPathElements.push(propertyName); - /* please note: due to interface or type can be a intersection types (e.g. A & B) - * or a union types (e.g. A | B), these types have no "valueDeclaration" property. - * We must traverse the "symbol.declarations" to collect "questionToken" of all sub types - */ - var optional = _.some(symbol.declarations, function (declaration) { - return !!declaration.questionToken; - }); - var modifiers = []; - symbol.declarations.forEach(function (declaration) { - if (declaration.modifiers) { - declaration.modifiers.forEach(function (modifier) { - modifiers.push(getModifierType(modifier)); - }); - } - }); - var property = { - name: propertyPathElements.join('.'), - modifiers: modifiers, - optional: optional, - type: getPropertyType(symbol.valueDeclaration ? symbol.valueDeclaration['type'] : symbol['type']), - }; - if (symbol.valueDeclaration && symbol.valueDeclaration['type'].kind === ts.SyntaxKind.ArrayType) { // array - var elementType = getPropertyType(symbol.valueDeclaration['type'].elementType); - if (elementType === 'object') { - property.elementKeys = _.flattenDeep(symbol.valueDeclaration['type'].elementType.members.map(function (member) { - return getSymbolProperties(member.symbol, [], symbolMap); - })); - } - else { - property.elementType = elementType; - } - } - properties.push(property); - var propertiesOfSymbol = _getPropertiesOfSymbol(symbol, propertyPathElements, symbolMap); - properties = __spreadArrays(properties, propertiesOfSymbol); - return properties; -}; -var isOutermostLayerSymbol = function (symbol) { - return symbol.valueDeclaration && symbol.valueDeclaration.symbol.valueDeclaration.type.members; -}; -var isInnerLayerSymbol = function (symbol) { - return symbol.valueDeclaration && symbol.valueDeclaration.symbol.valueDeclaration.type.typeName; -}; -var _getPropertiesOfSymbol = function (symbol, propertyPathElements, symbolMap) { - if (!isOutermostLayerSymbol(symbol) && !isInnerLayerSymbol(symbol)) { - return []; - } - var properties = []; - var members; - if (symbol.valueDeclaration.type.symbol) { - members = symbol.valueDeclaration.type.members.map(function (member) { return member.symbol; }); - } - else { - var propertyTypeName = symbol.valueDeclaration.type.typeName.escapedText; - var propertyTypeSymbol = symbolMap.get(propertyTypeName); - if (propertyTypeSymbol) { - if (propertyTypeSymbol.members) { - members = propertyTypeSymbol.members; - } - else { - members = propertyTypeSymbol.exportSymbol.members; - } - } - } - if (members) { - members.forEach(function (member) { - properties = __spreadArrays(properties, getSymbolProperties(member, propertyPathElements, symbolMap)); - }); - } - return properties; -}; -var getPropertyType = function (symbol) { - switch (symbol.kind) { - case ts.SyntaxKind.ArrayType: - return 'array'; - case ts.SyntaxKind.StringKeyword: - return 'string'; - case ts.SyntaxKind.NumberKeyword: - return 'number'; - case ts.SyntaxKind.BooleanKeyword: - return 'boolean'; - case ts.SyntaxKind.FunctionType: - return 'Function'; - case ts.SyntaxKind.TypeReference: - return symbol.typeName.escapedText; - case ts.SyntaxKind.AnyKeyword: - return 'any'; - case ts.SyntaxKind.TypeLiteral: - return 'object'; - case ts.SyntaxKind.UnionType: - return symbol.types.map(function (token) { return getPropertyType(token); }); - case ts.SyntaxKind.IntersectionType: - return symbol.types.map(function (token) { return getPropertyType(token); }); - default: - return 'unknown'; - } -}; -var getModifierType = function (modifier) { - switch (modifier.kind) { - case ts.SyntaxKind.ReadonlyKeyword: - return 'readonly'; - default: - return 'unknown'; - } -}; -var indexTs = path.join(__dirname, './index.ts'); -var isKeysCallExpression = function (node, typeChecker) { - if (!ts.isCallExpression(node)) { - return false; - } - var signature = typeChecker.getResolvedSignature(node); - if (typeof signature === 'undefined') { - return false; - } - var declaration = signature.declaration; - return !!declaration - && !ts.isJSDocSignature(declaration) - && (path.join(declaration.getSourceFile().fileName) === indexTs) - && !!declaration.name - && declaration.name.getText() === 'keys'; -};