@intecoag/inteco-cli 1.11.7 → 1.12.0-beta.1

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 (152) hide show
  1. package/README.md +12 -1
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +158 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/modules/adbBridge.d.ts +2 -0
  7. package/dist/modules/adbBridge.d.ts.map +1 -0
  8. package/dist/modules/adbBridge.js +40 -0
  9. package/dist/modules/adbBridge.js.map +1 -0
  10. package/dist/modules/adbIntentSender.d.ts +2 -0
  11. package/dist/modules/adbIntentSender.d.ts.map +1 -0
  12. package/dist/modules/adbIntentSender.js +67 -0
  13. package/dist/modules/adbIntentSender.js.map +1 -0
  14. package/dist/modules/azureSync.d.ts +4 -0
  15. package/dist/modules/azureSync.d.ts.map +1 -0
  16. package/{src → dist}/modules/azureSync.js +50 -131
  17. package/dist/modules/azureSync.js.map +1 -0
  18. package/dist/modules/bundleProduct.d.ts +2 -0
  19. package/dist/modules/bundleProduct.d.ts.map +1 -0
  20. package/{src → dist}/modules/bundleProduct.js +41 -80
  21. package/dist/modules/bundleProduct.js.map +1 -0
  22. package/dist/modules/changelog.d.ts +3 -0
  23. package/dist/modules/changelog.d.ts.map +1 -0
  24. package/dist/modules/changelog.js +45 -0
  25. package/dist/modules/changelog.js.map +1 -0
  26. package/dist/modules/configMutation.d.ts +2 -0
  27. package/dist/modules/configMutation.d.ts.map +1 -0
  28. package/{src → dist}/modules/configMutation.js +54 -101
  29. package/dist/modules/configMutation.js.map +1 -0
  30. package/dist/modules/csvMerger.d.ts +2 -0
  31. package/dist/modules/csvMerger.d.ts.map +1 -0
  32. package/dist/modules/csvMerger.js +104 -0
  33. package/dist/modules/csvMerger.js.map +1 -0
  34. package/dist/modules/deleteDB.d.ts +2 -0
  35. package/dist/modules/deleteDB.d.ts.map +1 -0
  36. package/dist/modules/deleteDB.js +75 -0
  37. package/dist/modules/deleteDB.js.map +1 -0
  38. package/dist/modules/dumpDB.d.ts +3 -0
  39. package/dist/modules/dumpDB.d.ts.map +1 -0
  40. package/{src → dist}/modules/dumpDB.js +64 -89
  41. package/dist/modules/dumpDB.js.map +1 -0
  42. package/dist/modules/dumpTableToCSV.d.ts +2 -0
  43. package/dist/modules/dumpTableToCSV.d.ts.map +1 -0
  44. package/dist/modules/dumpTableToCSV.js +128 -0
  45. package/dist/modules/dumpTableToCSV.js.map +1 -0
  46. package/dist/modules/extdSearch.d.ts +2 -0
  47. package/dist/modules/extdSearch.d.ts.map +1 -0
  48. package/{src → dist}/modules/extdSearch.js +60 -60
  49. package/dist/modules/extdSearch.js.map +1 -0
  50. package/dist/modules/githubDeploymentKey.d.ts +3 -0
  51. package/dist/modules/githubDeploymentKey.d.ts.map +1 -0
  52. package/dist/modules/githubDeploymentKey.js +241 -0
  53. package/dist/modules/githubDeploymentKey.js.map +1 -0
  54. package/dist/modules/githubDeploymentKeysList.d.ts +6 -0
  55. package/dist/modules/githubDeploymentKeysList.d.ts.map +1 -0
  56. package/dist/modules/githubDeploymentKeysList.js +185 -0
  57. package/dist/modules/githubDeploymentKeysList.js.map +1 -0
  58. package/dist/modules/githubSecurityAdvisories.d.ts +3 -0
  59. package/dist/modules/githubSecurityAdvisories.d.ts.map +1 -0
  60. package/dist/modules/githubSecurityAdvisories.js +145 -0
  61. package/dist/modules/githubSecurityAdvisories.js.map +1 -0
  62. package/dist/modules/graphqlSchemaExport.d.ts +2 -0
  63. package/dist/modules/graphqlSchemaExport.d.ts.map +1 -0
  64. package/dist/modules/graphqlSchemaExport.js +59 -0
  65. package/dist/modules/graphqlSchemaExport.js.map +1 -0
  66. package/dist/modules/importDB.d.ts +2 -0
  67. package/dist/modules/importDB.d.ts.map +1 -0
  68. package/{src → dist}/modules/importDB.js +48 -66
  69. package/dist/modules/importDB.js.map +1 -0
  70. package/dist/modules/rewriteConfig.d.ts +3 -0
  71. package/dist/modules/rewriteConfig.d.ts.map +1 -0
  72. package/dist/modules/rewriteConfig.js +75 -0
  73. package/dist/modules/rewriteConfig.js.map +1 -0
  74. package/dist/modules/setCLIConfig.d.ts +2 -0
  75. package/dist/modules/setCLIConfig.d.ts.map +1 -0
  76. package/dist/modules/setCLIConfig.js +29 -0
  77. package/dist/modules/setCLIConfig.js.map +1 -0
  78. package/dist/modules/syncConfig.d.ts +2 -0
  79. package/dist/modules/syncConfig.d.ts.map +1 -0
  80. package/{src → dist}/modules/syncConfig.js +74 -127
  81. package/dist/modules/syncConfig.js.map +1 -0
  82. package/dist/modules/t003Rewrite.d.ts +2 -0
  83. package/dist/modules/t003Rewrite.d.ts.map +1 -0
  84. package/dist/modules/t003Rewrite.js +53 -0
  85. package/dist/modules/t003Rewrite.js.map +1 -0
  86. package/dist/modules/t009Search.d.ts +2 -0
  87. package/dist/modules/t009Search.d.ts.map +1 -0
  88. package/dist/modules/t009Search.js +30 -0
  89. package/dist/modules/t009Search.js.map +1 -0
  90. package/{src → dist}/ressources/cmds.json +3 -0
  91. package/dist/utils/azure/azure.d.ts +24 -0
  92. package/dist/utils/azure/azure.d.ts.map +1 -0
  93. package/{src → dist}/utils/azure/azure.js +14 -21
  94. package/dist/utils/azure/azure.js.map +1 -0
  95. package/dist/utils/config/config.d.ts +27 -0
  96. package/dist/utils/config/config.d.ts.map +1 -0
  97. package/dist/utils/config/config.js +74 -0
  98. package/dist/utils/config/config.js.map +1 -0
  99. package/dist/utils/db/DB.d.ts +14 -0
  100. package/dist/utils/db/DB.d.ts.map +1 -0
  101. package/dist/utils/db/DB.js +61 -0
  102. package/dist/utils/db/DB.js.map +1 -0
  103. package/dist/utils/fs/FS.d.ts +15 -0
  104. package/dist/utils/fs/FS.d.ts.map +1 -0
  105. package/{src → dist}/utils/fs/FS.js +31 -45
  106. package/dist/utils/fs/FS.js.map +1 -0
  107. package/dist/utils/github/github.d.ts +29 -0
  108. package/dist/utils/github/github.d.ts.map +1 -0
  109. package/dist/utils/github/github.js +96 -0
  110. package/dist/utils/github/github.js.map +1 -0
  111. package/dist/utils/shell/DatabaseShell.d.ts +77 -0
  112. package/dist/utils/shell/DatabaseShell.d.ts.map +1 -0
  113. package/{src → dist}/utils/shell/DatabaseShell.js +73 -87
  114. package/dist/utils/shell/DatabaseShell.js.map +1 -0
  115. package/dist/utils/shell/DatabaseShellBuilder.d.ts +67 -0
  116. package/dist/utils/shell/DatabaseShellBuilder.d.ts.map +1 -0
  117. package/{src → dist}/utils/shell/DatabaseShellBuilder.js +50 -59
  118. package/dist/utils/shell/DatabaseShellBuilder.js.map +1 -0
  119. package/dist/utils/shell/Shell.d.ts +30 -0
  120. package/dist/utils/shell/Shell.d.ts.map +1 -0
  121. package/{src → dist}/utils/shell/Shell.js +14 -19
  122. package/dist/utils/shell/Shell.js.map +1 -0
  123. package/dist/utils/shell/ShellBuilder.d.ts +60 -0
  124. package/dist/utils/shell/ShellBuilder.d.ts.map +1 -0
  125. package/{src → dist}/utils/shell/ShellBuilder.js +23 -44
  126. package/dist/utils/shell/ShellBuilder.js.map +1 -0
  127. package/package.json +31 -8
  128. package/.github/dependabot.yml +0 -28
  129. package/.github/workflows/publish.yml +0 -31
  130. package/.husky/commit-msg +0 -1
  131. package/.vscode/settings.json +0 -6
  132. package/commitlint.config.mjs +0 -4
  133. package/src/index.js +0 -130
  134. package/src/modules/adbBridge.js +0 -52
  135. package/src/modules/adbIntentSender.js +0 -82
  136. package/src/modules/changelog.js +0 -60
  137. package/src/modules/csvMerger.js +0 -118
  138. package/src/modules/deleteDB.js +0 -84
  139. package/src/modules/dumpTableToCSV.js +0 -154
  140. package/src/modules/githubDeploymentKey.js +0 -265
  141. package/src/modules/githubDeploymentKeysList.js +0 -199
  142. package/src/modules/githubSecurityAdvisories.js +0 -162
  143. package/src/modules/graphqlSchemaExport.js +0 -61
  144. package/src/modules/rewriteConfig.js +0 -93
  145. package/src/modules/setCLIConfig.js +0 -33
  146. package/src/modules/t003Rewrite.js +0 -64
  147. package/src/modules/t009Search.js +0 -34
  148. package/src/utils/config/config.js +0 -70
  149. package/src/utils/db/DB.js +0 -54
  150. package/src/utils/github/github.js +0 -102
  151. /package/{src → dist}/ressources/wegas_p.ico +0 -0
  152. /package/{src → dist}/utils/config/default.json +0 -0
@@ -1,48 +1,43 @@
1
1
  import { BlobServiceClient } from "@azure/storage-blob";
2
2
  import { DefaultAzureCredential } from "@azure/identity";
3
-
4
3
  export class AzureHelper {
4
+ credential;
5
+ clientCache;
5
6
  constructor(credential = new DefaultAzureCredential()) {
6
7
  this.credential = credential;
7
8
  this.clientCache = new Map();
8
9
  }
9
-
10
10
  getContainerClient(storageAccount, container) {
11
11
  const cacheKey = `${storageAccount}|${container}`;
12
12
  let containerClient = this.clientCache.get(cacheKey);
13
13
  if (containerClient) {
14
14
  return containerClient;
15
15
  }
16
-
17
- const blobServiceClient = new BlobServiceClient(
18
- `https://${storageAccount}.blob.core.windows.net`,
19
- this.credential
20
- );
16
+ const blobServiceClient = new BlobServiceClient(`https://${storageAccount}.blob.core.windows.net`, this.credential);
21
17
  containerClient = blobServiceClient.getContainerClient(container);
22
18
  this.clientCache.set(cacheKey, containerClient);
23
19
  return containerClient;
24
20
  }
25
-
26
21
  async listContainers(storageAccount) {
27
- const blobServiceClient = new BlobServiceClient(
28
- `https://${storageAccount}.blob.core.windows.net`,
29
- this.credential
30
- );
22
+ const blobServiceClient = new BlobServiceClient(`https://${storageAccount}.blob.core.windows.net`, this.credential);
31
23
  const containers = [];
32
24
  for await (const container of blobServiceClient.listContainers()) {
33
25
  containers.push(container.name);
34
26
  }
35
27
  return containers;
36
28
  }
37
-
38
29
  async listBlobs(containerClient) {
39
30
  const blobs = [];
40
31
  for await (const blob of containerClient.listBlobsFlat()) {
41
- blobs.push(blob);
32
+ blobs.push({
33
+ name: blob.name,
34
+ properties: {
35
+ contentMD5: blob.properties.contentMD5
36
+ }
37
+ });
42
38
  }
43
39
  return blobs;
44
40
  }
45
-
46
41
  async getBlobMd5Base64(containerClient, blobPath) {
47
42
  try {
48
43
  const properties = await containerClient.getBlobClient(blobPath).getProperties();
@@ -51,27 +46,25 @@ export class AzureHelper {
51
46
  return null;
52
47
  }
53
48
  return Buffer.isBuffer(contentMd5) ? contentMd5.toString("base64") : null;
54
- } catch (error) {
49
+ }
50
+ catch {
55
51
  return null;
56
52
  }
57
53
  }
58
-
59
54
  async uploadFile(containerClient, blobPath, filePath, md5Base64, onProgress) {
60
55
  const blockBlobClient = containerClient.getBlockBlobClient(blobPath);
61
56
  const md5Buffer = md5Base64 ? Buffer.from(md5Base64, "base64") : undefined;
62
-
63
- await blockBlobClient.uploadFile(filePath, {
57
+ return await blockBlobClient.uploadFile(filePath, {
64
58
  blobHTTPHeaders: md5Buffer ? { blobContentMD5: md5Buffer } : undefined,
65
59
  onProgress
66
60
  });
67
61
  }
68
-
69
62
  async downloadToFile(containerClient, blobPath, filePath, onProgress) {
70
63
  const blockBlobClient = containerClient.getBlockBlobClient(blobPath);
71
64
  await blockBlobClient.downloadToFile(filePath, 0, 0, { onProgress });
72
65
  }
73
-
74
66
  async deleteBlob(containerClient, blobPath) {
75
67
  await containerClient.deleteBlob(blobPath);
76
68
  }
77
69
  }
70
+ //# sourceMappingURL=azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../src/utils/azure/azure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface CLIConfig {
2
+ configIndividualPath: string;
3
+ configIndividualPathWrite: string;
4
+ configIndividualPathEclipse: string;
5
+ dbURL: string;
6
+ dbUser: string;
7
+ dbPassword: string;
8
+ wegasUsername: string;
9
+ [key: string]: unknown;
10
+ }
11
+ type ConfigStore = {
12
+ read: () => Promise<Record<string, unknown>>;
13
+ write: (data: Record<string, unknown>) => Promise<void> | void;
14
+ filePath: string;
15
+ };
16
+ export declare class Config {
17
+ static config: ConfigStore;
18
+ static configData: CLIConfig | null;
19
+ private static normalizeConfig;
20
+ static initConfig(): Promise<void>;
21
+ static getConfig(): Promise<CLIConfig>;
22
+ static getConfigPath(): Promise<string>;
23
+ static setConfigField(field: string, value: unknown): Promise<void>;
24
+ static setConfig(data: CLIConfig): Promise<void>;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,yBAAyB,EAAE,MAAM,CAAC;IAClC,2BAA2B,EAAE,MAAM,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,KAAK,WAAW,GAAG;IACf,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/D,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,qBAAa,MAAM;IACf,MAAM,CAAC,MAAM,EAAE,WAAW,CAAoC;IAC9D,MAAM,CAAC,UAAU,EAAE,SAAS,GAAG,IAAI,CAAQ;IAE3C,OAAO,CAAC,MAAM,CAAC,eAAe;WAYjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;WAsC3B,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;WAU/B,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;WAKhC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;WAW5D,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzD"}
@@ -0,0 +1,74 @@
1
+ import cfg from "application-config";
2
+ import defaultCFG from './default.json' with { type: 'json' };
3
+ const defaultConfig = defaultCFG;
4
+ export class Config {
5
+ static config = cfg("inteco_cli");
6
+ static configData = null;
7
+ static normalizeConfig(data) {
8
+ const normalized = { ...defaultConfig };
9
+ for (const key of Object.keys(defaultConfig)) {
10
+ if (Object.hasOwn(data, key)) {
11
+ normalized[key] = data[key];
12
+ }
13
+ }
14
+ return normalized;
15
+ }
16
+ static async initConfig() {
17
+ if (this.configData == null) {
18
+ const rawData = await this.config.read();
19
+ this.configData = this.normalizeConfig(rawData);
20
+ }
21
+ if (!this.configData || Object.keys(this.configData).length === 0) {
22
+ // Default Configuration
23
+ this.configData = { ...defaultConfig };
24
+ this.config.write(this.configData);
25
+ }
26
+ else {
27
+ const data = this.normalizeConfig(this.configData);
28
+ let hasChange = false;
29
+ Object.keys(defaultConfig).forEach((key) => {
30
+ // Write new config-entries if not present
31
+ if (!Object.keys(this.configData).includes(key)) {
32
+ data[key] = defaultConfig[key];
33
+ hasChange = true;
34
+ }
35
+ });
36
+ Object.keys(this.configData).forEach((key) => {
37
+ if (!Object.keys(defaultConfig).includes(key)) {
38
+ delete data[key];
39
+ hasChange = true;
40
+ }
41
+ });
42
+ if (hasChange) {
43
+ this.configData = data;
44
+ this.config.write(data);
45
+ }
46
+ else {
47
+ this.configData = data;
48
+ }
49
+ }
50
+ }
51
+ static async getConfig() {
52
+ await this.initConfig();
53
+ if (!this.configData) {
54
+ this.configData = { ...defaultConfig };
55
+ }
56
+ return this.configData;
57
+ }
58
+ static async getConfigPath() {
59
+ await this.initConfig();
60
+ return this.config.filePath;
61
+ }
62
+ static async setConfigField(field, value) {
63
+ await this.initConfig();
64
+ const data = { ...(this.configData ?? defaultConfig) };
65
+ data[field] = value;
66
+ this.configData = data;
67
+ this.config.write(data);
68
+ }
69
+ static async setConfig(data) {
70
+ this.configData = data;
71
+ this.config.write(data);
72
+ }
73
+ }
74
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/utils/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Connection } from "mysql2/promise";
2
+ export declare class DB {
3
+ static connection: Connection | null;
4
+ static connect(db: string | null): Promise<void>;
5
+ private static getConnection;
6
+ private static closeConnection;
7
+ private static runQuery;
8
+ static executeQuery(query: string): Promise<unknown[]>;
9
+ static executeQueryOnDB(query: string, db: string): Promise<unknown[]>;
10
+ static getDatabaseNames(): Promise<Array<{
11
+ name: string;
12
+ }>>;
13
+ }
14
+ //# sourceMappingURL=DB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DB.d.ts","sourceRoot":"","sources":["../../../src/utils/db/DB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,UAAU,EAAsB,MAAM,gBAAgB,CAAC;AAIvF,qBAAa,EAAE;IACX,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAQ;WAE/B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,OAAO,CAAC,MAAM,CAAC,aAAa;mBAQP,eAAe;mBAOf,QAAQ;WAYhB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;WAI/C,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;WAI/D,gBAAgB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAqBpE"}
@@ -0,0 +1,61 @@
1
+ import { createConnection } from "mysql2/promise";
2
+ import { Config } from "../config/config.js";
3
+ export class DB {
4
+ static connection = null;
5
+ static async connect(db) {
6
+ const config = await Config.getConfig();
7
+ this.connection = await createConnection({
8
+ host: config.dbURL,
9
+ user: config.dbUser,
10
+ password: config.dbPassword,
11
+ database: db != null ? db : ""
12
+ });
13
+ }
14
+ static getConnection() {
15
+ if (!this.connection) {
16
+ throw new Error("Database connection is not initialized");
17
+ }
18
+ return this.connection;
19
+ }
20
+ static async closeConnection() {
21
+ if (this.connection) {
22
+ await this.connection.end();
23
+ this.connection = null;
24
+ }
25
+ }
26
+ static async runQuery(query, db) {
27
+ await this.connect(db);
28
+ try {
29
+ const [results] = await this.getConnection().query(query);
30
+ return Array.isArray(results) ? results : [];
31
+ }
32
+ finally {
33
+ await this.closeConnection();
34
+ }
35
+ }
36
+ static async executeQuery(query) {
37
+ return await this.runQuery(query, null);
38
+ }
39
+ static async executeQueryOnDB(query, db) {
40
+ return await this.runQuery(query, db);
41
+ }
42
+ static async getDatabaseNames() {
43
+ await this.connect(null);
44
+ let results = [];
45
+ try {
46
+ const [rows] = await this.getConnection().query("SHOW DATABASES");
47
+ results = rows;
48
+ }
49
+ finally {
50
+ await this.closeConnection();
51
+ }
52
+ const filtered = results.filter((val) => {
53
+ if (val.Database === "sys" || val.Database === "information_schema" || val.Database === "mysql" || val.Database === "performance_schema") {
54
+ return false;
55
+ }
56
+ return true;
57
+ });
58
+ return filtered.map((result) => ({ name: result.Database }));
59
+ }
60
+ }
61
+ //# sourceMappingURL=DB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DB.js","sourceRoot":"","sources":["../../../src/utils/db/DB.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuC,MAAM,gBAAgB,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,MAAM,OAAO,EAAE;IACX,MAAM,CAAC,UAAU,GAAsB,IAAI,CAAC;IAE5C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAiB;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAExC,IAAI,CAAC,UAAU,GAAG,MAAM,gBAAgB,CAAC;YACrC,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,QAAQ,EAAE,MAAM,CAAC,UAAU;YAC3B,QAAQ,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;SACjC,CAAC,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,aAAa;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,eAAe;QAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAC3B,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,EAAiB;QAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEvB,IAAI,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAE1D,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,CAAC;gBAAS,CAAC;YACP,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,KAAa;QACnC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAa,EAAE,EAAU;QACnD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,gBAAgB;QACzB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzB,IAAI,OAAO,GAAgC,EAAE,CAAC;QAE9C,IAAI,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAClE,OAAO,GAAG,IAAmC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACP,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACpC,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,oBAAoB,EAAE,CAAC;gBACvI,OAAO,KAAK,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC"}
@@ -0,0 +1,15 @@
1
+ type CopyUpdatedStats = {
2
+ added: number;
3
+ updated: number;
4
+ };
5
+ type CopyAllStats = {
6
+ copied: number;
7
+ };
8
+ export declare class FS {
9
+ static copyUpdatedFiles(sourceDir: string, destDir: string, dryRun?: boolean, stats?: CopyUpdatedStats, filenameBlacklist?: string[], onlyCopyNonExistant?: boolean): void;
10
+ static copyAllFiles(sourceDir: string, destDir: string, dryRun?: boolean, stats?: CopyAllStats, filenameBlacklist?: string[]): void;
11
+ static filePicker(startDir?: string, navRootDir?: string): Promise<string[]>;
12
+ static getAllFiles(dir: string): string[];
13
+ }
14
+ export {};
15
+ //# sourceMappingURL=FS.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FS.d.ts","sourceRoot":"","sources":["../../../src/utils/fs/FS.ts"],"names":[],"mappings":"AAKA,KAAK,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC3D,KAAK,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAGvC,qBAAa,EAAE;IACX,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ,EAAE,KAAK,GAAE,gBAA2C,EAAE,iBAAiB,GAAE,MAAM,EAAO,EAAE,mBAAmB,UAAQ,GAAG,IAAI;IAgDpM,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAQ,EAAE,KAAK,GAAE,YAA4B,EAAE,iBAAiB,GAAE,MAAM,EAAO,GAAG,IAAI;WAiCvI,UAAU,CAAC,QAAQ,SAAgB,EAAE,UAAU,SAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyChG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;CAiB5C"}
@@ -1,48 +1,44 @@
1
1
  import { statSync, mkdirSync, existsSync, copyFileSync, readdirSync } from "fs";
2
2
  import chalk from "chalk";
3
- import path, { relative } from "path";
3
+ import path from "path";
4
4
  import prompts from "prompts";
5
-
6
5
  export class FS {
7
6
  static copyUpdatedFiles(sourceDir, destDir, dryRun = false, stats = { added: 0, updated: 0 }, filenameBlacklist = [], onlyCopyNonExistant = false) {
8
7
  if (!existsSync(destDir)) {
9
8
  if (dryRun) {
10
9
  console.log(chalk.gray(`[DryRun] Would create directory: ${destDir}`));
11
- } else {
10
+ }
11
+ else {
12
12
  mkdirSync(destDir, { recursive: true });
13
13
  }
14
14
  }
15
-
16
15
  const entries = readdirSync(sourceDir, { withFileTypes: true });
17
-
18
16
  for (const entry of entries) {
19
- if(filenameBlacklist.includes(entry.name)) {
17
+ if (filenameBlacklist.includes(entry.name)) {
20
18
  continue;
21
19
  }
22
-
23
20
  const sourcePath = path.join(sourceDir, entry.name);
24
21
  const destPath = path.join(destDir, entry.name);
25
-
26
22
  if (entry.isDirectory()) {
27
23
  FS.copyUpdatedFiles(sourcePath, destPath, dryRun, stats, filenameBlacklist);
28
- } else {
24
+ }
25
+ else {
29
26
  let shouldCopy = false;
30
-
31
27
  if (!existsSync(destPath)) {
32
28
  shouldCopy = true;
33
- } else if(!onlyCopyNonExistant) {
29
+ }
30
+ else if (!onlyCopyNonExistant) {
34
31
  const sourceStat = statSync(sourcePath);
35
32
  const destStat = statSync(destPath);
36
-
37
33
  if (sourceStat.mtime > destStat.mtime) {
38
34
  shouldCopy = true;
39
35
  }
40
36
  }
41
-
42
37
  if (shouldCopy) {
43
38
  if (dryRun) {
44
39
  console.log(chalk.blue(`[DryRun] Would update file: ${destPath}`));
45
- } else {
40
+ }
41
+ else {
46
42
  copyFileSync(sourcePath, destPath);
47
43
  }
48
44
  stats.updated++;
@@ -50,47 +46,40 @@ export class FS {
50
46
  }
51
47
  }
52
48
  }
53
-
54
-
55
49
  static copyAllFiles(sourceDir, destDir, dryRun = false, stats = { copied: 0 }, filenameBlacklist = []) {
56
50
  if (!existsSync(destDir)) {
57
51
  if (dryRun) {
58
52
  console.log(chalk.gray(`[DryRun] Would create directory: ${destDir}`));
59
- } else {
53
+ }
54
+ else {
60
55
  mkdirSync(destDir, { recursive: true });
61
56
  }
62
57
  }
63
-
64
58
  const entries = readdirSync(sourceDir, { withFileTypes: true });
65
-
66
59
  for (const entry of entries) {
67
- if(filenameBlacklist.includes(entry.name)) {
60
+ if (filenameBlacklist.includes(entry.name)) {
68
61
  continue;
69
62
  }
70
-
71
63
  const sourcePath = path.join(sourceDir, entry.name);
72
64
  const destPath = path.join(destDir, entry.name);
73
-
74
65
  if (entry.isDirectory()) {
75
66
  FS.copyAllFiles(sourcePath, destPath, dryRun, stats, filenameBlacklist);
76
- } else {
67
+ }
68
+ else {
77
69
  if (dryRun) {
78
70
  console.log(chalk.magenta(`[DryRun] Would copy file: ${destPath}`));
79
- } else {
71
+ }
72
+ else {
80
73
  copyFileSync(sourcePath, destPath);
81
74
  }
82
75
  stats.copied++;
83
76
  }
84
77
  }
85
78
  }
86
-
87
-
88
79
  static async filePicker(startDir = process.cwd(), navRootDir = process.cwd()) {
89
80
  let current = startDir;
90
-
91
- while(true) {
81
+ while (true) {
92
82
  const entries = readdirSync(current, { withFileTypes: true });
93
-
94
83
  const choices = [
95
84
  { title: '[Dir] . (Select Current Directory)', value: '.', isDirectory: true },
96
85
  ...entries.map(e => ({
@@ -98,24 +87,24 @@ export class FS {
98
87
  value: e.name,
99
88
  isDirectory: e.isDirectory()
100
89
  })).sort((a, b) => a.isDirectory && !b.isDirectory ? -1 : (!a.isDirectory && b.isDirectory ? 1 : a.value.localeCompare(b.value)))
101
- ]
102
-
103
- if(path.relative(navRootDir, current) !== "") {
90
+ ];
91
+ if (path.relative(navRootDir, current) !== "") {
104
92
  choices.unshift({ title: '[Dir] .. (Go Up one Directory)', value: '..', isDirectory: true });
105
93
  }
106
-
107
94
  const { file } = await prompts({
108
95
  type: 'autocomplete',
109
96
  name: "file",
110
97
  message: `Pick Files: ${current}`,
111
98
  choices
112
99
  });
113
-
114
- const picked = choices.find(c => c.value === file);
115
-
116
- if(picked.isDirectory) {
100
+ const picked = choices.find((c) => c.value === file);
101
+ if (!picked) {
102
+ continue;
103
+ }
104
+ if (picked.isDirectory) {
117
105
  const dir = picked.value;
118
- if(dir === ".") return FS.getAllFiles(current).map(e => path.relative(navRootDir, e));
106
+ if (dir === ".")
107
+ return FS.getAllFiles(current).map((e) => path.relative(navRootDir, e));
119
108
  current = dir === ".." ? path.dirname(current) : path.join(current, dir);
120
109
  }
121
110
  else {
@@ -123,22 +112,19 @@ export class FS {
123
112
  }
124
113
  }
125
114
  }
126
-
127
115
  static getAllFiles(dir) {
128
116
  const entries = readdirSync(dir, { withFileTypes: true });
129
117
  const files = [];
130
-
131
- for(const entry of entries) {
118
+ for (const entry of entries) {
132
119
  const fullPath = path.join(dir, entry.name);
133
-
134
- if(entry.isDirectory()) {
120
+ if (entry.isDirectory()) {
135
121
  files.push(...FS.getAllFiles(fullPath));
136
122
  }
137
123
  else {
138
124
  files.push(fullPath);
139
125
  }
140
126
  }
141
-
142
127
  return files;
143
128
  }
144
- }
129
+ }
130
+ //# sourceMappingURL=FS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FS.js","sourceRoot":"","sources":["../../../src/utils/fs/FS.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ type GithubTokenResult = {
2
+ token: string;
3
+ authMethod: string;
4
+ };
5
+ /**
6
+ * Get GitHub authentication token from environment or GitHub CLI
7
+ * @returns {Promise<{token: string, authMethod: string}>} Token and authentication method
8
+ * @throws {Error} If no authentication method is available
9
+ */
10
+ export declare function getGithubToken(): Promise<GithubTokenResult>;
11
+ /**
12
+ * Make a GitHub API fetch request with proper headers and error handling
13
+ * @param {string} url - GitHub API endpoint URL
14
+ * @param {string} token - GitHub authentication token
15
+ * @returns {Promise<Response>} Fetch response
16
+ * @throws {Error} If fetch fails or returns error status
17
+ */
18
+ export declare function fetchGithubAPI(url: string, token: string): Promise<Response>;
19
+ /**
20
+ * Fetch all items from a paginated GitHub API endpoint
21
+ * @param {string} baseUrl - Base GitHub API endpoint URL (without pagination params)
22
+ * @param {string} token - GitHub authentication token
23
+ * @param {number} page - Current page (default: 1)
24
+ * @param {Array} allItems - Accumulated items (default: [])
25
+ * @returns {Promise<Array>} All items from all pages
26
+ */
27
+ export declare function fetchPaginatedGithubAPI<T = unknown>(baseUrl: string, token: string, page?: number, allItems?: T[]): Promise<T[]>;
28
+ export {};
29
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/utils/github/github.ts"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiCjE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwBlF;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,QAAQ,GAAE,CAAC,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAqBrI"}
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import { execSync } from 'child_process';
3
+ /**
4
+ * Get GitHub authentication token from environment or GitHub CLI
5
+ * @returns {Promise<{token: string, authMethod: string}>} Token and authentication method
6
+ * @throws {Error} If no authentication method is available
7
+ */
8
+ export async function getGithubToken() {
9
+ let token = null;
10
+ let authMethod = null;
11
+ // 1. Try GITHUB_TOKEN environment variable
12
+ if (process.env.GITHUB_TOKEN) {
13
+ token = process.env.GITHUB_TOKEN;
14
+ authMethod = 'GITHUB_TOKEN (environment variable)';
15
+ }
16
+ // 2. Try GitHub CLI authentication if available
17
+ if (!token) {
18
+ try {
19
+ token = execSync('gh auth token', { encoding: 'utf-8' }).trim();
20
+ authMethod = 'GitHub CLI';
21
+ }
22
+ catch {
23
+ // GitHub CLI not available or not authenticated
24
+ }
25
+ }
26
+ // 3. If no token found, prompt user to authenticate
27
+ if (!token) {
28
+ console.log(chalk.yellow('No GitHub authentication found. Please authenticate with GitHub CLI:'));
29
+ console.log(chalk.gray(' Run: gh auth login'));
30
+ console.log();
31
+ throw new Error('GitHub authentication required. Please run "gh auth login" or set GITHUB_TOKEN environment variable.');
32
+ }
33
+ if (!authMethod) {
34
+ authMethod = 'unknown';
35
+ }
36
+ return { token, authMethod };
37
+ }
38
+ /**
39
+ * Make a GitHub API fetch request with proper headers and error handling
40
+ * @param {string} url - GitHub API endpoint URL
41
+ * @param {string} token - GitHub authentication token
42
+ * @returns {Promise<Response>} Fetch response
43
+ * @throws {Error} If fetch fails or returns error status
44
+ */
45
+ export async function fetchGithubAPI(url, token) {
46
+ const res = await fetch(url, {
47
+ headers: {
48
+ 'Authorization': `Bearer ${token}`,
49
+ 'Accept': 'application/vnd.github+json',
50
+ 'X-GitHub-Api-Version': '2022-11-28',
51
+ 'User-Agent': 'inteco-cli'
52
+ }
53
+ });
54
+ if (!res.ok) {
55
+ if (res.status === 404) {
56
+ throw new Error(`404: Resource not found`);
57
+ }
58
+ if (res.status === 401) {
59
+ throw new Error('401: GitHub authentication failed');
60
+ }
61
+ if (res.status === 403) {
62
+ throw new Error('403: Access forbidden (Dependabot alerts may not be enabled)');
63
+ }
64
+ throw new Error(`${res.status}: GitHub API request failed: ${res.statusText}`);
65
+ }
66
+ return res;
67
+ }
68
+ /**
69
+ * Fetch all items from a paginated GitHub API endpoint
70
+ * @param {string} baseUrl - Base GitHub API endpoint URL (without pagination params)
71
+ * @param {string} token - GitHub authentication token
72
+ * @param {number} page - Current page (default: 1)
73
+ * @param {Array} allItems - Accumulated items (default: [])
74
+ * @returns {Promise<Array>} All items from all pages
75
+ */
76
+ export async function fetchPaginatedGithubAPI(baseUrl, token, page = 1, allItems = []) {
77
+ const url = `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}page=${page}&per_page=100`;
78
+ try {
79
+ const res = await fetchGithubAPI(url, token);
80
+ const items = await res.json();
81
+ if (items.length === 0) {
82
+ return allItems;
83
+ }
84
+ // Recursively fetch all pages
85
+ return fetchPaginatedGithubAPI(baseUrl, token, page + 1, [...allItems, ...items]);
86
+ }
87
+ catch (error) {
88
+ if (page === 1) {
89
+ // Only throw on first page - error getting initial data
90
+ throw error;
91
+ }
92
+ // On subsequent pages, return what we have so far
93
+ return allItems;
94
+ }
95
+ }
96
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/utils/github/github.ts"],"names":[],"mappings":"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"}