@tappify/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +150 -0
  2. package/bin/tappify +17 -0
  3. package/dist/commitlint.config.d.ts +8 -0
  4. package/dist/commitlint.config.js +29 -0
  5. package/dist/commitlint.config.js.map +1 -0
  6. package/dist/src/app.module.d.ts +2 -0
  7. package/dist/src/app.module.js +29 -0
  8. package/dist/src/app.module.js.map +1 -0
  9. package/dist/src/core/api/api.service.d.ts +11 -0
  10. package/dist/src/core/api/api.service.js +82 -0
  11. package/dist/src/core/api/api.service.js.map +1 -0
  12. package/dist/src/core/auth/auth.service.d.ts +30 -0
  13. package/dist/src/core/auth/auth.service.js +84 -0
  14. package/dist/src/core/auth/auth.service.js.map +1 -0
  15. package/dist/src/core/config/config.service.d.ts +16 -0
  16. package/dist/src/core/config/config.service.js +49 -0
  17. package/dist/src/core/config/config.service.js.map +1 -0
  18. package/dist/src/core/core.module.d.ts +2 -0
  19. package/dist/src/core/core.module.js +24 -0
  20. package/dist/src/core/core.module.js.map +1 -0
  21. package/dist/src/core/index.d.ts +4 -0
  22. package/dist/src/core/index.js +21 -0
  23. package/dist/src/core/index.js.map +1 -0
  24. package/dist/src/domains/auth/auth.module.d.ts +2 -0
  25. package/dist/src/domains/auth/auth.module.js +21 -0
  26. package/dist/src/domains/auth/auth.module.js.map +1 -0
  27. package/dist/src/domains/auth/index.d.ts +2 -0
  28. package/dist/src/domains/auth/index.js +19 -0
  29. package/dist/src/domains/auth/index.js.map +1 -0
  30. package/dist/src/domains/auth/runners/index.d.ts +2 -0
  31. package/dist/src/domains/auth/runners/index.js +19 -0
  32. package/dist/src/domains/auth/runners/index.js.map +1 -0
  33. package/dist/src/domains/auth/runners/login.runner.d.ts +9 -0
  34. package/dist/src/domains/auth/runners/login.runner.js +66 -0
  35. package/dist/src/domains/auth/runners/login.runner.js.map +1 -0
  36. package/dist/src/domains/auth/runners/logout.runner.d.ts +7 -0
  37. package/dist/src/domains/auth/runners/logout.runner.js +35 -0
  38. package/dist/src/domains/auth/runners/logout.runner.js.map +1 -0
  39. package/dist/src/domains/deploy/deploy.module.d.ts +2 -0
  40. package/dist/src/domains/deploy/deploy.module.js +20 -0
  41. package/dist/src/domains/deploy/deploy.module.js.map +1 -0
  42. package/dist/src/domains/deploy/index.d.ts +2 -0
  43. package/dist/src/domains/deploy/index.js +19 -0
  44. package/dist/src/domains/deploy/index.js.map +1 -0
  45. package/dist/src/domains/deploy/runners/deploy.runner.d.ts +10 -0
  46. package/dist/src/domains/deploy/runners/deploy.runner.js +132 -0
  47. package/dist/src/domains/deploy/runners/deploy.runner.js.map +1 -0
  48. package/dist/src/domains/deploy/runners/index.d.ts +1 -0
  49. package/dist/src/domains/deploy/runners/index.js +18 -0
  50. package/dist/src/domains/deploy/runners/index.js.map +1 -0
  51. package/dist/src/domains/deployments/deployments.module.d.ts +2 -0
  52. package/dist/src/domains/deployments/deployments.module.js +20 -0
  53. package/dist/src/domains/deployments/deployments.module.js.map +1 -0
  54. package/dist/src/domains/deployments/index.d.ts +1 -0
  55. package/dist/src/domains/deployments/index.js +18 -0
  56. package/dist/src/domains/deployments/index.js.map +1 -0
  57. package/dist/src/domains/deployments/runners/create-deployment.runner.d.ts +14 -0
  58. package/dist/src/domains/deployments/runners/create-deployment.runner.js +79 -0
  59. package/dist/src/domains/deployments/runners/create-deployment.runner.js.map +1 -0
  60. package/dist/src/domains/deployments/runners/index.d.ts +1 -0
  61. package/dist/src/domains/deployments/runners/index.js +18 -0
  62. package/dist/src/domains/deployments/runners/index.js.map +1 -0
  63. package/dist/src/domains/index.d.ts +4 -0
  64. package/dist/src/domains/index.js +21 -0
  65. package/dist/src/domains/index.js.map +1 -0
  66. package/dist/src/domains/init/index.d.ts +2 -0
  67. package/dist/src/domains/init/index.js +19 -0
  68. package/dist/src/domains/init/index.js.map +1 -0
  69. package/dist/src/domains/init/init.module.d.ts +2 -0
  70. package/dist/src/domains/init/init.module.js +20 -0
  71. package/dist/src/domains/init/init.module.js.map +1 -0
  72. package/dist/src/domains/init/runners/index.d.ts +1 -0
  73. package/dist/src/domains/init/runners/index.js +18 -0
  74. package/dist/src/domains/init/runners/index.js.map +1 -0
  75. package/dist/src/domains/init/runners/init.runner.d.ts +4 -0
  76. package/dist/src/domains/init/runners/init.runner.js +93 -0
  77. package/dist/src/domains/init/runners/init.runner.js.map +1 -0
  78. package/dist/src/main.d.ts +1 -0
  79. package/dist/src/main.js +14 -0
  80. package/dist/src/main.js.map +1 -0
  81. package/dist/tsconfig.build.tsbuildinfo +1 -0
  82. package/package.json +212 -0
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # Tap CLI
2
+
3
+ A command line interface for managing deployments and more, built with NestJS Commander.
4
+
5
+ ## Installation
6
+
7
+ ### Homebrew (macOS/Linux)
8
+
9
+ ```bash
10
+ brew tap tappify-dev/homebrew-tap
11
+ brew install tappify
12
+ ```
13
+
14
+ Or install directly from the formula:
15
+
16
+ ```bash
17
+ brew install --build-from-source ./homebrew/tap.rb
18
+ ```
19
+
20
+ ### NPM (Alternative)
21
+
22
+ ```bash
23
+ npm install -g @tappify/cli
24
+ ```
25
+
26
+ ### From Source
27
+
28
+ ```bash
29
+ git clone https://github.com/tappify-dev/cli.git
30
+ cd tap/cli
31
+ pnpm install
32
+ pnpm build
33
+ npm link
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ```bash
39
+ # Show available commands
40
+ tap --help
41
+
42
+ # Create a deployment
43
+ tap create-deployment <project-id> --environment production --branch main
44
+
45
+ # Create a deployment (dry run)
46
+ tap create-deployment <project-id> --environment staging --dry-run
47
+ ```
48
+
49
+ ## Commands
50
+
51
+ ### `create-deployment`
52
+
53
+ Create a new deployment for a project.
54
+
55
+ ```bash
56
+ tap create-deployment <project-id> [options]
57
+ ```
58
+
59
+ **Arguments:**
60
+
61
+ - `project-id`: The ID of the project to deploy
62
+
63
+ **Options:**
64
+
65
+ - `-e, --environment <environment>`: Target environment (e.g., production, staging)
66
+ - `-b, --branch <branch>`: Git branch to deploy
67
+ - `-d, --dry-run`: Run without making actual changes
68
+
69
+ ## Development
70
+
71
+ ### Setup
72
+
73
+ ```bash
74
+ pnpm install
75
+ ```
76
+
77
+ ### Run in Development Mode
78
+
79
+ ```bash
80
+ pnpm start:dev
81
+ ```
82
+
83
+ ### Build
84
+
85
+ ```bash
86
+ pnpm build
87
+ ```
88
+
89
+ ### Testing
90
+
91
+ ```bash
92
+ # Unit tests
93
+ pnpm test
94
+
95
+ # Test coverage
96
+ pnpm test
97
+ ```
98
+
99
+ ### Linting and Formatting
100
+
101
+ ```bash
102
+ # Lint code
103
+ pnpm lint
104
+
105
+ # Format code
106
+ pnpm format
107
+ ```
108
+
109
+ ### Committing
110
+
111
+ This project uses Commitizen and Commitlint for conventional commits:
112
+
113
+ ```bash
114
+ # Use commitizen to create commits
115
+ pnpm commit
116
+ ```
117
+
118
+ ## Project Structure
119
+
120
+ ```
121
+ cli/
122
+ ├── src/
123
+ │ ├── domains/ # Feature domains
124
+ │ │ └── deployments/ # Deployment-related commands
125
+ │ │ ├── runners/ # Command runners
126
+ │ │ └── deployments.module.ts
127
+ │ ├── core/ # Core utilities
128
+ │ ├── app.module.ts # Main application module
129
+ │ └── main.ts # Application entry point
130
+ ├── scripts/ # Build scripts
131
+ │ └── tap # CLI wrapper script
132
+ ├── homebrew/ # Homebrew formula and docs
133
+ │ ├── tap.rb # Homebrew formula
134
+ │ └── HOMEBREW.md # Distribution guide
135
+ ├── test/ # Tests
136
+ └── package.json
137
+
138
+ ```
139
+
140
+ ## Contributing
141
+
142
+ 1. Fork the repository
143
+ 2. Create your feature branch (`git checkout -b feat/amazing-feature`)
144
+ 3. Commit your changes using commitizen (`pnpm commit`)
145
+ 4. Push to the branch (`git push origin feat/amazing-feature`)
146
+ 5. Open a Pull Request
147
+
148
+ ## License
149
+
150
+ MIT
package/bin/tappify ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('path');
4
+ const { spawn } = require('child_process');
5
+
6
+ const mainPath = path.resolve(__dirname, '../dist/src/main.js');
7
+ const nodeArgs = [mainPath, ...process.argv.slice(2)];
8
+
9
+ const child = spawn('node', nodeArgs, {
10
+ stdio: 'inherit',
11
+ env: process.env
12
+ });
13
+
14
+ child.on('exit', (code) => {
15
+ process.exit(code);
16
+ });
17
+
@@ -0,0 +1,8 @@
1
+ declare const _default: {
2
+ extends: string[];
3
+ rules: {
4
+ 'type-enum': (string | number | string[])[];
5
+ 'subject-case': number[];
6
+ };
7
+ };
8
+ export default _default;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ extends: ['@commitlint/config-conventional'],
5
+ rules: {
6
+ 'type-enum': [
7
+ 2,
8
+ 'always',
9
+ [
10
+ 'feat',
11
+ 'fix',
12
+ 'docs',
13
+ 'style',
14
+ 'refactor',
15
+ 'perf',
16
+ 'test',
17
+ 'build',
18
+ 'ci',
19
+ 'chore',
20
+ 'revert',
21
+ 'wip',
22
+ 'cont',
23
+ 'improve',
24
+ ],
25
+ ],
26
+ 'subject-case': [0],
27
+ },
28
+ };
29
+ //# sourceMappingURL=commitlint.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitlint.config.js","sourceRoot":"","sources":["../commitlint.config.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,OAAO,EAAE,CAAC,iCAAiC,CAAC;IAC5C,KAAK,EAAE;QACL,WAAW,EAAE;YACX,CAAC;YACD,QAAQ;YACR;gBACE,MAAM;gBACN,KAAK;gBACL,MAAM;gBACN,OAAO;gBACP,UAAU;gBACV,MAAM;gBACN,MAAM;gBACN,OAAO;gBACP,IAAI;gBACJ,OAAO;gBACP,QAAQ;gBACR,KAAK;gBACL,MAAM;gBACN,SAAS;aACV;SACF;QACD,cAAc,EAAE,CAAC,CAAC,CAAC;KACpB;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare class AppModule {
2
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AppModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const core_1 = require("./core");
12
+ const domains_1 = require("./domains");
13
+ let AppModule = class AppModule {
14
+ };
15
+ exports.AppModule = AppModule;
16
+ exports.AppModule = AppModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [
19
+ core_1.CoreModule,
20
+ domains_1.DeploymentsModule,
21
+ domains_1.AuthModule,
22
+ domains_1.InitModule,
23
+ domains_1.DeployModule,
24
+ ],
25
+ controllers: [],
26
+ providers: [],
27
+ })
28
+ ], AppModule);
29
+ //# sourceMappingURL=app.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,iCAAoC;AACpC,uCAKmB;AAaZ,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAXrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,iBAAU;YACV,2BAAiB;YACjB,oBAAU;YACV,oBAAU;YACV,sBAAY;SACb;QACD,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,EAAE;KACd,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,11 @@
1
+ import { ConfigService } from '../config/config.service.js';
2
+ export declare class ApiService {
3
+ private readonly configService;
4
+ private readonly logger;
5
+ constructor(configService: ConfigService);
6
+ private get baseUrl();
7
+ private get headers();
8
+ get<T = unknown>(path: string): Promise<T>;
9
+ post<T = unknown>(path: string, body: unknown): Promise<T>;
10
+ upload<T = unknown>(path: string, filePath: string): Promise<T>;
11
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ var ApiService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ApiService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const form_data_1 = __importDefault(require("form-data"));
19
+ const node_fs_1 = require("node:fs");
20
+ const config_service_js_1 = require("../config/config.service.js");
21
+ let ApiService = ApiService_1 = class ApiService {
22
+ configService;
23
+ logger = new common_1.Logger(ApiService_1.name);
24
+ constructor(configService) {
25
+ this.configService = configService;
26
+ }
27
+ get baseUrl() {
28
+ return (this.configService.get('apiBaseUrl') ?? 'https://api.tappify.io/api/v1');
29
+ }
30
+ get headers() {
31
+ const token = this.configService.get('accessToken');
32
+ return {
33
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
34
+ };
35
+ }
36
+ async get(path) {
37
+ const res = await fetch(`${this.baseUrl}${path}`, {
38
+ method: 'GET',
39
+ headers: { ...this.headers, 'Content-Type': 'application/json' },
40
+ });
41
+ if (!res.ok) {
42
+ const text = await res.text();
43
+ throw new Error(`GET ${path} failed (${res.status}): ${text}`);
44
+ }
45
+ return res.json();
46
+ }
47
+ async post(path, body) {
48
+ const res = await fetch(`${this.baseUrl}${path}`, {
49
+ method: 'POST',
50
+ headers: { ...this.headers, 'Content-Type': 'application/json' },
51
+ body: JSON.stringify(body),
52
+ });
53
+ if (!res.ok) {
54
+ const text = await res.text();
55
+ throw new Error(`POST ${path} failed (${res.status}): ${text}`);
56
+ }
57
+ return (await res.json());
58
+ }
59
+ async upload(path, filePath) {
60
+ const form = new form_data_1.default();
61
+ form.append('file', (0, node_fs_1.createReadStream)(filePath));
62
+ const res = await fetch(`${this.baseUrl}${path}`, {
63
+ method: 'POST',
64
+ headers: {
65
+ ...this.headers,
66
+ ...form.getHeaders(),
67
+ },
68
+ body: form,
69
+ });
70
+ if (!res.ok) {
71
+ const text = await res.text();
72
+ throw new Error(`Upload to ${path} failed (${res.status}): ${text}`);
73
+ }
74
+ return (await res.json());
75
+ }
76
+ };
77
+ exports.ApiService = ApiService;
78
+ exports.ApiService = ApiService = ApiService_1 = __decorate([
79
+ (0, common_1.Injectable)(),
80
+ __metadata("design:paramtypes", [config_service_js_1.ConfigService])
81
+ ], ApiService);
82
+ //# sourceMappingURL=api.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.service.js","sourceRoot":"","sources":["../../../../src/core/api/api.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { ConfigService } from '../config/config.service.js';
2
+ export interface DeviceAuthResponse {
3
+ device_code: string;
4
+ user_code: string;
5
+ verification_uri: string;
6
+ verification_uri_complete: string;
7
+ expires_in: number;
8
+ interval: number;
9
+ }
10
+ interface TokenResponse {
11
+ access_token: string;
12
+ refresh_token: string;
13
+ user: {
14
+ id: string;
15
+ email: string;
16
+ first_name: string;
17
+ last_name: string;
18
+ };
19
+ organization_id?: string;
20
+ }
21
+ export declare class AuthService {
22
+ private readonly configService;
23
+ private readonly logger;
24
+ constructor(configService: ConfigService);
25
+ startDeviceAuthorization(): Promise<DeviceAuthResponse>;
26
+ pollForToken(deviceCode: string, interval: number, expiresIn: number): Promise<TokenResponse>;
27
+ private storeCredentials;
28
+ private sleep;
29
+ }
30
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var AuthService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.AuthService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_service_js_1 = require("../config/config.service.js");
16
+ const WORKOS_BASE_URL = 'https://api.workos.com';
17
+ const CLIENT_ID = process.env.WORKOS_CLIENT_ID ?? 'client_01JMQE7SPRY6W1JBQB8JWAK4JK';
18
+ let AuthService = AuthService_1 = class AuthService {
19
+ configService;
20
+ logger = new common_1.Logger(AuthService_1.name);
21
+ constructor(configService) {
22
+ this.configService = configService;
23
+ }
24
+ async startDeviceAuthorization() {
25
+ const res = await fetch(`${WORKOS_BASE_URL}/user_management/authorize/device`, {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/json' },
28
+ body: JSON.stringify({ client_id: CLIENT_ID }),
29
+ });
30
+ if (!res.ok) {
31
+ const text = await res.text();
32
+ throw new Error(`Failed to start device authorization: ${text}`);
33
+ }
34
+ return res.json();
35
+ }
36
+ async pollForToken(deviceCode, interval, expiresIn) {
37
+ const deadline = Date.now() + expiresIn * 1000;
38
+ let pollInterval = interval * 1000;
39
+ while (Date.now() < deadline) {
40
+ await this.sleep(pollInterval);
41
+ const res = await fetch(`${WORKOS_BASE_URL}/user_management/authenticate`, {
42
+ method: 'POST',
43
+ headers: { 'Content-Type': 'application/json' },
44
+ body: JSON.stringify({
45
+ client_id: CLIENT_ID,
46
+ grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
47
+ device_code: deviceCode,
48
+ }),
49
+ });
50
+ if (res.ok) {
51
+ const data = (await res.json());
52
+ this.storeCredentials(data);
53
+ return data;
54
+ }
55
+ const error = (await res.json());
56
+ if (error.error === 'authorization_pending') {
57
+ continue;
58
+ }
59
+ if (error.error === 'slow_down') {
60
+ pollInterval += 5000;
61
+ continue;
62
+ }
63
+ throw new Error(error.error_description ?? `Authorization failed: ${error.error}`);
64
+ }
65
+ throw new Error('Device authorization timed out.');
66
+ }
67
+ storeCredentials(data) {
68
+ this.configService.set('accessToken', data.access_token);
69
+ this.configService.set('refreshToken', data.refresh_token);
70
+ this.configService.set('userId', data.user.id);
71
+ if (data.organization_id) {
72
+ this.configService.set('organizationId', data.organization_id);
73
+ }
74
+ }
75
+ sleep(ms) {
76
+ return new Promise(resolve => setTimeout(resolve, ms));
77
+ }
78
+ };
79
+ exports.AuthService = AuthService;
80
+ exports.AuthService = AuthService = AuthService_1 = __decorate([
81
+ (0, common_1.Injectable)(),
82
+ __metadata("design:paramtypes", [config_service_js_1.ConfigService])
83
+ ], AuthService);
84
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../../src/core/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,mEAA4D;AA4B5D,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,mCAAmC,CAAC;AAG/D,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAGO;IAFZ,MAAM,GAAG,IAAI,eAAM,CAAC,aAAW,CAAC,IAAI,CAAC,CAAC;IAEvD,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,wBAAwB;QAC5B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,eAAe,mCAAmC,EACrD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;SAC/C,CACF,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAiC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,UAAkB,EAClB,QAAgB,EAChB,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;QAC/C,IAAI,YAAY,GAAG,QAAQ,GAAG,IAAI,CAAC;QAEnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE/B,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,eAAe,+BAA+B,EACjD;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,SAAS,EAAE,SAAS;oBACpB,UAAU,EAAE,8CAA8C;oBAC1D,WAAW,EAAE,UAAU;iBACxB,CAAC;aACH,CACF,CAAC;YAEF,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAkB,CAAC;gBACjD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAc,CAAC;YAE9C,IAAI,KAAK,CAAC,KAAK,KAAK,uBAAuB,EAAE,CAAC;gBAC5C,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;gBAChC,YAAY,IAAI,IAAI,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,MAAM,IAAI,KAAK,CACb,KAAK,CAAC,iBAAiB,IAAI,yBAAyB,KAAK,CAAC,KAAK,EAAE,CAClE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAEO,gBAAgB,CAAC,IAAmB;QAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAA;AApFY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAIiC,iCAAa;GAH9C,WAAW,CAoFvB"}
@@ -0,0 +1,16 @@
1
+ export interface TappifyConfig {
2
+ accessToken?: string;
3
+ refreshToken?: string;
4
+ userId?: string;
5
+ organizationId?: string;
6
+ apiBaseUrl?: string;
7
+ }
8
+ export declare class ConfigService {
9
+ private readonly store;
10
+ constructor();
11
+ get<K extends keyof TappifyConfig>(key: K): TappifyConfig[K];
12
+ set<K extends keyof TappifyConfig>(key: K, value: TappifyConfig[K]): void;
13
+ delete<K extends keyof TappifyConfig>(key: K): void;
14
+ clear(): void;
15
+ isAuthenticated(): boolean;
16
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ConfigService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const conf_1 = __importDefault(require("conf"));
18
+ let ConfigService = class ConfigService {
19
+ store;
20
+ constructor() {
21
+ this.store = new conf_1.default({
22
+ projectName: 'tappify',
23
+ defaults: {
24
+ apiBaseUrl: 'https://api.tappify.io/api/v1',
25
+ },
26
+ });
27
+ }
28
+ get(key) {
29
+ return this.store.get(key);
30
+ }
31
+ set(key, value) {
32
+ this.store.set(key, value);
33
+ }
34
+ delete(key) {
35
+ this.store.delete(key);
36
+ }
37
+ clear() {
38
+ this.store.clear();
39
+ }
40
+ isAuthenticated() {
41
+ return !!this.store.get('accessToken');
42
+ }
43
+ };
44
+ exports.ConfigService = ConfigService;
45
+ exports.ConfigService = ConfigService = __decorate([
46
+ (0, common_1.Injectable)(),
47
+ __metadata("design:paramtypes", [])
48
+ ], ConfigService);
49
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../../src/core/config/config.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,gDAAwB;AAWjB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,KAAK,CAAsB;IAE5C;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,cAAI,CAAgB;YACnC,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE;gBACR,UAAU,EAAE,+BAA+B;aAC5C;SACF,CAAC,CAAC;IACL,CAAC;IAED,GAAG,CAAgC,GAAM;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAgC,GAAM,EAAE,KAAuB;QAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAgC,GAAM;QAC1C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,eAAe;QACb,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;CACF,CAAA;AA/BY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CA+BzB"}
@@ -0,0 +1,2 @@
1
+ export declare class CoreModule {
2
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CoreModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const api_service_js_1 = require("./api/api.service.js");
12
+ const auth_service_js_1 = require("./auth/auth.service.js");
13
+ const config_service_js_1 = require("./config/config.service.js");
14
+ let CoreModule = class CoreModule {
15
+ };
16
+ exports.CoreModule = CoreModule;
17
+ exports.CoreModule = CoreModule = __decorate([
18
+ (0, common_1.Global)(),
19
+ (0, common_1.Module)({
20
+ providers: [config_service_js_1.ConfigService, auth_service_js_1.AuthService, api_service_js_1.ApiService],
21
+ exports: [config_service_js_1.ConfigService, auth_service_js_1.AuthService, api_service_js_1.ApiService],
22
+ })
23
+ ], CoreModule);
24
+ //# sourceMappingURL=core.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.module.js","sourceRoot":"","sources":["../../../src/core/core.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,yDAAkD;AAClD,4DAAqD;AACrD,kEAA2D;AAOpD,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IALtB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iCAAa,EAAE,6BAAW,EAAE,2BAAU,CAAC;QACnD,OAAO,EAAE,CAAC,iCAAa,EAAE,6BAAW,EAAE,2BAAU,CAAC;KAClD,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,4 @@
1
+ export * from './api/api.service.js';
2
+ export * from './auth/auth.service.js';
3
+ export * from './config/config.service.js';
4
+ export * from './core.module.js';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./api/api.service.js"), exports);
18
+ __exportStar(require("./auth/auth.service.js"), exports);
19
+ __exportStar(require("./config/config.service.js"), exports);
20
+ __exportStar(require("./core.module.js"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,yDAAuC;AACvC,6DAA2C;AAC3C,mDAAiC"}
@@ -0,0 +1,2 @@
1
+ export declare class AuthModule {
2
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const login_runner_js_1 = require("./runners/login.runner.js");
12
+ const logout_runner_js_1 = require("./runners/logout.runner.js");
13
+ let AuthModule = class AuthModule {
14
+ };
15
+ exports.AuthModule = AuthModule;
16
+ exports.AuthModule = AuthModule = __decorate([
17
+ (0, common_1.Module)({
18
+ providers: [login_runner_js_1.LoginRunner, logout_runner_js_1.LogoutRunner],
19
+ })
20
+ ], AuthModule);
21
+ //# sourceMappingURL=auth.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../../../src/domains/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,+DAAwD;AACxD,iEAA0D;AAKnD,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IAHtB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,6BAAW,EAAE,+BAAY,CAAC;KACvC,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,2 @@
1
+ export * from './auth.module.js';
2
+ export * from './runners/index.js';