├── .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 | ![Overview](https://raw.githubusercontent.com/simonmoreau/RevitToIFC/master/doc/revitToIfc.gif) 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 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | 17 |
18 |
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 | 14 | 15 | 16 | 17 |
18 |
19 |
20 |
21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 47 | 58 | 59 | 60 |
NameSizeStatusActions
34 | {{ item?.file?.name }} 35 | {{ item?.file?.size/1024/1024 | number:'.2' }} MB 40 | 41 | {{item?.formData?.status}} 42 | 43 | 44 | 45 | 46 | 48 | 51 | 54 | 57 |
61 |
62 | 65 | 68 |
69 | 70 |
71 | 72 |
73 |
74 |
75 |
76 |
77 | Convert your Revit files to IFC 78 |
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 | 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 | --------------------------------------------------------------------------------