├── .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 |
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 |
--------------------------------------------------------------------------------