├── .editorconfig ├── .gitignore ├── README.md ├── angular.json ├── package-lock.json ├── package.json ├── public └── favicon.ico ├── src ├── app │ ├── app.component.html │ ├── app.component.scss │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.config.ts │ ├── app.routes.ts │ └── components │ │ └── cart │ │ ├── cart.component.html │ │ ├── cart.component.scss │ │ ├── cart.component.spec.ts │ │ └── cart.component.ts ├── index.html ├── main.ts └── styles.scss ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | /node_modules 11 | npm-debug.log 12 | yarn-error.log 13 | 14 | # IDEs and editors 15 | .idea/ 16 | .project 17 | .classpath 18 | .c9/ 19 | *.launch 20 | .settings/ 21 | *.sublime-workspace 22 | 23 | # Visual Studio Code 24 | .vscode/* 25 | !.vscode/settings.json 26 | !.vscode/tasks.json 27 | !.vscode/launch.json 28 | !.vscode/extensions.json 29 | .history/* 30 | 31 | # Miscellaneous 32 | /.angular/cache 33 | .sass-cache/ 34 | /connect.lock 35 | /coverage 36 | /libpeerconnection.log 37 | testem.log 38 | /typings 39 | 40 | # System files 41 | .DS_Store 42 | Thumbs.db 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CulqiAngular 2 | 3 | Culqi implementation example in Angular using the [ngx-culqi](https://github.com/lperezp/ngx-culqi) library. 4 | 5 | ## 🛠️ Developed by: 6 | [lperezp](https://twitter.com/lperezp_pe) 7 | -------------------------------------------------------------------------------- /angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "culqi-angular": { 7 | "projectType": "application", 8 | "schematics": { 9 | "@schematics/angular:component": { 10 | "style": "scss" 11 | } 12 | }, 13 | "root": "", 14 | "sourceRoot": "src", 15 | "prefix": "app", 16 | "architect": { 17 | "build": { 18 | "builder": "@angular-devkit/build-angular:application", 19 | "options": { 20 | "outputPath": "dist/culqi-angular", 21 | "index": "src/index.html", 22 | "browser": "src/main.ts", 23 | "polyfills": [ 24 | "zone.js" 25 | ], 26 | "tsConfig": "tsconfig.app.json", 27 | "inlineStyleLanguage": "scss", 28 | "assets": [ 29 | { 30 | "glob": "**/*", 31 | "input": "public" 32 | } 33 | ], 34 | "styles": [ 35 | "src/styles.scss" 36 | ], 37 | "scripts": [] 38 | }, 39 | "configurations": { 40 | "production": { 41 | "budgets": [ 42 | { 43 | "type": "initial", 44 | "maximumWarning": "500kB", 45 | "maximumError": "1MB" 46 | }, 47 | { 48 | "type": "anyComponentStyle", 49 | "maximumWarning": "2kB", 50 | "maximumError": "4kB" 51 | } 52 | ], 53 | "outputHashing": "all" 54 | }, 55 | "development": { 56 | "optimization": false, 57 | "extractLicenses": false, 58 | "sourceMap": true 59 | } 60 | }, 61 | "defaultConfiguration": "production" 62 | }, 63 | "serve": { 64 | "builder": "@angular-devkit/build-angular:dev-server", 65 | "configurations": { 66 | "production": { 67 | "buildTarget": "culqi-angular:build:production" 68 | }, 69 | "development": { 70 | "buildTarget": "culqi-angular:build:development" 71 | } 72 | }, 73 | "defaultConfiguration": "development" 74 | }, 75 | "extract-i18n": { 76 | "builder": "@angular-devkit/build-angular:extract-i18n" 77 | }, 78 | "test": { 79 | "builder": "@angular-devkit/build-angular:karma", 80 | "options": { 81 | "polyfills": [ 82 | "zone.js", 83 | "zone.js/testing" 84 | ], 85 | "tsConfig": "tsconfig.spec.json", 86 | "inlineStyleLanguage": "scss", 87 | "assets": [ 88 | { 89 | "glob": "**/*", 90 | "input": "public" 91 | } 92 | ], 93 | "styles": [ 94 | "src/styles.scss" 95 | ], 96 | "scripts": [] 97 | } 98 | }, 99 | "deploy": { 100 | "builder": "angular-cli-ghpages:deploy" 101 | } 102 | } 103 | } 104 | }, 105 | "cli": { 106 | "analytics": false 107 | } 108 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "culqi-angular", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test" 10 | }, 11 | "private": true, 12 | "dependencies": { 13 | "@angular/animations": "^18.0.0", 14 | "@angular/common": "^18.0.0", 15 | "@angular/compiler": "^18.0.0", 16 | "@angular/core": "^18.0.0", 17 | "@angular/forms": "^18.0.0", 18 | "@angular/platform-browser": "^18.0.0", 19 | "@angular/platform-browser-dynamic": "^18.0.0", 20 | "@angular/router": "^18.0.0", 21 | "ngx-culqi": "^2.0.3", 22 | "rxjs": "~7.8.0", 23 | "tslib": "^2.3.0", 24 | "zone.js": "~0.14.3" 25 | }, 26 | "devDependencies": { 27 | "@angular-devkit/build-angular": "^18.0.2", 28 | "@angular/cli": "^18.0.2", 29 | "@angular/compiler-cli": "^18.0.0", 30 | "@types/jasmine": "~5.1.0", 31 | "angular-cli-ghpages": "^2.0.1", 32 | "jasmine-core": "~5.1.0", 33 | "karma": "~6.4.0", 34 | "karma-chrome-launcher": "~3.2.0", 35 | "karma-coverage": "~2.2.0", 36 | "karma-jasmine": "~5.1.0", 37 | "karma-jasmine-html-reporter": "~2.1.0", 38 | "typescript": "~5.4.2" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lperezp/culqi-angular/ac20ede020104cc8622747238607a862a6e1dd5a/public/favicon.ico -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 29 |

Hello ngx-culqi

30 |

UNOFFICIAL Culqi payment gateway library made to use with Angular by lperezp.dev 32 | 🎉

33 | 34 |
35 | 36 | 63 |
64 |
-------------------------------------------------------------------------------- /src/app/app.component.scss: -------------------------------------------------------------------------------- 1 | :host { 2 | --bright-blue: oklch(51.01% 0.274 263.83); 3 | --electric-violet: oklch(53.18% 0.28 296.97); 4 | --french-violet: oklch(47.66% 0.246 305.88); 5 | --vivid-pink: oklch(69.02% 0.277 332.77); 6 | --hot-red: oklch(61.42% 0.238 15.34); 7 | --orange-red: oklch(63.32% 0.24 31.68); 8 | 9 | --gray-900: oklch(19.37% 0.006 300.98); 10 | --gray-700: oklch(36.98% 0.014 302.71); 11 | --gray-400: oklch(70.9% 0.015 304.04); 12 | 13 | --red-to-pink-to-purple-vertical-gradient: linear-gradient(180deg, 14 | var(--orange-red) 0%, 15 | var(--vivid-pink) 50%, 16 | var(--electric-violet) 100%); 17 | 18 | --red-to-pink-to-purple-horizontal-gradient: linear-gradient(90deg, 19 | var(--orange-red) 0%, 20 | var(--vivid-pink) 50%, 21 | var(--electric-violet) 100%); 22 | 23 | --pill-accent: var(--bright-blue); 24 | 25 | font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, 26 | Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", 27 | "Segoe UI Symbol"; 28 | box-sizing: border-box; 29 | -webkit-font-smoothing: antialiased; 30 | -moz-osx-font-smoothing: grayscale; 31 | } 32 | 33 | h1 { 34 | font-size: 3.125rem; 35 | color: var(--gray-900); 36 | font-weight: 500; 37 | line-height: 100%; 38 | letter-spacing: -0.125rem; 39 | margin: 0; 40 | font-family: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, 41 | Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", 42 | "Segoe UI Symbol"; 43 | } 44 | 45 | p { 46 | margin: 0; 47 | color: var(--gray-700); 48 | } 49 | 50 | main { 51 | width: 100%; 52 | min-height: 100%; 53 | display: flex; 54 | justify-content: center; 55 | align-items: center; 56 | padding: 1rem; 57 | box-sizing: inherit; 58 | position: relative; 59 | } 60 | 61 | .angular-logo { 62 | max-width: 9.2rem; 63 | } 64 | 65 | .content { 66 | display: flex; 67 | justify-content: space-around; 68 | width: 100%; 69 | max-width: 700px; 70 | margin-bottom: 3rem; 71 | } 72 | 73 | .content h1 { 74 | margin-top: 1.75rem; 75 | } 76 | 77 | .content p { 78 | margin-top: 1.5rem; 79 | margin-bottom: 3rem; 80 | 81 | } 82 | 83 | .divider { 84 | width: 1px; 85 | background: var(--red-to-pink-to-purple-vertical-gradient); 86 | margin-inline: 0.5rem; 87 | } 88 | 89 | .pill-group { 90 | display: flex; 91 | flex-direction: column; 92 | align-items: start; 93 | flex-wrap: wrap; 94 | gap: 1.25rem; 95 | } 96 | 97 | .pill { 98 | display: flex; 99 | align-items: center; 100 | --pill-accent: var(--bright-blue); 101 | background: color-mix(in srgb, var(--pill-accent) 5%, transparent); 102 | color: var(--pill-accent); 103 | padding-inline: 0.75rem; 104 | padding-block: 0.375rem; 105 | border-radius: 2.75rem; 106 | border: 0; 107 | transition: background 0.3s ease; 108 | font-family: var(--inter-font); 109 | font-size: 0.875rem; 110 | font-style: normal; 111 | font-weight: 500; 112 | line-height: 1.4rem; 113 | letter-spacing: -0.00875rem; 114 | text-decoration: none; 115 | } 116 | 117 | .pill:hover { 118 | background: color-mix(in srgb, var(--pill-accent) 15%, transparent); 119 | } 120 | 121 | .pill-group .pill:nth-child(6n + 1) { 122 | --pill-accent: var(--bright-blue); 123 | } 124 | 125 | .pill-group .pill:nth-child(6n + 2) { 126 | --pill-accent: var(--french-violet); 127 | } 128 | 129 | .pill-group .pill:nth-child(6n + 3), 130 | .pill-group .pill:nth-child(6n + 4), 131 | .pill-group .pill:nth-child(6n + 5) { 132 | --pill-accent: var(--hot-red); 133 | } 134 | 135 | .pill-group svg { 136 | margin-inline-start: 0.25rem; 137 | } 138 | 139 | .social-links { 140 | display: flex; 141 | align-items: center; 142 | gap: 0.73rem; 143 | margin: 1.5rem 0; 144 | } 145 | 146 | .social-links path { 147 | transition: fill 0.3s ease; 148 | fill: var(--gray-400); 149 | } 150 | 151 | .social-links a:hover svg path { 152 | fill: var(--gray-900); 153 | } 154 | 155 | @media screen and (max-width: 650px) { 156 | .content { 157 | flex-direction: column; 158 | width: max-content; 159 | } 160 | 161 | .divider { 162 | height: 1px; 163 | width: 100%; 164 | background: var(--red-to-pink-to-purple-horizontal-gradient); 165 | margin-block: 1.5rem; 166 | } 167 | } -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { AppComponent } from './app.component'; 3 | 4 | describe('AppComponent', () => { 5 | beforeEach(async () => { 6 | await TestBed.configureTestingModule({ 7 | imports: [AppComponent], 8 | }).compileComponents(); 9 | }); 10 | 11 | it('should create the app', () => { 12 | const fixture = TestBed.createComponent(AppComponent); 13 | const app = fixture.componentInstance; 14 | expect(app).toBeTruthy(); 15 | }); 16 | 17 | it(`should have the 'culqi-angular' title`, () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app.title).toEqual('culqi-angular'); 21 | }); 22 | 23 | it('should render title', () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | fixture.detectChanges(); 26 | const compiled = fixture.nativeElement as HTMLElement; 27 | expect(compiled.querySelector('h1')?.textContent).toContain('Hello, culqi-angular'); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { CartComponent } from "./components/cart/cart.component"; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | standalone: true, 7 | templateUrl: './app.component.html', 8 | styleUrl: './app.component.scss', 9 | imports: [CartComponent] 10 | }) 11 | export class AppComponent { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/app/app.config.ts: -------------------------------------------------------------------------------- 1 | import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; 2 | import { provideRouter } from '@angular/router'; 3 | 4 | import { routes } from './app.routes'; 5 | import { provideHttpClient } from '@angular/common/http'; 6 | 7 | export const appConfig: ApplicationConfig = { 8 | providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideHttpClient()] 9 | }; 10 | -------------------------------------------------------------------------------- /src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router'; 2 | 3 | export const routes: Routes = []; 4 | -------------------------------------------------------------------------------- /src/app/components/cart/cart.component.html: -------------------------------------------------------------------------------- 1 |
2 |

Configure API KEY

3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Shopping Cart

11 |
12 |
13 | @for(item of listProducts; track item.description){ 14 |
15 |

{{ item.description }}

16 |

{{ item.amount | currency : "S/. " }}

17 |
18 | } 19 | 20 |
21 |
22 |
23 | @if (this.tokenCreated){ 24 |

tokenCreated: {{ this.tokenCreated }}

25 | } -------------------------------------------------------------------------------- /src/app/components/cart/cart.component.scss: -------------------------------------------------------------------------------- 1 | .cardSettings { 2 | margin: 20px 0; 3 | background-color: #f7f5f5; 4 | border-radius: 12px; 5 | padding: 12px; 6 | display: flex; 7 | flex-direction: column; 8 | 9 | .input { 10 | border: 1px solid #e6e3e3; 11 | margin: 4px 0; 12 | padding: 4px 8px; 13 | border-radius: 4px; 14 | outline: none; 15 | } 16 | 17 | .btn { 18 | margin-top: 20px; 19 | background-color: #E8103F; 20 | padding: 8px 20px; 21 | border-radius: 4px; 22 | color: white; 23 | width: 140px; 24 | border: none; 25 | } 26 | } 27 | 28 | .cart { 29 | display: block; 30 | border: 1px solid #bdbdbd; 31 | border-radius: 4px; 32 | padding: 20px; 33 | margin-bottom: 20px; 34 | 35 | .title { 36 | margin: 0 0 20px 0; 37 | } 38 | 39 | .card { 40 | .list { 41 | &Item { 42 | display: flex; 43 | justify-content: space-between; 44 | 45 | p { 46 | margin: 0 0 12px 0; 47 | } 48 | } 49 | } 50 | 51 | .btn { 52 | margin-top: 20px; 53 | background-color: #5C44E4; 54 | padding: 8px 20px; 55 | border-radius: 4px; 56 | color: white; 57 | border: none; 58 | } 59 | } 60 | 61 | } -------------------------------------------------------------------------------- /src/app/components/cart/cart.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CartComponent } from './cart.component'; 4 | 5 | describe('CartComponent', () => { 6 | let component: CartComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | imports: [CartComponent] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(CartComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/cart/cart.component.ts: -------------------------------------------------------------------------------- 1 | import { CurrencyPipe } from '@angular/common'; 2 | import { Component } from '@angular/core'; 3 | import { ICulqiOptions, IOrderCulqiResponse, NgxCulqiService } from 'ngx-culqi'; 4 | import { FormsModule } from '@angular/forms'; 5 | 6 | @Component({ 7 | selector: 'app-cart', 8 | standalone: true, 9 | imports: [CurrencyPipe, FormsModule], 10 | templateUrl: './cart.component.html', 11 | styleUrl: './cart.component.scss' 12 | }) 13 | export class CartComponent { 14 | listProducts = [ 15 | { 16 | description: "T-shirt size M", 17 | amount: 100 18 | }, 19 | { 20 | description: "ngTicket Perú", 21 | amount: 300 22 | } 23 | ]; 24 | amountTotal = 400; 25 | 26 | tokenCulqi: string = ''; 27 | apiKeyCulqi: string = ''; 28 | xculqirsaid: string = ''; 29 | rsapublickey: string = ``; 30 | 31 | styleCulqi = { 32 | logo: 'https://developers.google.com/static/homepage-assets/images/angular_gradient.png', 33 | bannerColor: '#5C44E4', 34 | buttonBackground: '#5C44E4', 35 | menuColor: '#5C44E4', 36 | linksColor: '#5C44E4', 37 | priceColor: '#5C44E4', 38 | }; 39 | 40 | tokenCreated: string | null = null; 41 | orderCreated: string | null = null; 42 | 43 | constructor(private ngxCulqiService: NgxCulqiService) { } 44 | 45 | ngOnInit(): void { 46 | this.ngxCulqiService.tokenCreated$.subscribe(value => { 47 | if (value) { 48 | this.showToken(value); 49 | this.ngxCulqiService.closeCulqi(); 50 | } 51 | }); 52 | 53 | this.ngxCulqiService.orderCreated$.subscribe(value => { 54 | if (value) { 55 | this.showOrder(value); 56 | } 57 | }); 58 | } 59 | 60 | setConfigureCulqi(): void { 61 | this.ngxCulqiService.loadScriptCulqi(this.tokenCulqi, this.apiKeyCulqi); 62 | } 63 | 64 | paymentCulqi(): void { 65 | const order = { 66 | "amount": this.amountTotal * 100, 67 | "currency_code": "PEN", 68 | "description": "Sales of products", 69 | "order_number": Date.now(), 70 | "client_details": { 71 | "first_name": "nameDemo", 72 | "last_name": "LastNameDemo", 73 | "email": "demo@demo.com", 74 | "phone_number": "987654321" 75 | }, 76 | "expiration_date": (Math.floor(Date.now() / 1000) + 86400), 77 | "confirm": false 78 | }; 79 | this.ngxCulqiService.generateOrder(order).subscribe((response: Partial) => { 80 | const culqiSettings = { 81 | title: order.description, 82 | currency: 'PEN', 83 | amount: order.amount, 84 | order: response.id, 85 | xculqirsaid: this.xculqirsaid, 86 | rsapublickey: this.rsapublickey 87 | }; 88 | 89 | const culqiOptions: ICulqiOptions = { style: this.styleCulqi }; 90 | this.ngxCulqiService.generateToken(culqiSettings, culqiOptions); 91 | }); 92 | } 93 | 94 | showToken(token: string): void { 95 | this.tokenCreated = token; 96 | } 97 | 98 | showOrder(order: string): void { 99 | this.orderCreated = order; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ngx-culqi: UNOFFICIAL Culqi payment gateway library made to use with Angular by lperezp.dev 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { bootstrapApplication } from '@angular/platform-browser'; 2 | import { appConfig } from './app/app.config'; 3 | import { AppComponent } from './app/app.component'; 4 | 5 | bootstrapApplication(AppComponent, appConfig) 6 | .catch((err) => console.error(err)); 7 | -------------------------------------------------------------------------------- /src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/app", 6 | "types": [] 7 | }, 8 | "files": [ 9 | "src/main.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "compileOnSave": false, 4 | "compilerOptions": { 5 | "outDir": "./dist/out-tsc", 6 | "strict": true, 7 | "noImplicitOverride": true, 8 | "noPropertyAccessFromIndexSignature": true, 9 | "noImplicitReturns": true, 10 | "noFallthroughCasesInSwitch": true, 11 | "skipLibCheck": true, 12 | "esModuleInterop": true, 13 | "sourceMap": true, 14 | "declaration": false, 15 | "experimentalDecorators": true, 16 | "moduleResolution": "bundler", 17 | "importHelpers": true, 18 | "target": "ES2022", 19 | "module": "ES2022", 20 | "useDefineForClassFields": false, 21 | "lib": [ 22 | "ES2022", 23 | "dom" 24 | ] 25 | }, 26 | "angularCompilerOptions": { 27 | "enableI18nLegacyMessageIdFormat": false, 28 | "strictInjectionParameters": true, 29 | "strictInputAccessModifiers": true, 30 | "strictTemplates": true 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | /* To learn more about this file see: https://angular.io/config/tsconfig. */ 2 | { 3 | "extends": "./tsconfig.json", 4 | "compilerOptions": { 5 | "outDir": "./out-tsc/spec", 6 | "types": [ 7 | "jasmine" 8 | ] 9 | }, 10 | "include": [ 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | --------------------------------------------------------------------------------