unlimit-keys 0.1.0 → 0.1.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.
package/README.md CHANGED
@@ -20,7 +20,7 @@ REDIS_URL=https://your-redis-url.upstash.io
20
20
  REDIS_TOKEN=your-token
21
21
 
22
22
  # Comma-separated or newline-separated API keys
23
- RU_API_KEYS="key1,key2,key3"
23
+ API_KEYS="key1,key2,key3"
24
24
  ```
25
25
 
26
26
  ### 2. Sync Keys to Redis
@@ -52,7 +52,7 @@ npx unlimit-keys get-key
52
52
 
53
53
  ## How It Works
54
54
 
55
- 1. **Key Pool**: Keys are stored in a single Redis Sorted Set (`ru_api_keys`).
55
+ 1. **Key Pool**: Keys are stored in a single Redis Sorted Set (`API_KEYS`).
56
56
  2. **LRU Rotation**: When you request a key, the library atomically:
57
57
  * Finds the key with the lowest score (oldest usage timestamp).
58
58
  * Updates that key's score to the current timestamp.
package/dist/cli.js CHANGED
@@ -12,11 +12,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  const commander_1 = require("commander");
14
14
  const getLeastUsedKey_1 = require("./schema/getLeastUsedKey");
15
+ const sync_api_keys_1 = require("./scripts/sync-api-keys");
15
16
  const program = new commander_1.Command();
16
17
  program
17
18
  .name('unlimit-keys')
18
19
  .description('Distributed LRU API key rotation using Redis')
19
- .version('0.1.0');
20
+ .version('0.1.5');
20
21
  program
21
22
  .command('get-key')
22
23
  .description('Get the least recently used API key')
@@ -32,10 +33,15 @@ program
32
33
  }));
33
34
  program
34
35
  .command('sync')
35
- .description('Sync API keys from RU_API_KEYS env var to Redis')
36
- .action(() => {
37
- console.log('Please run: npx unlimit-keys sync');
38
- console.log('Or: node dist/scripts/sync-api-keys.js');
39
- });
36
+ .description('Sync API keys from API_KEYS env var to Redis')
37
+ .action(() => __awaiter(void 0, void 0, void 0, function* () {
38
+ try {
39
+ yield (0, sync_api_keys_1.syncApiKeys)();
40
+ }
41
+ catch (error) {
42
+ console.error('Error:', error instanceof Error ? error.message : error);
43
+ process.exit(1);
44
+ }
45
+ }));
40
46
  program.parse();
41
47
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,yCAAoC;AACpC,8DAA2D;AAE3D,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,GAAS,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,iCAAe,GAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,yCAAoC;AACpC,8DAA2D;AAC3D,2DAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,GAAS,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,iCAAe,GAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,GAAS,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,2BAAW,GAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAA,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -11,7 +11,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.getLeastUsedKey = getLeastUsedKey;
13
13
  const redis_1 = require("./redis");
14
- const KEY_SET = 'ru_api_keys';
14
+ const KEY_SET = 'API_KEYS';
15
15
  /**
16
16
  * Fetches the least recently used API key from the global pool.
17
17
  * Automatically updates the key's usage timestamp.
@@ -37,7 +37,7 @@ function getLeastUsedKey() {
37
37
  `;
38
38
  const key = yield redis_1.redis.eval(script, [KEY_SET], [currentTime]);
39
39
  if (!key) {
40
- throw new Error('No API keys found in Redis. Please check your RU_API_KEYS environment variable and run the sync script.');
40
+ throw new Error('No API keys found in Redis. Please check your API_KEYS environment variable and run the sync script.');
41
41
  }
42
42
  return key;
43
43
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getLeastUsedKey.js","sourceRoot":"","sources":["../../src/schema/getLeastUsedKey.ts"],"names":[],"mappings":";;;;;;;;;;;AAWA,0CAwBC;AAnCD,mCAAgC;AAEhC,MAAM,OAAO,GAAG,aAAa,CAAC;AAE9B;;;;;;GAMG;AACH,SAAsB,eAAe;;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAEtC,qBAAqB;QACrB,6DAA6D;QAC7D,uDAAuD;QACvD,oBAAoB;QACpB,MAAM,MAAM,GAAG;;;;;;;;KAQd,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,aAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAkB,CAAC;QAEhF,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAC;QAC/H,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;CAAA"}
1
+ {"version":3,"file":"getLeastUsedKey.js","sourceRoot":"","sources":["../../src/schema/getLeastUsedKey.ts"],"names":[],"mappings":";;;;;;;;;;;AAWA,0CAwBC;AAnCD,mCAAgC;AAEhC,MAAM,OAAO,GAAG,UAAU,CAAC;AAE3B;;;;;;GAMG;AACH,SAAsB,eAAe;;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAEtC,qBAAqB;QACrB,6DAA6D;QAC7D,uDAAuD;QACvD,oBAAoB;QACpB,MAAM,MAAM,GAAG;;;;;;;;KAQd,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,aAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,CAAkB,CAAC;QAEhF,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QAC5H,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/schema/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAMvC,eAAO,MAAM,KAAK,OAGhB,CAAC"}
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/schema/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAYvC,eAAO,MAAM,KAAK,OAGhB,CAAC"}
@@ -1,12 +1,20 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.redis = void 0;
7
+ const dotenv_1 = __importDefault(require("dotenv"));
4
8
  const redis_1 = require("@upstash/redis");
5
- if (!process.env.REDIS_URL || !process.env.REDIS_TOKEN) {
9
+ // Load env files silently - .env.local overrides .env
10
+ dotenv_1.default.config({ path: '.env', quiet: true });
11
+ dotenv_1.default.config({ path: '.env.local', quiet: true });
12
+ const { REDIS_URL, REDIS_TOKEN } = process.env;
13
+ if (!REDIS_URL || !REDIS_TOKEN) {
6
14
  throw new Error('Missing Redis credentials. Please set REDIS_URL and REDIS_TOKEN.');
7
15
  }
8
16
  exports.redis = new redis_1.Redis({
9
- url: process.env.REDIS_URL,
10
- token: process.env.REDIS_TOKEN,
17
+ url: REDIS_URL,
18
+ token: REDIS_TOKEN,
11
19
  });
12
20
  //# sourceMappingURL=redis.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/schema/redis.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AAEvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACvD,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC;AAEY,QAAA,KAAK,GAAG,IAAI,aAAK,CAAC;IAC7B,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;IAC1B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;CAC/B,CAAC,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/schema/redis.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,0CAAuC;AAEvC,sDAAsD;AACtD,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEnD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAE/C,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC;AAEY,QAAA,KAAK,GAAG,IAAI,aAAK,CAAC;IAC7B,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,WAAW;CACnB,CAAC,CAAC"}
@@ -1,2 +1,3 @@
1
- import 'dotenv/config';
1
+ declare function syncApiKeys(): Promise<void>;
2
+ export { syncApiKeys };
2
3
  //# sourceMappingURL=sync-api-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-api-keys.d.ts","sourceRoot":"","sources":["../../src/scripts/sync-api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
1
+ {"version":3,"file":"sync-api-keys.d.ts","sourceRoot":"","sources":["../../src/scripts/sync-api-keys.ts"],"names":[],"mappings":"AAIA,iBAAe,WAAW,kBA0DzB;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -9,54 +9,65 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- require("dotenv/config");
13
- const redis_1 = require("@upstash/redis");
14
- // Note: checking for properties on process.env needs type assertions or simply checking existence
15
- if (!process.env.REDIS_URL || !process.env.REDIS_TOKEN) {
16
- throw new Error('Missing Upstash Redis credentials in .env file');
17
- }
18
- const redis = new redis_1.Redis({
19
- url: process.env.REDIS_URL,
20
- token: process.env.REDIS_TOKEN,
21
- });
22
- const KEY_SET = 'ru_api_keys';
12
+ exports.syncApiKeys = syncApiKeys;
13
+ const redis_1 = require("../schema/redis");
14
+ const KEY_SET = 'API_KEYS';
23
15
  function syncApiKeys() {
24
16
  return __awaiter(this, void 0, void 0, function* () {
25
- console.log('Syncing API keys from RU_API_KEYS...');
26
- const keysString = process.env.RU_API_KEYS || '';
17
+ console.log('🔄 Starting API key sync...\n');
18
+ const keysString = process.env.API_KEYS || '';
27
19
  const keysFromEnv = keysString.split(/[\n,]/).map(k => k.trim()).filter(Boolean);
28
20
  if (keysFromEnv.length === 0) {
29
- console.warn('No RU_API_KEYS found in environment variables.');
21
+ console.warn('⚠️ No API_KEYS found in environment variables.');
22
+ console.warn(' Make sure API_KEYS is set in your .env or .env.local file.\n');
30
23
  return;
31
24
  }
32
- const pipeline = redis.pipeline();
25
+ console.log(`📋 Found ${keysFromEnv.length} keys in environment`);
33
26
  // Get existing keys
34
- const keysInRedis = yield redis.zrange(KEY_SET, 0, -1);
35
- // Determine additions and removals
36
- const keysToAdd = keysFromEnv.filter(k => !keysInRedis.includes(k));
37
- const keysToRemove = keysInRedis.filter(k => !keysFromEnv.includes(k));
27
+ const keysInRedis = yield redis_1.redis.zrange(KEY_SET, 0, -1);
28
+ console.log(`🗄️ Found ${keysInRedis.length} keys in Redis\n`);
29
+ // Use Sets for O(1) lookup instead of O(n) array includes
30
+ const envKeySet = new Set(keysFromEnv);
31
+ const redisKeySet = new Set(keysInRedis);
32
+ const keysToAdd = keysFromEnv.filter(k => !redisKeySet.has(k));
33
+ const keysToRemove = keysInRedis.filter(k => !envKeySet.has(k));
34
+ if (keysToAdd.length === 0 && keysToRemove.length === 0) {
35
+ console.log('✅ Keys are already in sync. No changes needed.\n');
36
+ return;
37
+ }
38
+ const pipeline = redis_1.redis.pipeline();
38
39
  if (keysToAdd.length > 0) {
39
- console.log(`Adding ${keysToAdd.length} new keys.`);
40
+ console.log(`➕ Adding ${keysToAdd.length} new key(s):`);
40
41
  for (const key of keysToAdd) {
41
- // Add with score 0 (least used)
42
+ console.log(` • ${key.slice(0, 10)}...${key.slice(-4)}`);
42
43
  pipeline.zadd(KEY_SET, { score: 0, member: key });
43
44
  }
45
+ console.log();
44
46
  }
45
47
  if (keysToRemove.length > 0) {
46
- console.log(`Removing ${keysToRemove.length} stale keys.`);
48
+ console.log(`➖ Removing ${keysToRemove.length} stale key(s):`);
49
+ for (const key of keysToRemove) {
50
+ console.log(` • ${key.slice(0, 10)}...${key.slice(-4)}`);
51
+ }
47
52
  pipeline.zrem(KEY_SET, ...keysToRemove);
53
+ console.log();
48
54
  }
49
- if (keysToAdd.length === 0 && keysToRemove.length === 0) {
50
- console.log('Keys are already in sync.');
51
- }
52
- else {
53
- yield pipeline.exec();
54
- console.log('Sync complete.');
55
- }
55
+ yield pipeline.exec();
56
+ console.log('─'.repeat(40));
57
+ console.log(`✨ Sync complete!`);
58
+ console.log(` Total keys in pool: ${keysFromEnv.length}`);
59
+ if (keysToAdd.length > 0)
60
+ console.log(` Added: ${keysToAdd.length}`);
61
+ if (keysToRemove.length > 0)
62
+ console.log(` Removed: ${keysToRemove.length}`);
63
+ console.log();
64
+ });
65
+ }
66
+ // Run directly if this is the main module
67
+ if (require.main === module) {
68
+ syncApiKeys().catch((err) => {
69
+ console.error('Error syncing keys:', err);
70
+ process.exit(1);
56
71
  });
57
72
  }
58
- syncApiKeys().catch((err) => {
59
- console.error('Error syncing keys:', err);
60
- process.exit(1);
61
- });
62
73
  //# sourceMappingURL=sync-api-keys.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-api-keys.js","sourceRoot":"","sources":["../../src/scripts/sync-api-keys.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,yBAAuB;AACvB,0CAAuC;AAEvC,kGAAkG;AAClG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACrD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,aAAK,CAAC;IACpB,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;IAC1B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;CACjC,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,aAAa,CAAC;AAE9B,SAAe,WAAW;;QACtB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QACjD,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC/D,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAElC,oBAAoB;QACpB,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAa,CAAC;QAEnE,mCAAmC;QACnC,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;YACpD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC1B,gCAAgC;gBAChC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,MAAM,cAAc,CAAC,CAAC;YAC3D,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;CAAA;AAED,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"sync-api-keys.js","sourceRoot":"","sources":["../../src/scripts/sync-api-keys.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unlimit-keys",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "An API key rotation system using Redis",
5
5
  "author": "Anirban Majumder <anirbanmajumder.404@gmail.com>",
6
6
  "repository": {
@@ -38,10 +38,11 @@
38
38
  ],
39
39
  "scripts": {
40
40
  "build": "tsc",
41
- "prepublishOnly": "npm run build",
42
- "sync": "node dist/scripts/sync-api-keys.js",
41
+ "dev": "tsc --watch",
43
42
  "test": "vitest run",
44
- "publish-pkg": "npm publish --access public"
43
+ "sync": "node dist/scripts/sync-api-keys.js",
44
+ "prepublishOnly": "npm run build && npm run test",
45
+ "publish": "npm publish --access public"
45
46
  },
46
47
  "type": "commonjs",
47
48
  "engines": {
@@ -49,11 +50,11 @@
49
50
  },
50
51
  "dependencies": {
51
52
  "@upstash/redis": ">=1.0.0",
52
- "commander": "^14.0.0"
53
+ "commander": "^14.0.0",
54
+ "dotenv": "^17.2.3"
53
55
  },
54
56
  "devDependencies": {
55
57
  "@types/node": "^24.0.15",
56
- "ts-node": "^10.9.2",
57
58
  "typescript": "^5.8.3",
58
59
  "vitest": "^4.0.17"
59
60
  },
@@ -65,4 +66,4 @@
65
66
  "optional": true
66
67
  }
67
68
  }
68
- }
69
+ }