@agi-ventures-canada/hackathon-cli 0.1.0 → 0.1.2
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/dist/_chunks/assign.mjs +1 -1
- package/dist/_chunks/assign.mjs.map +1 -1
- package/dist/_chunks/assignments-delete.mjs +1 -1
- package/dist/_chunks/assignments-delete.mjs.map +1 -1
- package/dist/_chunks/calculate.mjs +1 -1
- package/dist/_chunks/calculate.mjs.map +1 -1
- package/dist/_chunks/cancel.mjs +1 -1
- package/dist/_chunks/cancel.mjs.map +1 -1
- package/dist/_chunks/config.mjs +5 -5
- package/dist/_chunks/config.mjs.map +1 -1
- package/dist/_chunks/constants.mjs +2 -2
- package/dist/_chunks/constants.mjs.map +1 -1
- package/dist/_chunks/create.mjs.map +1 -1
- package/dist/_chunks/create3.mjs.map +1 -1
- package/dist/_chunks/create4.mjs.map +1 -1
- package/dist/_chunks/create5.mjs.map +1 -1
- package/dist/_chunks/create6.mjs.map +1 -1
- package/dist/_chunks/criteria-create.mjs.map +1 -1
- package/dist/_chunks/criteria-delete.mjs +1 -1
- package/dist/_chunks/criteria-delete.mjs.map +1 -1
- package/dist/_chunks/criteria-update.mjs +1 -1
- package/dist/_chunks/criteria-update.mjs.map +1 -1
- package/dist/_chunks/delete.mjs +1 -1
- package/dist/_chunks/delete.mjs.map +1 -1
- package/dist/_chunks/delete2.mjs +1 -1
- package/dist/_chunks/delete2.mjs.map +1 -1
- package/dist/_chunks/delete3.mjs +1 -1
- package/dist/_chunks/delete3.mjs.map +1 -1
- package/dist/_chunks/delete4.mjs +1 -1
- package/dist/_chunks/delete4.mjs.map +1 -1
- package/dist/_chunks/delete5.mjs +1 -1
- package/dist/_chunks/delete5.mjs.map +1 -1
- package/dist/_chunks/get.mjs +1 -1
- package/dist/_chunks/get.mjs.map +1 -1
- package/dist/_chunks/get2.mjs +1 -1
- package/dist/_chunks/get2.mjs.map +1 -1
- package/dist/_chunks/get3.mjs +2 -2
- package/dist/_chunks/get3.mjs.map +1 -1
- package/dist/_chunks/get4.mjs +1 -1
- package/dist/_chunks/get4.mjs.map +1 -1
- package/dist/_chunks/invitations-cancel.mjs +1 -1
- package/dist/_chunks/invitations-cancel.mjs.map +1 -1
- package/dist/_chunks/judges-remove.mjs +1 -1
- package/dist/_chunks/judges-remove.mjs.map +1 -1
- package/dist/_chunks/login.mjs +4 -4
- package/dist/_chunks/login.mjs.map +1 -1
- package/dist/_chunks/org.mjs +1 -1
- package/dist/_chunks/org.mjs.map +1 -1
- package/dist/_chunks/publish.mjs +1 -1
- package/dist/_chunks/publish.mjs.map +1 -1
- package/dist/_chunks/resolve.mjs +1 -4
- package/dist/_chunks/resolve.mjs.map +1 -1
- package/dist/_chunks/result.mjs +1 -1
- package/dist/_chunks/result.mjs.map +1 -1
- package/dist/_chunks/results.mjs +1 -1
- package/dist/_chunks/results.mjs.map +1 -1
- package/dist/_chunks/submissions.mjs +1 -1
- package/dist/_chunks/submissions.mjs.map +1 -1
- package/dist/_chunks/unassign.mjs +1 -1
- package/dist/_chunks/unassign.mjs.map +1 -1
- package/dist/_chunks/unpublish.mjs +1 -1
- package/dist/_chunks/unpublish.mjs.map +1 -1
- package/dist/_chunks/update-check.mjs +70 -0
- package/dist/_chunks/update-check.mjs.map +1 -0
- package/dist/_chunks/update.mjs +3 -3
- package/dist/_chunks/update.mjs.map +1 -1
- package/dist/_chunks/update2.mjs +1 -1
- package/dist/_chunks/update2.mjs.map +1 -1
- package/dist/_chunks/update3.mjs +1 -1
- package/dist/_chunks/update3.mjs.map +1 -1
- package/dist/_chunks/update4.mjs +1 -1
- package/dist/_chunks/update4.mjs.map +1 -1
- package/dist/_chunks/update5.mjs +49 -0
- package/dist/_chunks/update5.mjs.map +1 -0
- package/dist/cli.mjs +32 -15
- package/dist/cli.mjs.map +1 -1
- package/package.json +3 -3
package/dist/_chunks/login.mjs
CHANGED
|
@@ -26,15 +26,15 @@ function parseLoginOptions(args) {
|
|
|
26
26
|
}
|
|
27
27
|
async function runLogin(args) {
|
|
28
28
|
const options = parseLoginOptions(args);
|
|
29
|
-
const baseUrl = options.baseUrl ?? "https://
|
|
30
|
-
if (loadConfig() && !options.yes && !options.apiKey && !process.env.
|
|
29
|
+
const baseUrl = options.baseUrl ?? "https://getoatmeal.com";
|
|
30
|
+
if (loadConfig() && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {
|
|
31
31
|
const overwrite = await p.confirm({ message: "You are already logged in. Overwrite existing config?" });
|
|
32
32
|
if (p.isCancel(overwrite) || !overwrite) {
|
|
33
33
|
p.log.info("Login cancelled.");
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
-
const key = options.apiKey ?? process.env.
|
|
37
|
+
const key = options.apiKey ?? process.env.HACKATHON_API_KEY;
|
|
38
38
|
if (key) {
|
|
39
39
|
await validateAndSaveKey(key, baseUrl);
|
|
40
40
|
return;
|
|
@@ -100,7 +100,7 @@ async function validateAndSaveKey(apiKey, baseUrl) {
|
|
|
100
100
|
keyId: whoami.keyId,
|
|
101
101
|
scopes: whoami.scopes
|
|
102
102
|
});
|
|
103
|
-
p.log.success(`Logged in! Key saved to ~/.
|
|
103
|
+
p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`);
|
|
104
104
|
p.log.info(`Tenant: ${whoami.tenantId}`);
|
|
105
105
|
p.log.info(`Scopes: ${whoami.scopes.join(", ")}`);
|
|
106
106
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.
|
|
1
|
+
{"version":3,"file":"login.mjs","names":[],"sources":["../../src/commands/login.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\"\nimport { execSync } from \"node:child_process\"\nimport * as p from \"@clack/prompts\"\nimport { OatmealClient } from \"../client.js\"\nimport { loadConfig, saveConfig } from \"../config.js\"\nimport { AUTH_TIMEOUT_MS, DEFAULT_BASE_URL, POLL_INTERVAL_MS } from \"../constants.js\"\nimport type { CliConfig, WhoAmIResponse } from \"../types.js\"\n\ninterface LoginOptions {\n apiKey?: string\n noBrowser?: boolean\n baseUrl?: string\n yes?: boolean\n}\n\nexport function parseLoginOptions(args: string[]): LoginOptions {\n const options: LoginOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--api-key\":\n options.apiKey = args[++i]\n break\n case \"--no-browser\":\n options.noBrowser = true\n break\n case \"--base-url\":\n options.baseUrl = args[++i]\n break\n case \"--yes\":\n case \"-y\":\n options.yes = true\n break\n }\n }\n return options\n}\n\nexport async function runLogin(args: string[]): Promise<void> {\n const options = parseLoginOptions(args)\n const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL\n\n const existingConfig = loadConfig()\n if (existingConfig && !options.yes && !options.apiKey && !process.env.HACKATHON_API_KEY) {\n const overwrite = await p.confirm({\n message: \"You are already logged in. Overwrite existing config?\",\n })\n if (p.isCancel(overwrite) || !overwrite) {\n p.log.info(\"Login cancelled.\")\n return\n }\n }\n\n const key = options.apiKey ?? process.env.HACKATHON_API_KEY\n if (key) {\n await validateAndSaveKey(key, baseUrl)\n return\n }\n\n if (options.noBrowser || !process.stdout.isTTY) {\n const pastedKey = await p.password({ message: \"Paste your API key:\" })\n if (p.isCancel(pastedKey)) {\n p.log.info(\"Login cancelled.\")\n return\n }\n await validateAndSaveKey(pastedKey, baseUrl)\n return\n }\n\n const deviceToken = randomBytes(32).toString(\"hex\")\n const authUrl = `${baseUrl}/cli-auth?token=${deviceToken}`\n\n p.log.info(`Opening browser to sign in...`)\n p.log.info(authUrl)\n\n try {\n openBrowser(authUrl)\n } catch {\n p.log.warn(\"Could not open browser. Visit the URL above manually.\")\n }\n\n const spinner = p.spinner()\n spinner.start(\"Waiting for authentication...\")\n\n try {\n const apiKey = await pollForKey(baseUrl, deviceToken)\n spinner.stop(\"Authenticated!\")\n await validateAndSaveKey(apiKey, baseUrl)\n } catch (error) {\n spinner.stop(\"Authentication failed.\")\n throw error\n }\n}\n\nfunction openBrowser(url: string): void {\n const platform = process.platform\n const cmd =\n platform === \"darwin\"\n ? \"open\"\n : platform === \"win32\"\n ? \"start\"\n : \"xdg-open\"\n execSync(`${cmd} \"${url}\"`, { stdio: \"ignore\" })\n}\n\nasync function pollForKey(baseUrl: string, deviceToken: string): Promise<string> {\n const client = new OatmealClient({ baseUrl })\n const start = Date.now()\n\n while (Date.now() - start < AUTH_TIMEOUT_MS) {\n const result = await client.get<{ status: string; apiKey?: string }>(\n \"/api/public/cli-auth/poll\",\n { params: { token: deviceToken } }\n )\n\n if (result.status === \"complete\" && result.apiKey) {\n return result.apiKey\n }\n\n if (result.status === \"expired\") {\n throw new Error(\"Authentication session expired. Please try again.\")\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n\n throw new Error(\"Authentication timed out after 5 minutes. Please try again.\")\n}\n\nasync function validateAndSaveKey(apiKey: string, baseUrl: string): Promise<void> {\n const client = new OatmealClient({ baseUrl, apiKey })\n\n const spinner = p.spinner()\n spinner.start(\"Validating API key...\")\n\n try {\n const whoami = await client.get<WhoAmIResponse>(\"/api/v1/whoami\")\n spinner.stop(\"Key validated!\")\n\n const config: CliConfig = {\n apiKey,\n baseUrl,\n tenantId: whoami.tenantId,\n keyId: whoami.keyId,\n scopes: whoami.scopes,\n }\n\n saveConfig(config)\n\n p.log.success(`Logged in! Key saved to ~/.hackathon/config.json`)\n p.log.info(`Tenant: ${whoami.tenantId}`)\n p.log.info(`Scopes: ${whoami.scopes.join(\", \")}`)\n } catch (error) {\n spinner.stop(\"Validation failed.\")\n throw error\n }\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,kBAAkB,MAA8B;CAC9D,MAAM,UAAwB,EAAE;AAChC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,SAAS,KAAK,EAAE;AACxB;EACF,KAAK;AACH,WAAQ,YAAY;AACpB;EACF,KAAK;AACH,WAAQ,UAAU,KAAK,EAAE;AACzB;EACF,KAAK;EACL,KAAK;AACH,WAAQ,MAAM;AACd;;AAGN,QAAO;;AAGT,eAAsB,SAAS,MAA+B;CAC5D,MAAM,UAAU,kBAAkB,KAAK;CACvC,MAAM,UAAU,QAAQ,WAAA;AAGxB,KADuB,YAAY,IACb,CAAC,QAAQ,OAAO,CAAC,QAAQ,UAAU,CAAC,QAAQ,IAAI,mBAAmB;EACvF,MAAM,YAAY,MAAM,EAAE,QAAQ,EAChC,SAAS,yDACV,CAAC;AACF,MAAI,EAAE,SAAS,UAAU,IAAI,CAAC,WAAW;AACvC,KAAE,IAAI,KAAK,mBAAmB;AAC9B;;;CAIJ,MAAM,MAAM,QAAQ,UAAU,QAAQ,IAAI;AAC1C,KAAI,KAAK;AACP,QAAM,mBAAmB,KAAK,QAAQ;AACtC;;AAGF,KAAI,QAAQ,aAAa,CAAC,QAAQ,OAAO,OAAO;EAC9C,MAAM,YAAY,MAAM,EAAE,SAAS,EAAE,SAAS,uBAAuB,CAAC;AACtE,MAAI,EAAE,SAAS,UAAU,EAAE;AACzB,KAAE,IAAI,KAAK,mBAAmB;AAC9B;;AAEF,QAAM,mBAAmB,WAAW,QAAQ;AAC5C;;CAGF,MAAM,cAAc,YAAY,GAAG,CAAC,SAAS,MAAM;CACnD,MAAM,UAAU,GAAG,QAAQ,kBAAkB;AAE7C,GAAE,IAAI,KAAK,gCAAgC;AAC3C,GAAE,IAAI,KAAK,QAAQ;AAEnB,KAAI;AACF,cAAY,QAAQ;SACd;AACN,IAAE,IAAI,KAAK,wDAAwD;;CAGrE,MAAM,UAAU,EAAE,SAAS;AAC3B,SAAQ,MAAM,gCAAgC;AAE9C,KAAI;EACF,MAAM,SAAS,MAAM,WAAW,SAAS,YAAY;AACrD,UAAQ,KAAK,iBAAiB;AAC9B,QAAM,mBAAmB,QAAQ,QAAQ;UAClC,OAAO;AACd,UAAQ,KAAK,yBAAyB;AACtC,QAAM;;;AAIV,SAAS,YAAY,KAAmB;CACtC,MAAM,WAAW,QAAQ;AAOzB,UAAS,GALP,aAAa,WACT,SACA,aAAa,UACX,UACA,WACQ,IAAI,IAAI,IAAI,EAAE,OAAO,UAAU,CAAC;;AAGlD,eAAe,WAAW,SAAiB,aAAsC;CAC/E,MAAM,SAAS,IAAI,cAAc,EAAE,SAAS,CAAC;CAC7C,MAAM,QAAQ,KAAK,KAAK;AAExB,QAAO,KAAK,KAAK,GAAG,QAAQ,iBAAiB;EAC3C,MAAM,SAAS,MAAM,OAAO,IAC1B,6BACA,EAAE,QAAQ,EAAE,OAAO,aAAa,EAAE,CACnC;AAED,MAAI,OAAO,WAAW,cAAc,OAAO,OACzC,QAAO,OAAO;AAGhB,MAAI,OAAO,WAAW,UACpB,OAAM,IAAI,MAAM,oDAAoD;AAGtE,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,iBAAiB,CAAC;;AAGvE,OAAM,IAAI,MAAM,8DAA8D;;AAGhF,eAAe,mBAAmB,QAAgB,SAAgC;CAChF,MAAM,SAAS,IAAI,cAAc;EAAE;EAAS;EAAQ,CAAC;CAErD,MAAM,UAAU,EAAE,SAAS;AAC3B,SAAQ,MAAM,wBAAwB;AAEtC,KAAI;EACF,MAAM,SAAS,MAAM,OAAO,IAAoB,iBAAiB;AACjE,UAAQ,KAAK,iBAAiB;AAU9B,aAR0B;GACxB;GACA;GACA,UAAU,OAAO;GACjB,OAAO,OAAO;GACd,QAAQ,OAAO;GAChB,CAEiB;AAElB,IAAE,IAAI,QAAQ,mDAAmD;AACjE,IAAE,IAAI,KAAK,WAAW,OAAO,WAAW;AACxC,IAAE,IAAI,KAAK,WAAW,OAAO,OAAO,KAAK,KAAK,GAAG;UAC1C,OAAO;AACd,UAAQ,KAAK,qBAAqB;AAClC,QAAM"}
|
package/dist/_chunks/org.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { n as formatJson, t as formatDetail } from "../cli.mjs";
|
|
|
2
2
|
//#region src/commands/browse/org.ts
|
|
3
3
|
async function runBrowseOrg(client, slug, options) {
|
|
4
4
|
if (!slug) {
|
|
5
|
-
console.error("Usage:
|
|
5
|
+
console.error("Usage: hackathon browse org <slug>");
|
|
6
6
|
process.exit(1);
|
|
7
7
|
}
|
|
8
8
|
const data = await client.get(`/api/public/orgs/${encodeURIComponent(slug)}`);
|
package/dist/_chunks/org.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"org.mjs","names":[],"sources":["../../src/commands/browse/org.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatDetail, formatJson } from \"../../output.js\"\nimport type { OrgProfile } from \"../../types.js\"\n\nexport async function runBrowseOrg(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse org <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<OrgProfile>(\n `/api/public/orgs/${encodeURIComponent(slug)}`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n console.log(\n formatDetail([\n { label: \"Name\", value: data.name },\n { label: \"Slug\", value: data.slug },\n { label: \"Description\", value: data.description },\n { label: \"Hackathons\", value: String(data.hackathon_count ?? 0) },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,aACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,qCAAqC;AACnD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,oBAAoB,mBAAmB,KAAK,GAC7C;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,SAAQ,IACN,aAAa;EACX;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAQ,OAAO,KAAK;GAAM;EACnC;GAAE,OAAO;GAAe,OAAO,KAAK;GAAa;EACjD;GAAE,OAAO;GAAc,OAAO,OAAO,KAAK,mBAAmB,EAAA;;EAC9D,CAAC,CACH"}
|
package/dist/_chunks/publish.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
|
|
|
3
3
|
//#region src/commands/results/publish.ts
|
|
4
4
|
async function runResultsPublish(client, hackathonId, options) {
|
|
5
5
|
if (!hackathonId) {
|
|
6
|
-
console.error("Usage:
|
|
6
|
+
console.error("Usage: hackathon results publish <hackathon-id>");
|
|
7
7
|
process.exit(1);
|
|
8
8
|
}
|
|
9
9
|
if (!options.yes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.mjs","names":[],"sources":["../../src/commands/results/publish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsPublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"publish.mjs","names":[],"sources":["../../src/commands/results/publish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsPublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: hackathon results publish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({\n message: \"Publish results? This will make them visible to participants.\",\n })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/publish`)\n console.log(formatSuccess(\"Results published\"))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,kDAAkD;AAChE,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAC9B,SAAS,iEACV,CAAC;AACF,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,kBAAkB;AAC7E,SAAQ,IAAI,cAAc,oBAAoB,CAAC"}
|
package/dist/_chunks/resolve.mjs
CHANGED
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
3
|
async function resolveHackathonId(client, idOrSlug) {
|
|
4
4
|
if (UUID_REGEX.test(idOrSlug)) return idOrSlug;
|
|
5
|
-
const match = (await client.get("/api/dashboard/hackathons", { params: {
|
|
6
|
-
q: idOrSlug,
|
|
7
|
-
limit: 1
|
|
8
|
-
} })).hackathons?.find((h) => h.slug === idOrSlug);
|
|
5
|
+
const match = (await client.get("/api/dashboard/hackathons", { params: { q: idOrSlug } })).hackathons?.find((h) => h.slug === idOrSlug);
|
|
9
6
|
if (!match) throw new Error(`Hackathon not found: "${idOrSlug}". Use a UUID or exact slug.`);
|
|
10
7
|
return match.id;
|
|
11
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug
|
|
1
|
+
{"version":3,"file":"resolve.mjs","names":[],"sources":["../../src/commands/hackathons/resolve.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport type { Hackathon } from \"../../types.js\"\n\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function resolveHackathonId(\n client: OatmealClient,\n idOrSlug: string\n): Promise<string> {\n if (UUID_REGEX.test(idOrSlug)) {\n return idOrSlug\n }\n\n const data = await client.get<{ hackathons: Hackathon[] }>(\"/api/dashboard/hackathons\", {\n params: { q: idOrSlug },\n })\n\n const match = data.hackathons?.find((h) => h.slug === idOrSlug)\n if (!match) {\n throw new Error(`Hackathon not found: \"${idOrSlug}\". Use a UUID or exact slug.`)\n }\n\n return match.id\n}\n"],"mappings":";AAGA,MAAM,aAAa;AAEnB,eAAsB,mBACpB,QACA,UACiB;AACjB,KAAI,WAAW,KAAK,SAAS,CAC3B,QAAO;CAOT,MAAM,SAJO,MAAM,OAAO,IAAiC,6BAA6B,EACtF,QAAQ,EAAE,GAAG,UAAU,EACxB,CAAC,EAEiB,YAAY,MAAM,MAAM,EAAE,SAAS,SAAS;AAC/D,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,yBAAyB,SAAS,8BAA8B;AAGlF,QAAO,MAAM"}
|
package/dist/_chunks/result.mjs
CHANGED
|
@@ -15,7 +15,7 @@ function parseJobResultOptions(args) {
|
|
|
15
15
|
}
|
|
16
16
|
async function runJobsResult(client, jobId, args) {
|
|
17
17
|
if (!jobId) {
|
|
18
|
-
console.error("Usage:
|
|
18
|
+
console.error("Usage: hackathon jobs result <job-id>");
|
|
19
19
|
process.exit(1);
|
|
20
20
|
}
|
|
21
21
|
if (parseJobResultOptions(args).poll) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.mjs","names":[],"sources":["../../src/commands/jobs/result.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson } from \"../../output.js\"\nimport { POLL_INTERVAL_MS } from \"../../constants.js\"\n\ninterface JobResultOptions {\n poll?: boolean\n json?: boolean\n}\n\nexport function parseJobResultOptions(args: string[]): JobResultOptions {\n const options: JobResultOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--poll\":\n options.poll = true\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJobsResult(\n client: OatmealClient,\n jobId: string,\n args: string[]\n): Promise<void> {\n if (!jobId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"result.mjs","names":[],"sources":["../../src/commands/jobs/result.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson } from \"../../output.js\"\nimport { POLL_INTERVAL_MS } from \"../../constants.js\"\n\ninterface JobResultOptions {\n poll?: boolean\n json?: boolean\n}\n\nexport function parseJobResultOptions(args: string[]): JobResultOptions {\n const options: JobResultOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--poll\":\n options.poll = true\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJobsResult(\n client: OatmealClient,\n jobId: string,\n args: string[]\n): Promise<void> {\n if (!jobId) {\n console.error(\"Usage: hackathon jobs result <job-id>\")\n process.exit(1)\n }\n\n const options = parseJobResultOptions(args)\n\n if (options.poll) {\n let attempts = 0\n const maxAttempts = 60\n while (attempts < maxAttempts) {\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n if (result.status === \"completed\" || result.result) {\n console.log(formatJson(result))\n return\n }\n console.error(`Job still running (attempt ${++attempts}/${maxAttempts})...`)\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS))\n }\n console.error(\"Timed out waiting for job result.\")\n process.exit(1)\n }\n\n const result = await client.get<{ status: string; result?: unknown }>(\n `/api/v1/jobs/${jobId}/result`\n )\n\n if (result.status !== \"completed\" && !result.result) {\n console.log(`Job is still ${result.status}. Use --poll to wait for completion.`)\n return\n }\n\n console.log(formatJson(result))\n}\n"],"mappings":";;;AASA,SAAgB,sBAAsB,MAAkC;CACtE,MAAM,UAA4B,EAAE;AACpC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO;AACf;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,cACpB,QACA,OACA,MACe;AACf,KAAI,CAAC,OAAO;AACV,UAAQ,MAAM,wCAAwC;AACtD,UAAQ,KAAK,EAAE;;AAKjB,KAFgB,sBAAsB,KAAK,CAE/B,MAAM;EAChB,IAAI,WAAW;EACf,MAAM,cAAc;AACpB,SAAO,WAAW,aAAa;GAC7B,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AACD,OAAI,OAAO,WAAW,eAAe,OAAO,QAAQ;AAClD,YAAQ,IAAI,WAAW,OAAO,CAAC;AAC/B;;AAEF,WAAQ,MAAM,8BAA8B,EAAE,SAAS,GAAG,YAAY,MAAM;AAC5E,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,iBAAiB,CAAC;;AAEvE,UAAQ,MAAM,oCAAoC;AAClD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,SAAS,MAAM,OAAO,IAC1B,gBAAgB,MAAM,SACvB;AAED,KAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,UAAQ,IAAI,gBAAgB,OAAO,OAAO,sCAAsC;AAChF;;AAGF,SAAQ,IAAI,WAAW,OAAO,CAAC"}
|
package/dist/_chunks/results.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { i as formatTable, n as formatJson } from "../cli.mjs";
|
|
|
2
2
|
//#region src/commands/browse/results.ts
|
|
3
3
|
async function runBrowseResults(client, slug, options) {
|
|
4
4
|
if (!slug) {
|
|
5
|
-
console.error("Usage:
|
|
5
|
+
console.error("Usage: hackathon browse results <slug>");
|
|
6
6
|
process.exit(1);
|
|
7
7
|
}
|
|
8
8
|
const data = await client.get(`/api/public/hackathons/${encodeURIComponent(slug)}/results`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"results.mjs","names":[],"sources":["../../src/commands/browse/results.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { ResultsData } from \"../../types.js\"\n\nexport async function runBrowseResults(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse results <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<ResultsData>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/results`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.published) {\n console.log(\"Results have not been published yet.\")\n return\n }\n\n if (!data.rankings?.length) {\n console.log(\"No rankings available.\")\n return\n }\n\n console.log(\n formatTable(data.rankings, [\n { key: \"rank\", label: \"#\" },\n { key: \"submission_name\", label: \"Submission\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"total_score\", label: \"Score\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,iBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,yCAAyC;AACvD,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,UACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,WAAW;AACnB,UAAQ,IAAI,uCAAuC;AACnD;;AAGF,KAAI,CAAC,KAAK,UAAU,QAAQ;AAC1B,UAAQ,IAAI,yBAAyB;AACrC;;AAGF,SAAQ,IACN,YAAY,KAAK,UAAU;EACzB;GAAE,KAAK;GAAQ,OAAO;GAAK;EAC3B;GAAE,KAAK;GAAmB,OAAO;GAAc;EAC/C;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAe,OAAO;;EAC9B,CAAC,CACH"}
|
|
@@ -2,7 +2,7 @@ import { i as formatTable, n as formatJson } from "../cli.mjs";
|
|
|
2
2
|
//#region src/commands/browse/submissions.ts
|
|
3
3
|
async function runBrowseSubmissions(client, slug, options) {
|
|
4
4
|
if (!slug) {
|
|
5
|
-
console.error("Usage:
|
|
5
|
+
console.error("Usage: hackathon browse submissions <slug>");
|
|
6
6
|
process.exit(1);
|
|
7
7
|
}
|
|
8
8
|
const data = await client.get(`/api/public/hackathons/${encodeURIComponent(slug)}/submissions`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"submissions.mjs","names":[],"sources":["../../src/commands/browse/submissions.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatTable } from \"../../output.js\"\nimport type { Submission } from \"../../types.js\"\n\nexport async function runBrowseSubmissions(\n client: OatmealClient,\n slug: string,\n options: { json?: boolean }\n): Promise<void> {\n if (!slug) {\n console.error(\"Usage: hackathon browse submissions <slug>\")\n process.exit(1)\n }\n\n const data = await client.get<{ submissions: Submission[] }>(\n `/api/public/hackathons/${encodeURIComponent(slug)}/submissions`\n )\n\n if (options.json) {\n console.log(formatJson(data))\n return\n }\n\n if (!data.submissions?.length) {\n console.log(\"No submissions found.\")\n return\n }\n\n console.log(\n formatTable(data.submissions, [\n { key: \"name\", label: \"Name\" },\n { key: \"team_name\", label: \"Team\" },\n { key: \"submitted_at\", label: \"Submitted\" },\n ])\n )\n}\n"],"mappings":";;AAIA,eAAsB,qBACpB,QACA,MACA,SACe;AACf,KAAI,CAAC,MAAM;AACT,UAAQ,MAAM,6CAA6C;AAC3D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,OAAO,MAAM,OAAO,IACxB,0BAA0B,mBAAmB,KAAK,CAAC,cACpD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,KAAK,CAAC;AAC7B;;AAGF,KAAI,CAAC,KAAK,aAAa,QAAQ;AAC7B,UAAQ,IAAI,wBAAwB;AACpC;;AAGF,SAAQ,IACN,YAAY,KAAK,aAAa;EAC5B;GAAE,KAAK;GAAQ,OAAO;GAAQ;EAC9B;GAAE,KAAK;GAAa,OAAO;GAAQ;EACnC;GAAE,KAAK;GAAgB,OAAO;;EAC/B,CAAC,CACH"}
|
|
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
|
|
|
3
3
|
//#region src/commands/prizes/unassign.ts
|
|
4
4
|
async function runPrizesUnassign(client, hackathonId, prizeId, submissionId, options) {
|
|
5
5
|
if (!prizeId || !submissionId) {
|
|
6
|
-
console.error("Usage:
|
|
6
|
+
console.error("Usage: hackathon prizes unassign <hackathon-id> <prize-id> <submission-id>");
|
|
7
7
|
process.exit(1);
|
|
8
8
|
}
|
|
9
9
|
if (!options.yes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unassign.mjs","names":[],"sources":["../../src/commands/prizes/unassign.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesUnassign(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n submissionId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!prizeId || !submissionId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"unassign.mjs","names":[],"sources":["../../src/commands/prizes/unassign.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runPrizesUnassign(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n submissionId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!prizeId || !submissionId) {\n console.error(\"Usage: hackathon prizes unassign <hackathon-id> <prize-id> <submission-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: `Unassign prize ${prizeId} from submission ${submissionId}?` })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.delete(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}/assign/${submissionId}`\n )\n console.log(formatSuccess(`Unassigned prize ${prizeId}`))\n}\n"],"mappings":";;;AAIA,eAAsB,kBACpB,QACA,aACA,SACA,cACA,SACe;AACf,KAAI,CAAC,WAAW,CAAC,cAAc;AAC7B,UAAQ,MAAM,6EAA6E;AAC3F,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,kBAAkB,QAAQ,mBAAmB,aAAa,IAAI,CAAC;AAC1G,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,OACX,6BAA6B,YAAY,UAAU,QAAQ,UAAU,eACtE;AACD,SAAQ,IAAI,cAAc,oBAAoB,UAAU,CAAC"}
|
|
@@ -3,7 +3,7 @@ import * as p from "@clack/prompts";
|
|
|
3
3
|
//#region src/commands/results/unpublish.ts
|
|
4
4
|
async function runResultsUnpublish(client, hackathonId, options) {
|
|
5
5
|
if (!hackathonId) {
|
|
6
|
-
console.error("Usage:
|
|
6
|
+
console.error("Usage: hackathon results unpublish <hackathon-id>");
|
|
7
7
|
process.exit(1);
|
|
8
8
|
}
|
|
9
9
|
if (!options.yes) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unpublish.mjs","names":[],"sources":["../../src/commands/results/unpublish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsUnpublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"unpublish.mjs","names":[],"sources":["../../src/commands/results/unpublish.ts"],"sourcesContent":["import * as p from \"@clack/prompts\"\nimport type { OatmealClient } from \"../../client.js\"\nimport { formatSuccess } from \"../../output.js\"\n\nexport async function runResultsUnpublish(\n client: OatmealClient,\n hackathonId: string,\n options: { yes?: boolean }\n): Promise<void> {\n if (!hackathonId) {\n console.error(\"Usage: hackathon results unpublish <hackathon-id>\")\n process.exit(1)\n }\n\n if (!options.yes) {\n const confirm = await p.confirm({ message: \"Unpublish results?\" })\n if (p.isCancel(confirm) || !confirm) {\n p.log.info(\"Cancelled.\")\n return\n }\n }\n\n await client.post(`/api/dashboard/hackathons/${hackathonId}/results/unpublish`)\n console.log(formatSuccess(\"Results unpublished\"))\n}\n"],"mappings":";;;AAIA,eAAsB,oBACpB,QACA,aACA,SACe;AACf,KAAI,CAAC,aAAa;AAChB,UAAQ,MAAM,oDAAoD;AAClE,UAAQ,KAAK,EAAE;;AAGjB,KAAI,CAAC,QAAQ,KAAK;EAChB,MAAM,UAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,sBAAsB,CAAC;AAClE,MAAI,EAAE,SAAS,QAAQ,IAAI,CAAC,SAAS;AACnC,KAAE,IAAI,KAAK,aAAa;AACxB;;;AAIJ,OAAM,OAAO,KAAK,6BAA6B,YAAY,oBAAoB;AAC/E,SAAQ,IAAI,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { n as CONFIG_DIR, s as VERSION } from "./constants.mjs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
//#region src/update-check.ts
|
|
5
|
+
const PACKAGE_NAME = "@agi-ventures-canada/hackathon-cli";
|
|
6
|
+
const CHECK_FILE = join(CONFIG_DIR, "update-check.json");
|
|
7
|
+
const CHECK_INTERVAL_MS = 14400 * 1e3;
|
|
8
|
+
function readCache() {
|
|
9
|
+
if (!existsSync(CHECK_FILE)) return null;
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(readFileSync(CHECK_FILE, "utf-8"));
|
|
12
|
+
} catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function writeCache(data) {
|
|
17
|
+
try {
|
|
18
|
+
writeFileSync(CHECK_FILE, JSON.stringify(data) + "\n", { mode: 384 });
|
|
19
|
+
} catch {}
|
|
20
|
+
}
|
|
21
|
+
async function fetchLatestVersion() {
|
|
22
|
+
try {
|
|
23
|
+
const controller = new AbortController();
|
|
24
|
+
const timeout = setTimeout(() => controller.abort(), 3e3);
|
|
25
|
+
const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, { signal: controller.signal });
|
|
26
|
+
clearTimeout(timeout);
|
|
27
|
+
if (!res.ok) return null;
|
|
28
|
+
return (await res.json()).version ?? null;
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function compareVersions(a, b) {
|
|
34
|
+
const pa = a.split(".").map(Number);
|
|
35
|
+
const pb = b.split(".").map(Number);
|
|
36
|
+
for (let i = 0; i < 3; i++) {
|
|
37
|
+
if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1;
|
|
38
|
+
if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1;
|
|
39
|
+
}
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
async function checkForUpdate() {
|
|
43
|
+
const cache = readCache();
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {
|
|
46
|
+
if (compareVersions("0.1.0", cache.latestVersion) < 0) return {
|
|
47
|
+
current: VERSION,
|
|
48
|
+
latest: cache.latestVersion
|
|
49
|
+
};
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const latest = await fetchLatestVersion();
|
|
53
|
+
if (!latest) return null;
|
|
54
|
+
writeCache({
|
|
55
|
+
lastChecked: now,
|
|
56
|
+
latestVersion: latest
|
|
57
|
+
});
|
|
58
|
+
if (compareVersions("0.1.0", latest) < 0) return {
|
|
59
|
+
current: VERSION,
|
|
60
|
+
latest
|
|
61
|
+
};
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function formatUpdateNotice(info) {
|
|
65
|
+
return `\nUpdate available: ${info.current} → ${info.latest}\nRun \`hackathon update\` to update`;
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { checkForUpdate, formatUpdateNotice };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=update-check.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.mjs","names":[],"sources":["../../src/update-check.ts"],"sourcesContent":["import { existsSync, readFileSync, writeFileSync } from \"node:fs\"\nimport { join } from \"node:path\"\nimport { CONFIG_DIR, VERSION } from \"./constants.js\"\n\nconst PACKAGE_NAME = \"@agi-ventures-canada/hackathon-cli\"\nconst CHECK_FILE = join(CONFIG_DIR, \"update-check.json\")\nconst CHECK_INTERVAL_MS = 4 * 60 * 60 * 1000 // 4 hours\n\ninterface UpdateCheckCache {\n lastChecked: number\n latestVersion: string\n}\n\nfunction readCache(): UpdateCheckCache | null {\n if (!existsSync(CHECK_FILE)) return null\n try {\n return JSON.parse(readFileSync(CHECK_FILE, \"utf-8\")) as UpdateCheckCache\n } catch {\n return null\n }\n}\n\nfunction writeCache(data: UpdateCheckCache): void {\n try {\n writeFileSync(CHECK_FILE, JSON.stringify(data) + \"\\n\", { mode: 0o600 })\n } catch {\n // Silently ignore write failures\n }\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 3000)\n const res = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n { signal: controller.signal }\n )\n clearTimeout(timeout)\n if (!res.ok) return null\n const data = (await res.json()) as { version?: string }\n return data.version ?? null\n } catch {\n return null\n }\n}\n\nfunction compareVersions(a: string, b: string): number {\n const pa = a.split(\".\").map(Number)\n const pb = b.split(\".\").map(Number)\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return -1\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return 1\n }\n return 0\n}\n\nexport interface UpdateInfo {\n current: string\n latest: string\n}\n\nexport async function checkForUpdate(): Promise<UpdateInfo | null> {\n const cache = readCache()\n const now = Date.now()\n\n if (cache && now - cache.lastChecked < CHECK_INTERVAL_MS) {\n if (compareVersions(VERSION, cache.latestVersion) < 0) {\n return { current: VERSION, latest: cache.latestVersion }\n }\n return null\n }\n\n const latest = await fetchLatestVersion()\n if (!latest) return null\n\n writeCache({ lastChecked: now, latestVersion: latest })\n\n if (compareVersions(VERSION, latest) < 0) {\n return { current: VERSION, latest }\n }\n return null\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `\\nUpdate available: ${info.current} → ${info.latest}\\nRun \\`hackathon update\\` to update`\n}\n"],"mappings":";;;;AAIA,MAAM,eAAe;AACrB,MAAM,aAAa,KAAK,YAAY,oBAAoB;AACxD,MAAM,oBAAoB,QAAc;AAOxC,SAAS,YAAqC;AAC5C,KAAI,CAAC,WAAW,WAAW,CAAE,QAAO;AACpC,KAAI;AACF,SAAO,KAAK,MAAM,aAAa,YAAY,QAAQ,CAAC;SAC9C;AACN,SAAO;;;AAIX,SAAS,WAAW,MAA8B;AAChD,KAAI;AACF,gBAAc,YAAY,KAAK,UAAU,KAAK,GAAG,MAAM,EAAE,MAAM,KAAO,CAAC;SACjE;;AAKV,eAAe,qBAA6C;AAC1D,KAAI;EACF,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;EAC1D,MAAM,MAAM,MAAM,MAChB,8BAA8B,aAAa,UAC3C,EAAE,QAAQ,WAAW,QAAQ,CAC9B;AACD,eAAa,QAAQ;AACrB,MAAI,CAAC,IAAI,GAAI,QAAO;AAEpB,UADc,MAAM,IAAI,MAAM,EAClB,WAAW;SACjB;AACN,SAAO;;;AAIX,SAAS,gBAAgB,GAAW,GAAmB;CACrD,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;CACnC,MAAM,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,OAAO;AACnC,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;AACxC,OAAK,GAAG,MAAM,MAAM,GAAG,MAAM,GAAI,QAAO;;AAE1C,QAAO;;AAQT,eAAsB,iBAA6C;CACjE,MAAM,QAAQ,WAAW;CACzB,MAAM,MAAM,KAAK,KAAK;AAEtB,KAAI,SAAS,MAAM,MAAM,cAAc,mBAAmB;AACxD,MAAI,gBAAA,SAAyB,MAAM,cAAc,GAAG,EAClD,QAAO;GAAE,SAAS;GAAS,QAAQ,MAAM;GAAe;AAE1D,SAAO;;CAGT,MAAM,SAAS,MAAM,oBAAoB;AACzC,KAAI,CAAC,OAAQ,QAAO;AAEpB,YAAW;EAAE,aAAa;EAAK,eAAe;EAAQ,CAAC;AAEvD,KAAI,gBAAA,SAAyB,OAAO,GAAG,EACrC,QAAO;EAAE,SAAS;EAAS;EAAQ;AAErC,QAAO;;AAGT,SAAgB,mBAAmB,MAA0B;AAC3D,QAAO,uBAAuB,KAAK,QAAQ,KAAK,KAAK,OAAO"}
|
package/dist/_chunks/update.mjs
CHANGED
|
@@ -21,7 +21,7 @@ function parseUpdateOptions(args) {
|
|
|
21
21
|
}
|
|
22
22
|
async function runHackathonsUpdate(client, idOrSlug, args) {
|
|
23
23
|
if (!idOrSlug) {
|
|
24
|
-
console.error("Usage:
|
|
24
|
+
console.error("Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]");
|
|
25
25
|
process.exit(1);
|
|
26
26
|
}
|
|
27
27
|
const options = parseUpdateOptions(args);
|
|
@@ -34,12 +34,12 @@ async function runHackathonsUpdate(client, idOrSlug, args) {
|
|
|
34
34
|
console.error("Error: provide at least one field to update (--name, --slug, --description)");
|
|
35
35
|
process.exit(1);
|
|
36
36
|
}
|
|
37
|
-
const hackathon = await client.patch(`/api/dashboard/hackathons/${id}`, body);
|
|
37
|
+
const hackathon = await client.patch(`/api/dashboard/hackathons/${id}/settings`, body);
|
|
38
38
|
if (options.json) {
|
|
39
39
|
console.log(formatJson(hackathon));
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
console.log(formatSuccess(`Updated hackathon "${hackathon.name}"`));
|
|
42
|
+
console.log(formatSuccess(`Updated hackathon "${hackathon.name ?? id}"`));
|
|
43
43
|
}
|
|
44
44
|
//#endregion
|
|
45
45
|
export { runHackathonsUpdate };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"update.mjs","names":[],"sources":["../../src/commands/hackathons/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Hackathon } from \"../../types.js\"\nimport { resolveHackathonId } from \"./resolve.js\"\n\ninterface UpdateOptions {\n name?: string\n slug?: string\n description?: string\n json?: boolean\n}\n\nexport function parseUpdateOptions(args: string[]): UpdateOptions {\n const options: UpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--slug\":\n options.slug = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runHackathonsUpdate(\n client: OatmealClient,\n idOrSlug: string,\n args: string[]\n): Promise<void> {\n if (!idOrSlug) {\n console.error(\"Usage: hackathon events update <id-or-slug> [--name ...] [--slug ...] [--description ...]\")\n process.exit(1)\n }\n\n const options = parseUpdateOptions(args)\n const id = await resolveHackathonId(client, idOrSlug)\n\n const body: Record<string, string> = {}\n if (options.name) body.name = options.name\n if (options.slug) body.slug = options.slug\n if (options.description) body.description = options.description\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update (--name, --slug, --description)\")\n process.exit(1)\n }\n\n const hackathon = await client.patch<Hackathon>(`/api/dashboard/hackathons/${id}/settings`, body)\n\n if (options.json) {\n console.log(formatJson(hackathon))\n return\n }\n\n console.log(formatSuccess(`Updated hackathon \"${hackathon.name ?? id}\"`))\n}\n"],"mappings":";;;AAYA,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,UAAyB,EAAE;AACjC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,oBACpB,QACA,UACA,MACe;AACf,KAAI,CAAC,UAAU;AACb,UAAQ,MAAM,4FAA4F;AAC1G,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,mBAAmB,KAAK;CACxC,MAAM,KAAK,MAAM,mBAAmB,QAAQ,SAAS;CAErD,MAAM,OAA+B,EAAE;AACvC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AAEpD,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8EAA8E;AAC5F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,YAAY,MAAM,OAAO,MAAiB,6BAA6B,GAAG,YAAY,KAAK;AAEjG,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,UAAU,CAAC;AAClC;;AAGF,SAAQ,IAAI,cAAc,sBAAsB,UAAU,QAAQ,GAAG,GAAG,CAAC"}
|
package/dist/_chunks/update2.mjs
CHANGED
|
@@ -20,7 +20,7 @@ function parseJudgeDisplayUpdateOptions(args) {
|
|
|
20
20
|
}
|
|
21
21
|
async function runJudgeDisplayUpdate(client, hackathonId, profileId, args) {
|
|
22
22
|
if (!profileId) {
|
|
23
|
-
console.error("Usage:
|
|
23
|
+
console.error("Usage: hackathon judge-display update <hackathon-id> <profile-id> [--name ...]");
|
|
24
24
|
process.exit(1);
|
|
25
25
|
}
|
|
26
26
|
const options = parseJudgeDisplayUpdateOptions(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update2.mjs","names":[],"sources":["../../src/commands/judge-display/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgeDisplayProfile } from \"../../types.js\"\n\ninterface JudgeDisplayUpdateOptions {\n name?: string\n title?: string\n bio?: string\n json?: boolean\n}\n\nexport function parseJudgeDisplayUpdateOptions(args: string[]): JudgeDisplayUpdateOptions {\n const options: JudgeDisplayUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--title\":\n options.title = args[++i]\n break\n case \"--bio\":\n options.bio = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJudgeDisplayUpdate(\n client: OatmealClient,\n hackathonId: string,\n profileId: string,\n args: string[]\n): Promise<void> {\n if (!profileId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"update2.mjs","names":[],"sources":["../../src/commands/judge-display/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { JudgeDisplayProfile } from \"../../types.js\"\n\ninterface JudgeDisplayUpdateOptions {\n name?: string\n title?: string\n bio?: string\n json?: boolean\n}\n\nexport function parseJudgeDisplayUpdateOptions(args: string[]): JudgeDisplayUpdateOptions {\n const options: JudgeDisplayUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--title\":\n options.title = args[++i]\n break\n case \"--bio\":\n options.bio = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runJudgeDisplayUpdate(\n client: OatmealClient,\n hackathonId: string,\n profileId: string,\n args: string[]\n): Promise<void> {\n if (!profileId) {\n console.error(\"Usage: hackathon judge-display update <hackathon-id> <profile-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parseJudgeDisplayUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.title) body.title = options.title\n if (options.bio) body.bio = options.bio\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const profile = await client.patch<JudgeDisplayProfile>(\n `/api/dashboard/hackathons/${hackathonId}/judges/display/${profileId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(profile))\n return\n }\n\n console.log(formatSuccess(`Updated judge display profile \"${profile.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,+BAA+B,MAA2C;CACxF,MAAM,UAAqC,EAAE;AAC7C,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,MAAM,KAAK,EAAE;AACrB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,sBACpB,QACA,aACA,WACA,MACe;AACf,KAAI,CAAC,WAAW;AACd,UAAQ,MAAM,iFAAiF;AAC/F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,+BAA+B,KAAK;CACpD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AACxC,KAAI,QAAQ,IAAK,MAAK,MAAM,QAAQ;AAEpC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,MAAM,OAAO,MAC3B,6BAA6B,YAAY,kBAAkB,aAC3D,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,QAAQ,CAAC;AAChC;;AAGF,SAAQ,IAAI,cAAc,kCAAkC,QAAQ,KAAK,GAAG,CAAC"}
|
package/dist/_chunks/update3.mjs
CHANGED
|
@@ -23,7 +23,7 @@ function parsePrizeUpdateOptions(args) {
|
|
|
23
23
|
}
|
|
24
24
|
async function runPrizesUpdate(client, hackathonId, prizeId, args) {
|
|
25
25
|
if (!prizeId) {
|
|
26
|
-
console.error("Usage:
|
|
26
|
+
console.error("Usage: hackathon prizes update <hackathon-id> <prize-id> [--name ...]");
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
|
29
29
|
const options = parsePrizeUpdateOptions(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update3.mjs","names":[],"sources":["../../src/commands/prizes/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\ninterface PrizeUpdateOptions {\n name?: string\n description?: string\n type?: string\n value?: string\n json?: boolean\n}\n\nexport function parsePrizeUpdateOptions(args: string[]): PrizeUpdateOptions {\n const options: PrizeUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--type\":\n options.type = args[++i]\n break\n case \"--value\":\n options.value = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runPrizesUpdate(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n args: string[]\n): Promise<void> {\n if (!prizeId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"update3.mjs","names":[],"sources":["../../src/commands/prizes/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Prize } from \"../../types.js\"\n\ninterface PrizeUpdateOptions {\n name?: string\n description?: string\n type?: string\n value?: string\n json?: boolean\n}\n\nexport function parsePrizeUpdateOptions(args: string[]): PrizeUpdateOptions {\n const options: PrizeUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--description\":\n options.description = args[++i]\n break\n case \"--type\":\n options.type = args[++i]\n break\n case \"--value\":\n options.value = args[++i]\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runPrizesUpdate(\n client: OatmealClient,\n hackathonId: string,\n prizeId: string,\n args: string[]\n): Promise<void> {\n if (!prizeId) {\n console.error(\"Usage: hackathon prizes update <hackathon-id> <prize-id> [--name ...]\")\n process.exit(1)\n }\n\n const options = parsePrizeUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.description) body.description = options.description\n if (options.type) body.type = options.type\n if (options.value) body.value = options.value\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const prize = await client.patch<Prize>(\n `/api/dashboard/hackathons/${hackathonId}/prizes/${prizeId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(prize))\n return\n }\n\n console.log(formatSuccess(`Updated prize \"${prize.name}\"`))\n}\n"],"mappings":";;AAYA,SAAgB,wBAAwB,MAAoC;CAC1E,MAAM,UAA8B,EAAE;AACtC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,cAAc,KAAK,EAAE;AAC7B;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,QAAQ,KAAK,EAAE;AACvB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,gBACpB,QACA,aACA,SACA,MACe;AACf,KAAI,CAAC,SAAS;AACZ,UAAQ,MAAM,wEAAwE;AACtF,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,wBAAwB,KAAK;CAC7C,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,YAAa,MAAK,cAAc,QAAQ;AACpD,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,MAAO,MAAK,QAAQ,QAAQ;AAExC,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,QAAQ,MAAM,OAAO,MACzB,6BAA6B,YAAY,UAAU,WACnD,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,MAAM,CAAC;AAC9B;;AAGF,SAAQ,IAAI,cAAc,kBAAkB,MAAM,KAAK,GAAG,CAAC"}
|
package/dist/_chunks/update4.mjs
CHANGED
|
@@ -23,7 +23,7 @@ function parseScheduleUpdateOptions(args) {
|
|
|
23
23
|
}
|
|
24
24
|
async function runSchedulesUpdate(client, scheduleId, args) {
|
|
25
25
|
if (!scheduleId) {
|
|
26
|
-
console.error("Usage:
|
|
26
|
+
console.error("Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]");
|
|
27
27
|
process.exit(1);
|
|
28
28
|
}
|
|
29
29
|
const options = parseScheduleUpdateOptions(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage:
|
|
1
|
+
{"version":3,"file":"update4.mjs","names":[],"sources":["../../src/commands/schedules/update.ts"],"sourcesContent":["import type { OatmealClient } from \"../../client.js\"\nimport { formatJson, formatSuccess } from \"../../output.js\"\nimport type { Schedule } from \"../../types.js\"\n\ninterface ScheduleUpdateOptions {\n name?: string\n cron?: string\n enabled?: boolean\n json?: boolean\n}\n\nexport function parseScheduleUpdateOptions(args: string[]): ScheduleUpdateOptions {\n const options: ScheduleUpdateOptions = {}\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--name\":\n options.name = args[++i]\n break\n case \"--cron\":\n options.cron = args[++i]\n break\n case \"--enable\":\n options.enabled = true\n break\n case \"--disable\":\n options.enabled = false\n break\n case \"--json\":\n options.json = true\n break\n }\n }\n return options\n}\n\nexport async function runSchedulesUpdate(\n client: OatmealClient,\n scheduleId: string,\n args: string[]\n): Promise<void> {\n if (!scheduleId) {\n console.error(\"Usage: hackathon schedules update <schedule-id> [--name ...] [--cron ...]\")\n process.exit(1)\n }\n\n const options = parseScheduleUpdateOptions(args)\n const body: Record<string, unknown> = {}\n if (options.name) body.name = options.name\n if (options.cron) body.cron_expression = options.cron\n if (options.enabled !== undefined) body.enabled = options.enabled\n\n if (Object.keys(body).length === 0) {\n console.error(\"Error: provide at least one field to update\")\n process.exit(1)\n }\n\n const schedule = await client.patch<Schedule>(\n `/api/dashboard/schedules/${scheduleId}`,\n body\n )\n\n if (options.json) {\n console.log(formatJson(schedule))\n return\n }\n\n console.log(formatSuccess(`Updated schedule \"${schedule.name}\"`))\n}\n"],"mappings":";;AAWA,SAAgB,2BAA2B,MAAuC;CAChF,MAAM,UAAiC,EAAE;AACzC,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,IAC/B,SAAQ,KAAK,IAAb;EACE,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,OAAO,KAAK,EAAE;AACtB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,UAAU;AAClB;EACF,KAAK;AACH,WAAQ,OAAO;AACf;;AAGN,QAAO;;AAGT,eAAsB,mBACpB,QACA,YACA,MACe;AACf,KAAI,CAAC,YAAY;AACf,UAAQ,MAAM,4EAA4E;AAC1F,UAAQ,KAAK,EAAE;;CAGjB,MAAM,UAAU,2BAA2B,KAAK;CAChD,MAAM,OAAgC,EAAE;AACxC,KAAI,QAAQ,KAAM,MAAK,OAAO,QAAQ;AACtC,KAAI,QAAQ,KAAM,MAAK,kBAAkB,QAAQ;AACjD,KAAI,QAAQ,YAAY,KAAA,EAAW,MAAK,UAAU,QAAQ;AAE1D,KAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GAAG;AAClC,UAAQ,MAAM,8CAA8C;AAC5D,UAAQ,KAAK,EAAE;;CAGjB,MAAM,WAAW,MAAM,OAAO,MAC5B,4BAA4B,cAC5B,KACD;AAED,KAAI,QAAQ,MAAM;AAChB,UAAQ,IAAI,WAAW,SAAS,CAAC;AACjC;;AAGF,SAAQ,IAAI,cAAc,qBAAqB,SAAS,KAAK,GAAG,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { s as VERSION } from "./constants.mjs";
|
|
2
|
+
import { checkForUpdate } from "./update-check.mjs";
|
|
3
|
+
import pc from "picocolors";
|
|
4
|
+
import { execSync } from "node:child_process";
|
|
5
|
+
//#region src/commands/update.ts
|
|
6
|
+
const PKG = "@agi-ventures-canada/hackathon-cli";
|
|
7
|
+
function detectPackageManager() {
|
|
8
|
+
const execPath = process.env.npm_execpath ?? process.env._ ?? "";
|
|
9
|
+
if (/bun/.test(execPath)) return {
|
|
10
|
+
cmd: "bun",
|
|
11
|
+
install: `bun install -g ${PKG}@latest`
|
|
12
|
+
};
|
|
13
|
+
if (/pnpm/.test(execPath)) return {
|
|
14
|
+
cmd: "pnpm",
|
|
15
|
+
install: `pnpm add -g ${PKG}@latest`
|
|
16
|
+
};
|
|
17
|
+
if (/yarn/.test(execPath)) return {
|
|
18
|
+
cmd: "yarn",
|
|
19
|
+
install: `yarn global add ${PKG}@latest`
|
|
20
|
+
};
|
|
21
|
+
return {
|
|
22
|
+
cmd: "npm",
|
|
23
|
+
install: `npm install -g ${PKG}@latest`
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function runUpdate() {
|
|
27
|
+
console.log(`Current version: ${VERSION}`);
|
|
28
|
+
console.log("Checking for updates...");
|
|
29
|
+
const update = await checkForUpdate();
|
|
30
|
+
if (!update) {
|
|
31
|
+
console.log(pc.green("Already up to date."));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const pm = detectPackageManager();
|
|
35
|
+
console.log(`New version available: ${update.latest}`);
|
|
36
|
+
console.log(`Updating via ${pm.cmd}...`);
|
|
37
|
+
try {
|
|
38
|
+
execSync(pm.install, { stdio: "inherit" });
|
|
39
|
+
console.log(pc.green(`\nUpdated to ${update.latest}`));
|
|
40
|
+
} catch {
|
|
41
|
+
console.error(pc.red("Update failed. Try manually:"));
|
|
42
|
+
console.error(` ${pm.install}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { runUpdate };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=update5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update5.mjs","names":[],"sources":["../../src/commands/update.ts"],"sourcesContent":["import { execSync } from \"node:child_process\"\nimport pc from \"picocolors\"\nimport { VERSION } from \"../constants.js\"\nimport { checkForUpdate } from \"../update-check.js\"\n\nconst PKG = \"@agi-ventures-canada/hackathon-cli\"\n\nfunction detectPackageManager(): { cmd: string; install: string } {\n const execPath = process.env.npm_execpath ?? process.env._ ?? \"\"\n if (/bun/.test(execPath)) return { cmd: \"bun\", install: `bun install -g ${PKG}@latest` }\n if (/pnpm/.test(execPath)) return { cmd: \"pnpm\", install: `pnpm add -g ${PKG}@latest` }\n if (/yarn/.test(execPath)) return { cmd: \"yarn\", install: `yarn global add ${PKG}@latest` }\n return { cmd: \"npm\", install: `npm install -g ${PKG}@latest` }\n}\n\nexport async function runUpdate(): Promise<void> {\n console.log(`Current version: ${VERSION}`)\n console.log(\"Checking for updates...\")\n\n const update = await checkForUpdate()\n if (!update) {\n console.log(pc.green(\"Already up to date.\"))\n return\n }\n\n const pm = detectPackageManager()\n console.log(`New version available: ${update.latest}`)\n console.log(`Updating via ${pm.cmd}...`)\n\n try {\n execSync(pm.install, { stdio: \"inherit\" })\n console.log(pc.green(`\\nUpdated to ${update.latest}`))\n } catch {\n console.error(pc.red(\"Update failed. Try manually:\"))\n console.error(` ${pm.install}`)\n process.exit(1)\n }\n}\n"],"mappings":";;;;;AAKA,MAAM,MAAM;AAEZ,SAAS,uBAAyD;CAChE,MAAM,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,KAAK;AAC9D,KAAI,MAAM,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAO,SAAS,kBAAkB,IAAI;EAAU;AACxF,KAAI,OAAO,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAQ,SAAS,eAAe,IAAI;EAAU;AACvF,KAAI,OAAO,KAAK,SAAS,CAAE,QAAO;EAAE,KAAK;EAAQ,SAAS,mBAAmB,IAAI;EAAU;AAC3F,QAAO;EAAE,KAAK;EAAO,SAAS,kBAAkB,IAAI;EAAU;;AAGhE,eAAsB,YAA2B;AAC/C,SAAQ,IAAI,oBAAoB,UAAU;AAC1C,SAAQ,IAAI,0BAA0B;CAEtC,MAAM,SAAS,MAAM,gBAAgB;AACrC,KAAI,CAAC,QAAQ;AACX,UAAQ,IAAI,GAAG,MAAM,sBAAsB,CAAC;AAC5C;;CAGF,MAAM,KAAK,sBAAsB;AACjC,SAAQ,IAAI,0BAA0B,OAAO,SAAS;AACtD,SAAQ,IAAI,gBAAgB,GAAG,IAAI,KAAK;AAExC,KAAI;AACF,WAAS,GAAG,SAAS,EAAE,OAAO,WAAW,CAAC;AAC1C,UAAQ,IAAI,GAAG,MAAM,gBAAgB,OAAO,SAAS,CAAC;SAChD;AACN,UAAQ,MAAM,GAAG,IAAI,+BAA+B,CAAC;AACrD,UAAQ,MAAM,KAAK,GAAG,UAAU;AAChC,UAAQ,KAAK,EAAE"}
|