@forgecart/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 (93) hide show
  1. package/README.md +179 -0
  2. package/bin/forgecart.js +3 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +30 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/delete.d.ts +3 -0
  8. package/dist/commands/delete.d.ts.map +1 -0
  9. package/dist/commands/delete.js +55 -0
  10. package/dist/commands/delete.js.map +1 -0
  11. package/dist/commands/deploy.d.ts +3 -0
  12. package/dist/commands/deploy.d.ts.map +1 -0
  13. package/dist/commands/deploy.js +128 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/env.d.ts +3 -0
  16. package/dist/commands/env.d.ts.map +1 -0
  17. package/dist/commands/env.js +100 -0
  18. package/dist/commands/env.js.map +1 -0
  19. package/dist/commands/init.d.ts +4 -0
  20. package/dist/commands/init.d.ts.map +1 -0
  21. package/dist/commands/init.js +233 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/list.d.ts +3 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +61 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/logs.d.ts +3 -0
  28. package/dist/commands/logs.d.ts.map +1 -0
  29. package/dist/commands/logs.js +105 -0
  30. package/dist/commands/logs.js.map +1 -0
  31. package/dist/commands/scale.d.ts +3 -0
  32. package/dist/commands/scale.d.ts.map +1 -0
  33. package/dist/commands/scale.js +45 -0
  34. package/dist/commands/scale.js.map +1 -0
  35. package/dist/commands/status.d.ts +3 -0
  36. package/dist/commands/status.d.ts.map +1 -0
  37. package/dist/commands/status.js +85 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/whoami.d.ts +3 -0
  40. package/dist/commands/whoami.d.ts.map +1 -0
  41. package/dist/commands/whoami.js +46 -0
  42. package/dist/commands/whoami.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +5 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/api-client.d.ts +21 -0
  48. package/dist/lib/api-client.d.ts.map +1 -0
  49. package/dist/lib/api-client.js +220 -0
  50. package/dist/lib/api-client.js.map +1 -0
  51. package/dist/lib/archive.d.ts +8 -0
  52. package/dist/lib/archive.d.ts.map +1 -0
  53. package/dist/lib/archive.js +96 -0
  54. package/dist/lib/archive.js.map +1 -0
  55. package/dist/lib/config.d.ts +12 -0
  56. package/dist/lib/config.d.ts.map +1 -0
  57. package/dist/lib/config.js +79 -0
  58. package/dist/lib/config.js.map +1 -0
  59. package/dist/lib/logger.d.ts +15 -0
  60. package/dist/lib/logger.d.ts.map +1 -0
  61. package/dist/lib/logger.js +54 -0
  62. package/dist/lib/logger.js.map +1 -0
  63. package/dist/lib/nx-generator.d.ts +8 -0
  64. package/dist/lib/nx-generator.d.ts.map +1 -0
  65. package/dist/lib/nx-generator.js +146 -0
  66. package/dist/lib/nx-generator.js.map +1 -0
  67. package/dist/templates/application-additions/.forgecartignore +37 -0
  68. package/dist/templates/application-additions/Procfile +1 -0
  69. package/dist/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
  70. package/dist/templates/storefront-additions/.forgecartignore +40 -0
  71. package/dist/templates/storefront-additions/Procfile +1 -0
  72. package/dist/templates/storefront-additions/src/app/products/page.tsx +78 -0
  73. package/dist/templates/storefront-additions/src/lib/forgecart.ts +11 -0
  74. package/dist/types/index.d.ts +70 -0
  75. package/dist/types/index.d.ts.map +1 -0
  76. package/dist/types/index.js +14 -0
  77. package/dist/types/index.js.map +1 -0
  78. package/dist/utils/spinner.d.ts +4 -0
  79. package/dist/utils/spinner.d.ts.map +1 -0
  80. package/dist/utils/spinner.js +20 -0
  81. package/dist/utils/spinner.js.map +1 -0
  82. package/dist/utils/validation.d.ts +12 -0
  83. package/dist/utils/validation.d.ts.map +1 -0
  84. package/dist/utils/validation.js +66 -0
  85. package/dist/utils/validation.js.map +1 -0
  86. package/package.json +52 -0
  87. package/templates/application-additions/.forgecartignore +37 -0
  88. package/templates/application-additions/Procfile +1 -0
  89. package/templates/application-additions/src/services/price-fetcher.service.ts +72 -0
  90. package/templates/storefront-additions/.forgecartignore +40 -0
  91. package/templates/storefront-additions/Procfile +1 -0
  92. package/templates/storefront-additions/src/app/products/page.tsx +78 -0
  93. package/templates/storefront-additions/src/lib/forgecart.ts +11 -0
@@ -0,0 +1,46 @@
1
+ import { Command } from 'commander';
2
+ import logger from '../lib/logger.js';
3
+ import { readConfig, findProjectRoot } from '../lib/config.js';
4
+ import { ForgecartApiClient } from '../lib/api-client.js';
5
+ import { withSpinner } from '../utils/spinner.js';
6
+ export function createWhoamiCommand() {
7
+ const cmd = new Command('whoami')
8
+ .description('Show current channel information')
9
+ .action(async () => {
10
+ await showWhoami();
11
+ });
12
+ return cmd;
13
+ }
14
+ async function showWhoami() {
15
+ const projectRoot = findProjectRoot();
16
+ if (!projectRoot) {
17
+ logger.error('Not in a ForgéCart project');
18
+ process.exit(1);
19
+ }
20
+ const config = readConfig(projectRoot);
21
+ if (!config) {
22
+ logger.error('Invalid ForgéCart configuration');
23
+ process.exit(1);
24
+ }
25
+ const apiClient = new ForgecartApiClient(config.apiUrl, config.channelToken);
26
+ const channelInfo = await withSpinner('Fetching channel information...', 'Channel information retrieved', 'Failed to fetch channel information', async () => {
27
+ return apiClient.getChannelInfo();
28
+ });
29
+ if (!channelInfo) {
30
+ logger.error('Unable to fetch channel information. Your token may be invalid.');
31
+ process.exit(1);
32
+ }
33
+ logger.newline();
34
+ logger.title('Channel Information');
35
+ logger.keyValue('Channel ID', channelInfo.id);
36
+ logger.keyValue('Channel Code', channelInfo.code);
37
+ logger.keyValue('API URL', config.apiUrl);
38
+ logger.newline();
39
+ logger.keyValue('Project Root', projectRoot);
40
+ logger.keyValue('Has Application', config.hasApplication ? 'Yes' : 'No');
41
+ logger.keyValue('Storefront Path', config.storefrontPath);
42
+ if (config.applicationPath) {
43
+ logger.keyValue('Application Path', config.applicationPath);
44
+ }
45
+ }
46
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,MAAM,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAiB,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC9B,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;IAEJ,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IAErC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAE5E,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,iCAAiC,EACjC,+BAA+B,EAC/B,qCAAqC,EACrC,KAAK,IAAI,EAAE;QACT,OAAO,SAAS,CAAC,cAAc,EAAE,CAAA;IACnC,CAAC,CACF,CAAA;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,CAAA;IAChB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACnC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,CAAA;IAC7C,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACjD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,CAAC,OAAO,EAAE,CAAA;IAChB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IAC5C,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACxE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAA;IACzD,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC,CAAA;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { createProgram } from './cli.js';
3
+ const program = createProgram();
4
+ program.parse(process.argv);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAA;AAE/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { Deployment, DeploymentType, DeploymentEnv, ChannelInfo } from '../types/index.js';
2
+ export declare class ForgecartApiClient {
3
+ private graphqlClient;
4
+ private baseUrl;
5
+ private channelToken;
6
+ constructor(apiUrl: string, channelToken: string);
7
+ validateChannelToken(): Promise<boolean>;
8
+ getChannelInfo(): Promise<ChannelInfo | null>;
9
+ getDeployments(): Promise<Deployment[]>;
10
+ getDeployment(type: DeploymentType): Promise<Deployment | null>;
11
+ createDeployment(type: DeploymentType): Promise<Deployment>;
12
+ deleteDeployment(type: DeploymentType): Promise<boolean>;
13
+ scaleDeployment(type: DeploymentType, instances: number): Promise<Deployment>;
14
+ getDeploymentEnv(type: DeploymentType): Promise<DeploymentEnv[]>;
15
+ setDeploymentEnv(type: DeploymentType, key: string, value: string): Promise<boolean>;
16
+ unsetDeploymentEnv(type: DeploymentType, key: string): Promise<boolean>;
17
+ refreshDeploymentStatus(type: DeploymentType): Promise<Deployment | null>;
18
+ uploadAndDeploy(type: DeploymentType, zipBuffer: Buffer): Promise<Deployment>;
19
+ getLogsWebSocketUrl(type: DeploymentType): Promise<string | null>;
20
+ }
21
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAE1B,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAQ;gBAEhB,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAU1C,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAexC,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAkB7C,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAmBvC,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqB/D,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAqB3D,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqB7E,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBhE,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAapF,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAavE,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAsBzE,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwB7E,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAgBxE"}
@@ -0,0 +1,220 @@
1
+ import { GraphQLClient, gql } from 'graphql-request';
2
+ import FormData from 'form-data';
3
+ export class ForgecartApiClient {
4
+ graphqlClient;
5
+ baseUrl;
6
+ channelToken;
7
+ constructor(apiUrl, channelToken) {
8
+ this.baseUrl = apiUrl;
9
+ this.channelToken = channelToken;
10
+ this.graphqlClient = new GraphQLClient(`${apiUrl}/shop-api`, {
11
+ headers: {
12
+ 'vendure-token': channelToken,
13
+ },
14
+ });
15
+ }
16
+ async validateChannelToken() {
17
+ const query = gql `
18
+ query ValidateChannelToken {
19
+ validateChannelToken
20
+ }
21
+ `;
22
+ try {
23
+ const result = await this.graphqlClient.request(query);
24
+ return result.validateChannelToken;
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ async getChannelInfo() {
31
+ const query = gql `
32
+ query ChannelInfo {
33
+ channelInfo {
34
+ id
35
+ code
36
+ }
37
+ }
38
+ `;
39
+ try {
40
+ const result = await this.graphqlClient.request(query);
41
+ return result.channelInfo;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ async getDeployments() {
48
+ const query = gql `
49
+ query Deployments {
50
+ deployments {
51
+ id
52
+ type
53
+ status
54
+ url
55
+ instances
56
+ lastDeployedAt
57
+ errorMessage
58
+ }
59
+ }
60
+ `;
61
+ const result = await this.graphqlClient.request(query);
62
+ return result.deployments;
63
+ }
64
+ async getDeployment(type) {
65
+ const query = gql `
66
+ query Deployment($type: DeploymentType!) {
67
+ deployment(type: $type) {
68
+ id
69
+ type
70
+ status
71
+ url
72
+ instances
73
+ lastDeployedAt
74
+ errorMessage
75
+ }
76
+ }
77
+ `;
78
+ const result = await this.graphqlClient.request(query, {
79
+ type,
80
+ });
81
+ return result.deployment;
82
+ }
83
+ async createDeployment(type) {
84
+ const mutation = gql `
85
+ mutation CreateDeployment($input: CreateDeploymentInput!) {
86
+ createDeployment(input: $input) {
87
+ id
88
+ type
89
+ status
90
+ url
91
+ instances
92
+ lastDeployedAt
93
+ errorMessage
94
+ }
95
+ }
96
+ `;
97
+ const result = await this.graphqlClient.request(mutation, {
98
+ input: { type },
99
+ });
100
+ return result.createDeployment;
101
+ }
102
+ async deleteDeployment(type) {
103
+ const mutation = gql `
104
+ mutation DeleteDeployment($type: DeploymentType!) {
105
+ deleteDeployment(type: $type)
106
+ }
107
+ `;
108
+ const result = await this.graphqlClient.request(mutation, {
109
+ type,
110
+ });
111
+ return result.deleteDeployment;
112
+ }
113
+ async scaleDeployment(type, instances) {
114
+ const mutation = gql `
115
+ mutation ScaleDeployment($input: ScaleDeploymentInput!) {
116
+ scaleDeployment(input: $input) {
117
+ id
118
+ type
119
+ status
120
+ url
121
+ instances
122
+ lastDeployedAt
123
+ errorMessage
124
+ }
125
+ }
126
+ `;
127
+ const result = await this.graphqlClient.request(mutation, {
128
+ input: { type, instances },
129
+ });
130
+ return result.scaleDeployment;
131
+ }
132
+ async getDeploymentEnv(type) {
133
+ const query = gql `
134
+ query DeploymentEnv($type: DeploymentType!) {
135
+ deploymentEnv(type: $type) {
136
+ key
137
+ value
138
+ }
139
+ }
140
+ `;
141
+ const result = await this.graphqlClient.request(query, {
142
+ type,
143
+ });
144
+ return result.deploymentEnv;
145
+ }
146
+ async setDeploymentEnv(type, key, value) {
147
+ const mutation = gql `
148
+ mutation SetDeploymentEnv($input: SetEnvInput!) {
149
+ setDeploymentEnv(input: $input)
150
+ }
151
+ `;
152
+ const result = await this.graphqlClient.request(mutation, {
153
+ input: { type, key, value },
154
+ });
155
+ return result.setDeploymentEnv;
156
+ }
157
+ async unsetDeploymentEnv(type, key) {
158
+ const mutation = gql `
159
+ mutation UnsetDeploymentEnv($input: UnsetEnvInput!) {
160
+ unsetDeploymentEnv(input: $input)
161
+ }
162
+ `;
163
+ const result = await this.graphqlClient.request(mutation, {
164
+ input: { type, key },
165
+ });
166
+ return result.unsetDeploymentEnv;
167
+ }
168
+ async refreshDeploymentStatus(type) {
169
+ const mutation = gql `
170
+ mutation RefreshDeploymentStatus($type: DeploymentType!) {
171
+ refreshDeploymentStatus(type: $type) {
172
+ id
173
+ type
174
+ status
175
+ url
176
+ instances
177
+ lastDeployedAt
178
+ errorMessage
179
+ }
180
+ }
181
+ `;
182
+ const result = await this.graphqlClient.request(mutation, { type });
183
+ return result.refreshDeploymentStatus;
184
+ }
185
+ async uploadAndDeploy(type, zipBuffer) {
186
+ const formData = new FormData();
187
+ formData.append('file', zipBuffer, {
188
+ filename: 'app.zip',
189
+ contentType: 'application/zip',
190
+ });
191
+ const response = await fetch(`${this.baseUrl}/deployments/${type}/upload`, {
192
+ method: 'POST',
193
+ headers: {
194
+ 'vendure-token': this.channelToken,
195
+ },
196
+ body: formData,
197
+ });
198
+ if (!response.ok) {
199
+ const errorText = await response.text();
200
+ throw new Error(`Deployment failed: ${response.status} - ${errorText}`);
201
+ }
202
+ const result = (await response.json());
203
+ return result.deployment;
204
+ }
205
+ async getLogsWebSocketUrl(type) {
206
+ const response = await fetch(`${this.baseUrl}/deployments/${type}/logs`, {
207
+ method: 'POST',
208
+ headers: {
209
+ 'vendure-token': this.channelToken,
210
+ 'Content-Type': 'application/json',
211
+ },
212
+ });
213
+ if (!response.ok) {
214
+ return null;
215
+ }
216
+ const result = (await response.json());
217
+ return result.wsUrl;
218
+ }
219
+ }
220
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface ArchiveOptions {
2
+ sourceDir: string;
3
+ ignoreFile?: string;
4
+ }
5
+ export declare function createArchive(options: ArchiveOptions): Promise<Buffer>;
6
+ export declare function getIgnoreFileForType(type: 'storefront' | 'application'): string;
7
+ export {};
8
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAkFD,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAgC5E;AAGD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,GAAG,aAAa,GACjC,MAAM,CAER"}
@@ -0,0 +1,96 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import archiver from 'archiver';
4
+ function parseIgnoreFile(ignoreFilePath) {
5
+ if (!fs.existsSync(ignoreFilePath)) {
6
+ return [];
7
+ }
8
+ const content = fs.readFileSync(ignoreFilePath, 'utf-8');
9
+ return content
10
+ .split('\n')
11
+ .map((line) => line.trim())
12
+ .filter((line) => line && !line.startsWith('#'));
13
+ }
14
+ function shouldIgnore(filePath, patterns) {
15
+ const relativePath = filePath.replace(/\\/g, '/');
16
+ for (const pattern of patterns) {
17
+ // Handle directory patterns (ending with /)
18
+ if (pattern.endsWith('/')) {
19
+ const dirPattern = pattern.slice(0, -1);
20
+ if (relativePath.startsWith(dirPattern + '/') ||
21
+ relativePath === dirPattern) {
22
+ return true;
23
+ }
24
+ }
25
+ // Handle exact matches
26
+ else if (relativePath === pattern || relativePath.endsWith('/' + pattern)) {
27
+ return true;
28
+ }
29
+ // Handle glob patterns with *
30
+ else if (pattern.includes('*')) {
31
+ const regex = new RegExp('^' +
32
+ pattern
33
+ .replace(/\./g, '\\.')
34
+ .replace(/\*\*/g, '.*')
35
+ .replace(/\*/g, '[^/]*') +
36
+ '$');
37
+ if (regex.test(relativePath)) {
38
+ return true;
39
+ }
40
+ }
41
+ // Handle patterns that match any file with that name
42
+ else if (relativePath.includes('/' + pattern) || relativePath === pattern) {
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ function getAllFiles(dir, baseDir, ignorePatterns) {
49
+ const files = [];
50
+ const items = fs.readdirSync(dir, { withFileTypes: true });
51
+ for (const item of items) {
52
+ const fullPath = path.join(dir, item.name);
53
+ const relativePath = path.relative(baseDir, fullPath).replace(/\\/g, '/');
54
+ if (shouldIgnore(relativePath, ignorePatterns)) {
55
+ continue;
56
+ }
57
+ if (item.isDirectory()) {
58
+ files.push(...getAllFiles(fullPath, baseDir, ignorePatterns));
59
+ }
60
+ else {
61
+ files.push(fullPath);
62
+ }
63
+ }
64
+ return files;
65
+ }
66
+ export async function createArchive(options) {
67
+ const { sourceDir, ignoreFile } = options;
68
+ // Parse ignore patterns
69
+ const defaultIgnorePatterns = ['node_modules/', '.git/', '.env', '.env.local'];
70
+ let ignorePatterns = [...defaultIgnorePatterns];
71
+ if (ignoreFile) {
72
+ const customPatterns = parseIgnoreFile(path.join(sourceDir, ignoreFile));
73
+ ignorePatterns = [...ignorePatterns, ...customPatterns];
74
+ }
75
+ // Get all files to include
76
+ const files = getAllFiles(sourceDir, sourceDir, ignorePatterns);
77
+ // Create archive
78
+ return new Promise((resolve, reject) => {
79
+ const chunks = [];
80
+ const archive = archiver('zip', { zlib: { level: 9 } });
81
+ archive.on('data', (chunk) => chunks.push(chunk));
82
+ archive.on('end', () => resolve(Buffer.concat(chunks)));
83
+ archive.on('error', reject);
84
+ for (const file of files) {
85
+ const relativePath = path.relative(sourceDir, file);
86
+ // Use mode 0644 for files to ensure buildpack can read them
87
+ archive.file(file, { name: relativePath, mode: 0o644 });
88
+ }
89
+ archive.finalize();
90
+ });
91
+ }
92
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
93
+ export function getIgnoreFileForType(type) {
94
+ return '.forgecartignore';
95
+ }
96
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/lib/archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,QAAQ,MAAM,UAAU,CAAA;AAO/B,SAAS,eAAe,CAAC,cAAsB;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IACxD,OAAO,OAAO;SACX,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,QAAkB;IACxD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,4CAA4C;QAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACvC,IACE,YAAY,CAAC,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC;gBACzC,YAAY,KAAK,UAAU,EAC3B,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,uBAAuB;aAClB,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAA;QACb,CAAC;QACD,8BAA8B;aACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,GAAG;gBACD,OAAO;qBACJ,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;qBACrB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;qBACtB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC1B,GAAG,CACN,CAAA;YACD,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QACD,qDAAqD;aAChD,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,WAAW,CAClB,GAAW,EACX,OAAe,EACf,cAAwB;IAExB,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAEzE,IAAI,YAAY,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;YAC/C,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAA;QAC/D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAEzC,wBAAwB;IACxB,MAAM,qBAAqB,GAAG,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;IAC9E,IAAI,cAAc,GAAG,CAAC,GAAG,qBAAqB,CAAC,CAAA;IAE/C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAA;QACxE,cAAc,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAA;IACzD,CAAC;IAED,2BAA2B;IAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAA;IAE/D,iBAAiB;IACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEvD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACzD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACvD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACnD,4DAA4D;YAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACzD,CAAC;QAED,OAAO,CAAC,QAAQ,EAAE,CAAA;IACpB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,oBAAoB,CAClC,IAAkC;IAElC,OAAO,kBAAkB,CAAA;AAC3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ForgecartConfig } from '../types/index.js';
2
+ export declare function getConfigDir(projectRoot: string): string;
3
+ export declare function getConfigPath(projectRoot: string): string;
4
+ export declare function configExists(projectRoot?: string): boolean;
5
+ export declare function readConfig(projectRoot?: string): ForgecartConfig | null;
6
+ export declare function writeConfig(config: ForgecartConfig, projectRoot?: string): void;
7
+ export declare function updateConfig(updates: Partial<ForgecartConfig>, projectRoot?: string): ForgecartConfig;
8
+ export declare function getDefaultConfig(): ForgecartConfig;
9
+ export declare function findProjectRoot(startDir?: string): string | null;
10
+ export declare function requireConfig(): ForgecartConfig;
11
+ export declare function getProjectRoot(): string;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAYnD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,YAAY,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAEzE;AAED,wBAAgB,UAAU,CAAC,WAAW,GAAE,MAAsB,GAAG,eAAe,GAAG,IAAI,CAatF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,WAAW,GAAE,MAAsB,GAAG,IAAI,CAS9F;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,WAAW,GAAE,MAAsB,GAClC,eAAe,CAKjB;AAED,wBAAgB,gBAAgB,IAAI,eAAe,CAElD;AAED,wBAAgB,eAAe,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAW/E;AAED,wBAAgB,aAAa,IAAI,eAAe,CAc/C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAQvC"}
@@ -0,0 +1,79 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ const CONFIG_DIR = '.forgecart';
4
+ const CONFIG_FILE = 'config.json';
5
+ const DEFAULT_CONFIG = {
6
+ version: '1.0',
7
+ channelToken: '',
8
+ apiUrl: 'https://api.forgecart.com',
9
+ hasApplication: false,
10
+ storefrontPath: 'apps/storefront',
11
+ };
12
+ export function getConfigDir(projectRoot) {
13
+ return path.join(projectRoot, CONFIG_DIR);
14
+ }
15
+ export function getConfigPath(projectRoot) {
16
+ return path.join(getConfigDir(projectRoot), CONFIG_FILE);
17
+ }
18
+ export function configExists(projectRoot = process.cwd()) {
19
+ return fs.existsSync(getConfigPath(projectRoot));
20
+ }
21
+ export function readConfig(projectRoot = process.cwd()) {
22
+ const configPath = getConfigPath(projectRoot);
23
+ if (!fs.existsSync(configPath)) {
24
+ return null;
25
+ }
26
+ try {
27
+ const content = fs.readFileSync(configPath, 'utf-8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ export function writeConfig(config, projectRoot = process.cwd()) {
35
+ const configDir = getConfigDir(projectRoot);
36
+ const configPath = getConfigPath(projectRoot);
37
+ if (!fs.existsSync(configDir)) {
38
+ fs.mkdirSync(configDir, { recursive: true });
39
+ }
40
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
41
+ }
42
+ export function updateConfig(updates, projectRoot = process.cwd()) {
43
+ const existing = readConfig(projectRoot) || DEFAULT_CONFIG;
44
+ const updated = { ...existing, ...updates };
45
+ writeConfig(updated, projectRoot);
46
+ return updated;
47
+ }
48
+ export function getDefaultConfig() {
49
+ return { ...DEFAULT_CONFIG };
50
+ }
51
+ export function findProjectRoot(startDir = process.cwd()) {
52
+ let currentDir = startDir;
53
+ while (currentDir !== path.parse(currentDir).root) {
54
+ if (fs.existsSync(path.join(currentDir, CONFIG_DIR, CONFIG_FILE))) {
55
+ return currentDir;
56
+ }
57
+ currentDir = path.dirname(currentDir);
58
+ }
59
+ return null;
60
+ }
61
+ export function requireConfig() {
62
+ const projectRoot = findProjectRoot();
63
+ if (!projectRoot) {
64
+ throw new Error('Not in a ForgéCart project. Run "forgecart init" to create a new project.');
65
+ }
66
+ const config = readConfig(projectRoot);
67
+ if (!config) {
68
+ throw new Error('Invalid ForgéCart configuration. Please reinitialize the project.');
69
+ }
70
+ return config;
71
+ }
72
+ export function getProjectRoot() {
73
+ const root = findProjectRoot();
74
+ if (!root) {
75
+ throw new Error('Not in a ForgéCart project. Run "forgecart init" to create a new project.');
76
+ }
77
+ return root;
78
+ }
79
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAG5B,MAAM,UAAU,GAAG,YAAY,CAAA;AAC/B,MAAM,WAAW,GAAG,aAAa,CAAA;AACjC,MAAM,cAAc,GAAoB;IACtC,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,EAAE;IAChB,MAAM,EAAE,2BAA2B;IACnC,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,iBAAiB;CAClC,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAoB,CAAA;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAuB,EAAE,cAAsB,OAAO,CAAC,GAAG,EAAE;IACtF,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAA;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAiC,EACjC,cAAsB,OAAO,CAAC,GAAG,EAAE;IAEnC,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,cAAc,CAAA;IAC1D,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAA;IAC3C,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACjC,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,GAAG,cAAc,EAAE,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,UAAU,GAAG,QAAQ,CAAA;IAEzB,OAAO,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;IACtF,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,15 @@
1
+ export declare const logger: {
2
+ info: (message: string) => void;
3
+ success: (message: string) => void;
4
+ warn: (message: string) => void;
5
+ error: (message: string) => void;
6
+ debug: (message: string) => void;
7
+ log: (message: string) => void;
8
+ newline: () => void;
9
+ title: (message: string) => void;
10
+ list: (items: string[]) => void;
11
+ keyValue: (key: string, value: string) => void;
12
+ box: (message: string) => void;
13
+ };
14
+ export default logger;
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBAIH,MAAM;oBAIT,MAAM;qBAIL,MAAM;qBAIN,MAAM;mBAMR,MAAM;;qBAQJ,MAAM;kBAMT,MAAM,EAAE;oBAMN,MAAM,SAAS,MAAM;mBAItB,MAAM;CActB,CAAA;AAED,eAAe,MAAM,CAAA"}
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ info: (message) => {
4
+ console.log(chalk.blue('ℹ'), message);
5
+ },
6
+ success: (message) => {
7
+ console.log(chalk.green('✔'), message);
8
+ },
9
+ warn: (message) => {
10
+ console.log(chalk.yellow('⚠'), message);
11
+ },
12
+ error: (message) => {
13
+ console.log(chalk.red('✖'), message);
14
+ },
15
+ debug: (message) => {
16
+ if (process.env.DEBUG) {
17
+ console.log(chalk.gray('⚙'), chalk.gray(message));
18
+ }
19
+ },
20
+ log: (message) => {
21
+ console.log(message);
22
+ },
23
+ newline: () => {
24
+ console.log();
25
+ },
26
+ title: (message) => {
27
+ console.log();
28
+ console.log(chalk.bold.cyan(message));
29
+ console.log(chalk.cyan('─'.repeat(message.length)));
30
+ },
31
+ list: (items) => {
32
+ items.forEach((item) => {
33
+ console.log(chalk.gray(' •'), item);
34
+ });
35
+ },
36
+ keyValue: (key, value) => {
37
+ console.log(` ${chalk.gray(key + ':')} ${value}`);
38
+ },
39
+ box: (message) => {
40
+ const lines = message.split('\n');
41
+ const maxLength = Math.max(...lines.map((l) => l.length));
42
+ const border = '─'.repeat(maxLength + 2);
43
+ console.log();
44
+ console.log(chalk.cyan(`┌${border}┐`));
45
+ lines.forEach((line) => {
46
+ const padding = ' '.repeat(maxLength - line.length);
47
+ console.log(chalk.cyan('│'), line + padding, chalk.cyan('│'));
48
+ });
49
+ console.log(chalk.cyan(`└${border}┘`));
50
+ console.log();
51
+ },
52
+ };
53
+ export default logger;
54
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function createNxWorkspace(projectName: string, targetDir: string): Promise<boolean>;
2
+ export declare function generateNextApp(appName: string, projectRoot: string): Promise<boolean>;
3
+ export declare function generateNestApp(appName: string, projectRoot: string): Promise<boolean>;
4
+ export declare function installDependency(packageName: string, projectRoot: string, dev?: boolean): Promise<boolean>;
5
+ export declare function runNxBuild(appName: string, projectRoot: string): Promise<boolean>;
6
+ export declare function copyTemplateFiles(templateDir: string, targetDir: string, overwrite?: boolean): void;
7
+ export declare function getCliTemplatesDir(): string;
8
+ //# sourceMappingURL=nx-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nx-generator.d.ts","sourceRoot":"","sources":["../../src/lib/nx-generator.ts"],"names":[],"mappings":"AAsDA,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBhG;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,UAAQ,GACV,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWvF;AAED,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,UAAO,GACf,IAAI,CAqBN;AAoBD,wBAAgB,kBAAkB,IAAI,MAAM,CAwB3C"}