UNPKG

typings-core

Version:
720 lines 30.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var test = require("blue-tape"); var nock = require("nock"); var path_1 = require("path"); var events_1 = require("events"); var compile_1 = require("./compile"); var config_1 = require("../utils/config"); var dependencies_1 = require("./dependencies"); var FIXTURES_DIR = path_1.join(__dirname, '__test__/fixtures'); test('compile', function (t) { t.test('fixtures', function (t) { t.test('compile a normal definition', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile'); var root = { src: path_1.join(FIXTURE_DIR, config_1.CONFIG_FILE), main: 'root', raw: undefined, postmessage: undefined, global: false, browser: { 'b/b': 'browser' }, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var a = { src: path_1.join(FIXTURE_DIR, "a/" + config_1.CONFIG_FILE), main: undefined, raw: undefined, postmessage: undefined, global: false, typings: 'typed.d.ts', browserTypings: 'typed.browser.d.ts', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var b = { src: path_1.join(FIXTURE_DIR, 'bower.json'), main: undefined, raw: undefined, postmessage: undefined, global: false, typings: 'typings/b.d.ts', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var browser = { src: path_1.join(FIXTURE_DIR, 'package.json'), main: undefined, raw: undefined, postmessage: undefined, global: false, typings: 'browser.d.ts', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var dep = { src: path_1.join(FIXTURE_DIR, "dep/" + config_1.CONFIG_FILE), main: 'dep/main.d.ts', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; root.dependencies.a = a; root.dependencies['b/b'] = b; root.dependencies.browser = browser; a.dependencies.dep = dep; var emitter = new events_1.EventEmitter(); return compile_1.compile(root, ['main', 'browser'], { name: 'root', cwd: __dirname, global: false, meta: true, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ "// Generated by typings", "// Source: __test__/fixtures/compile/dep/path.d.ts", 'declare module \'~root~a~dep/path\' {', 'export const isDep: boolean', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/a/typed.d.ts", 'declare module \'~root~a/typed\' {', 'import { isDep } from \'~root~a~dep/path\'', '', 'export interface ITest {', ' foo: string', ' bar: boolean', '}', '', 'export default function (): ITest', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/typings/b.d.ts", 'declare module \'~root~b/b/typings/b\' {', 'export const foo: number', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/root.import.d.ts", 'declare module \'~root/root.import\' {', 'export const test: string', '}', 'declare module \'root/root.import\' {', 'export * from \'~root/root.import\';', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/root.d.ts", 'declare module \'~root/root\' {', 'import a from \'~root~a/typed\'', 'import b = require(\'~root~b/b/typings/b\')', 'export * from \'~root/root.import\'', 'export default a', '}', 'declare module \'root/root\' {', 'export * from \'~root/root\';', 'export { default } from \'~root/root\';', '}', 'declare module \'root\' {', 'export * from \'~root/root\';', 'export { default } from \'~root/root\';', '}', '' ].join('\n')); t.equal(out.results.browser, [ "// Generated by typings", "// Source: __test__/fixtures/compile/a/typed.browser.d.ts", 'declare module \'~root~a/typed.browser\' {', 'export function browser (): boolean', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/browser.d.ts", 'declare module \'~root~browser/browser\' {', 'export const bar: boolean', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/root.import.d.ts", 'declare module \'~root/root.import\' {', 'export const test: string', '}', 'declare module \'root/root.import\' {', 'export * from \'~root/root.import\';', '}', '', "// Generated by typings", "// Source: __test__/fixtures/compile/root.d.ts", 'declare module \'~root/root\' {', 'import a from \'~root~a/typed.browser\'', 'import b = require(\'~root~browser/browser\')', 'export * from \'~root/root.import\'', 'export default a', '}', 'declare module \'root/root\' {', 'export * from \'~root/root\';', 'export { default } from \'~root/root\';', '}', 'declare module \'root\' {', 'export * from \'~root/root\';', 'export { default } from \'~root/root\';', '}', '' ].join('\n')); }); }); t.test('compile export equals', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-export-equals'); var file = { src: path_1.join(FIXTURE_DIR, config_1.CONFIG_FILE), main: 'file.d.ts', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); return compile_1.compile(file, ['main', 'browser'], { name: 'foobar', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'foobar\' {', 'function foo (value: string): foo.Bar;', '', 'module foo {', ' export interface Bar {', ' (message: any, ...args: any[]): void;', ' enabled: boolean;', ' namespace: string;', ' }', '}', '', 'export = foo;', '}', '' ].join('\n')); t.equal(out.results.main, out.results.browser); }); }); t.test('compile export default', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-export-default'); var file = { src: path_1.join(FIXTURE_DIR, config_1.CONFIG_FILE), main: 'index.d.ts', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); return compile_1.compile(file, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'test\' {', 'const foo: string;', '', 'export default foo;', '}', '' ].join('\n')); }); }); t.test('compile duplicate files from different import contexts', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-dep-dupe'); var root = { src: path_1.join(FIXTURE_DIR, config_1.CONFIG_FILE), main: 'index.d.ts', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var foo = { src: path_1.join(FIXTURE_DIR, 'foo', config_1.CONFIG_FILE), main: 'index.d.ts', parent: root, raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; root.dependencies.foo = foo; var emitter = new events_1.EventEmitter(); return compile_1.compile(root, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'~test~foo/x\' {', 'import * as bar from \'~test~foo/index\'', '', 'export { bar }', '}', '', 'declare module \'~test~foo/index\' {', 'export * from \'~test~foo/x\'', '}', '', 'declare module \'test\' {', 'import * as x from \'~test~foo/x\'', 'export * from \'~test~foo/index\'', '}', '' ].join('\n')); }); }); t.test('compile module augmentation', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-module-augmentation'); var file = { src: path_1.join(FIXTURE_DIR, config_1.CONFIG_FILE), main: 'index.d.ts', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); return compile_1.compile(file, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'~test/import\' {', 'function main (): boolean;', '', 'export { main }', '}', 'declare module \'test/import\' {', 'export * from \'~test/import\';', '}', '', 'declare module \'~test/index\' {', 'import * as imported from \'~test/import\'', '', 'module \'~test/import\' {', ' namespace main {', ' export function augmented (): boolean;', ' }', '}', '', 'export { imported }', '}', 'declare module \'test/index\' {', 'export * from \'~test/index\';', '}', 'declare module \'test\' {', 'export * from \'~test/index\';', '}', '' ].join('\n')); }); }); t.test('compile a global definition', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-global'); var node = { src: __filename, raw: undefined, postmessage: undefined, global: true, typings: path_1.join(FIXTURE_DIR, 'node.d.ts'), dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var fs = { src: path_1.join(FIXTURE_DIR, 'fs.d.ts'), main: undefined, raw: undefined, postmessage: undefined, global: false, typings: path_1.join(FIXTURE_DIR, 'fs.d.ts'), dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; node.dependencies.fs = fs; var emitter = new events_1.EventEmitter(); return compile_1.compile(node, ['main'], { name: 'node', cwd: __dirname, global: true, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'fs\' {', 'export function readFileSync (path: string, encoding: string): string', 'export function readFileSync (path: string): Buffer', '}', '', 'declare var __dirname: string', '' ].join('\n')); }); }); t.test('compile inline global definitions', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-inline-global'); var typings = path_1.join(FIXTURE_DIR, 'node.d.ts'); var node = { src: __filename, raw: undefined, postmessage: undefined, global: true, typings: typings, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); return compile_1.compile(node, ['main', 'browser'], { name: 'name', cwd: __dirname, global: true, meta: true, emitter: emitter }) .then(function (out) { var contents = [ "// Generated by typings", "// Source: __test__/fixtures/compile-inline-global/node.d.ts", 'declare const require: (module: string) => any;', '', 'declare module "events" {', '\texport const test: boolean;', '}', '', 'declare module "fs" {', '\timport * as events from "events";', '}', '' ].join('\n'); t.equal(out.results.main, contents); t.equal(out.results.main, out.results.browser); }); }); }); t.test('missing error', function (t) { var node = { src: 'http://example.com/typings/typings.json', raw: undefined, postmessage: undefined, global: false, typings: 'http://example.com/typings/index.d.ts', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); t.plan(1); return compile_1.compile(node, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .catch(function (result) { t.equal(result.message, 'Unable to read typings for "test". You should check the entry paths in "typings.json" are up to date'); }); }); t.test('global flag compile error', function (t) { var node = { src: 'http://example.com/typings.json', raw: undefined, postmessage: undefined, global: true, typings: 'http://example.com/index.d.ts', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); t.plan(1); return compile_1.compile(node, ['main'], { name: 'name', cwd: __dirname, global: false, meta: false, emitter: emitter }) .catch(function (result) { t.equal(result.message, 'Unable to compile "name", the typings are meant to be installed as global ' + 'but attempted to be compiled as an external module'); }); }); t.test('global compile error', function (t) { var node = { src: path_1.join(__dirname, '__test__/fixtures/compile-global/node.d.ts'), raw: undefined, postmessage: undefined, global: false, main: path_1.join(__dirname, '__test__/fixtures/compile-global/node.d.ts'), dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); t.plan(1); return compile_1.compile(node, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .catch(function (result) { t.equal(result.message, 'Attempted to compile "test" as an external module, ' + 'but it looks like a global module. ' + 'You\'ll need to enable the global option to continue.'); }); }); t.test('external compile error', function (t) { var node = { src: path_1.join(__dirname, '__test__/fixtures/compile/root.d.ts'), raw: undefined, postmessage: undefined, global: true, main: path_1.join(__dirname, '__test__/fixtures/compile/root.d.ts'), dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); t.plan(1); return compile_1.compile(node, ['main'], { name: 'test', cwd: __dirname, global: true, meta: false, emitter: emitter }) .catch(function (result) { t.equal(result.message, 'Attempted to compile "test" as a global module, ' + 'but it looks like an external module. ' + 'You\'ll need to remove the global option to continue.'); }); }); t.test('no main or typings error', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'main-resolve-error'); var main = { src: path_1.join(FIXTURE_DIR, 'package.json'), raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); t.plan(1); return compile_1.compile(main, ['main'], { name: 'main', cwd: __dirname, global: false, meta: false, emitter: emitter }) .catch(function (error) { t.ok(/^Unable to read typings for "main"/.test(error.message)); }); }); t.test('no module dts file error', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'node-resolve-error'); var main = { src: path_1.join(FIXTURE_DIR, 'package.json'), main: 'index.js', raw: undefined, postmessage: undefined, global: false, dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var dependency = { main: 'index.js', raw: undefined, postmessage: undefined, global: false, src: path_1.join(FIXTURE_DIR, 'node_modules/test/package.json'), dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); main.dependencies.test = dependency; t.plan(1); return compile_1.compile(main, ['main'], { name: 'main', cwd: __dirname, global: false, meta: false, emitter: emitter }) .catch(function (error) { t.ok(/^Unable to read typings for "test"/.test(error.message)); }); }); t.test('override dependency with local file', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-module-file-override'); var emitter = new events_1.EventEmitter(); return dependencies_1.resolveNpmDependencies({ cwd: FIXTURE_DIR, dev: false, emitter: emitter }) .then(function (tree) { return compile_1.compile(tree, ['browser'], { name: 'main', cwd: __dirname, global: false, meta: false, emitter: emitter }); }) .then(function (out) { t.equal(out.results.browser, [ 'declare module \'~main/override\' {', 'function test (): string;', '', 'export = test;', '}', 'declare module \'main/override\' {', 'import main = require(\'~main/override\');', 'export = main;', '}', '', 'declare module \'main\' {', 'import * as foo from \'~main/override\'', '', 'export = foo', '}', '' ].join('\n')); }); }); t.test('resolve and compile local file override with dependency', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-file-module-override'); var emitter = new events_1.EventEmitter(); return dependencies_1.resolveNpmDependencies({ cwd: FIXTURE_DIR, dev: false, emitter: emitter }) .then(function (tree) { return compile_1.compile(tree, ['main', 'browser'], { name: 'main', cwd: __dirname, global: false, meta: false, emitter: emitter }); }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'~main/imported/index\' {', 'export function isNotDep (): boolean;', '}', 'declare module \'main/imported/index\' {', 'export * from \'~main/imported/index\';', '}', '', 'declare module \'~main/index\' {', 'export * from \'~main/imported/index\'', '}', 'declare module \'main/index\' {', 'export * from \'~main/index\';', '}', 'declare module \'main\' {', 'export * from \'~main/index\';', '}', '' ].join('\n')); t.equal(out.results.browser, [ 'declare module \'~main~dep/index\' {', 'export function isDep (): boolean;', '}', '', 'declare module \'~main/index\' {', 'export * from \'~main~dep/index\'', '}', 'declare module \'main/index\' {', 'export * from \'~main/index\';', '}', 'declare module \'main\' {', 'export * from \'~main/index\';', '}', '' ].join('\n')); }); }); t.test('resolve over http', function (t) { var node = { src: 'http://example.com/typings.json', raw: undefined, postmessage: undefined, global: false, main: 'http://example.com/index.d.ts?query=test', dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); nock('http://example.com') .get('/index.d.ts?query=test') .matchHeader('User-Agent', /^typings\/\d+\.\d+\.\d+ node\/v\d+\.\d+\.\d+.*$/) .reply(200, 'export * from "./test"'); nock('http://example.com') .get('/test?query=test') .reply(404); nock('http://example.com') .get('/test.d.ts?query=test') .reply(200, 'export const test: boolean'); return compile_1.compile(node, ['main'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'~test/test\' {', 'export const test: boolean', '}', 'declare module \'test/test\' {', 'export * from \'~test/test\';', '}', '', 'declare module \'~test/index\' {', 'export * from \'~test/test\'', '}', 'declare module \'test/index\' {', 'export * from \'~test/index\';', '}', 'declare module \'test\' {', 'export * from \'~test/index\';', '}', '' ].join('\n')); }); }); t.test('resolve files array', function (t) { var FIXTURE_DIR = path_1.join(FIXTURES_DIR, 'compile-files-array'); var tree = { src: path_1.join(FIXTURE_DIR, 'typings.json'), raw: undefined, postmessage: undefined, global: false, files: ['a.d.ts', 'b.d.ts'], dependencies: {}, devDependencies: {}, peerDependencies: {}, globalDependencies: {}, globalDevDependencies: {} }; var emitter = new events_1.EventEmitter(); return compile_1.compile(tree, ['main', 'browser'], { name: 'test', cwd: __dirname, global: false, meta: false, emitter: emitter }) .then(function (out) { t.equal(out.results.main, [ 'declare module \'~test/a\' {', 'export const a: boolean;', '}', 'declare module \'test/a\' {', 'export * from \'~test/a\';', '}', '', 'declare module \'~test/b\' {', 'export const b: boolean;', '}', 'declare module \'test/b\' {', 'export * from \'~test/b\';', '}', '' ].join('\n')); t.equal(out.results.main, out.results.browser); }); }); }); //# sourceMappingURL=compile.spec.js.map