@taggr/cli 1.0.3 → 1.0.5
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.
- package/README.md +100 -2
- package/dist/commands/check.d.ts +7 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +162 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +9 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +63 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +6 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +17 -4
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +32 -7
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +66 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +6 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +138 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +20 -4
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +38 -5
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/api.d.ts +5 -0
- package/dist/utils/api.d.ts.map +1 -1
- package/dist/utils/api.js +82 -6
- package/dist/utils/api.js.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +15 -5
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/generator.d.ts +3 -3
- package/dist/utils/generator.d.ts.map +1 -1
- package/dist/utils/generator.js +103 -18
- package/dist/utils/generator.js.map +1 -1
- package/dist/utils/metadata.d.ts +25 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +157 -0
- package/dist/utils/metadata.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getMetadata } from '../utils/metadata.js';
|
|
3
|
+
import { getOutputDir } from '../utils/generator.js';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
export async function statusCommand() {
|
|
7
|
+
try {
|
|
8
|
+
const metadata = await getMetadata();
|
|
9
|
+
if (!metadata) {
|
|
10
|
+
console.log(chalk.yellow('No sync metadata found'));
|
|
11
|
+
console.log();
|
|
12
|
+
console.log(chalk.dim('Run "taggr pull --all" to sync labels.'));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
console.log();
|
|
16
|
+
console.log(chalk.bold('Taggr Sync Status'));
|
|
17
|
+
console.log();
|
|
18
|
+
// Show sync info
|
|
19
|
+
const syncedDate = new Date(metadata.syncedAt);
|
|
20
|
+
console.log(chalk.dim(' Last synced: ') + chalk.white(syncedDate.toLocaleString()));
|
|
21
|
+
console.log(chalk.dim(' API URL: ') + chalk.white(metadata.apiUrl));
|
|
22
|
+
console.log();
|
|
23
|
+
// Count labels
|
|
24
|
+
const labelCount = Object.keys(metadata.labels).length;
|
|
25
|
+
console.log(chalk.dim(` Labels: ${chalk.white(labelCount.toString())}`));
|
|
26
|
+
console.log();
|
|
27
|
+
// Show label versions
|
|
28
|
+
if (labelCount > 0) {
|
|
29
|
+
console.log(chalk.bold('Label Versions:'));
|
|
30
|
+
console.log();
|
|
31
|
+
const labels = Object.entries(metadata.labels)
|
|
32
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
33
|
+
.slice(0, 10); // Show first 10
|
|
34
|
+
for (const [name, meta] of labels) {
|
|
35
|
+
const syncedDate = new Date(meta.syncedAt);
|
|
36
|
+
console.log(` ${chalk.white(name.padEnd(30))} ` +
|
|
37
|
+
`${chalk.dim('v' + meta.version)} ` +
|
|
38
|
+
`${chalk.dim('(' + syncedDate.toLocaleDateString() + ')')}`);
|
|
39
|
+
}
|
|
40
|
+
if (labelCount > 10) {
|
|
41
|
+
console.log();
|
|
42
|
+
console.log(chalk.dim(` ... and ${labelCount - 10} more`));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Check if files exist
|
|
46
|
+
console.log();
|
|
47
|
+
const outputDir = getOutputDir();
|
|
48
|
+
const labelsJsonPath = path.join(outputDir, 'labels.json');
|
|
49
|
+
const labelsDtsPath = path.join(outputDir, 'labels.d.ts');
|
|
50
|
+
const metadataPath = path.join(outputDir, '.taggr.json');
|
|
51
|
+
console.log(chalk.bold('Files:'));
|
|
52
|
+
console.log();
|
|
53
|
+
console.log(` ${await fs.pathExists(labelsJsonPath) ? chalk.green('✓') : chalk.red('✗')} ` +
|
|
54
|
+
chalk.white('labels.json'));
|
|
55
|
+
console.log(` ${await fs.pathExists(labelsDtsPath) ? chalk.green('✓') : chalk.red('✗')} ` +
|
|
56
|
+
chalk.white('labels.d.ts'));
|
|
57
|
+
console.log(` ${await fs.pathExists(metadataPath) ? chalk.green('✓') : chalk.red('✗')} ` +
|
|
58
|
+
chalk.white('.taggr.json'));
|
|
59
|
+
console.log();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkJvE"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { requireAuth } from '../utils/config.js';
|
|
4
|
+
import { initApi, getLabels } from '../utils/api.js';
|
|
5
|
+
import { getMetadata } from '../utils/metadata.js';
|
|
6
|
+
import { writeAllLabels } from '../utils/generator.js';
|
|
7
|
+
export async function watchCommand(options) {
|
|
8
|
+
const interval = options.interval || 30; // Default 30 seconds
|
|
9
|
+
const spinner = ora('Starting watch mode...').start();
|
|
10
|
+
try {
|
|
11
|
+
// Check if metadata exists
|
|
12
|
+
const metadata = await getMetadata();
|
|
13
|
+
if (!metadata) {
|
|
14
|
+
spinner.fail(chalk.red('No sync metadata found'));
|
|
15
|
+
console.log();
|
|
16
|
+
console.log(chalk.dim('Run "taggr pull --all" first to sync labels.'));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// Initialize API
|
|
20
|
+
const config = await requireAuth();
|
|
21
|
+
initApi(config);
|
|
22
|
+
spinner.succeed(chalk.green('Watch mode started'));
|
|
23
|
+
console.log();
|
|
24
|
+
console.log(chalk.dim(`Watching for label changes (checking every ${interval} seconds)...`));
|
|
25
|
+
console.log(chalk.dim('Press Ctrl+C to stop'));
|
|
26
|
+
console.log();
|
|
27
|
+
let lastChecksum = metadata.overallChecksum;
|
|
28
|
+
let iteration = 0;
|
|
29
|
+
// Watch loop
|
|
30
|
+
const watchInterval = setInterval(async () => {
|
|
31
|
+
iteration++;
|
|
32
|
+
const checkSpinner = ora(`Checking for changes... (${iteration})`).start();
|
|
33
|
+
try {
|
|
34
|
+
// Get current labels from API
|
|
35
|
+
const labelsResponse = await getLabels();
|
|
36
|
+
if (!labelsResponse || !labelsResponse.labels) {
|
|
37
|
+
checkSpinner.fail(chalk.red('Failed to fetch labels'));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const { labels } = labelsResponse;
|
|
41
|
+
// Calculate current checksum
|
|
42
|
+
const currentMetadata = await getMetadata();
|
|
43
|
+
if (!currentMetadata) {
|
|
44
|
+
checkSpinner.stop();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Compare versions
|
|
48
|
+
const outdated = [];
|
|
49
|
+
const newLabels = [];
|
|
50
|
+
for (const label of labels) {
|
|
51
|
+
const localMeta = currentMetadata.labels[label.name];
|
|
52
|
+
if (!localMeta) {
|
|
53
|
+
newLabels.push(label.name);
|
|
54
|
+
}
|
|
55
|
+
else if (localMeta.version !== label.version) {
|
|
56
|
+
outdated.push({
|
|
57
|
+
name: label.name,
|
|
58
|
+
oldVersion: localMeta.version,
|
|
59
|
+
newVersion: label.version,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Check for deleted labels
|
|
64
|
+
const deleted = [];
|
|
65
|
+
for (const labelName of Object.keys(currentMetadata.labels)) {
|
|
66
|
+
if (!labels.find(l => l.name === labelName)) {
|
|
67
|
+
deleted.push(labelName);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// If there are changes, pull and notify
|
|
71
|
+
if (outdated.length > 0 || newLabels.length > 0 || deleted.length > 0) {
|
|
72
|
+
checkSpinner.stop();
|
|
73
|
+
console.log();
|
|
74
|
+
console.log(chalk.yellow('⚠ Label changes detected!'));
|
|
75
|
+
if (outdated.length > 0) {
|
|
76
|
+
console.log();
|
|
77
|
+
console.log(chalk.yellow(` ${outdated.length} label(s) updated:`));
|
|
78
|
+
for (const change of outdated) {
|
|
79
|
+
console.log(` ${chalk.white(change.name)}: ` +
|
|
80
|
+
`${chalk.red(change.oldVersion)} → ${chalk.green(change.newVersion)}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (newLabels.length > 0) {
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(chalk.green(` ${newLabels.length} new label(s):`));
|
|
86
|
+
for (const labelName of newLabels) {
|
|
87
|
+
console.log(` ${chalk.white(labelName)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (deleted.length > 0) {
|
|
91
|
+
console.log();
|
|
92
|
+
console.log(chalk.red(` ${deleted.length} label(s) deleted:`));
|
|
93
|
+
for (const labelName of deleted) {
|
|
94
|
+
console.log(` ${chalk.white(labelName)}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Pull updated labels
|
|
98
|
+
console.log();
|
|
99
|
+
const pullSpinner = ora('Pulling updated labels...').start();
|
|
100
|
+
try {
|
|
101
|
+
await writeAllLabels(labels, config.apiUrl);
|
|
102
|
+
pullSpinner.succeed(chalk.green('Labels updated successfully!'));
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
pullSpinner.fail(chalk.red('Failed to update labels'));
|
|
107
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
checkSpinner.succeed(chalk.dim('No changes detected'));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
checkSpinner.fail(chalk.red('Check failed'));
|
|
116
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
117
|
+
}
|
|
118
|
+
}, interval * 1000);
|
|
119
|
+
// Handle graceful shutdown
|
|
120
|
+
process.on('SIGINT', () => {
|
|
121
|
+
clearInterval(watchInterval);
|
|
122
|
+
console.log();
|
|
123
|
+
console.log(chalk.dim('Watch mode stopped'));
|
|
124
|
+
process.exit(0);
|
|
125
|
+
});
|
|
126
|
+
// Keep process alive
|
|
127
|
+
process.on('SIGTERM', () => {
|
|
128
|
+
clearInterval(watchInterval);
|
|
129
|
+
process.exit(0);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
spinner.fail(chalk.red('Failed to start watch mode'));
|
|
134
|
+
console.error(chalk.red(`\nError: ${error.message}`));
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgDnD"}
|
package/dist/commands/whoami.js
CHANGED
|
@@ -12,15 +12,31 @@ export async function whoamiCommand() {
|
|
|
12
12
|
throw new Error('Invalid response from server: user data not found');
|
|
13
13
|
}
|
|
14
14
|
const { user } = whoamiResponse;
|
|
15
|
+
// Validate user object has required properties
|
|
16
|
+
if (!user.uid || !user.email) {
|
|
17
|
+
throw new Error('Invalid user data: missing required fields (uid, email)');
|
|
18
|
+
}
|
|
15
19
|
spinner.stop();
|
|
16
20
|
console.log();
|
|
17
21
|
console.log(chalk.bold('Logged in as:'));
|
|
18
22
|
console.log();
|
|
19
23
|
console.log(chalk.dim(' Name: ') + chalk.white(user.displayName || 'Not set'));
|
|
20
|
-
console.log(chalk.dim(' Email: ') + chalk.white(user.email));
|
|
21
|
-
console.log(chalk.dim(' UID: ') + chalk.white(user.uid));
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
console.log(chalk.dim(' Email: ') + chalk.white(user.email || 'Not set'));
|
|
25
|
+
console.log(chalk.dim(' UID: ') + chalk.white(user.uid || 'Not set'));
|
|
26
|
+
// Safely access stats
|
|
27
|
+
const totalLabels = user.stats?.totalLabels ?? 0;
|
|
28
|
+
console.log(chalk.dim(' Labels: ') + chalk.white(totalLabels.toString()));
|
|
29
|
+
// Safely format date
|
|
30
|
+
let joinedDate = 'Unknown';
|
|
31
|
+
if (user.createdAt) {
|
|
32
|
+
try {
|
|
33
|
+
joinedDate = new Date(user.createdAt).toLocaleDateString();
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
joinedDate = 'Invalid date';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
console.log(chalk.dim(' Joined: ') + chalk.white(joinedDate));
|
|
24
40
|
console.log();
|
|
25
41
|
}
|
|
26
42
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,cAAc,GAAG,MAAM,MAAM,EAAE,CAAC;QAEtC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;QAEhC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,cAAc,GAAG,MAAM,MAAM,EAAE,CAAC;QAEtC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC;QAEhC,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;QAE1E,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE3E,qBAAqB;QACrB,IAAI,UAAU,GAAG,SAAS,CAAC;QAC3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC;gBACP,UAAU,GAAG,cAAc,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,9 @@ import { logoutCommand } from './commands/logout.js';
|
|
|
9
9
|
import { whoamiCommand } from './commands/whoami.js';
|
|
10
10
|
import { listCommand } from './commands/list.js';
|
|
11
11
|
import { pullCommand } from './commands/pull.js';
|
|
12
|
+
import { checkCommand } from './commands/check.js';
|
|
13
|
+
import { watchCommand } from './commands/watch.js';
|
|
14
|
+
import { statusCommand } from './commands/status.js';
|
|
12
15
|
// Read version from package.json
|
|
13
16
|
// When installed globally: node_modules/@taggr/cli/dist/index.js -> ../package.json
|
|
14
17
|
// When in development: packages/cli/dist/index.js -> ../package.json
|
|
@@ -33,7 +36,7 @@ program
|
|
|
33
36
|
program
|
|
34
37
|
.command('login <api-key>')
|
|
35
38
|
.description('Authenticate with your Taggr API key')
|
|
36
|
-
.option('-u, --url <url>', 'API URL (default: https://taggr
|
|
39
|
+
.option('-u, --url <url>', 'API URL (default: https://taggr.onrender.com/api)')
|
|
37
40
|
.action(loginCommand);
|
|
38
41
|
// Logout command
|
|
39
42
|
program
|
|
@@ -57,19 +60,49 @@ program
|
|
|
57
60
|
.description('Pull label(s) and generate local files')
|
|
58
61
|
.option('-a, --all', 'Pull all labels')
|
|
59
62
|
.action(pullCommand);
|
|
63
|
+
// Check command
|
|
64
|
+
program
|
|
65
|
+
.command('check')
|
|
66
|
+
.description('Check if labels are up-to-date')
|
|
67
|
+
.option('--strict', 'Fail if labels are outdated (for CI/CD)')
|
|
68
|
+
.option('--fix', 'Show fix instructions')
|
|
69
|
+
.action(checkCommand);
|
|
70
|
+
// Watch command
|
|
71
|
+
program
|
|
72
|
+
.command('watch')
|
|
73
|
+
.description('Watch for label changes and auto-sync')
|
|
74
|
+
.option('-i, --interval <seconds>', 'Poll interval in seconds', '30')
|
|
75
|
+
.action((options) => {
|
|
76
|
+
watchCommand({ interval: parseInt(options.interval) || 30 });
|
|
77
|
+
});
|
|
78
|
+
// Status command
|
|
79
|
+
program
|
|
80
|
+
.command('status')
|
|
81
|
+
.description('Show sync status and label versions')
|
|
82
|
+
.action(statusCommand);
|
|
83
|
+
// Sync command (alias for pull --all)
|
|
84
|
+
program
|
|
85
|
+
.command('sync')
|
|
86
|
+
.description('Force sync all labels (alias for pull --all)')
|
|
87
|
+
.action(async () => {
|
|
88
|
+
const { pullCommand } = await import('./commands/pull.js');
|
|
89
|
+
await pullCommand(undefined, { all: true });
|
|
90
|
+
});
|
|
60
91
|
// Help styling
|
|
61
92
|
program.addHelpText('after', `
|
|
62
93
|
${chalk.bold('Examples:')}
|
|
63
94
|
${chalk.dim('$')} taggr login YOUR_API_KEY ${chalk.dim('# Authenticate with API key')}
|
|
64
95
|
${chalk.dim('$')} taggr list ${chalk.dim('# List all your labels')}
|
|
65
|
-
${chalk.dim('$')} taggr pull my-label ${chalk.dim('# Pull a specific label')}
|
|
66
96
|
${chalk.dim('$')} taggr pull --all ${chalk.dim('# Pull all labels')}
|
|
97
|
+
${chalk.dim('$')} taggr check ${chalk.dim('# Check if labels are up-to-date')}
|
|
98
|
+
${chalk.dim('$')} taggr check --strict ${chalk.dim('# Fail build if outdated (CI/CD)')}
|
|
99
|
+
${chalk.dim('$')} taggr watch ${chalk.dim('# Auto-sync on changes')}
|
|
100
|
+
${chalk.dim('$')} taggr status ${chalk.dim('# Show sync status')}
|
|
67
101
|
${chalk.dim('$')} taggr whoami ${chalk.dim('# Show current user')}
|
|
68
|
-
${chalk.dim('$')} taggr logout ${chalk.dim('# Remove saved credentials')}
|
|
69
102
|
|
|
70
103
|
${chalk.bold('After pulling, import your labels:')}
|
|
71
|
-
${chalk.white("import
|
|
72
|
-
${chalk.white('console.log(myLabel
|
|
104
|
+
${chalk.white("import labels from './taggr/labels.json';")}
|
|
105
|
+
${chalk.white('console.log(labels.myLabel);')}
|
|
73
106
|
`);
|
|
74
107
|
program.parse();
|
|
75
108
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -40,4 +40,15 @@ export interface LabelResponse {
|
|
|
40
40
|
export interface WhoamiResponse {
|
|
41
41
|
user: UserInfo;
|
|
42
42
|
}
|
|
43
|
+
export interface LabelMetadata {
|
|
44
|
+
version: string;
|
|
45
|
+
syncedAt: string;
|
|
46
|
+
checksum: string;
|
|
47
|
+
}
|
|
48
|
+
export interface TaggrMetadata {
|
|
49
|
+
syncedAt: string;
|
|
50
|
+
apiUrl: string;
|
|
51
|
+
labels: Record<string, LabelMetadata>;
|
|
52
|
+
overallChecksum: string;
|
|
53
|
+
}
|
|
43
54
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;CAChB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
package/dist/utils/api.d.ts
CHANGED
|
@@ -15,4 +15,9 @@ export declare function getLabels(): Promise<LabelsResponse>;
|
|
|
15
15
|
* Get a single label by name
|
|
16
16
|
*/
|
|
17
17
|
export declare function getLabelByName(name: string): Promise<LabelResponse>;
|
|
18
|
+
/**
|
|
19
|
+
* Get label versions for checking if local labels are up-to-date
|
|
20
|
+
* This endpoint should return current versions of all labels
|
|
21
|
+
*/
|
|
22
|
+
export declare function getLabelVersions(): Promise<Record<string, string>>;
|
|
18
23
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/utils/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,aAAa,CAAC;AAyBrB;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAiBjD;AA2DD;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CA+BtD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAgCzD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BzE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgBxE"}
|
package/dist/utils/api.js
CHANGED
|
@@ -1,13 +1,39 @@
|
|
|
1
1
|
import axios, { AxiosError } from 'axios';
|
|
2
2
|
let apiClient = null;
|
|
3
|
+
/**
|
|
4
|
+
* Validate API URL format
|
|
5
|
+
*/
|
|
6
|
+
function validateApiUrl(url) {
|
|
7
|
+
if (!url || typeof url !== 'string') {
|
|
8
|
+
throw new Error('API URL must be a non-empty string');
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const urlObj = new URL(url);
|
|
12
|
+
if (!['http:', 'https:'].includes(urlObj.protocol)) {
|
|
13
|
+
throw new Error('API URL must use http or https protocol');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (error instanceof TypeError) {
|
|
18
|
+
throw new Error(`Invalid API URL format: ${url}. Please provide a valid URL (e.g., https://api.example.com/api)`);
|
|
19
|
+
}
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
3
23
|
/**
|
|
4
24
|
* Initialize the API client with config
|
|
5
25
|
*/
|
|
6
26
|
export function initApi(config) {
|
|
27
|
+
// Validate API URL
|
|
28
|
+
validateApiUrl(config.apiUrl);
|
|
29
|
+
// Validate API key
|
|
30
|
+
if (!config.apiKey || typeof config.apiKey !== 'string' || config.apiKey.trim().length === 0) {
|
|
31
|
+
throw new Error('API key must be a non-empty string');
|
|
32
|
+
}
|
|
7
33
|
apiClient = axios.create({
|
|
8
34
|
baseURL: config.apiUrl,
|
|
9
35
|
headers: {
|
|
10
|
-
'X-API-Key': config.apiKey,
|
|
36
|
+
'X-API-Key': config.apiKey.trim(),
|
|
11
37
|
'Content-Type': 'application/json',
|
|
12
38
|
},
|
|
13
39
|
timeout: 30000,
|
|
@@ -28,8 +54,17 @@ function getClient() {
|
|
|
28
54
|
function handleError(error) {
|
|
29
55
|
if (error instanceof AxiosError) {
|
|
30
56
|
if (error.response) {
|
|
31
|
-
|
|
32
|
-
|
|
57
|
+
// Check if we got HTML (frontend) instead of JSON (backend)
|
|
58
|
+
const responseData = error.response.data;
|
|
59
|
+
if (typeof responseData === 'string' && (responseData.trim().startsWith('<!doctype') || responseData.trim().startsWith('<!DOCTYPE') || responseData.trim().startsWith('<html'))) {
|
|
60
|
+
throw new Error('Received HTML response instead of JSON. The API URL is pointing to the frontend.\n' +
|
|
61
|
+
'Please ensure:\n' +
|
|
62
|
+
' 1. Your backend is deployed and accessible\n' +
|
|
63
|
+
' 2. Use the --url flag to specify the correct backend API URL\n' +
|
|
64
|
+
' 3. Example: taggr login <API_KEY> --url https://your-backend-url.com/api');
|
|
65
|
+
}
|
|
66
|
+
const data = responseData;
|
|
67
|
+
if (data && typeof data === 'object' && 'error' in data && data.error) {
|
|
33
68
|
throw new Error(data.error.message);
|
|
34
69
|
}
|
|
35
70
|
throw new Error(`API error: ${error.response.status}`);
|
|
@@ -41,12 +76,27 @@ function handleError(error) {
|
|
|
41
76
|
}
|
|
42
77
|
throw error;
|
|
43
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if response is HTML (indicates wrong URL - hitting frontend instead of backend)
|
|
81
|
+
*/
|
|
82
|
+
function checkForHtmlResponse(data, baseURL) {
|
|
83
|
+
if (typeof data === 'string' && (data.trim().startsWith('<!doctype') || data.trim().startsWith('<!DOCTYPE') || data.trim().startsWith('<html'))) {
|
|
84
|
+
throw new Error('Received HTML response instead of JSON. This usually means:\n' +
|
|
85
|
+
' 1. The API URL is pointing to the frontend instead of the backend\n' +
|
|
86
|
+
' 2. The backend is not deployed or is at a different URL\n' +
|
|
87
|
+
' 3. Please check your backend deployment URL and use --url flag if needed\n' +
|
|
88
|
+
` Current URL: ${baseURL || apiClient?.defaults.baseURL || 'unknown'}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
44
91
|
/**
|
|
45
92
|
* Get current user info
|
|
46
93
|
*/
|
|
47
94
|
export async function whoami() {
|
|
48
95
|
try {
|
|
49
|
-
const
|
|
96
|
+
const client = getClient();
|
|
97
|
+
const response = await client.get('/cli/whoami');
|
|
98
|
+
// Check if we got HTML instead of JSON (wrong URL)
|
|
99
|
+
checkForHtmlResponse(response.data, client.defaults.baseURL);
|
|
50
100
|
// Check if response has the expected structure
|
|
51
101
|
if (!response.data) {
|
|
52
102
|
throw new Error(`Invalid API response: response.data is ${typeof response.data}`);
|
|
@@ -73,7 +123,10 @@ export async function whoami() {
|
|
|
73
123
|
*/
|
|
74
124
|
export async function getLabels() {
|
|
75
125
|
try {
|
|
76
|
-
const
|
|
126
|
+
const client = getClient();
|
|
127
|
+
const response = await client.get('/cli/labels');
|
|
128
|
+
// Check if we got HTML instead of JSON (wrong URL)
|
|
129
|
+
checkForHtmlResponse(response.data, client.defaults.baseURL);
|
|
77
130
|
// Check if response has the expected structure
|
|
78
131
|
if (!response.data) {
|
|
79
132
|
throw new Error(`Invalid API response: response.data is ${typeof response.data}`);
|
|
@@ -100,7 +153,10 @@ export async function getLabels() {
|
|
|
100
153
|
*/
|
|
101
154
|
export async function getLabelByName(name) {
|
|
102
155
|
try {
|
|
103
|
-
const
|
|
156
|
+
const client = getClient();
|
|
157
|
+
const response = await client.get(`/cli/labels/${name}`);
|
|
158
|
+
// Check if we got HTML instead of JSON (wrong URL)
|
|
159
|
+
checkForHtmlResponse(response.data, client.defaults.baseURL);
|
|
104
160
|
// Check if response has the expected structure
|
|
105
161
|
if (!response.data) {
|
|
106
162
|
throw new Error(`Invalid API response: response.data is ${typeof response.data}`);
|
|
@@ -119,4 +175,24 @@ export async function getLabelByName(name) {
|
|
|
119
175
|
return handleError(error);
|
|
120
176
|
}
|
|
121
177
|
}
|
|
178
|
+
/**
|
|
179
|
+
* Get label versions for checking if local labels are up-to-date
|
|
180
|
+
* This endpoint should return current versions of all labels
|
|
181
|
+
*/
|
|
182
|
+
export async function getLabelVersions() {
|
|
183
|
+
try {
|
|
184
|
+
const client = getClient();
|
|
185
|
+
// For now, we'll use the labels endpoint and extract versions
|
|
186
|
+
// In the future, this could be a dedicated endpoint: /cli/labels/versions
|
|
187
|
+
const response = await getLabels();
|
|
188
|
+
const versions = {};
|
|
189
|
+
for (const label of response.labels) {
|
|
190
|
+
versions[label.name] = label.version;
|
|
191
|
+
}
|
|
192
|
+
return versions;
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return handleError(error);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
122
198
|
//# sourceMappingURL=api.js.map
|
package/dist/utils/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,UAAU,EAAE,MAAM,OAAO,CAAC;AASzD,IAAI,SAAS,GAAyB,IAAI,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmB;IACzC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,UAAU,EAAE,MAAM,OAAO,CAAC;AASzD,IAAI,SAAS,GAAyB,IAAI,CAAC;AAE3C;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,kEAAkE,CAAC,CAAC;QACpH,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmB;IACzC,mBAAmB;IACnB,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE9B,mBAAmB;IACnB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;QACD,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,4DAA4D;YAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YACzC,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAChL,MAAM,IAAI,KAAK,CACb,oFAAoF;oBACpF,kBAAkB;oBAClB,gDAAgD;oBAChD,kEAAkE;oBAClE,4EAA4E,CAC7E,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,YAAoC,CAAC;YAClD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,qLAAqL,CAAC,CAAC;QACzM,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,KAAK,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAS,EAAE,OAAgB;IACvD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAChJ,MAAM,IAAI,KAAK,CACb,+DAA+D;YAC/D,uEAAuE;YACvE,6DAA6D;YAC7D,8EAA8E;YAC9E,kBAAkB,OAAO,IAAI,SAAS,EAAE,QAAQ,CAAC,OAAO,IAAI,SAAS,EAAE,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAA8B,aAAa,CAAC,CAAC;QAE9E,mDAAmD;QACnD,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE7D,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,2DAA2D;QAC3D,oFAAoF;QACpF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,IAAI,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sDAAsD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gEAAgE;QAChE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAA8B,aAAa,CAAC,CAAC;QAE9E,mDAAmD;QACnD,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE7D,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,IAAI,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAA6B,eAAe,IAAI,EAAE,CAAC,CAAC;QAErF,mDAAmD;QACnD,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAE7D,+CAA+C;QAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,IAAI,oBAAoB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjI,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,8DAA8D;QAC9D,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,CAAC;QAEnC,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QACvC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAe/C;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAe/C;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0B7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5E;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAGnD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAQxD"}
|
package/dist/utils/config.js
CHANGED
|
@@ -4,7 +4,7 @@ import os from 'os';
|
|
|
4
4
|
const CONFIG_DIR = path.join(os.homedir(), '.taggr');
|
|
5
5
|
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
6
6
|
// Default to production API URL, fallback to localhost for development
|
|
7
|
-
const DEFAULT_API_URL = process.env.TAGGR_API_URL || 'https://taggr
|
|
7
|
+
const DEFAULT_API_URL = process.env.TAGGR_API_URL || 'https://taggr.onrender.com/api';
|
|
8
8
|
/**
|
|
9
9
|
* Ensure config directory exists
|
|
10
10
|
*/
|
|
@@ -19,14 +19,24 @@ export async function getConfig() {
|
|
|
19
19
|
await ensureConfigDir();
|
|
20
20
|
if (await fs.pathExists(CONFIG_FILE)) {
|
|
21
21
|
const config = await fs.readJson(CONFIG_FILE);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
// Validate config structure
|
|
23
|
+
if (config && typeof config === 'object' && !Array.isArray(config)) {
|
|
24
|
+
return {
|
|
25
|
+
apiKey: config.apiKey || '',
|
|
26
|
+
apiUrl: config.apiUrl || DEFAULT_API_URL,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Config file is corrupted (not an object)
|
|
31
|
+
console.warn(`Warning: Config file at ${CONFIG_FILE} is corrupted. Please login again.`);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
26
34
|
}
|
|
27
35
|
return null;
|
|
28
36
|
}
|
|
29
37
|
catch (error) {
|
|
38
|
+
// If JSON parsing fails, config is corrupted
|
|
39
|
+
console.warn(`Warning: Could not read config file at ${CONFIG_FILE}. Please login again.`);
|
|
30
40
|
return null;
|
|
31
41
|
}
|
|
32
42
|
}
|