├── .angular-cli.json
├── .editorconfig
├── .firebaserc
├── .gitignore
├── .travis.yml
├── LICENSE.md
├── README.md
├── doc
├── revitToIfc.gif
└── screenshot.png
├── e2e
├── app.e2e-spec.ts
├── app.po.ts
└── tsconfig.json
├── firebase.json
├── karma.conf.js
├── package-lock.json
├── package.json
├── protractor.config.js
├── src
├── app
│ ├── app.component.html
│ ├── app.component.scss
│ ├── app.component.spec.ts
│ ├── app.component.ts
│ ├── app.module.ts
│ ├── app.routing.ts
│ ├── index.ts
│ └── revit-converter
│ │ ├── revit-converter.component.html
│ │ ├── revit-converter.component.scss
│ │ ├── revit-converter.component.spec.ts
│ │ ├── revit-converter.component.ts
│ │ ├── revit-converter.models.ts
│ │ ├── revit-converter.service.spec.ts
│ │ └── revit-converter.service.ts
├── environments
│ ├── environment.prod.ts
│ └── environment.ts
├── favicon.ico
├── images
│ ├── cloud.svg
│ ├── revitToIFC_logo.png
│ └── revitToIFC_logo.svg
├── index.html
├── main.ts
├── polyfills.ts
├── styles.css
├── test.ts
├── tsconfig.json
└── typings.d.ts
├── tslint.json
└── typings.json
/.angular-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "project": {
3 | "version": "1.0.0-beta.20-4",
4 | "name": "RevitToIFC"
5 | },
6 | "apps": [
7 | {
8 | "root": "src",
9 | "outDir": "dist",
10 | "assets": [
11 | "images",
12 | "favicon.ico"
13 | ],
14 | "index": "index.html",
15 | "main": "main.ts",
16 | "test": "test.ts",
17 | "tsconfig": "tsconfig.json",
18 | "prefix": "app",
19 | "mobile": false,
20 | "styles": [
21 | "../node_modules/@clr/icons/clr-icons.min.css",
22 | "../node_modules/@clr/ui/clr-ui.min.css",
23 | "styles.css"
24 | ],
25 | "scripts": [
26 | "../node_modules/core-js/client/shim.min.js",
27 | "../node_modules/mutationobserver-shim/dist/mutationobserver.min.js",
28 | "../node_modules/@webcomponents/custom-elements/custom-elements.min.js",
29 | "../node_modules/@clr/icons/clr-icons.min.js",
30 | "../node_modules/web-animations-js/web-animations.min.js"
31 | ],
32 | "environmentSource": "environments/environment.ts",
33 | "environments": {
34 | "dev": "environments/environment.ts",
35 | "prod": "environments/environment.prod.ts"
36 | }
37 | }
38 | ],
39 | "addons": [],
40 | "packages": [],
41 | "e2e": {
42 | "protractor": {
43 | "config": "./protractor.config.js"
44 | }
45 | },
46 | "test": {
47 | "karma": {
48 | "config": "./karma.conf.js"
49 | }
50 | },
51 | "defaults": {
52 | "styleExt": "scss",
53 | "prefixInterfaces": false,
54 | "inline": {
55 | "style": false,
56 | "template": false
57 | },
58 | "spec": {
59 | "class": false,
60 | "component": true,
61 | "directive": true,
62 | "module": false,
63 | "pipe": true,
64 | "service": true
65 | }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 4
8 | end_of_line = lf
9 | insert_final_newline = true
10 | trim_trailing_whitespace = true
11 |
12 |
13 | [*.md]
14 | max_line_length = 0
15 | trim_trailing_whitespace = true
16 |
17 | # Indentation override
18 | #[lib/**.js]
19 | #[{package.json,.travis.yml}]
20 | #[**/**.js]
21 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "revit-to-ifc"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | coverage/
2 | dist/
3 | html-report/
4 | node_modules/
5 | typings/
6 | **/*npm-debug.log.*
7 | **/*yarn-error.log.*
8 | .idea/
9 | .DS_Store
10 | .npmrc
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "8.9.3"
4 |
5 | sudo: required
6 | dist: trusty
7 | group: edge
8 |
9 | addons:
10 | apt:
11 | sources:
12 | - ubuntu-toolchain-r-test
13 | - google-chrome
14 | packages:
15 | - g++-4.8
16 | - google-chrome-stable
17 |
18 | before_install:
19 | - export CHROME_BIN=/usr/bin/google-chrome
20 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015-present Dan Abramov
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | **This project is now archived, you can find the new version in [RevitToIFCApp](https://github.com/simonmoreau/RevitToIFCApp)**
2 |
3 | ----
4 |
5 |
6 |
7 |
8 | RevitToIFC
9 |
10 |
11 | A Web App to convert Revit files to IFC
12 |
13 | # Overview
14 |
15 | Revit To IFC is a web application using the Autodesk Forge web services to convert Revit file to the IFC format. You can use this application to upload your Revit file to the Forge service and download back the converted file.
16 |
17 | 
18 |
19 | # Installation
20 |
21 | *Prerequisite*:
22 |
23 | * Please install Angular-CLI by following [these instructions](https://github.com/angular/angular-cli#installation).
24 | * Create a new application on the [Autodesk Forge website](https://developer.autodesk.com/myapps/create). This app must include the Data Management API and the Model Derivative API
25 |
26 | ```bash
27 | git clone https://github.com/simonmoreau/RevitToIFC.git
28 | cd RevitToIFC
29 |
30 | # install the project's dependencies
31 | npm install
32 |
33 | # starts the application in dev mode and watches your files for livereload
34 | ng serve
35 | ```
36 |
37 | For comprehensive documentation on Angular-CLI, please see their [github repository](https://github.com/angular/angular-cli).
38 |
39 | This Web app use [Azure Function](https://azure.microsoft.com/en-us/services/functions/) to retrieve a Forge access token. You can find this function [here](https://github.com/simonmoreau/ForgeFunction).
40 |
41 | # Built With
42 |
43 | * [Angular](https://angular.io)
44 | * [Autodesk Forge](https://forge.autodesk.com/) - A web service used to convert Revit file to IFC
45 |
46 | # Development
47 |
48 | Want to contribute? Great, I would be happy to integrate your improvements!
49 |
50 | To fix a bug or enhance an existing module, follow these steps:
51 |
52 | * Fork the repo
53 | * Create a new branch (`git checkout -b improve-feature`)
54 | * Make the appropriate changes in the files
55 | * Add changes to reflect the changes made
56 | * Commit your changes (`git commit -am 'Improve feature'`)
57 | * Push to the branch (`git push origin improve-feature`)
58 | * Create a Pull Request
59 |
60 | ## Bug / Feature Request
61 |
62 | If you find a bug (connection issue, error while uploading, ...), kindly open an issue [here](https://github.com/simonmoreau/RevitToIFC/issues/new) by including a screenshot of your problem and the expected result.
63 |
64 | If you'd like to request a new function, feel free to do so by opening an issue [here](https://github.com/simonmoreau/RevitToIFC/issues/new). Please include workflows samples and their corresponding results.
65 |
66 | # License
67 |
68 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details
69 |
70 | # Contact information
71 |
72 | This software is an open-source project mostly maintained by myself, Simon Moreau. If you have any questions or request, feel free to contact me at [simon@bim42.com](mailto:simon@bim42.com) or on Twitter [@bim42](https://twitter.com/bim42?lang=en).
73 |
--------------------------------------------------------------------------------
/doc/revitToIfc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simonmoreau/RevitToIFC/b532fcf50e0894c844f36068c436848fdbebeb29/doc/revitToIfc.gif
--------------------------------------------------------------------------------
/doc/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simonmoreau/RevitToIFC/b532fcf50e0894c844f36068c436848fdbebeb29/doc/screenshot.png
--------------------------------------------------------------------------------
/e2e/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import {RevitToIFCAppHome} from './app.po';
2 |
3 | fdescribe('RevitToIFC app', function () {
4 |
5 | let expectedMsg: string = 'This is the RevitToIFC application. This is the default page that loads for the application.';
6 |
7 | let page: RevitToIFCAppHome;
8 |
9 | beforeEach(() => {
10 | page = new RevitToIFCAppHome();
11 | });
12 |
13 | it('should display: ' + expectedMsg, () => {
14 | page.navigateTo();
15 | expect(page.getParagraphText()).toEqual(expectedMsg)
16 | });
17 | });
18 |
--------------------------------------------------------------------------------
/e2e/app.po.ts:
--------------------------------------------------------------------------------
1 | import { browser, element, by } from 'protractor';
2 |
3 |
4 | export class RevitToIFCAppHome {
5 |
6 | navigateTo() {
7 | return browser.get('/');
8 | }
9 |
10 | getParagraphText() {
11 | return element(by.css('my-app p')).getText();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/e2e/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "rootDir": "../",
5 | "baseUrl": "",
6 | "declaration": false,
7 | "emitDecoratorMetadata": true,
8 | "experimentalDecorators": true,
9 | "module": "commonjs",
10 | "moduleResolution": "node",
11 | "outDir": "dist/out-tsc-e2e",
12 | "sourceMap": true,
13 | "target": "es5",
14 | "typeRoots": [
15 | "node_modules/@types"
16 | ],
17 | "types": [
18 | "jasmine",
19 | "jasminewd2"
20 | ]
21 | },
22 | "exclude": [
23 | "node_modules",
24 | "dist"
25 | ]
26 | }
27 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "dist",
4 | "ignore": [
5 | "firebase.json",
6 | "**/.*",
7 | "**/node_modules/**"
8 | ],
9 | "rewrites": [
10 | {
11 | "source": "**",
12 | "destination": "/index.html"
13 | }
14 | ]
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/karma.conf.js:
--------------------------------------------------------------------------------
1 | // Karma configuration file, see link for more information
2 | // https://karma-runner.github.io/0.13/config/configuration-file.html
3 |
4 | module.exports = function (config) {
5 | config.set({
6 | basePath: '',
7 | frameworks: ['jasmine', '@angular/cli'],
8 | plugins: [
9 | require('karma-jasmine'),
10 | require('karma-chrome-launcher'),
11 | require('karma-mocha-reporter'),
12 | require('karma-remap-istanbul'),
13 | require('@angular/cli/plugins/karma')
14 | ],
15 | files: [
16 | {pattern: './src/test.ts', watched: false}
17 | ],
18 | preprocessors: {
19 | './src/test.ts': ['@angular/cli']
20 | },
21 | mime: {
22 | 'text/x-typescript': ['ts', 'tsx']
23 | },
24 | remapIstanbulReporter: {
25 | reports: {
26 | html: 'coverage',
27 | lcovonly: './coverage/coverage.lcov'
28 | }
29 | },
30 | coverageIstanbulReporter: {
31 | reports: [ 'html', 'lcovonly', 'text-summary' ],
32 | fixWebpackSourcePaths: true
33 | },
34 | angularCli: {
35 | config: './.angular-cli.json',
36 | environment: 'dev'
37 | },
38 | reporters: config.angularCli && config.angularCli.codeCoverage
39 | ? ['mocha', 'karma-remap-istanbul']
40 | : ['mocha'],
41 | port: 9876,
42 | colors: true,
43 | logLevel: config.LOG_INFO,
44 | autoWatch: true,
45 | browsers: ['ChromeHeadless'],
46 | singleRun: true
47 | });
48 | };
49 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "revit-to-ifc",
3 | "version": "0.10.0",
4 | "description": "A Web App to convert Revit files to IFC",
5 | "angular-cli": {},
6 | "scripts": {
7 | "start": "ng serve",
8 | "lint": "tslint \"src/**/*.ts\"",
9 | "test": "ng test --single-run",
10 | "pree2e": "webdriver-manager update",
11 | "e2e": "protractor protractor.config.js"
12 | },
13 | "private": true,
14 | "dependencies": {
15 | "@angular/animations": "^5.2.0",
16 | "@angular/common": "^5.2.0",
17 | "@angular/compiler": "^5.2.0",
18 | "@angular/core": "^5.2.0",
19 | "@angular/forms": "^5.2.0",
20 | "@angular/http": "^5.2.0",
21 | "@angular/platform-browser": "^5.2.0",
22 | "@angular/platform-browser-dynamic": "^5.2.0",
23 | "@angular/router": "^5.2.0",
24 | "@clr/angular": "^0.11.0",
25 | "@clr/icons": "^0.11.0",
26 | "@clr/ui": "^0.11.0",
27 | "@webcomponents/custom-elements": "1.0.0",
28 | "core-js": "^2.4.1",
29 | "mutationobserver-shim": "^0.3.2",
30 | "ng2-file-upload": "^1.3.0",
31 | "rxjs": "^5.5.6",
32 | "ts-helpers": "^1.1.1",
33 | "web-animations-js": "^2.3.1",
34 | "zone.js": "^0.8.19"
35 | },
36 | "devDependencies": {
37 | "@angular/cli": "~1.7.0",
38 | "@angular/compiler-cli": "^5.2.0",
39 | "@angular/language-service": "^5.2.0",
40 | "@types/core-js": "~0.9.42",
41 | "@types/jasmine": "~2.8.3",
42 | "@types/jasminewd2": "~2.0.2",
43 | "@types/node": "~6.0.60",
44 | "bootstrap": "4.0.0-alpha.5",
45 | "codelyzer": "^4.0.1",
46 | "enhanced-resolve": "~3.4.1",
47 | "jasmine-core": "~2.8.0",
48 | "jasmine-spec-reporter": "~4.2.1",
49 | "karma": "~2.0.0",
50 | "karma-chrome-launcher": "~2.2.0",
51 | "karma-coverage-istanbul-reporter": "^1.2.1",
52 | "karma-jasmine": "~1.1.0",
53 | "karma-jasmine-html-reporter": "^0.2.2",
54 | "karma-cli": "^1.0.1",
55 | "karma-mocha-reporter": "~2.2.1",
56 | "karma-remap-istanbul": "~0.6.0",
57 | "protractor": "~5.1.2",
58 | "ts-node": "~4.1.0",
59 | "tslint": "~5.9.1",
60 | "typescript": "~2.5.3",
61 | "typings": "^1.4.0",
62 | "webdriver-manager": "^12.0.6"
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/protractor.config.js:
--------------------------------------------------------------------------------
1 | // Protractor configuration file, see link for more information
2 | // https://github.com/angular/protractor/blob/master/lib/config.ts
3 |
4 | const { SpecReporter } = require('jasmine-spec-reporter');
5 |
6 | exports.config = {
7 | allScriptsTimeout: 11000,
8 | specs: [
9 | './e2e/**/*.e2e-spec.ts'
10 | ],
11 | capabilities: {
12 | 'browserName': 'chrome'
13 | },
14 | directConnect: true,
15 | baseUrl: 'http://localhost:4200/',
16 | framework: 'jasmine',
17 | jasmineNodeOpts: {
18 | showColors: true,
19 | defaultTimeoutInterval: 30000,
20 | print: function() {}
21 | },
22 | onPrepare() {
23 | require('ts-node').register({
24 | project: 'e2e/tsconfig.json'
25 | });
26 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/src/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
11 |
13 |
14 |
19 |
--------------------------------------------------------------------------------
/src/app/app.component.scss:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2016 VMware, Inc. All Rights Reserved.
2 | // This software is released under MIT license.
3 | // The full license information can be found in LICENSE in the root directory of this project.
4 | .clr-icon {
5 | &.clr-revitToIFC-logo {
6 | background-image: url(../images/revitToIFC_logo.png);
7 | height: 36px;
8 | width: 36px;
9 | margin-right: 11px;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/app/app.component.spec.ts:
--------------------------------------------------------------------------------
1 | /* tslint:disable:no-unused-variable */
2 |
3 | import { TestBed, async, ComponentFixture } from '@angular/core/testing';
4 | import { AppComponent } from './app.component';
5 | import { ClarityModule } from "@clr/angular";
6 | import { ROUTING } from "./app.routing";
7 | import { APP_BASE_HREF } from "@angular/common";
8 |
9 | describe('AppComponent', () => {
10 |
11 | let fixture: ComponentFixture;
12 | let compiled: any;
13 |
14 | beforeEach(() => {
15 | TestBed.configureTestingModule({
16 | declarations: [
17 | AppComponent
18 | ],
19 | imports: [
20 | ClarityModule.forRoot(),
21 | ROUTING
22 | ],
23 | providers: [{provide: APP_BASE_HREF, useValue: '/'}]
24 | });
25 |
26 | fixture = TestBed.createComponent(AppComponent);
27 | fixture.detectChanges();
28 | compiled = fixture.nativeElement;
29 |
30 |
31 | });
32 |
33 | afterEach(() => {
34 | fixture.destroy();
35 | });
36 |
37 | it('should create the app', async(() => {
38 | expect(compiled).toBeTruthy();
39 | }));
40 |
41 |
42 | });
43 |
--------------------------------------------------------------------------------
/src/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { Router } from '@angular/router';
3 |
4 | @Component({
5 | selector: 'my-app',
6 | templateUrl: './app.component.html',
7 | styleUrls: ['./app.component.scss']
8 | })
9 | export class AppComponent {
10 | constructor(private router: Router) {
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { BrowserAnimationsModule } from "@angular/platform-browser/animations";
2 | import { BrowserModule } from '@angular/platform-browser';
3 | import { NgModule } from '@angular/core';
4 | import { FormsModule } from '@angular/forms';
5 | import { HttpModule } from '@angular/http';
6 | import {HttpClientModule} from '@angular/common/http';
7 | import { ClarityModule } from '@clr/angular';
8 | import { AppComponent } from './app.component';
9 | import { ROUTING } from "./app.routing";
10 | import { RevitConverterComponent } from './revit-converter/revit-converter.component';
11 | import { FileUploadModule } from "ng2-file-upload";
12 |
13 | @NgModule({
14 | declarations: [
15 | AppComponent,
16 | RevitConverterComponent,
17 | ],
18 | imports: [
19 | BrowserAnimationsModule,
20 | BrowserModule,
21 | FormsModule,
22 | HttpModule,
23 | HttpClientModule,
24 | ClarityModule,
25 | ROUTING,
26 | FileUploadModule
27 | ],
28 | providers: [],
29 | bootstrap: [AppComponent]
30 | })
31 | export class AppModule {
32 | }
33 |
--------------------------------------------------------------------------------
/src/app/app.routing.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (c) 2016 VMware, Inc. All Rights Reserved.
3 | * This software is released under MIT license.
4 | * The full license information can be found in LICENSE in the root directory of this project.
5 | */
6 | import { ModuleWithProviders } from '@angular/core/src/metadata/ng_module';
7 | import { Routes, RouterModule } from '@angular/router';
8 | import { RevitConverterComponent } from './revit-converter/revit-converter.component'
9 |
10 | export const ROUTES: Routes = [
11 | {path: '', redirectTo: 'home', pathMatch: 'full'},
12 | {path: 'home', component: RevitConverterComponent}
13 | ];
14 |
15 | export const ROUTING: ModuleWithProviders = RouterModule.forRoot(ROUTES);
16 |
--------------------------------------------------------------------------------
/src/app/index.ts:
--------------------------------------------------------------------------------
1 | export * from './app.component';
2 | export * from './app.module';
3 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.component.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Upload Revit Files
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | Name
26 | Size
27 | Status
28 | Actions
29 |
30 |
31 |
32 |
33 |
34 | {{ item?.file?.name }}
35 |
36 |
37 | {{ item?.file?.size/1024/1024 | number:'.2' }} MB
38 |
39 |
40 |
41 | {{item?.formData?.status}}
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | Upload
50 |
51 |
52 | Remove
53 |
54 |
55 | Download
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | Upload all
64 |
65 |
66 | Remove all
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 | This free service rely on the
82 |
Autodesk Forge service to convert your Revit file to IFC. Its source is available on
83 |
Github .
84 |
If you find it usefull, you can buy me a coffee !
85 |
86 |
92 |
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.component.scss:
--------------------------------------------------------------------------------
1 | /* .my-drop-zone { border: dotted 3px #007cbb; } */
2 | .nv-file-over { border: solid 5px #007cbb; min-height: 500px } /* Default class applied to drop zones on over */
3 | .another-file-over-class { border: dotted 3px green; }
4 |
5 | html, body { height: 100%; }
6 |
7 | .table td { vertical-align: inherit;}
8 |
9 | .clr-icon {
10 | &.clr-cloud-logo {
11 | background-image: url(../../images/cloud.svg);
12 | height: 124px;
13 | width: 200px;
14 | margin: 40px;
15 | }
16 | }
17 | .card-footer {
18 | &.coffee {
19 | text-align: center;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.component.spec.ts:
--------------------------------------------------------------------------------
1 | import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2 |
3 | import { RevitConverterComponent } from './revit-converter.component';
4 |
5 | describe('RevitConverterComponent', () => {
6 | let component: RevitConverterComponent;
7 | let fixture: ComponentFixture
;
8 |
9 | beforeEach(async(() => {
10 | TestBed.configureTestingModule({
11 | declarations: [ RevitConverterComponent ]
12 | })
13 | .compileComponents();
14 | }));
15 |
16 | beforeEach(() => {
17 | fixture = TestBed.createComponent(RevitConverterComponent);
18 | component = fixture.componentInstance;
19 | fixture.detectChanges();
20 | });
21 |
22 | it('should create', () => {
23 | expect(component).toBeTruthy();
24 | });
25 | });
26 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from "@angular/core";
2 | import {
3 | FileUploader,
4 | FileUploaderOptions,
5 | Headers,
6 | FileItem,
7 | ParsedResponseHeaders
8 | } from "ng2-file-upload";
9 | import { RevitConverterService } from "./revit-converter.service";
10 | import {
11 | ConversionJob,
12 | UploadAnswer,
13 | FormDataStatus
14 | } from "./revit-converter.models";
15 |
16 | const baseUrl = "https://developer.api.autodesk.com/oss/v2/buckets/";
17 |
18 | @Component({
19 | selector: "app-revit-converter",
20 | templateUrl: "./revit-converter.component.html",
21 | styleUrls: ["./revit-converter.component.scss"],
22 | providers: [RevitConverterService]
23 | })
24 | export class RevitConverterComponent implements OnInit {
25 | public uploader: FileUploader = new FileUploader({
26 | disableMultipart: true
27 | });
28 | public uploaderOptions: FileUploaderOptions;
29 | public hasBaseDropZoneOver: boolean = false;
30 | public hasAnotherDropZoneOver: boolean = false;
31 | public access_token = "";
32 |
33 | constructor(private _revitConverterService: RevitConverterService) {}
34 |
35 | ngOnInit() {
36 | // Fetch an access token
37 |
38 | this._revitConverterService.GetAccessToken().subscribe(token => {
39 | this.access_token = token.access_token;
40 | this.uploader.onBeforeUploadItem = item => {
41 | item.method = "PUT";
42 | item.url =
43 | baseUrl +
44 | "revittoifcbucket/objects/" +
45 | Date.now().toString() +
46 | "_" +
47 | item.file.name;
48 |
49 | let headers: Headers[] = [
50 | {
51 | name: "Authorization",
52 | value: "Bearer " + this.access_token
53 | },
54 | { name: "Content-Type", value: "application/octet-stream" }
55 | ];
56 |
57 | item.headers = headers;
58 |
59 | let itemStatus: FormDataStatus = {
60 | intervalId: null,
61 | status: "Uploading",
62 | urn: "",
63 | derivativeUrn: ""
64 | };
65 | item.formData = itemStatus;
66 | };
67 |
68 | this.uploader.onAfterAddingFile = (item: FileItem) => {
69 | let extension: string = item.file.name.split(".").pop();
70 | if (extension !== "rvt") {
71 | item.remove();
72 | }
73 | };
74 |
75 | this.uploader.onCompleteItem = (
76 | item: FileItem,
77 | response: string,
78 | status: number,
79 | headers: ParsedResponseHeaders
80 | ) => {
81 | console.log(response);
82 | let uploadResponse: UploadAnswer = JSON.parse(response);
83 |
84 | this._revitConverterService
85 | .PostJobRequest(this.access_token, uploadResponse.objectId)
86 | .subscribe(answer => {
87 | this._revitConverterService
88 | .GetJobStatus(this.access_token, answer.urn)
89 | .subscribe(jobStatus1 => {
90 | let itemStatus: FormDataStatus = {
91 | intervalId: null,
92 | status: "Converting",
93 | urn: answer.urn,
94 | derivativeUrn: ""
95 | };
96 | item.formData = itemStatus;
97 |
98 | if (jobStatus1.derivatives.length === 0) {
99 | let interval = setInterval(
100 | this.UpdateJobStatus,
101 | 2000,
102 | this.access_token,
103 | answer.urn,
104 | this._revitConverterService,
105 | item
106 | );
107 | item.formData.intervalId = interval;
108 | } else {
109 | // When the conversion is complete
110 | if (jobStatus1.status === "failed") {
111 | itemStatus.status = "Failed";
112 | } else {
113 | itemStatus.status = "Complete";
114 | // Add the download link
115 | let derivativeUrn: string = jobStatus1.derivatives.filter(
116 | derivative =>
117 | derivative.outputType === "ifc"
118 | )[0].children[0].urn;
119 | itemStatus.derivativeUrn = derivativeUrn;
120 | }
121 | }
122 | }, error => (this._revitConverterService.errorMessage = error));
123 | }, error => (this._revitConverterService.errorMessage = error));
124 | };
125 | }, error => (this._revitConverterService.errorMessage = error));
126 | }
127 |
128 | /**
129 | * UpdateJobStatus
130 | */
131 | public UpdateJobStatus(
132 | access_token: string,
133 | urn: string,
134 | service: RevitConverterService,
135 | item: FileItem
136 | ): void {
137 | service.GetJobStatus(access_token, urn).subscribe(jobCurrentStatus => {
138 | let itemStatus: FormDataStatus = item.formData;
139 |
140 | if (jobCurrentStatus.derivatives.length === 0) {
141 | // While the job is running
142 | let conversionProgress: string = jobCurrentStatus.progress.match(
143 | new RegExp("\\d*%")
144 | )[0];
145 | itemStatus.status = "Converting " + conversionProgress; // ;
146 | } else {
147 | // When the conversion is complete
148 | if (jobCurrentStatus.status === "failed") {
149 | itemStatus.status = "Failed";
150 | } else {
151 | itemStatus.status = "Complete";
152 | // Add the download link
153 | let derivativeUrn: string = jobCurrentStatus.derivatives.filter(
154 | derivative => derivative.outputType === "ifc"
155 | )[0].children[0].urn;
156 | itemStatus.derivativeUrn = derivativeUrn;
157 | }
158 | }
159 | }, error => (this._revitConverterService.errorMessage = error));
160 | }
161 |
162 | /**
163 | * Download file
164 | */
165 | public DownloadFile(urn: string, derivative: string) {
166 | let fileName: string = derivative.replace(/^.*[\\\/]/, "");
167 | fileName = fileName.replace(new RegExp("\\d*_"), "");
168 | this._revitConverterService
169 | .GetDerivative(this.access_token, urn, derivative)
170 | .subscribe(data =>
171 | this._revitConverterService.downloadFile(data, fileName)
172 | );
173 | }
174 | /**
175 | * DeleteBuckets
176 | */
177 | public DeleteBuckets() {
178 | let bucketsNames: string[] = ["bucketname"];
179 |
180 | bucketsNames.forEach(bucketsName => {
181 | this._revitConverterService
182 | .DeleteBucket(this.access_token, bucketsName)
183 | .subscribe(response => {
184 | console.log(bucketsName + response);
185 | }, error => (this._revitConverterService.errorMessage = error));
186 | });
187 | }
188 |
189 | public fileOverBase(e: any): void {
190 | this.hasBaseDropZoneOver = e;
191 | }
192 |
193 | public fileOverAnother(e: any): void {
194 | this.hasAnotherDropZoneOver = e;
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.models.ts:
--------------------------------------------------------------------------------
1 | import { FileItem } from 'ng2-file-upload';
2 |
3 | export interface JobBody {
4 | input: Input;
5 | output: Output;
6 | }
7 |
8 | export interface Input {
9 | urn: string;
10 | compressedUrn: string;
11 | rootFilename: string;
12 | }
13 |
14 | export interface Output {
15 | formats: Format[];
16 | destination: Destination;
17 | }
18 |
19 | export interface Format {
20 | type: Type;
21 | views: string[];
22 | }
23 |
24 | export enum Destination {
25 | 'US',
26 | 'EMEA',
27 | }
28 |
29 | export enum Type {
30 | 'DWG',
31 | 'FBX',
32 | 'IFC',
33 | 'IGES',
34 | 'OBJ',
35 | 'STEP',
36 | 'STL',
37 | 'SVF',
38 | 'thumbnail',
39 | }
40 |
41 | export interface AcceptedJobs {
42 | output: Output;
43 | }
44 |
45 | export interface JobAnswer {
46 | result: string;
47 | urn: string;
48 | acceptedJobs: AcceptedJobs;
49 | }
50 |
51 | export interface FormDataStatus {
52 | intervalId: number;
53 | status: string;
54 | urn: string;
55 | derivativeUrn: string;
56 | }
57 |
58 | export interface UploadAnswer {
59 | bucketKey: string;
60 | objectId: string;
61 | objectKey: string;
62 | sha1: string;
63 | size: number;
64 | contentType: string;
65 | location: string;
66 | }
67 |
68 | export interface ConversionJob {
69 | uploadAnswer: UploadAnswer;
70 | jobAnswer: JobAnswer;
71 | file: FileItem;
72 | }
73 |
74 |
75 | export interface Message {
76 | type: string;
77 | code: string;
78 | message: string[];
79 | }
80 |
81 | export interface Child {
82 | guid: string;
83 | type: string;
84 | role: string;
85 | urn: string;
86 | mime: string;
87 | status: string;
88 | }
89 |
90 | export interface Derivative {
91 | status: string;
92 | progress: string;
93 | outputType: string;
94 | children: Child[];
95 | }
96 |
97 | export interface JobStatus {
98 | type: string;
99 | messages: Message[];
100 | hasThumbnail: string;
101 | status: string;
102 | progress: string;
103 | region: string;
104 | urn: string;
105 | version: string;
106 | derivatives: Derivative[];
107 | }
108 |
109 | export interface AccessToken {
110 | access_token: string;
111 | token_type: string;
112 | expires_in: number;
113 | }
114 |
115 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.service.spec.ts:
--------------------------------------------------------------------------------
1 | import { TestBed, inject } from '@angular/core/testing';
2 |
3 | import { RevitConverterService } from './revit-converter.service';
4 |
5 | describe('RevitConverterService', () => {
6 | beforeEach(() => {
7 | TestBed.configureTestingModule({
8 | providers: [RevitConverterService]
9 | });
10 | });
11 |
12 | it('should be created', inject([RevitConverterService], (service: RevitConverterService) => {
13 | expect(service).toBeTruthy();
14 | }));
15 | });
16 |
--------------------------------------------------------------------------------
/src/app/revit-converter/revit-converter.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from "@angular/core";
2 | import {
3 | HttpClient,
4 | HttpErrorResponse,
5 | HttpHeaders,
6 | HttpParams
7 | } from "@angular/common/http";
8 | import { Response, ResponseContentType, Jsonp } from '@angular/http';
9 | import { Router } from "@angular/router";
10 | import { Observable } from "rxjs/Observable";
11 | import { ISubscription } from "rxjs/Subscription";
12 | import "rxjs/add/operator/catch";
13 | import "rxjs/add/operator/do";
14 |
15 | import {
16 | JobAnswer,
17 | JobBody,
18 | Format,
19 | Type,
20 | JobStatus,
21 | AccessToken
22 | } from "./revit-converter.models";
23 |
24 | @Injectable()
25 | export class RevitConverterService {
26 | errorMessage: string;
27 | private _baseUrl = "https://developer.api.autodesk.com/modelderivative/v2/designdata/";
28 |
29 | constructor(private _http: HttpClient, private router: Router) {}
30 |
31 | public setDelay(delay: number): void {
32 | setTimeout(function() {
33 | console.log(delay);
34 | }, delay);
35 | }
36 |
37 | public PostJobRequest(
38 | access_token: string,
39 | objectId: string
40 | ): Observable {
41 | let body: string =
42 | '{"input": {"urn": "' +
43 | btoa(objectId).replace(/=+$/, "") +
44 | '"},"output": {"formats": [{"type": "ifc"}]}}';
45 |
46 | return this._http
47 | .post(this._baseUrl + "job", body, {
48 | headers: new HttpHeaders()
49 | .set("Authorization", "Bearer " + access_token)
50 | .set("Content-Type", "application/json")
51 | })
52 | .do(data =>
53 | console.log("All PostJobRequest: " + JSON.stringify(data))
54 | )
55 | .catch(this.handleError);
56 | }
57 |
58 | public GetJobStatus(
59 | access_token: string,
60 | urn: string
61 | ): Observable {
62 | return this._http
63 | .get(this._baseUrl + urn + "/manifest", {
64 | headers: new HttpHeaders().set(
65 | "Authorization",
66 | "Bearer " + access_token
67 | )
68 | })
69 | .do(data =>
70 | console.log("All GetJobStatus: " + JSON.stringify(data))
71 | )
72 | .catch(this.handleError);
73 | }
74 |
75 | public GetDerivative(
76 | access_token: string,
77 | urn: string,
78 | derivative: string
79 | ): Observable {
80 | return this._http
81 | .get(this._baseUrl + urn + "/manifest/" + derivative, {
82 | headers: new HttpHeaders().set(
83 | "Authorization",
84 | "Bearer " + access_token,
85 | ),
86 | responseType: 'blob' as 'json'
87 | })
88 | // .subscribe(data => this.downloadFile(data))
89 | .catch(this.handleError);
90 | }
91 |
92 | public downloadFile(data: Response, fileName: string) {
93 | let blob = new Blob([data], { type: "text/csv" });
94 | // let url = window.URL.createObjectURL(blob);
95 |
96 | let link = document.createElement('a');
97 | link.href = window.URL.createObjectURL(blob);
98 | link.download = fileName;
99 | link.click();
100 | }
101 |
102 | public GetAccessToken(): Observable {
103 | return this._http
104 | .get(
105 | "https://forgefunction.azurewebsites.net/api/ForgeToken",
106 | {}
107 | )
108 | .do(data =>
109 | console.log("You have a token!")
110 | )
111 | .catch(this.handleError);
112 | }
113 |
114 | /**
115 | * ConvertConversionProgress
116 | */
117 | public ConvertConversionProgress(progress: string): number {
118 | let value: number = Number(progress.match(/^\d*/)) as number;
119 | return value;
120 | }
121 |
122 | DeleteBucket(access_token: string, bucketId: string): Observable {
123 | return (
124 | this._http
125 | .delete(
126 | "https://developer.api.autodesk.com/oss/v2/buckets/" +
127 | bucketId,
128 | {
129 | headers: new HttpHeaders().set(
130 | "Authorization",
131 | "Bearer " + access_token
132 | )
133 | }
134 | )
135 | // .do(data => console.log('All DeleteBucket: ' + JSON.stringify(data)))
136 | .catch(this.handleError)
137 | );
138 | }
139 |
140 | private handleError(err: HttpErrorResponse) {
141 | // in a real world app, we may send the server to some remote logging infrastructure
142 | // instead of just logging it to the console
143 | let errorMessage = "";
144 | if (err.error instanceof Error) {
145 | // A client-side or network error occurred. Handle it accordingly.
146 | errorMessage = `An error occurred: ${err.error.message}`;
147 | } else {
148 | // The backend returned an unsuccessful response code.
149 | // The response body may contain clues as to what went wrong,
150 | errorMessage = `Server returned code: ${
151 | err.status
152 | }, error message is: ${err.message}`;
153 | }
154 | console.log(errorMessage);
155 | return Observable.throw(errorMessage);
156 | }
157 | }
158 |
--------------------------------------------------------------------------------
/src/environments/environment.prod.ts:
--------------------------------------------------------------------------------
1 | export const environment = {
2 | production: true
3 | };
4 |
--------------------------------------------------------------------------------
/src/environments/environment.ts:
--------------------------------------------------------------------------------
1 | // The file contents for the current environment will overwrite these during build.
2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do
3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead.
4 | // The list of which env maps to which file can be found in `angular-cli.json`.
5 |
6 | export const environment = {
7 | production: false
8 | };
9 |
--------------------------------------------------------------------------------
/src/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simonmoreau/RevitToIFC/b532fcf50e0894c844f36068c436848fdbebeb29/src/favicon.ico
--------------------------------------------------------------------------------
/src/images/cloud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/src/images/revitToIFC_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simonmoreau/RevitToIFC/b532fcf50e0894c844f36068c436848fdbebeb29/src/images/revitToIFC_logo.png
--------------------------------------------------------------------------------
/src/images/revitToIFC_logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 | logo
10 | Created with Sketch.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Revit To IFC
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 | Loading...
38 |
39 |
40 |
41 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import './polyfills.ts';
2 |
3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
4 | import { enableProdMode } from '@angular/core';
5 | import { environment } from './environments/environment';
6 | import { AppModule } from './app/';
7 |
8 | if (environment.production) {
9 | enableProdMode();
10 | }
11 |
12 | platformBrowserDynamic().bootstrapModule(AppModule);
13 |
--------------------------------------------------------------------------------
/src/polyfills.ts:
--------------------------------------------------------------------------------
1 | // This file includes polyfills needed by Angular 2 and is loaded before
2 | // the app. You can add your own extra polyfills to this file.
3 | import 'core-js/es6/symbol';
4 | import 'core-js/es6/object';
5 | import 'core-js/es6/function';
6 | import 'core-js/es6/parse-int';
7 | import 'core-js/es6/parse-float';
8 | import 'core-js/es6/number';
9 | import 'core-js/es6/math';
10 | import 'core-js/es6/string';
11 | import 'core-js/es6/date';
12 | import 'core-js/es6/array';
13 | import 'core-js/es6/regexp';
14 | import 'core-js/es6/map';
15 | import 'core-js/es6/set';
16 | import 'core-js/es6/reflect';
17 |
18 | import 'core-js/es7/reflect';
19 |
20 |
21 | import 'zone.js/dist/zone';
22 |
23 |
--------------------------------------------------------------------------------
/src/styles.css:
--------------------------------------------------------------------------------
1 | /* You can add global styles to this file, and also import other style files */
2 |
--------------------------------------------------------------------------------
/src/test.ts:
--------------------------------------------------------------------------------
1 | import './polyfills.ts';
2 |
3 | import 'zone.js/dist/long-stack-trace-zone';
4 | import 'zone.js/dist/proxy.js';
5 | import 'zone.js/dist/sync-test';
6 | import 'zone.js/dist/jasmine-patch';
7 | import 'zone.js/dist/async-test';
8 | import 'zone.js/dist/fake-async-test';
9 | import { getTestBed } from '@angular/core/testing';
10 | import {
11 | BrowserDynamicTestingModule,
12 | platformBrowserDynamicTesting
13 | } from '@angular/platform-browser-dynamic/testing';
14 |
15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
16 | declare var __karma__: any;
17 | declare var require: any;
18 |
19 | // Prevent Karma from running prematurely.
20 | __karma__.loaded = function () {};
21 |
22 | // First, initialize the Angular testing environment.
23 | getTestBed().initTestEnvironment(
24 | BrowserDynamicTestingModule,
25 | platformBrowserDynamicTesting()
26 | );
27 | // Then we find all the tests.
28 | let context = require.context('./', true, /\.spec\.ts/);
29 | // And load the modules.
30 | context.keys().map(context);
31 | // Finally, start Karma to run the tests.
32 | __karma__.start();
33 |
--------------------------------------------------------------------------------
/src/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compileOnSave": false,
3 | "compilerOptions": {
4 | "rootDir": "../",
5 | "baseUrl": "",
6 | "declaration": false,
7 | "emitDecoratorMetadata": true,
8 | "experimentalDecorators": true,
9 | "lib": [
10 | "es6",
11 | "dom"
12 | ],
13 | "mapRoot": "src",
14 | "module": "commonjs",
15 | "moduleResolution": "node",
16 | "outDir": "dist/out-tsc",
17 | "sourceMap": true,
18 | "target": "es5",
19 | "typeRoots": [
20 | "node_modules/@types"
21 | ],
22 | "types": [
23 | "jasmine",
24 | "core-js",
25 | "node"
26 | ]
27 | },
28 | "exclude": [
29 | "node_modules",
30 | "dist"
31 | ]
32 | }
33 |
--------------------------------------------------------------------------------
/src/typings.d.ts:
--------------------------------------------------------------------------------
1 | // Typings reference file, you can add your own global typings here
2 | // https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html
3 |
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "rulesDirectory": [
3 | "node_modules/codelyzer"
4 | ],
5 | "rules": {
6 | "class-name": true,
7 | "comment-format": [
8 | true,
9 | "check-space"
10 | ],
11 | "curly": true,
12 | "eofline": true,
13 | "forin": true,
14 | "indent": [
15 | true,
16 | "spaces"
17 | ],
18 | "label-position": true,
19 | "max-line-length": [
20 | true,
21 | 140
22 | ],
23 | "member-access": false,
24 | "member-ordering": [
25 | true,
26 | "static-before-instance",
27 | "variables-before-functions"
28 | ],
29 | "no-arg": true,
30 | "no-bitwise": true,
31 | "no-console": [
32 | true,
33 | "debug",
34 | "info",
35 | "time",
36 | "timeEnd",
37 | "trace"
38 | ],
39 | "no-construct": true,
40 | "no-debugger": true,
41 | "no-duplicate-variable": true,
42 | "no-empty": false,
43 | "no-eval": true,
44 | "no-shadowed-variable": true,
45 | "no-string-literal": false,
46 | "no-switch-case-fall-through": true,
47 | "no-trailing-whitespace": true,
48 | "no-unused-expression": true,
49 | "no-unused-variable": true,
50 | "no-use-before-declare": true,
51 | "no-var-keyword": true,
52 | "object-literal-sort-keys": false,
53 | "one-line": [
54 | true,
55 | "check-open-brace",
56 | "check-catch",
57 | "check-else",
58 | "check-whitespace"
59 | ],
60 | "radix": true,
61 | "semicolon": [
62 | "always"
63 | ],
64 | "triple-equals": [
65 | true,
66 | "allow-null-check"
67 | ],
68 | "typedef-whitespace": [
69 | true,
70 | {
71 | "call-signature": "nospace",
72 | "index-signature": "nospace",
73 | "parameter": "nospace",
74 | "property-declaration": "nospace",
75 | "variable-declaration": "nospace"
76 | }
77 | ],
78 | "variable-name": false,
79 | "whitespace": [
80 | true,
81 | "check-branch",
82 | "check-decl",
83 | "check-operator",
84 | "check-separator",
85 | "check-type"
86 | ],
87 |
88 | "use-input-property-decorator": true,
89 | "use-output-property-decorator": true,
90 | "use-host-property-decorator": true,
91 | "no-input-rename": true,
92 | "no-output-rename": true,
93 | "use-life-cycle-interface": true,
94 | "use-pipe-transform-interface": true,
95 | "component-class-suffix": true,
96 | "directive-class-suffix": true,
97 | "templates-use-public": true,
98 | "invoke-injectable": true
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/typings.json:
--------------------------------------------------------------------------------
1 | {
2 | "globalDependencies": {
3 | "es6-shim": "registry:dt/es6-shim#0.31.2+20160602141504"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------