@autonomee/gohub 0.8.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 (179) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +57 -0
  3. package/bin/clawdhub.js +2 -0
  4. package/bin/gohub.js +2 -0
  5. package/dist/browserAuth.d.ts +20 -0
  6. package/dist/browserAuth.js +156 -0
  7. package/dist/browserAuth.js.map +1 -0
  8. package/dist/browserAuth.test.d.ts +1 -0
  9. package/dist/browserAuth.test.js +83 -0
  10. package/dist/browserAuth.test.js.map +1 -0
  11. package/dist/cli/authToken.d.ts +2 -0
  12. package/dist/cli/authToken.js +13 -0
  13. package/dist/cli/authToken.js.map +1 -0
  14. package/dist/cli/autonomeeConfig.d.ts +1 -0
  15. package/dist/cli/autonomeeConfig.js +2 -0
  16. package/dist/cli/autonomeeConfig.js.map +1 -0
  17. package/dist/cli/buildInfo.d.ts +3 -0
  18. package/dist/cli/buildInfo.js +104 -0
  19. package/dist/cli/buildInfo.js.map +1 -0
  20. package/dist/cli/clawdbotConfig.d.ts +6 -0
  21. package/dist/cli/clawdbotConfig.js +155 -0
  22. package/dist/cli/clawdbotConfig.js.map +1 -0
  23. package/dist/cli/clawdbotConfig.test.d.ts +1 -0
  24. package/dist/cli/clawdbotConfig.test.js +199 -0
  25. package/dist/cli/clawdbotConfig.test.js.map +1 -0
  26. package/dist/cli/commands/auth.d.ts +9 -0
  27. package/dist/cli/commands/auth.js +74 -0
  28. package/dist/cli/commands/auth.js.map +1 -0
  29. package/dist/cli/commands/auth.test.d.ts +1 -0
  30. package/dist/cli/commands/auth.test.js +50 -0
  31. package/dist/cli/commands/auth.test.js.map +1 -0
  32. package/dist/cli/commands/delete.d.ts +28 -0
  33. package/dist/cli/commands/delete.js +94 -0
  34. package/dist/cli/commands/delete.js.map +1 -0
  35. package/dist/cli/commands/delete.test.d.ts +1 -0
  36. package/dist/cli/commands/delete.test.js +61 -0
  37. package/dist/cli/commands/delete.test.js.map +1 -0
  38. package/dist/cli/commands/inspect.d.ts +12 -0
  39. package/dist/cli/commands/inspect.js +281 -0
  40. package/dist/cli/commands/inspect.js.map +1 -0
  41. package/dist/cli/commands/inspect.test.d.ts +1 -0
  42. package/dist/cli/commands/inspect.test.js +151 -0
  43. package/dist/cli/commands/inspect.test.js.map +1 -0
  44. package/dist/cli/commands/moderation.d.ts +19 -0
  45. package/dist/cli/commands/moderation.js +161 -0
  46. package/dist/cli/commands/moderation.js.map +1 -0
  47. package/dist/cli/commands/moderation.test.d.ts +1 -0
  48. package/dist/cli/commands/moderation.test.js +147 -0
  49. package/dist/cli/commands/moderation.test.js.map +1 -0
  50. package/dist/cli/commands/ownership.d.ts +15 -0
  51. package/dist/cli/commands/ownership.js +76 -0
  52. package/dist/cli/commands/ownership.js.map +1 -0
  53. package/dist/cli/commands/ownership.test.d.ts +1 -0
  54. package/dist/cli/commands/ownership.test.js +68 -0
  55. package/dist/cli/commands/ownership.test.js.map +1 -0
  56. package/dist/cli/commands/publish.d.ts +9 -0
  57. package/dist/cli/commands/publish.js +85 -0
  58. package/dist/cli/commands/publish.js.map +1 -0
  59. package/dist/cli/commands/publish.test.d.ts +1 -0
  60. package/dist/cli/commands/publish.test.js +105 -0
  61. package/dist/cli/commands/publish.test.js.map +1 -0
  62. package/dist/cli/commands/skills.d.ts +26 -0
  63. package/dist/cli/commands/skills.js +394 -0
  64. package/dist/cli/commands/skills.js.map +1 -0
  65. package/dist/cli/commands/skills.test.d.ts +1 -0
  66. package/dist/cli/commands/skills.test.js +402 -0
  67. package/dist/cli/commands/skills.test.js.map +1 -0
  68. package/dist/cli/commands/star.d.ts +8 -0
  69. package/dist/cli/commands/star.js +31 -0
  70. package/dist/cli/commands/star.js.map +1 -0
  71. package/dist/cli/commands/sync.d.ts +3 -0
  72. package/dist/cli/commands/sync.js +157 -0
  73. package/dist/cli/commands/sync.js.map +1 -0
  74. package/dist/cli/commands/sync.test.d.ts +1 -0
  75. package/dist/cli/commands/sync.test.js +277 -0
  76. package/dist/cli/commands/sync.test.js.map +1 -0
  77. package/dist/cli/commands/syncHelpers.d.ts +76 -0
  78. package/dist/cli/commands/syncHelpers.js +350 -0
  79. package/dist/cli/commands/syncHelpers.js.map +1 -0
  80. package/dist/cli/commands/syncHelpers.test.d.ts +1 -0
  81. package/dist/cli/commands/syncHelpers.test.js +22 -0
  82. package/dist/cli/commands/syncHelpers.test.js.map +1 -0
  83. package/dist/cli/commands/syncTypes.d.ts +24 -0
  84. package/dist/cli/commands/syncTypes.js +2 -0
  85. package/dist/cli/commands/syncTypes.js.map +1 -0
  86. package/dist/cli/commands/transfer.d.ts +50 -0
  87. package/dist/cli/commands/transfer.js +131 -0
  88. package/dist/cli/commands/transfer.js.map +1 -0
  89. package/dist/cli/commands/transfer.test.d.ts +1 -0
  90. package/dist/cli/commands/transfer.test.js +90 -0
  91. package/dist/cli/commands/transfer.test.js.map +1 -0
  92. package/dist/cli/commands/unstar.d.ts +8 -0
  93. package/dist/cli/commands/unstar.js +31 -0
  94. package/dist/cli/commands/unstar.js.map +1 -0
  95. package/dist/cli/helpStyle.d.ts +13 -0
  96. package/dist/cli/helpStyle.js +38 -0
  97. package/dist/cli/helpStyle.js.map +1 -0
  98. package/dist/cli/registry.d.ts +7 -0
  99. package/dist/cli/registry.js +42 -0
  100. package/dist/cli/registry.js.map +1 -0
  101. package/dist/cli/registry.test.d.ts +1 -0
  102. package/dist/cli/registry.test.js +48 -0
  103. package/dist/cli/registry.test.js.map +1 -0
  104. package/dist/cli/scanSkills.d.ts +7 -0
  105. package/dist/cli/scanSkills.js +91 -0
  106. package/dist/cli/scanSkills.js.map +1 -0
  107. package/dist/cli/scanSkills.test.d.ts +1 -0
  108. package/dist/cli/scanSkills.test.js +62 -0
  109. package/dist/cli/scanSkills.test.js.map +1 -0
  110. package/dist/cli/slug.d.ts +2 -0
  111. package/dist/cli/slug.js +16 -0
  112. package/dist/cli/slug.js.map +1 -0
  113. package/dist/cli/types.d.ts +15 -0
  114. package/dist/cli/types.js +2 -0
  115. package/dist/cli/types.js.map +1 -0
  116. package/dist/cli/ui.d.ts +7 -0
  117. package/dist/cli/ui.js +82 -0
  118. package/dist/cli/ui.js.map +1 -0
  119. package/dist/cli/ui.test.d.ts +1 -0
  120. package/dist/cli/ui.test.js +45 -0
  121. package/dist/cli/ui.test.js.map +1 -0
  122. package/dist/cli.d.ts +2 -0
  123. package/dist/cli.js +419 -0
  124. package/dist/cli.js.map +1 -0
  125. package/dist/config.d.ts +4 -0
  126. package/dist/config.js +77 -0
  127. package/dist/config.js.map +1 -0
  128. package/dist/config.test.d.ts +1 -0
  129. package/dist/config.test.js +56 -0
  130. package/dist/config.test.js.map +1 -0
  131. package/dist/discovery.d.ts +5 -0
  132. package/dist/discovery.js +25 -0
  133. package/dist/discovery.js.map +1 -0
  134. package/dist/discovery.test.d.ts +1 -0
  135. package/dist/discovery.test.js +46 -0
  136. package/dist/discovery.test.js.map +1 -0
  137. package/dist/homedir.d.ts +7 -0
  138. package/dist/homedir.js +29 -0
  139. package/dist/homedir.js.map +1 -0
  140. package/dist/http.bun.test.d.ts +1 -0
  141. package/dist/http.bun.test.js +231 -0
  142. package/dist/http.bun.test.js.map +1 -0
  143. package/dist/http.d.ts +43 -0
  144. package/dist/http.js +498 -0
  145. package/dist/http.js.map +1 -0
  146. package/dist/http.test.d.ts +1 -0
  147. package/dist/http.test.js +322 -0
  148. package/dist/http.test.js.map +1 -0
  149. package/dist/schema/ark.d.ts +4 -0
  150. package/dist/schema/ark.js +26 -0
  151. package/dist/schema/ark.js.map +1 -0
  152. package/dist/schema/index.d.ts +6 -0
  153. package/dist/schema/index.js +6 -0
  154. package/dist/schema/index.js.map +1 -0
  155. package/dist/schema/license.d.ts +4 -0
  156. package/dist/schema/license.js +5 -0
  157. package/dist/schema/license.js.map +1 -0
  158. package/dist/schema/routes.d.ts +22 -0
  159. package/dist/schema/routes.js +23 -0
  160. package/dist/schema/routes.js.map +1 -0
  161. package/dist/schema/schemas.d.ts +353 -0
  162. package/dist/schema/schemas.js +318 -0
  163. package/dist/schema/schemas.js.map +1 -0
  164. package/dist/schema/textFiles.d.ts +5 -0
  165. package/dist/schema/textFiles.js +66 -0
  166. package/dist/schema/textFiles.js.map +1 -0
  167. package/dist/schema/textFiles.test.d.ts +1 -0
  168. package/dist/schema/textFiles.test.js +20 -0
  169. package/dist/schema/textFiles.test.js.map +1 -0
  170. package/dist/skills.d.ts +43 -0
  171. package/dist/skills.js +178 -0
  172. package/dist/skills.js.map +1 -0
  173. package/dist/skills.test.d.ts +1 -0
  174. package/dist/skills.test.js +147 -0
  175. package/dist/skills.test.js.map +1 -0
  176. package/dist/types.d.ts +7 -0
  177. package/dist/types.js +2 -0
  178. package/dist/types.js.map +1 -0
  179. package/package.json +41 -0
package/dist/config.js ADDED
@@ -0,0 +1,77 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { resolveHome } from './homedir.js';
5
+ import { GlobalConfigSchema, parseArk } from './schema/index.js';
6
+ /**
7
+ * Resolve config path with legacy fallback.
8
+ * Checks for 'gohub' first, falls back to legacy 'clawhub' if it exists.
9
+ */
10
+ function resolveConfigPath(baseDir) {
11
+ const gohubPath = join(baseDir, 'gohub', 'config.json');
12
+ const legacyPath = join(baseDir, 'clawhub', 'config.json');
13
+ if (existsSync(gohubPath))
14
+ return gohubPath;
15
+ if (existsSync(legacyPath))
16
+ return legacyPath;
17
+ return gohubPath;
18
+ }
19
+ function isNonFatalChmodError(error) {
20
+ if (!(error instanceof Error))
21
+ return false;
22
+ const code = error.code;
23
+ return code === 'EPERM' || code === 'ENOTSUP' || code === 'EOPNOTSUPP' || code === 'EINVAL';
24
+ }
25
+ export function getGlobalConfigPath() {
26
+ const override = process.env.GOHUB_CONFIG_PATH?.trim() ?? process.env.CLAWDHUB_CONFIG_PATH?.trim();
27
+ if (override)
28
+ return resolve(override);
29
+ const home = resolveHome();
30
+ if (process.platform === 'darwin') {
31
+ return resolveConfigPath(join(home, 'Library', 'Application Support'));
32
+ }
33
+ const xdg = process.env.XDG_CONFIG_HOME;
34
+ if (xdg) {
35
+ return resolveConfigPath(xdg);
36
+ }
37
+ if (process.platform === 'win32') {
38
+ const appData = process.env.APPDATA;
39
+ if (appData) {
40
+ return resolveConfigPath(appData);
41
+ }
42
+ }
43
+ return resolveConfigPath(join(home, '.config'));
44
+ }
45
+ export async function readGlobalConfig() {
46
+ try {
47
+ const raw = await readFile(getGlobalConfigPath(), 'utf8');
48
+ const parsed = JSON.parse(raw);
49
+ return parseArk(GlobalConfigSchema, parsed, 'Global config');
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ export async function writeGlobalConfig(config) {
56
+ const path = getGlobalConfigPath();
57
+ const dir = dirname(path);
58
+ // Create directory with restricted permissions (owner only)
59
+ await mkdir(dir, { recursive: true, mode: 0o700 });
60
+ // Write file with restricted permissions (owner read/write only)
61
+ // This protects API tokens from being read by other users
62
+ await writeFile(path, `${JSON.stringify(config, null, 2)}\n`, {
63
+ encoding: 'utf8',
64
+ mode: 0o600,
65
+ });
66
+ // Ensure permissions on existing files (writeFile mode only applies on create)
67
+ if (process.platform !== 'win32') {
68
+ try {
69
+ await chmod(path, 0o600);
70
+ }
71
+ catch (error) {
72
+ if (!isNonFatalChmodError(error))
73
+ throw error;
74
+ }
75
+ }
76
+ }
77
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ /* @vitest-environment node */
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ const chmodMock = vi.fn();
4
+ const mkdirMock = vi.fn();
5
+ const readFileMock = vi.fn();
6
+ const writeFileMock = vi.fn();
7
+ vi.mock('node:fs/promises', () => ({
8
+ chmod: (...args) => chmodMock(...args),
9
+ mkdir: (...args) => mkdirMock(...args),
10
+ readFile: (...args) => readFileMock(...args),
11
+ writeFile: (...args) => writeFileMock(...args),
12
+ }));
13
+ const { writeGlobalConfig } = await import('./config');
14
+ const originalPlatform = process.platform;
15
+ const testConfigPath = '/tmp/gohub-config-test/config.json';
16
+ function makeErr(code) {
17
+ const error = new Error(code);
18
+ error.code = code;
19
+ return error;
20
+ }
21
+ beforeEach(() => {
22
+ vi.stubEnv('GOHUB_CONFIG_PATH', testConfigPath);
23
+ Object.defineProperty(process, 'platform', { value: 'linux' });
24
+ chmodMock.mockResolvedValue(undefined);
25
+ mkdirMock.mockResolvedValue(undefined);
26
+ readFileMock.mockResolvedValue('');
27
+ writeFileMock.mockResolvedValue(undefined);
28
+ });
29
+ afterEach(() => {
30
+ Object.defineProperty(process, 'platform', { value: originalPlatform });
31
+ vi.unstubAllEnvs();
32
+ vi.clearAllMocks();
33
+ });
34
+ describe('writeGlobalConfig', () => {
35
+ it('writes config with restricted modes', async () => {
36
+ await writeGlobalConfig({ registry: 'https://example.com', token: 'clh_test' });
37
+ expect(mkdirMock).toHaveBeenCalledWith('/tmp/gohub-config-test', {
38
+ recursive: true,
39
+ mode: 0o700,
40
+ });
41
+ expect(writeFileMock).toHaveBeenCalledWith(testConfigPath, expect.stringContaining('"token": "clh_test"'), {
42
+ encoding: 'utf8',
43
+ mode: 0o600,
44
+ });
45
+ expect(chmodMock).toHaveBeenCalledWith(testConfigPath, 0o600);
46
+ });
47
+ it('ignores non-fatal chmod errors', async () => {
48
+ chmodMock.mockRejectedValueOnce(makeErr('ENOTSUP'));
49
+ await expect(writeGlobalConfig({ registry: 'https://example.com' })).resolves.toBeUndefined();
50
+ });
51
+ it('rethrows unexpected chmod errors', async () => {
52
+ chmodMock.mockRejectedValueOnce(new Error('boom'));
53
+ await expect(writeGlobalConfig({ registry: 'https://example.com' })).rejects.toThrow('boom');
54
+ });
55
+ });
56
+ //# sourceMappingURL=config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function discoverRegistryFromSite(siteUrl: string): Promise<{
2
+ apiBase: string;
3
+ authBase: string | undefined;
4
+ minCliVersion: string | undefined;
5
+ } | null>;
@@ -0,0 +1,25 @@
1
+ import { parseArk, WellKnownConfigSchema } from './schema/index.js';
2
+ export async function discoverRegistryFromSite(siteUrl) {
3
+ const paths = ['/.well-known/gohub.json', '/.well-known/clawhub.json'];
4
+ for (const path of paths) {
5
+ const url = new URL(path, siteUrl);
6
+ const response = await fetch(url.toString(), {
7
+ method: 'GET',
8
+ headers: { Accept: 'application/json' },
9
+ });
10
+ if (!response.ok)
11
+ continue;
12
+ const raw = (await response.json());
13
+ const parsed = parseArk(WellKnownConfigSchema, raw, 'WellKnown config');
14
+ const apiBase = 'apiBase' in parsed ? parsed.apiBase : parsed.registry;
15
+ if (!apiBase)
16
+ return null;
17
+ return {
18
+ apiBase,
19
+ authBase: parsed.authBase,
20
+ minCliVersion: parsed.minCliVersion,
21
+ };
22
+ }
23
+ return null;
24
+ }
25
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAEnE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAAe;IAC5D,MAAM,KAAK,GAAG,CAAC,yBAAyB,EAAE,2BAA2B,CAAC,CAAA;IACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAClC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,SAAQ;QAC1B,MAAM,GAAG,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAY,CAAA;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE,kBAAkB,CAAC,CAAA;QACvE,MAAM,OAAO,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAA;QACtE,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,46 @@
1
+ /* @vitest-environment node */
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ import { discoverRegistryFromSite } from './discovery';
4
+ describe('discovery', () => {
5
+ afterEach(() => {
6
+ vi.unstubAllGlobals();
7
+ });
8
+ it('returns null on non-ok response', async () => {
9
+ vi.stubGlobal('fetch', vi.fn(async () => new Response('nope', { status: 404 })));
10
+ await expect(discoverRegistryFromSite('https://example.com')).resolves.toBeNull();
11
+ });
12
+ it('parses registry config', async () => {
13
+ vi.stubGlobal('fetch', vi.fn(async () => new Response(JSON.stringify({ registry: 'https://example.convex.site' }), {
14
+ status: 200,
15
+ headers: { 'Content-Type': 'application/json' },
16
+ })));
17
+ await expect(discoverRegistryFromSite('https://example.com')).resolves.toEqual({
18
+ apiBase: 'https://example.convex.site',
19
+ authBase: undefined,
20
+ minCliVersion: undefined,
21
+ });
22
+ });
23
+ it('parses apiBase config', async () => {
24
+ vi.stubGlobal('fetch', vi.fn(async () => new Response(JSON.stringify({
25
+ apiBase: 'https://api.example.com',
26
+ authBase: 'https://auth.example.com',
27
+ minCliVersion: '1.2.3',
28
+ }), {
29
+ status: 200,
30
+ headers: { 'Content-Type': 'application/json' },
31
+ })));
32
+ await expect(discoverRegistryFromSite('https://example.com')).resolves.toEqual({
33
+ apiBase: 'https://api.example.com',
34
+ authBase: 'https://auth.example.com',
35
+ minCliVersion: '1.2.3',
36
+ });
37
+ });
38
+ it('returns null when apiBase is empty', async () => {
39
+ vi.stubGlobal('fetch', vi.fn(async () => new Response(JSON.stringify({ apiBase: '' }), {
40
+ status: 200,
41
+ headers: { 'Content-Type': 'application/json' },
42
+ })));
43
+ await expect(discoverRegistryFromSite('https://example.com')).resolves.toBeNull();
44
+ });
45
+ });
46
+ //# sourceMappingURL=discovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.test.js","sourceRoot":"","sources":["../src/discovery.test.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAEtD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAA4B,CACpF,CAAA;QACD,MAAM,MAAM,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CACH,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,6BAA6B,EAAE,CAAC,EAAE;YACxE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACsB,CAC7B,CAAA;QACD,MAAM,MAAM,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC7E,OAAO,EAAE,6BAA6B;YACtC,QAAQ,EAAE,SAAS;YACnB,aAAa,EAAE,SAAS;SACzB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CACH,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CACV,IAAI,CAAC,SAAS,CAAC;YACb,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,0BAA0B;YACpC,aAAa,EAAE,OAAO;SACvB,CAAC,EACF;YACE,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CACF,CACuB,CAC7B,CAAA;QACD,MAAM,MAAM,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC7E,OAAO,EAAE,yBAAyB;YAClC,QAAQ,EAAE,0BAA0B;YACpC,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,UAAU,CACX,OAAO,EACP,EAAE,CAAC,EAAE,CACH,KAAK,IAAI,EAAE,CACT,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE;YAC5C,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC,CACsB,CAC7B,CAAA;QACD,MAAM,MAAM,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;IACnF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve the user's home directory, preferring environment variables over
3
+ * os.homedir(). On Linux, os.homedir() reads from /etc/passwd which can
4
+ * return a stale path after a user rename (usermod -l). The $HOME env var
5
+ * is set by the login process and reflects the current session.
6
+ */
7
+ export declare function resolveHome(): string;
@@ -0,0 +1,29 @@
1
+ import { homedir } from 'node:os';
2
+ import { win32 } from 'node:path';
3
+ /**
4
+ * Resolve the user's home directory, preferring environment variables over
5
+ * os.homedir(). On Linux, os.homedir() reads from /etc/passwd which can
6
+ * return a stale path after a user rename (usermod -l). The $HOME env var
7
+ * is set by the login process and reflects the current session.
8
+ */
9
+ export function resolveHome() {
10
+ if (process.platform === 'win32') {
11
+ return normalizeHome(process.env.USERPROFILE) || normalizeHome(process.env.HOME) || homedir();
12
+ }
13
+ return normalizeHome(process.env.HOME) || homedir();
14
+ }
15
+ function normalizeHome(value) {
16
+ const trimmed = value?.trim();
17
+ if (!trimmed)
18
+ return '';
19
+ if (process.platform === 'win32') {
20
+ const root = win32.parse(trimmed).root;
21
+ if (trimmed === root)
22
+ return trimmed;
23
+ return trimmed.replace(/[\\/]+$/, '');
24
+ }
25
+ if (trimmed === '/')
26
+ return '/';
27
+ return trimmed.replace(/\/+$/, '');
28
+ }
29
+ //# sourceMappingURL=homedir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homedir.js","sourceRoot":"","sources":["../src/homedir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEjC;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAA;IAC/F,CAAC;IACD,OAAO,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAA;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IAEvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAA;QACtC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,OAAO,CAAA;QACpC,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,OAAO,KAAK,GAAG;QAAE,OAAO,GAAG,CAAA;IAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,231 @@
1
+ /* @vitest-environment node */
2
+ import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ const bunRuntimeMocks = vi.hoisted(() => {
4
+ const originalBunVersion = process.versions.bun;
5
+ Object.defineProperty(process.versions, 'bun', {
6
+ value: '1.2.3',
7
+ configurable: true,
8
+ });
9
+ return {
10
+ originalBunVersion,
11
+ spawnSync: vi.fn(),
12
+ mkdtemp: vi.fn(async () => '/tmp/gohub-test'),
13
+ rm: vi.fn(async () => undefined),
14
+ writeFile: vi.fn(async () => undefined),
15
+ readFile: vi.fn(async () => Buffer.from([1, 2, 3])),
16
+ };
17
+ });
18
+ vi.mock('node:child_process', () => ({
19
+ spawnSync: bunRuntimeMocks.spawnSync,
20
+ }));
21
+ vi.mock('node:fs/promises', () => ({
22
+ mkdtemp: bunRuntimeMocks.mkdtemp,
23
+ rm: bunRuntimeMocks.rm,
24
+ writeFile: bunRuntimeMocks.writeFile,
25
+ readFile: bunRuntimeMocks.readFile,
26
+ }));
27
+ import * as http from './http';
28
+ function restoreBunRuntime() {
29
+ if (bunRuntimeMocks.originalBunVersion === undefined) {
30
+ Reflect.deleteProperty(process.versions, 'bun');
31
+ return;
32
+ }
33
+ Object.defineProperty(process.versions, 'bun', {
34
+ value: bunRuntimeMocks.originalBunVersion,
35
+ configurable: true,
36
+ });
37
+ }
38
+ function mockImmediateTimeouts() {
39
+ const setTimeoutMock = vi.fn((callback) => {
40
+ callback();
41
+ return 1;
42
+ });
43
+ const clearTimeoutMock = vi.fn();
44
+ vi.stubGlobal('setTimeout', setTimeoutMock);
45
+ vi.stubGlobal('clearTimeout', clearTimeoutMock);
46
+ return { setTimeoutMock, clearTimeoutMock };
47
+ }
48
+ async function loadHttpModuleWithBunMocks(opts) {
49
+ const spawnSync = opts?.spawnImpl ?? vi.fn();
50
+ bunRuntimeMocks.spawnSync.mockImplementation((...args) => spawnSync(...args));
51
+ bunRuntimeMocks.mkdtemp.mockImplementation(async () => opts?.mkdtempValue ?? '/tmp/gohub-test');
52
+ bunRuntimeMocks.rm.mockImplementation(async () => undefined);
53
+ bunRuntimeMocks.writeFile.mockImplementation(async () => undefined);
54
+ bunRuntimeMocks.readFile.mockImplementation(async () => (opts?.readFileValue ?? Buffer.from([1, 2, 3])));
55
+ return {
56
+ http,
57
+ spawnSync: bunRuntimeMocks.spawnSync,
58
+ mkdtemp: bunRuntimeMocks.mkdtemp,
59
+ rm: bunRuntimeMocks.rm,
60
+ writeFile: bunRuntimeMocks.writeFile,
61
+ readFile: bunRuntimeMocks.readFile,
62
+ };
63
+ }
64
+ describe('http bun runtime', () => {
65
+ beforeEach(() => {
66
+ vi.clearAllMocks();
67
+ vi.unstubAllGlobals();
68
+ Object.defineProperty(process.versions, 'bun', {
69
+ value: '1.2.3',
70
+ configurable: true,
71
+ });
72
+ });
73
+ afterEach(() => {
74
+ vi.unstubAllGlobals();
75
+ });
76
+ afterAll(() => {
77
+ restoreBunRuntime();
78
+ });
79
+ it('uses curl for apiRequest GET and parses JSON', async () => {
80
+ const spawnSync = vi.fn().mockReturnValue({
81
+ status: 0,
82
+ stdout: '{"ok":true}\n200',
83
+ stderr: '',
84
+ });
85
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
86
+ const fetchMock = vi.fn();
87
+ vi.stubGlobal('fetch', fetchMock);
88
+ const result = await httpClient.apiRequest('https://registry.example', {
89
+ method: 'GET',
90
+ path: '/v1/ping',
91
+ token: 'clh_token',
92
+ });
93
+ expect(result).toEqual({ ok: true });
94
+ expect(fetchMock).not.toHaveBeenCalled();
95
+ expect(spawnSync).toHaveBeenCalledTimes(1);
96
+ const [, args] = spawnSync.mock.calls[0];
97
+ expect(args).toContain('GET');
98
+ expect(args).toContain('https://registry.example/v1/ping');
99
+ expect(args).toContain('Accept: application/json');
100
+ expect(args).toContain('Authorization: Bearer clh_token');
101
+ }, 10_000);
102
+ it('uses curl for apiRequest POST with json body', async () => {
103
+ const spawnSync = vi.fn().mockReturnValue({
104
+ status: 0,
105
+ stdout: '{"ok":true}\n200',
106
+ stderr: '',
107
+ });
108
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
109
+ await httpClient.apiRequest('https://registry.example', {
110
+ method: 'POST',
111
+ path: '/v1/ping',
112
+ body: { a: 1 },
113
+ });
114
+ const [, args] = spawnSync.mock.calls[0];
115
+ expect(args).toContain('Content-Type: application/json');
116
+ expect(args).toContain('--data-binary');
117
+ expect(args).toContain('{"a":1}');
118
+ });
119
+ it('retries bun apiRequest on 429 errors', async () => {
120
+ const spawnSync = vi.fn().mockReturnValue({
121
+ status: 0,
122
+ stdout: 'rate limited\n429',
123
+ stderr: '',
124
+ });
125
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
126
+ await expect(httpClient.apiRequest('https://registry.example', {
127
+ method: 'GET',
128
+ path: '/v1/ping',
129
+ })).rejects.toThrow('rate limited');
130
+ expect(spawnSync).toHaveBeenCalledTimes(3);
131
+ });
132
+ it('includes rate-limit guidance from curl metadata on 429', async () => {
133
+ mockImmediateTimeouts();
134
+ const spawnSync = vi.fn().mockReturnValue({
135
+ status: 0,
136
+ stdout: 'rate limited\n__GOHUB_CURL_META__\n429\n20\n0\n1771404540\n20\n0\n34\n34\n',
137
+ stderr: '',
138
+ });
139
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
140
+ await expect(httpClient.apiRequest('https://registry.example', {
141
+ method: 'GET',
142
+ path: '/v1/ping',
143
+ })).rejects.toThrow(/retry in 34s.*remaining: 0\/20.*reset in 34s/i);
144
+ expect(spawnSync).toHaveBeenCalledTimes(3);
145
+ });
146
+ it('does not retry bun apiRequest on 404 errors', async () => {
147
+ const spawnSync = vi.fn().mockReturnValue({
148
+ status: 0,
149
+ stdout: 'missing\n404',
150
+ stderr: '',
151
+ });
152
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
153
+ await expect(httpClient.apiRequest('https://registry.example', {
154
+ method: 'GET',
155
+ path: '/v1/ping',
156
+ })).rejects.toThrow('missing');
157
+ expect(spawnSync).toHaveBeenCalledTimes(1);
158
+ });
159
+ it('supports fetchText bun path and propagates status fallback', async () => {
160
+ const spawnSync = vi
161
+ .fn()
162
+ .mockReturnValueOnce({
163
+ status: 0,
164
+ stdout: 'hello world\n200',
165
+ stderr: '',
166
+ })
167
+ .mockReturnValueOnce({
168
+ status: 0,
169
+ stdout: '\n400',
170
+ stderr: '',
171
+ });
172
+ const { http: httpClient } = await loadHttpModuleWithBunMocks({ spawnImpl: spawnSync });
173
+ const text = await httpClient.fetchText('https://registry.example', { path: '/v1/readme' });
174
+ expect(text).toBe('hello world');
175
+ await expect(httpClient.fetchText('https://registry.example', { path: '/v1/readme' })).rejects.toThrow('HTTP 400');
176
+ });
177
+ it('handles downloadZip bun path and cleans up temp dir', async () => {
178
+ const spawnSync = vi
179
+ .fn()
180
+ .mockReturnValueOnce({
181
+ status: 0,
182
+ stdout: '200',
183
+ stderr: '',
184
+ })
185
+ .mockReturnValueOnce({
186
+ status: 0,
187
+ stdout: '404',
188
+ stderr: '',
189
+ });
190
+ const { http: httpClient, rm, readFile } = await loadHttpModuleWithBunMocks({
191
+ spawnImpl: spawnSync,
192
+ mkdtempValue: '/tmp/gohub-download-abc',
193
+ readFileValue: Buffer.from('not found'),
194
+ });
195
+ const bytes = await httpClient.downloadZip('https://registry.example', { slug: 'demo', token: 't' });
196
+ expect(Array.from(bytes)).toEqual(Array.from(Buffer.from('not found')));
197
+ await expect(httpClient.downloadZip('https://registry.example', { slug: 'demo', token: 't' })).rejects.toThrow('not found');
198
+ expect(readFile).toHaveBeenCalled();
199
+ expect(rm).toHaveBeenCalledWith('/tmp/gohub-download-abc', {
200
+ recursive: true,
201
+ force: true,
202
+ });
203
+ });
204
+ it('posts multipart form via curl in bun path', async () => {
205
+ const spawnSync = vi.fn().mockReturnValue({
206
+ status: 0,
207
+ stdout: '{"ok":true}\n200',
208
+ stderr: '',
209
+ });
210
+ const { http: httpClient, writeFile, rm } = await loadHttpModuleWithBunMocks({
211
+ spawnImpl: spawnSync,
212
+ mkdtempValue: '/tmp/gohub-upload-abc',
213
+ });
214
+ const form = new FormData();
215
+ form.append('name', 'demo');
216
+ form.append('file', new Blob(['abc'], { type: 'text/plain' }), 'demo.txt');
217
+ const result = await httpClient.apiRequestForm('https://registry.example', {
218
+ method: 'POST',
219
+ path: '/upload',
220
+ form,
221
+ });
222
+ expect(result).toEqual({ ok: true });
223
+ expect(writeFile).toHaveBeenCalled();
224
+ expect(rm).toHaveBeenCalledWith('/tmp/gohub-upload-abc', { recursive: true, force: true });
225
+ const [, args] = spawnSync.mock.calls[0];
226
+ expect(args).toContain('-F');
227
+ expect(args.some((arg) => arg.includes('name=demo'))).toBe(true);
228
+ expect(args.some((arg) => arg.includes('file=@/tmp/gohub-upload-abc/demo.txt'))).toBe(true);
229
+ });
230
+ });
231
+ //# sourceMappingURL=http.bun.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.bun.test.js","sourceRoot":"","sources":["../src/http.bun.test.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAE9B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAClF,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;IACtC,MAAM,kBAAkB,GAAI,OAAO,CAAC,QAA+C,CAAC,GAAG,CAAA;IACvF,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;QAC7C,KAAK,EAAE,OAAO;QACd,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;IAEF,OAAO;QACL,kBAAkB;QAClB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;QAClB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC;QAC7C,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QAChC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QACvC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAwB,CAAC;KAC3E,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,SAAS,EAAE,eAAe,CAAC,SAAS;CACrC,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,eAAe,CAAC,OAAO;IAChC,EAAE,EAAE,eAAe,CAAC,EAAE;IACtB,SAAS,EAAE,eAAe,CAAC,SAAS;IACpC,QAAQ,EAAE,eAAe,CAAC,QAAQ;CACnC,CAAC,CAAC,CAAA;AAEH,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAA;AAE9B,SAAS,iBAAiB;IACxB,IAAI,eAAe,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QAC/C,OAAM;IACR,CAAC;IACD,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;QAC7C,KAAK,EAAE,eAAe,CAAC,kBAAkB;QACzC,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,QAAoB,EAAE,EAAE;QACpD,QAAQ,EAAE,CAAA;QACV,OAAO,CAA6C,CAAA;IACtD,CAAC,CAAC,CAAA;IACF,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;IAChC,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,cAA8C,CAAC,CAAA;IAC3E,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,gBAAuC,CAAC,CAAA;IACtE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AAC7C,CAAC;AAID,KAAK,UAAU,0BAA0B,CAAC,IAIzC;IACC,MAAM,SAAS,GAAc,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,EAAE,CAAA;IACvD,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;IACxF,eAAe,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,IAAI,iBAAiB,CAAC,CAAA;IAC/F,eAAe,CAAC,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAA;IAC5D,eAAe,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAA;IACnE,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CACzC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAwB,CACnF,CAAA;IAED,OAAO;QACL,IAAI;QACJ,SAAS,EAAE,eAAe,CAAC,SAAS;QACpC,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,EAAE,EAAE,eAAe,CAAC,EAAE;QACtB,SAAS,EAAE,eAAe,CAAC,SAAS;QACpC,QAAQ,EAAE,eAAe,CAAC,QAAQ;KACnC,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,EAAE,CAAC,gBAAgB,EAAE,CAAA;QACrB,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE;YAC7C,KAAK,EAAE,OAAO;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,GAAG,EAAE;QACZ,iBAAiB,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QACvF,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACzB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAEjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAkB,0BAA0B,EAAE;YACtF,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,WAAW;SACnB,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAuB,CAAA;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAA;QAC1D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAA;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAA;IAC3D,CAAC,EAAE,MAAM,CAAC,CAAA;IAEV,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,UAAU,CAAC,UAAU,CAAC,0BAA0B,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;SACf,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAuB,CAAA;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAA;QACxD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,MAAM,CACV,UAAU,CAAC,UAAU,CAAC,0BAA0B,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QAEjC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,qBAAqB,EAAE,CAAA;QACvB,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EACJ,4EAA4E;YAC9E,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,MAAM,CACV,UAAU,CAAC,UAAU,CAAC,0BAA0B,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAA;QAElE,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,MAAM,CACV,UAAU,CAAC,UAAU,CAAC,0BAA0B,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;SACjB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAE5B,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAE;aACJ,mBAAmB,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,EAAE;SACX,CAAC;aACD,mBAAmB,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACJ,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,0BAA0B,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAA;QAEvF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;QAC3F,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEhC,MAAM,MAAM,CACV,UAAU,CAAC,SAAS,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CACzE,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,SAAS,GAAG,EAAE;aACjB,EAAE,EAAE;aACJ,mBAAmB,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;SACX,CAAC;aACD,mBAAmB,CAAC;YACnB,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACJ,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,0BAA0B,CAAC;YAC1E,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,yBAAyB;YACvC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;SACxC,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACpG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QAEvE,MAAM,MAAM,CACV,UAAU,CAAC,WAAW,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CACjF,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAE9B,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAA;QACnC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,yBAAyB,EAAE;YACzD,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,EAAE;SACX,CAAC,CAAA;QACF,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,MAAM,0BAA0B,CAAC;YAC3E,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,uBAAuB;SACtC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;QAE1E,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAAkB,0BAA0B,EAAE;YAC1F,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,SAAS;YACf,IAAI;SACL,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAA;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1F,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAuB,CAAA;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import type { ArkValidator } from './schema/index.js';
2
+ export declare function shouldUseProxyFromEnv(env?: NodeJS.ProcessEnv): boolean;
3
+ export declare function registryUrl(path: string, registry: string): URL;
4
+ type RequestArgs = {
5
+ method: 'GET' | 'POST' | 'DELETE';
6
+ path: string;
7
+ token?: string;
8
+ body?: unknown;
9
+ } | {
10
+ method: 'GET' | 'POST' | 'DELETE';
11
+ url: string;
12
+ token?: string;
13
+ body?: unknown;
14
+ };
15
+ export declare function apiRequest<T>(registry: string, args: RequestArgs): Promise<T>;
16
+ export declare function apiRequest<T>(registry: string, args: RequestArgs, schema: ArkValidator<T>): Promise<T>;
17
+ type FormRequestArgs = {
18
+ method: 'POST';
19
+ path: string;
20
+ token?: string;
21
+ form: FormData;
22
+ } | {
23
+ method: 'POST';
24
+ url: string;
25
+ token?: string;
26
+ form: FormData;
27
+ };
28
+ export declare function apiRequestForm<T>(registry: string, args: FormRequestArgs): Promise<T>;
29
+ export declare function apiRequestForm<T>(registry: string, args: FormRequestArgs, schema: ArkValidator<T>): Promise<T>;
30
+ type TextRequestArgs = {
31
+ path: string;
32
+ token?: string;
33
+ } | {
34
+ url: string;
35
+ token?: string;
36
+ };
37
+ export declare function fetchText(registry: string, args: TextRequestArgs): Promise<string>;
38
+ export declare function downloadZip(registry: string, args: {
39
+ slug: string;
40
+ version?: string;
41
+ token?: string;
42
+ }): Promise<Uint8Array<ArrayBuffer>>;
43
+ export {};