fix(docs): Working generated angular2.d.ts
This requires some hacks, documented in https://docs.google.com/document/d/1nNebWTiLzz5ePcit_bjZPtaiSIFU4EsQKUlX7LX0c0A/edit Changes: - include subtyping info in angular2.d.ts by adding 'extends supertype' - export missing symbols needed transitively by angular2/angular2 - because of decorator/annotation mismatch, we can't export these to applications. So I've added a separate angular2.api.ts file to re-export specifically to .d.ts generation. - Hack to remove aliases introduced by 'import * as alias' syntax - Hack to deal with Error still an interface note that we require users to install the transitive dependencies - this is how TSD works.
This commit is contained in:
parent
5357b1548a
commit
7141c15e65
|
@ -15,8 +15,9 @@ module.exports = function createTypeDefinitionFile() {
|
||||||
};
|
};
|
||||||
_.forEach(docs, function(doc) {
|
_.forEach(docs, function(doc) {
|
||||||
// The shape of the public API is determined by what is reexported into
|
// The shape of the public API is determined by what is reexported into
|
||||||
// angular2/angular2.
|
// angular2/angular2, with hacks layered into angular2.api.ts
|
||||||
if (doc.id === 'angular2/angular2') {
|
if (doc.id === 'angular2/angular2.api') {
|
||||||
|
doc.id = 'angular2/angular2';
|
||||||
typeDefDoc.modules.push(doc);
|
typeDefDoc.modules.push(doc);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,7 +3,8 @@ var path = require('canonical-path');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var ts = require('typescript');
|
var ts = require('typescript');
|
||||||
|
|
||||||
module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, modules, getFileInfo, getExportDocType, getContent, log) {
|
module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, modules, getFileInfo,
|
||||||
|
getExportDocType, getContent, log) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
$runAfter: ['files-read'],
|
$runAfter: ['files-read'],
|
||||||
|
@ -12,8 +13,8 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
$validate: {
|
$validate: {
|
||||||
sourceFiles: {presence: true},
|
sourceFiles: {presence: true},
|
||||||
basePath: {presence: true},
|
basePath: {presence: true},
|
||||||
hidePrivateMembers: { inclusion: [true, false] },
|
hidePrivateMembers: {inclusion: [true, false]},
|
||||||
sortClassMembers: { inclusion: [true, false] },
|
sortClassMembers: {inclusion: [true, false]},
|
||||||
ignoreExportsMatching: {}
|
ignoreExportsMatching: {}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
|
|
||||||
// Generate docs for each of the export's members
|
// Generate docs for each of the export's members
|
||||||
if (resolvedExport.flags & ts.SymbolFlags.HasMembers) {
|
if (resolvedExport.flags & ts.SymbolFlags.HasMembers) {
|
||||||
|
|
||||||
exportDoc.members = [];
|
exportDoc.members = [];
|
||||||
for(var memberName in resolvedExport.members) {
|
for(var memberName in resolvedExport.members) {
|
||||||
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
|
log.silly('>>>>>> member: ' + memberName + ' from ' + exportDoc.id + ' in ' + moduleDoc.id);
|
||||||
|
@ -115,6 +116,29 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
}
|
}
|
||||||
|
|
||||||
function createExportDoc(name, exportSymbol, moduleDoc, basePath, typeChecker) {
|
function createExportDoc(name, exportSymbol, moduleDoc, basePath, typeChecker) {
|
||||||
|
exportSymbol.declarations.forEach(function(decl) {
|
||||||
|
var sourceFile = ts.getSourceFileOfNode(decl);
|
||||||
|
if (decl.typeParameters) {
|
||||||
|
name = name + '<' + getText(sourceFile, decl.typeParameters) + '>';
|
||||||
|
}
|
||||||
|
if (decl.heritageClauses) {
|
||||||
|
decl.heritageClauses.forEach(function(heritage) {
|
||||||
|
if (heritage.token == ts.SyntaxKind.ExtendsKeyword) {
|
||||||
|
name = name + " extends ";
|
||||||
|
heritage.types.forEach(function(typ, idx) {
|
||||||
|
name = name + (idx > 0 ? ', ' : '') + typ.getFullText();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (heritage.token == ts.SyntaxKind.ImplementsKeyword) {
|
||||||
|
name = name + " implements ";
|
||||||
|
heritage.types.forEach(function(typ, idx) {
|
||||||
|
name = name + (idx > 0 ? ', ' : '') + typ.getFullText();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
var exportDoc = {
|
var exportDoc = {
|
||||||
docType: getExportDocType(exportSymbol),
|
docType: getExportDocType(exportSymbol),
|
||||||
name: name,
|
name: name,
|
||||||
|
@ -167,14 +191,21 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
function getParameters(typeChecker, symbol) {
|
function getParameters(typeChecker, symbol) {
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
var sourceFile = ts.getSourceFileOfNode(declaration);
|
||||||
if(!declaration.parameters) {
|
if (!declaration.parameters) {
|
||||||
var location = getLocation(symbol);
|
var location = getLocation(symbol);
|
||||||
throw new Error('missing declaration parameters for "' + symbol.name +
|
throw new Error('missing declaration parameters for "' + symbol.name +
|
||||||
'" in ' + sourceFile.fileName +
|
'" in ' + sourceFile.fileName +
|
||||||
' at line ' + location.start.line);
|
' at line ' + location.start.line);
|
||||||
}
|
}
|
||||||
return declaration.parameters.map(function(parameter) {
|
return declaration.parameters.map(function(parameter) {
|
||||||
return getText(sourceFile, parameter).trim();
|
var paramText = getText(sourceFile, parameter.name);
|
||||||
|
if (parameter.questionToken || parameter.initializer) {
|
||||||
|
paramText += '?';
|
||||||
|
}
|
||||||
|
if (parameter.type) {
|
||||||
|
paramText += ':' + getType(sourceFile, parameter.type);
|
||||||
|
}
|
||||||
|
return paramText.trim();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +213,7 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
var declaration = symbol.valueDeclaration || symbol.declarations[0];
|
||||||
var sourceFile = ts.getSourceFileOfNode(declaration);
|
var sourceFile = ts.getSourceFileOfNode(declaration);
|
||||||
if (declaration.type) {
|
if (declaration.type) {
|
||||||
return getText(sourceFile, declaration.type).trim();
|
return getType(sourceFile, declaration.type).trim();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +232,18 @@ module.exports = function readTypeScriptModules(tsParser, readFilesProcessor, mo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Strip any local renamed imports from the front of types
|
||||||
|
function getType(sourceFile, type) {
|
||||||
|
var text = getText(sourceFile, type);
|
||||||
|
while (text.indexOf(".") >= 0) {
|
||||||
|
// Keep namespaced symbols in Rx
|
||||||
|
if (text.match(/^\s*Rx\./)) break;
|
||||||
|
// handle the case List<thing.stuff> -> List<stuff>
|
||||||
|
text = text.replace(/([^.<]*)\.([^>]*)/, "$2");
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
function getLocation(symbol) {
|
function getLocation(symbol) {
|
||||||
var node = symbol.valueDeclaration || symbol.declarations[0];
|
var node = symbol.valueDeclaration || symbol.declarations[0];
|
||||||
var sourceFile = ts.getSourceFileOfNode(node);
|
var sourceFile = ts.getSourceFileOfNode(node);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
{$ '*/' | indent(level, true) | replace(r/\n$/, "") $}{% endif -%}
|
{$ '*/' | indent(level, true) | replace(r/\n$/, "") $}{% endif -%}
|
||||||
{%- endmacro -%}
|
{%- endmacro -%}
|
||||||
|
|
||||||
// Type definitions for Angular v2.0.0-alpha.22
|
// Type definitions for Angular v2.0.0-alpha.26
|
||||||
// Project: http://angular.io/
|
// Project: http://angular.io/
|
||||||
// Definitions by: angular team <https://github.com/angular/>
|
// Definitions by: angular team <https://github.com/angular/>
|
||||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||||
|
@ -16,6 +16,29 @@
|
||||||
// Please do not create manual edits or send pull requests
|
// Please do not create manual edits or send pull requests
|
||||||
// modifying this file.
|
// modifying this file.
|
||||||
// ***********************************************************
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Angular depends transitively on these libraries.
|
||||||
|
// If you don't have them installed you can run
|
||||||
|
// $ tsd query es6-promise rx rx-lite --action install --save
|
||||||
|
///<reference path="../es6-promise/es6-promise.d.ts"/>
|
||||||
|
///<reference path="../rx/rx.d.ts"/>
|
||||||
|
|
||||||
|
interface List<T> extends Array<T> {}
|
||||||
|
interface Map<K,V> {}
|
||||||
|
interface StringMap<K,V> extends Map<K,V> {}
|
||||||
|
interface Type {}
|
||||||
|
|
||||||
|
declare module "angular2/angular2" {
|
||||||
|
type SetterFn = typeof Function;
|
||||||
|
type int = number;
|
||||||
|
|
||||||
|
// See https://github.com/Microsoft/TypeScript/issues/1168
|
||||||
|
class BaseException /* extends Error */ {
|
||||||
|
message;
|
||||||
|
stack;
|
||||||
|
toString(): string;
|
||||||
|
}
|
||||||
|
}
|
||||||
{% for module in doc.modules %}
|
{% for module in doc.modules %}
|
||||||
{$ commentBlock(module, 1) $}
|
{$ commentBlock(module, 1) $}
|
||||||
declare module "{$ module.id $}" {
|
declare module "{$ module.id $}" {
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
library angular2.angular2.api;
|
||||||
|
// Ignore this file for dart emit.
|
||||||
|
// It is used only for generating the TypeScript .d.ts file.
|
|
@ -0,0 +1,28 @@
|
||||||
|
// This module is used by dgeni to produce the angular2.d.ts file.
|
||||||
|
|
||||||
|
// Re-export everything we export to the application runtime
|
||||||
|
export * from './angular2';
|
||||||
|
|
||||||
|
// Horrible hack. See
|
||||||
|
// https://docs.google.com/document/d/1nNebWTiLzz5ePcit_bjZPtaiSIFU4EsQKUlX7LX0c0A/edit
|
||||||
|
// Exports needed to make angular2.d.ts work,
|
||||||
|
// because these symbols are dependencies of other exports but are not otherwise exported.
|
||||||
|
// This should be cleaned up in one of two ways:
|
||||||
|
// 1) if the symbol is intended to be part of the public API, then re-export somewhere else
|
||||||
|
// 2) if the symbol should be omitted from the public API, then the class exposing it should
|
||||||
|
// not be exported, or should avoid exposing the symbol.
|
||||||
|
export {AbstractChangeDetector} from './src/change_detection/abstract_change_detector';
|
||||||
|
export {ProtoRecord} from './src/change_detection/proto_record';
|
||||||
|
export * from './src/core/compiler/element_injector';
|
||||||
|
// FIXME: this is a workaround for https://github.com/angular/angular/issues/2356
|
||||||
|
// We export the Directive *annotation* instead of the *decorator*.
|
||||||
|
// But it breaks the build.
|
||||||
|
export {Directive, LifecycleEvent} from './src/core/annotations_impl/annotations';
|
||||||
|
export {FormDirective} from './src/forms/directives/form_directive';
|
||||||
|
export {ControlContainerDirective} from './src/forms/directives/control_container_directive';
|
||||||
|
export {Injectable} from './src/di/annotations_impl';
|
||||||
|
export {BaseQueryList} from './src/core/compiler/base_query_list';
|
||||||
|
export {AppProtoView, AppView, AppViewContainer} from './src/core/compiler/view';
|
||||||
|
export * from './src/change_detection/parser/ast';
|
||||||
|
export {Visibility} from './src/core/annotations_impl/visibility';
|
||||||
|
export {AppViewManager} from './src/core/compiler/view_manager';
|
Loading…
Reference in New Issue