Skip to content

Commit

Permalink
feat(build): Added a version stamp in .metadata.json files.
Browse files Browse the repository at this point in the history
Also modified StaticReflector to handle multiple versions in a
single .metadata.json file.

Fixes angular#8974
  • Loading branch information
chuckjaz committed Jun 3, 2016
1 parent b160ada commit 5e4df1d
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 5 deletions.
5 changes: 5 additions & 0 deletions modules/@angular/compiler-cli/src/static_reflector.ts
Expand Up @@ -22,6 +22,8 @@ import {
InjectMetadata,
} from "@angular/core";
import {ReflectorReader} from "./core_private";

const SUPPORTED_SCHEMA_VERSION = 1;

/**
* The host of the static resolver is expected to be able to provide module metadata in the form of
Expand Down Expand Up @@ -379,6 +381,9 @@ export class StaticReflector implements ReflectorReader {
let moduleMetadata = this.metadataCache.get(module);
if (!moduleMetadata) {
moduleMetadata = this.host.getMetadataFor(module);
if (Array.isArray(moduleMetadata)) {
moduleMetadata = (<Array<any>>moduleMetadata).find(element => element.version === SUPPORTED_SCHEMA_VERSION);
}
if (!moduleMetadata) {
moduleMetadata = {__symbolic: "module", module: module, metadata: {}};
}
Expand Down
9 changes: 6 additions & 3 deletions modules/@angular/compiler-cli/test/static_reflector_spec.ts
Expand Up @@ -300,8 +300,9 @@ class MockReflectorHost implements StaticReflectorHost {

getMetadataFor(moduleId: string): any {
let data: {[key: string]: any} = {
'/tmp/angular2/src/common/forms/directives.d.ts': {
'/tmp/angular2/src/common/forms/directives.d.ts': [{
"__symbolic": "module",
"version": 1,
"metadata": {
"FORM_DIRECTIVES": [
{
Expand All @@ -311,9 +312,10 @@ class MockReflectorHost implements StaticReflectorHost {
}
]
}
},
}],
'/tmp/angular2/src/common/directives/ng_for.d.ts': {
"__symbolic": "module",
"version": 1,
"metadata": {
"NgFor": {
"__symbolic": "class",
Expand Down Expand Up @@ -375,6 +377,7 @@ class MockReflectorHost implements StaticReflectorHost {
{"metadata": {"ChangeDetectorRef": {"__symbolic": "class"}}},
'/tmp/src/app/hero-detail.component.d.ts': {
"__symbolic": "module",
"version": 1,
"metadata": {
"HeroDetailComponent": {
"__symbolic": "class",
Expand Down Expand Up @@ -422,7 +425,7 @@ class MockReflectorHost implements StaticReflectorHost {
}
}
},
'/src/extern.d.ts': {"__symbolic": "module", metadata: {s: "s"}}
'/src/extern.d.ts': {"__symbolic": "module", "version": 1, metadata: {s: "s"}},
};
return data[moduleId];
}
Expand Down
4 changes: 2 additions & 2 deletions tools/@angular/tsc-wrapped/src/collector.ts
@@ -1,7 +1,7 @@
import * as ts from 'typescript';

import {Evaluator, ImportMetadata, ImportSpecifierMetadata, isPrimitive} from './evaluator';
import {ClassMetadata, ConstructorMetadata, ModuleMetadata, MemberMetadata, MetadataError, MetadataMap, MetadataSymbolicExpression, MetadataSymbolicReferenceExpression, MetadataValue, MethodMetadata, isMetadataError, isMetadataSymbolicReferenceExpression,} from './schema';
import {ClassMetadata, ConstructorMetadata, ModuleMetadata, MemberMetadata, MetadataError, MetadataMap, MetadataSymbolicExpression, MetadataSymbolicReferenceExpression, MetadataValue, MethodMetadata, isMetadataError, isMetadataSymbolicReferenceExpression, VERSION} from './schema';
import {Symbols} from './symbols';

/**
Expand Down Expand Up @@ -207,6 +207,6 @@ export class MetadataCollector {
}
});

return metadata && {__symbolic: 'module', metadata};
return metadata && {__symbolic: 'module', version: VERSION, metadata};
}
}
12 changes: 12 additions & 0 deletions tools/@angular/tsc-wrapped/src/schema.ts
@@ -1,5 +1,17 @@
// Metadata Schema

// If you make a backwards incompatible change to the schema, increment the VERSION number.

// If you make a backwards compatible change to the metadata (such as adding an option field) then
// leave VERSION the same. If possible, as many versions of the metadata that can represent the
// semantics of the file in an array. For example, when generating a version 2 file, if version 1
// can accurately represent the metadata, generate both version 1 and version 2 in an array.

export const VERSION = 1;

export interface ModuleMetadata {
__symbolic: 'module';
version: number;
metadata: {[name: string]: (ClassMetadata | MetadataValue)};
}
export function isModuleMetadata(value: any): value is ModuleMetadata {
Expand Down

0 comments on commit 5e4df1d

Please sign in to comment.