@crossmint/cli 1.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/README.md +111 -0
- package/build-pkg.js +13 -0
- package/dist/bin/crossmint.d.ts +3 -0
- package/dist/bin/crossmint.d.ts.map +1 -0
- package/dist/bin/crossmint.js +18 -0
- package/dist/commands/keys/create.d.ts +2 -0
- package/dist/commands/keys/create.d.ts.map +1 -0
- package/dist/commands/keys/create.js +2 -0
- package/dist/commands/keys/create.test.d.ts +2 -0
- package/dist/commands/keys/create.test.d.ts.map +1 -0
- package/dist/commands/keys/delete.d.ts +2 -0
- package/dist/commands/keys/delete.d.ts.map +1 -0
- package/dist/commands/keys/delete.js +1 -0
- package/dist/commands/keys/delete.test.d.ts +2 -0
- package/dist/commands/keys/delete.test.d.ts.map +1 -0
- package/dist/commands/keys/edit.d.ts +2 -0
- package/dist/commands/keys/edit.d.ts.map +1 -0
- package/dist/commands/keys/edit.js +2 -0
- package/dist/commands/keys/edit.test.d.ts +2 -0
- package/dist/commands/keys/edit.test.d.ts.map +1 -0
- package/dist/commands/keys/index.d.ts +5 -0
- package/dist/commands/keys/index.d.ts.map +1 -0
- package/dist/commands/keys/index.js +11 -0
- package/dist/commands/keys/list.d.ts +3 -0
- package/dist/commands/keys/list.d.ts.map +1 -0
- package/dist/commands/keys/list.js +10 -0
- package/dist/commands/keys/list.test.d.ts +2 -0
- package/dist/commands/keys/list.test.d.ts.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +1 -0
- package/dist/commands/login.test.d.ts +2 -0
- package/dist/commands/login.test.d.ts.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +1 -0
- package/dist/commands/projects/create.d.ts +6 -0
- package/dist/commands/projects/create.d.ts.map +1 -0
- package/dist/commands/projects/create.js +6 -0
- package/dist/commands/projects/create.test.d.ts +2 -0
- package/dist/commands/projects/create.test.d.ts.map +1 -0
- package/dist/commands/projects/details.d.ts +2 -0
- package/dist/commands/projects/details.d.ts.map +1 -0
- package/dist/commands/projects/details.js +2 -0
- package/dist/commands/projects/details.test.d.ts +2 -0
- package/dist/commands/projects/details.test.d.ts.map +1 -0
- package/dist/commands/projects/index.d.ts +4 -0
- package/dist/commands/projects/index.d.ts.map +1 -0
- package/dist/commands/projects/index.js +7 -0
- package/dist/commands/projects/select.d.ts +2 -0
- package/dist/commands/projects/select.d.ts.map +1 -0
- package/dist/commands/projects/select.js +1 -0
- package/dist/commands/projects/select.test.d.ts +2 -0
- package/dist/commands/projects/select.test.d.ts.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +1 -0
- package/dist/types/keys.d.ts +11 -0
- package/dist/types/keys.d.ts.map +1 -0
- package/dist/types/keys.js +0 -0
- package/dist/utils/Pager.d.ts +9 -0
- package/dist/utils/Pager.d.ts.map +1 -0
- package/dist/utils/Pager.js +2 -0
- package/dist/utils/Pager.test.d.ts +2 -0
- package/dist/utils/Pager.test.d.ts.map +1 -0
- package/dist/utils/fetch.d.ts +5 -0
- package/dist/utils/fetch.d.ts.map +1 -0
- package/dist/utils/fetch.js +1 -0
- package/dist/utils/getProject.d.ts +4 -0
- package/dist/utils/getProject.d.ts.map +1 -0
- package/dist/utils/getProject.js +1 -0
- package/dist/utils/getWhitelistedOriginsAndAppIdentifiersPrompt.d.ts +6 -0
- package/dist/utils/getWhitelistedOriginsAndAppIdentifiersPrompt.d.ts.map +1 -0
- package/dist/utils/getWhitelistedOriginsAndAppIdentifiersPrompt.js +2 -0
- package/dist/utils/keytar.d.ts +4 -0
- package/dist/utils/keytar.d.ts.map +1 -0
- package/dist/utils/keytar.js +1 -0
- package/dist/utils/oauth/codeChallenge.d.ts +3 -0
- package/dist/utils/oauth/codeChallenge.d.ts.map +1 -0
- package/dist/utils/oauth/codeChallenge.js +1 -0
- package/dist/utils/oauth/getStytchConfig.d.ts +6 -0
- package/dist/utils/oauth/getStytchConfig.d.ts.map +1 -0
- package/dist/utils/oauth/getStytchConfig.js +1 -0
- package/dist/utils/oauth/server.d.ts +3 -0
- package/dist/utils/oauth/server.d.ts.map +1 -0
- package/dist/utils/oauth/server.js +1 -0
- package/dist/utils/scopes.d.ts +14 -0
- package/dist/utils/scopes.d.ts.map +1 -0
- package/dist/utils/scopes.js +1 -0
- package/dist/utils/spinner.d.ts +6 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js +1 -0
- package/dist/utils/store.d.ts +11 -0
- package/dist/utils/store.d.ts.map +1 -0
- package/dist/utils/store.js +1 -0
- package/dist/utils/urls.d.ts +9 -0
- package/dist/utils/urls.d.ts.map +1 -0
- package/dist/utils/urls.js +1 -0
- package/package.json +50 -0
- package/shims/prelude.js +33 -0
- package/src/bin/crossmint.ts +34 -0
- package/src/commands/keys/create.test.ts +230 -0
- package/src/commands/keys/create.ts +96 -0
- package/src/commands/keys/delete.test.ts +87 -0
- package/src/commands/keys/delete.ts +36 -0
- package/src/commands/keys/edit.test.ts +159 -0
- package/src/commands/keys/edit.ts +98 -0
- package/src/commands/keys/index.ts +4 -0
- package/src/commands/keys/list.test.ts +123 -0
- package/src/commands/keys/list.ts +83 -0
- package/src/commands/login.test.ts +87 -0
- package/src/commands/login.ts +59 -0
- package/src/commands/logout.ts +9 -0
- package/src/commands/projects/create.test.ts +82 -0
- package/src/commands/projects/create.ts +45 -0
- package/src/commands/projects/details.test.ts +64 -0
- package/src/commands/projects/details.ts +36 -0
- package/src/commands/projects/index.ts +3 -0
- package/src/commands/projects/select.test.ts +86 -0
- package/src/commands/projects/select.ts +50 -0
- package/src/commands/whoami.ts +19 -0
- package/src/types/keys.ts +13 -0
- package/src/utils/Pager.test.ts +70 -0
- package/src/utils/Pager.ts +34 -0
- package/src/utils/fetch.ts +63 -0
- package/src/utils/getProject.ts +10 -0
- package/src/utils/getWhitelistedOriginsAndAppIdentifiersPrompt.ts +52 -0
- package/src/utils/keytar.ts +15 -0
- package/src/utils/oauth/codeChallenge.ts +18 -0
- package/src/utils/oauth/getStytchConfig.ts +28 -0
- package/src/utils/oauth/server.ts +66 -0
- package/src/utils/scopes.ts +66 -0
- package/src/utils/spinner.ts +20 -0
- package/src/utils/store.ts +38 -0
- package/src/utils/urls.ts +11 -0
- package/tsconfig.json +35 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsup.config.ts +11 -0
- package/vitest.config.ts +9 -0
- package/vitest.setup.ts +8 -0
package/README.md
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Crossmint CLI Setup Guide
|
|
2
|
+
|
|
3
|
+
## Install and Configure the Crossmint CLI
|
|
4
|
+
|
|
5
|
+
### 1️⃣ Install Dependencies
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
pnpm install
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### 2️⃣ Build the CLI
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
pnpm build
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 4️⃣ Link the CLI Globally
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
pnpm link --global
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 5️⃣ Verify the CLI is Installed
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
crossmint --help
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Development Mode (Auto-Reload)
|
|
32
|
+
|
|
33
|
+
To automatically rebuild and relink on changes:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
pnpm dev
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Troubleshooting Issues
|
|
42
|
+
|
|
43
|
+
### **Issue: `zsh: command not found: crossmint`**
|
|
44
|
+
|
|
45
|
+
#### **Fix:** Ensure the CLI is linked globally:
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
pnpm unlink --global
|
|
49
|
+
pnpm link --global
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Then, verify it’s linked:
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
pnpm bin -g
|
|
56
|
+
ls -l $(pnpm bin -g)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### **Issue: `pnpm bin -g` is empty or returns an error**
|
|
60
|
+
|
|
61
|
+
#### **Fix:** The global bin directory is missing or not in `PATH`. Run:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
pnpm config set global-bin-dir ~/.local/bin
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Then, add it to your PATH:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
|
|
71
|
+
source ~/.zshrc
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Then, relink the CLI:
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
pnpm unlink --global
|
|
78
|
+
pnpm link --global
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Releasing
|
|
82
|
+
|
|
83
|
+
For releasing you will need to modify the package.json version. You can do this by running
|
|
84
|
+
|
|
85
|
+
```sh
|
|
86
|
+
pnpm version <patch|minor|major>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Then you'll have to commit the package change and include it in your PR.
|
|
90
|
+
|
|
91
|
+
## For Running a Production Build
|
|
92
|
+
|
|
93
|
+
First build the js dist for pkg
|
|
94
|
+
|
|
95
|
+
```sh
|
|
96
|
+
pnpm build:pkg
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Notice that this will break the pnpm linked bin, you can fix it by running later `pnpm build`.
|
|
100
|
+
|
|
101
|
+
Then run to create the binary:
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
pnpm exec pkg dist/bin/crossmint.js --targets node20-macos-arm64 --output build/cli
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Then try the package by running:
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
./build/cli help
|
|
111
|
+
```
|
package/build-pkg.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { build } from "esbuild";
|
|
2
|
+
|
|
3
|
+
await build({
|
|
4
|
+
entryPoints: ["src/bin/crossmint.ts"],
|
|
5
|
+
outfile: "dist/bin/crossmint.js",
|
|
6
|
+
bundle: true,
|
|
7
|
+
platform: "node",
|
|
8
|
+
target: "node20",
|
|
9
|
+
format: "cjs",
|
|
10
|
+
sourcemap: true,
|
|
11
|
+
external: ["keytar"],
|
|
12
|
+
inject: ["./shims/prelude.js"],
|
|
13
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crossmint.d.ts","sourceRoot":"","sources":["../../src/bin/crossmint.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var ue=Object.defineProperty;var n=(t,e)=>ue(t,"name",{value:e,configurable:!0});var ge=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var fe=ge((nn,et)=>{et.exports={name:"@crossmint/cli",version:"1.1.2",description:"",keywords:[],license:"ISC",author:"",type:"module",main:"dist/bin/crossmint.js",bin:{crossmint:"dist/bin/crossmint.js"},scripts:{build:"tsup --env.NODE_ENV production","build:pkg":"node ./build-pkg.js",bump:"node ./scripts/bump.mjs",dev:"tsup --watch --env.NODE_ENV development",start:"pnpm build && node dist/bin/crossmint.js","test:vitest":"vitest run","test:vitest:watch":"vitest"},dependencies:{"@crossmint/common-consts":"workspace:*","@crossmint/common-string-utils":"workspace:*","@crossmint/common-types":"workspace:*","@crossmint/data-dbs-types":"workspace:*","@crossmint/products-console-types":"workspace:*","@inquirer/prompts":"7.4.0",chalk:"4.1.2",commander:"12.0.0",keytar:"7.9.0",nanospinner:"1.2.2",open:"9.1.0"},devDependencies:{"@crossmint/tsconfig":"workspace:*","@crossmint/tsupconfig":"workspace:*","@crossmint/vitestconfig":"workspace:*","@types/node":"20.14.8","@yao-pkg/pkg":"6.3.2",esbuild:"0.25.2",vitest:"2.1.9"},pkg:{scripts:"dist/bin/crossmint.js",assets:[],targets:["node20-macos-arm64","node20-linux-x64","node20-macos-x64"],outputPath:"build"}}});import{program as I}from"commander";var he={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function v(t){return he[t]}n(v,"getCrossmintUrl");import R from"keytar";var V="crossmint-cli";async function S(t,e){return R.setPassword(V,t,e)}n(S,"set");async function C(t){return R.getPassword(V,t)}n(C,"get");async function b(t){return R.deletePassword(V,t)}n(b,"del");function X(t){return S("environment",t)}n(X,"setEnvironment");async function y(){return C("environment")}n(y,"getEnvironment");async function Z(){return b("environment")}n(Z,"deleteEnvironment");function ee(t){return S("sessionToken",t)}n(ee,"setSessionToken");async function te(){return C("sessionToken")}n(te,"getSessionToken");async function oe(){return b("sessionToken")}n(oe,"deleteSessionToken");function E(t){return S("projectId",t)}n(E,"setProjectId");async function w(){return C("projectId")}n(w,"getProjectId");async function re(){return b("projectId")}n(re,"deleteProjectId");import{select as ve}from"@inquirer/prompts";import{HttpMethods as W}from"@crossmint/common-consts";async function d(t,e=W.GET,o){let r=await te(),a=await y();r||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),a||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let s=`${v(a)}${t}`;return k(s,e,o,{Cookie:`sessionToken=${r}`})}n(d,"fetchAuthenticated");async function ne(t,e=W.GET,o){let r=await y();r||(console.error("\u274C Environment not found"),process.exit(1));let a=`${v(r)}${t}`;return k(a,e,o)}n(ne,"fetchUnauthenticated");async function k(t,e=W.GET,o,r){let a={method:e,headers:{"Content-Type":"application/json",...r}};o&&(a.body=JSON.stringify(o));let s=await fetch(t,a);if(s.status>=400){let i=await s.json();throw new Error(`${i.message}`)}return await s.json()}n(k,"fetchJSON");import{routes as we}from"@crossmint/common-consts";import{select as Pe}from"@inquirer/prompts";import{createSpinner as ye}from"nanospinner";function g(t){let e=ye(t),o={start:n(r=>(e.start({text:r}),o),"start"),succeed:n(r=>(e.success({text:r}),o),"succeed"),fail:n(r=>(e.error({text:r}),o),"fail")};return o}n(g,"createSpinner");async function A(){let t=g("Fetching projects...").start();try{let e=await d(we.api.projects);if(!e||e.length===0)return t.fail("No projects found. Create a new project using `crossmint project create`"),process.exit(0);if(t.succeed("Fetched projects"),e.length===1){let r=e[0];return console.log(`You only have one project: ${r.name}`),console.log("To create another project, run `crossmint project create`"),await E(r.id),console.log(`\u2705 Project ${r.name} selected`),process.exit(0)}let o=await Pe({message:"Select a project:",choices:e.map(r=>({name:r.name,value:r,description:r.description}))});await E(o.id),console.log(`\u2705 Project ${o.name} selected`),process.exit(0)}catch{t.fail("Failed to fetch projects"),process.exit(1)}}n(A,"selectProject");import Ie from"open";import ie from"crypto";async function se(){let e=ie.randomBytes(32).toString("base64url"),r=ie.createHash("sha256").update(e).digest().toString("base64url");return await S("pkceCodeVerifier",e),r}n(se,"generateCodeChallenge");async function ce(){return await C("pkceCodeVerifier")}n(ce,"getCodeVerifier");import je from"http";import{HttpMethods as ae}from"@crossmint/common-consts";import{routes as pe}from"@crossmint/common-consts";async function K(){let t=await y();return t||(console.error("\u274C Environment not found"),process.exit(1)),t==="local"?{uri:"test.stytch.com",projectId:"project-test-8eb55d3d-949f-4e0f-aea6-c9ba740f7813",clientId:"connected-app-test-4d27d6d8-3491-45c8-9bb0-b05f89cb7a1a"}:t==="staging"?{uri:"api.stytch.com",projectId:"project-live-b7c564af-0c0d-4662-bfc0-72bed1049cfe",clientId:"connected-app-live-47cd5bf1-c155-42c1-9f36-5d35853b34a7"}:{uri:"api.stytch.com",projectId:"project-live-7a1cb98d-b8b7-4471-aaf6-f8af67a0df94",clientId:"connected-app-live-a72edd7e-6ff3-4002-a13a-e7ca66354bd1"}}n(K,"getStytchConfig");async function B(t){return new Promise((e,o)=>{let r=je.createServer(async(s,i)=>{try{let c=new URL(s.url||"",`http://${s.headers.host}`).searchParams.get("code");if(!c){i.writeHead(400,{"Content-Type":"text/plain"}),i.end("No code provided");return}let h=await K(),f=await k(`https://${h.uri}/v1/public/${h.projectId}/oauth2/token`,ae.POST,{grant_type:"authorization_code",code:c,client_id:h.clientId,redirect_uri:"http://127.0.0.1:3456/callback",code_verifier:await ce()}),u=await ne(pe.authentication.exchangeAccessToken,ae.POST,{accessToken:f.access_token});await ee(u.sessionToken),i.writeHead(302,{Location:`${v(t)}${pe.console.authorizeDevice.success}`}),i.end(),r.close(),e(f)}catch(p){i.writeHead(500,{"Content-Type":"text/plain"}),i.end("Error during authentication"),r.close(),o(p)}});r.listen(3456)})}n(B,"server");import{routes as xe}from"@crossmint/common-consts";var Se=!1;async function z(){try{console.log("\u{1F510} Crossmint CLI - Login");let t=await ve({message:"Select environment:",choices:[{name:"Production",value:"production"},{name:"Staging",value:"staging"},...Se?[{name:"Local",value:"local"}]:[]]}),e=v(t);e||(console.error(`Error: No URL found for ${t} environment`),process.exit(1)),await X(t);let o=B(t),{clientId:r}=await K(),s={code_challenge:await se(),code_challenge_method:"S256",scope:"full_access",response_type:"code",grant_type:"authorization_code",redirect_uri:"http://127.0.0.1:3456/callback",client_id:r},i=`${e}${xe.console.authorizeDevice.index(s)}`;console.log("Opening browser for authentication..."),Ie(i),await o,console.log(`\u2705 Login successful! You are now authenticated in the ${t} environment.`),await A()}catch{console.error("\u274C Login failed, please try again."),process.exit(1)}}n(z,"login");import{routes as Ae}from"@crossmint/common-consts";import{routes as Ce}from"@crossmint/common-consts";async function j(t){return(await d(Ce.api.projects)).find(r=>r.id===t)}n(j,"getProject");import{capitalizeFirstLetter as Ee}from"@crossmint/common-string-utils";async function Y(){let t=await y(),e=await w(),o=await j(e||""),r=await d(Ae.authentication.getSession);console.log(`You are logged in to \u{1F340}Crossmint as: ${r.user.email} - Environment: ${Ee(t)} - ${o?`Project: ${o.name}`:"No project selected"}`),process.exit(0)}n(Y,"whoami");async function J(){await oe(),await Z(),await re(),console.log("Logged out"),process.exit(0)}n(J,"logout");import{confirm as be,input as ke}from"@inquirer/prompts";import{HttpMethods as Ke}from"@crossmint/common-consts";import{routes as $e}from"@crossmint/common-consts";async function $(t={}){let e=g();try{let o=t.name;o||(o=await ke({message:"Enter project name:",validate:n(i=>i.length>0||"Project name is required","validate")})),e.start(`\u{1F680} Creating project "${o}" with Smart Wallets...`);let r=await d($e.api.console.projects.index,Ke.POST,{name:o,walletType:"smart_wallet",storageProvider:"ipfs",projectThumbnail:""}),a=JSON.parse(r);e.succeed(`\u2705 Project created successfully!
|
|
3
|
+
|
|
4
|
+
`),console.log(`\u{1F4CC} Project Details:
|
|
5
|
+
Name: ${o}
|
|
6
|
+
ID: ${a.kableClientId}
|
|
7
|
+
`),await be({message:"Do you want to select this project?"})&&(await E(a._id),console.log(`\u2705Project '${o}' selected`)),process.exit(0)}catch(o){e.fail(`\u274C Failed to create project: ${o instanceof Error?o.message:"Unknown error"}`),process.exit(1)}}n($,"createProject");async function O(){let t=await w();t||(console.error("No project selected. Please select a project first using `crossmint project select`"),process.exit(1));let e=g("Fetching project details...").start();try{let o=await j(t);o||(e.fail("Project not found"),process.exit(1)),e.succeed("Fetched project details"),console.log(`
|
|
8
|
+
\u{1F4CC} Project Details:`),console.log(`Name: ${o.name}`),console.log(`ID: ${o.kableClientId}`),console.log(`Wallet Type: ${o.addons.nonCustodialWallets?"Smart":"Custodial"}`),process.exit(0)}catch(o){e.fail("Failed to fetch project details"),console.error("Error:",o instanceof Error?o.message:"Unknown error"),process.exit(1)}}n(O,"showProjectDetails");import{select as le,checkbox as Fe}from"@inquirer/prompts";import{routes as He,HttpMethods as Me}from"@crossmint/common-consts";import{Separator as Te}from"@inquirer/prompts";import{CLIENT_API_KEY_PUBLIC_SCOPES as De,SERVER_API_KEY_PUBLIC_SCOPES as Ue,APIKeyCategoryNames as _e}from"@crossmint/products-console-types";function T(t,e,o,r=[]){let s=(t==="server"?Ue:De).reduce((i,p)=>{let{title:c,description:h,value:f,category:u}=p;return i[u]||(i[u]=[]),Le(p,e,o)||i[u].push({name:`${c} (${f})`,value:f,description:h,checked:r.includes(f)}),i},{});return Object.entries(s).flatMap(([i,p])=>[new Te(_e[i]),...p])}n(T,"getScopeChoices");function Le(t,e,o){return e==="production"&&t.projectPermission!=null&&(o==null?void 0:o.addons)!=null&&!o.addons[t.projectPermission]}n(Le,"isScopeDisabled");import{input as me}from"@inquirer/prompts";function Ne(t){try{return new URL(t),!0}catch{return!1}}n(Ne,"isValidUrl");async function D(t,e){let o=[],r=[],a=e?`
|
|
9
|
+
Press [tab] to edit or [enter] to confirm current value`:"";if(t==="web"){let s=await me({default:e==null?void 0:e.join(","),message:`Enter whitelisted domain or localhost (e.g., https://www.yourdomain.com) (separate multiple domains with a comma):${a}`,validate:n(i=>{let p=i.split(",");for(let c of p)if(!Ne(c))return`Invalid domain: ${c}. Please enter a valid URL (e.g., https://www.yourdomain.com)`;return!0},"validate")});o.push(...s.split(",").map(i=>i.trim()))}else if(t==="mobile"){let s=await me({default:e==null?void 0:e.join(","),message:`Enter iOS bundle ID or Android package name (e.g., com.company.appname) (separate multiple domains with a comma):${a}`,validate:n(i=>{let p=i.split(",");for(let c of p)if(c.trim().length===0)return"App identifier cannot be empty";return!0},"validate")});r.push(...s.split(",").map(i=>i.trim()))}return{whitelistedOrigins:o,whitelistedAppIdentifiers:r}}n(D,"getWhitelistedOriginsAndAppIdentifiersPrompt");async function U(){let t=await y(),e=await w();t||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1)),e||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let o=g("Creating key...");try{let r=await le({message:"Select Key Usage:",choices:[{name:"Server side",value:"server"},{name:"Client side",value:"client"}]}),a,s,i;r==="client"&&(a=await le({message:"Select client platform:",choices:[{name:"Web",value:"web"},{name:"Mobile",value:"mobile"}]}),{whitelistedOrigins:s,whitelistedAppIdentifiers:i}=await D(a));let p=await j(e);p||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let c=T(r,t,p),h=await Fe({message:`Select scopes for ${r} key:`,choices:c,validate:n(x=>x.length===0?"At least one scope must be selected":!0,"validate")}),f={usageOrigin:r,scopes:h};r==="client"&&(f.whitelistedOrigins=s,f.whitelistedAppIdentifiers=i),o.start();let u=await d(He.api.console.projects.apiKeys(e),Me.POST,f);o.succeed("\u2705 API Key created successfully!"),console.log("Key ID:",u.apiKey._id),console.log("\u{1F512} Key Secret:",u.apiKey.clientSecret),r==="server"&&t==="production"&&console.log("Please save these credentials securely. The key secret will not be shown again."),process.exit(0)}catch(r){o.fail(`\u274C Failed to create key: ${r instanceof Error?r.message:"Unknown error"}`),process.exit(1)}}n(U,"createKey");import{routes as Ve}from"@crossmint/common-consts";import{APIKeyUsageOriginArray as We}from"@crossmint/products-console-types";import{capitalizeFirstLetter as Be}from"@crossmint/common-string-utils";import{spawn as Re}from"child_process";var q=class q{output="";pager;constructor(){this.pager=Re("less",["-R"],{stdio:["pipe","inherit","inherit"]}),this.pager.on("exit",e=>{console.log(this.output),process.exit(e??0)})}add(e){this.output+=e}shouldUsePager(){let e=process.stdout.rows;return this.output.split(`
|
|
10
|
+
`).length>e}write(){var e,o;this.shouldUsePager()?((e=this.pager.stdin)==null||e.write(this.output),(o=this.pager.stdin)==null||o.end()):this.pager.kill()}};n(q,"Pager");var _=q;import L from"chalk";async function N(t){let e=await y(),o=await w();o||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1)),t&&!We.includes(t)&&(console.error("Invalid key type. Please use 'server' or 'client'."),process.exit(1));let r=g("Fetching API keys...");try{r.start();let a=await d(Ve.api.console.projects.apiKeys(o)),s=t?a.filter(c=>c.usageOrigin===t):a;if(s.length===0)return r.succeed("\u{1F50D} No API keys found for this project. To create a new API key, run `crossmint keys create`"),process.exit(0);r.succeed("\u{1F4CC} List of API Keys:");let i=new _,p=L.bold.magenta("=========");s.forEach((c,h)=>{i.add(`
|
|
11
|
+
${p}
|
|
12
|
+
|
|
13
|
+
`),i.add(`${L.bold(`${h+1}. Key ID:`)} ${c._id}
|
|
14
|
+
`);let f=c.usageOrigin==="server"&&e==="production"?`******************${c.clientSecret.slice(-4)}`:c.clientSecret;i.add(` ${L.bold("Key Secret:")} ${f}
|
|
15
|
+
|
|
16
|
+
`);let u=[["Type",Be(c.usageOrigin)],["Created By",c.createdBy],["Created",c.createdAt?new Date(c.createdAt).toLocaleString():void 0],["Scopes",c.scopes.join(", ")]];c.usageOrigin==="client"&&(c.whitelistedOrigins.length>0&&u.push(["Whitelisted Origins",c.whitelistedOrigins.join(", ")]),c.whitelistedAppIdentifiers&&c.whitelistedAppIdentifiers.length>0&&u.push(["Whitelisted App IDs",c.whitelistedAppIdentifiers.join(", ")])),u.forEach(([x,P])=>{P!==void 0&&i.add(`${L.cyan(x.padEnd(20))} ${P}
|
|
17
|
+
`)})}),i.add(`
|
|
18
|
+
${p}`),i.write()}catch(a){r.fail(`\u274C Failed to fetch keys: ${a instanceof Error?a.message:"Unknown error"}`),process.exit(1)}}n(N,"listKeys");import{HttpMethods as ze}from"@crossmint/common-consts";import{routes as Ye}from"@crossmint/common-consts";import{confirm as Je}from"@inquirer/prompts";async function F(t){let e=await w();e||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let o=g("Deleting API key...");try{await Je({message:"Are you sure you want to delete this API key? This action cannot be undone.",default:!1})||(o.fail("Operation cancelled"),process.exit(0)),o.start(),await d(Ye.api.console.projects.apiKeys(e,t),ze.DELETE),o.succeed("\u2705 API key deleted successfully!")}catch(r){o.fail(`\u274C Failed to delete API key: ${r instanceof Error?r.message:"Unknown error"}`),process.exit(1)}}n(F,"deleteKey");import{HttpMethods as qe,routes as de}from"@crossmint/common-consts";import{checkbox as Ge}from"@inquirer/prompts";async function H(t){var a,s;let e=await y();e||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1));let o=await w();o||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let r=g("Fetching API key...");try{r.start();let p=(await d(de.api.console.projects.apiKeys(o))).find(P=>P._id.toString()===t);p||(r.fail("API key not found"),process.exit(1));let c,h;p.usageOrigin==="client"&&(r.succeed("\u{1F4CC} Current API Key Whitelisted Origins:"),{whitelistedOrigins:c,whitelistedAppIdentifiers:h}=await D(((a=p.whitelistedOrigins)==null?void 0:a.length)>0?"web":"mobile",((s=p.whitelistedOrigins)==null?void 0:s.length)>0?p.whitelistedOrigins:p.whitelistedAppIdentifiers)),r.succeed("\u{1F4CC} Current API Key Scopes:");let f=await j(o);f||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let u=T(p.usageOrigin,e,f,p.scopes),x=await Ge({message:`Select scopes for ${p.usageOrigin} key:`,choices:u,validate:n(P=>P.length===0?"At least one scope must be selected":!0,"validate")});if(Qe(p,x)||Xe(p,c,h)){r.start("Updating API key scopes...");let P={apiKeyId:t,...p,scopes:x};p.usageOrigin==="client"&&(P.whitelistedOrigins=c,P.whitelistedAppIdentifiers=h),await d(de.api.console.projects.apiKeys(o),qe.PUT,P)}r.succeed("\u2705 API key scopes updated successfully!")}catch(i){r.fail(`\u274C Failed to update API key: ${i instanceof Error?i.message:"Unknown error"}`),process.exit(1)}}n(H,"editKey");function Qe(t,e){return t.scopes.some(o=>!e.includes(o))||e.some(o=>!t.scopes.includes(o))}n(Qe,"scopesChanged");function Xe(t,e,o){var r,a;return t.usageOrigin==="client"&&(((r=t.whitelistedOrigins)==null?void 0:r.some(s=>!(e!=null&&e.includes(s))))||(e==null?void 0:e.some(s=>{var i;return!((i=t.whitelistedOrigins)!=null&&i.includes(s))}))||((a=t.whitelistedAppIdentifiers)==null?void 0:a.some(s=>!(o!=null&&o.includes(s))))||(o==null?void 0:o.some(s=>{var i;return!((i=t.whitelistedAppIdentifiers)!=null&&i.includes(s))})))}n(Xe,"originsChanged");I.name("crossmint").description("Crossmint CLI Tool").version(fe().version);var M=I.command("keys").description("API Keys management commands");M.command("create").description("Create a new API Key").action(U);M.command("delete <key-id>").description("Delete an API Key").action(F);M.command("edit <key-id>").description("Edit the scopes of an API Key").action(H);M.command("list [type]").description("List all API Keys (optionally filter by type: server|client)").action(N);I.command("login").description("Login to Crossmint").action(z);I.command("logout").description("Logout from Crossmint").action(J);var G=I.command("projects").description("Project management commands");G.command("create").description("Create a new project").action($).option("-n, --name <name>","Project name");G.command("details").description("Show project details").action(O);G.command("select").description("Select a project").action(A);I.command("whoami").description("Show current user and environment").action(Y);I.parse(process.argv);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/create.ts"],"names":[],"mappings":"AAYA,wBAA8B,SAAS,kBAmFtC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var k=Object.defineProperty;var e=(t,r)=>k(t,"name",{value:r,configurable:!0});import{select as C,checkbox as V}from"@inquirer/prompts";import{routes as G,HttpMethods as W}from"@crossmint/common-consts";import{Separator as T}from"@inquirer/prompts";import{CLIENT_API_KEY_PUBLIC_SCOPES as O,SERVER_API_KEY_PUBLIC_SCOPES as U,APIKeyCategoryNames as b}from"@crossmint/products-console-types";function h(t,r,n,o=[]){let s=(t==="server"?U:O).reduce((i,a)=>{let{title:p,description:P,value:f,category:d}=a;return i[d]||(i[d]=[]),$(a,r,n)||i[d].push({name:`${p} (${f})`,value:f,description:P,checked:o.includes(f)}),i},{});return Object.entries(s).flatMap(([i,a])=>[new T(b[i]),...a])}e(h,"getScopeChoices");function $(t,r,n){return r==="production"&&t.projectPermission!=null&&(n==null?void 0:n.addons)!=null&&!n.addons[t.projectPermission]}e($,"isScopeDisabled");import{HttpMethods as v}from"@crossmint/common-consts";import D from"keytar";var _="crossmint-cli";async function u(t){return D.getPassword(_,t)}e(u,"get");async function g(){return u("environment")}e(g,"getEnvironment");async function w(){return u("sessionToken")}e(w,"getSessionToken");async function I(){return u("projectId")}e(I,"getProjectId");var N={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function S(t){return N[t]}e(S,"getCrossmintUrl");async function y(t,r=v.GET,n){let o=await w(),c=await g();o||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),c||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let s=`${S(c)}${t}`;return R(s,r,n,{Cookie:`sessionToken=${o}`})}e(y,"fetchAuthenticated");async function R(t,r=v.GET,n,o){let c={method:r,headers:{"Content-Type":"application/json",...o}};n&&(c.body=JSON.stringify(n));let s=await fetch(t,c);if(s.status>=400){let i=await s.json();throw new Error(`${i.message}`)}return await s.json()}e(R,"fetchJSON");import{createSpinner as B}from"nanospinner";function A(t){let r=B(t),n={start:e(o=>(r.start({text:o}),n),"start"),succeed:e(o=>(r.success({text:o}),n),"succeed"),fail:e(o=>(r.error({text:o}),n),"fail")};return n}e(A,"createSpinner");import{routes as H}from"@crossmint/common-consts";async function x(t){return(await y(H.api.projects)).find(o=>o.id===t)}e(x,"getProject");import{input as E}from"@inquirer/prompts";function L(t){try{return new URL(t),!0}catch{return!1}}e(L,"isValidUrl");async function j(t,r){let n=[],o=[],c=r?`
|
|
2
|
+
Press [tab] to edit or [enter] to confirm current value`:"";if(t==="web"){let s=await E({default:r==null?void 0:r.join(","),message:`Enter whitelisted domain or localhost (e.g., https://www.yourdomain.com) (separate multiple domains with a comma):${c}`,validate:e(i=>{let a=i.split(",");for(let p of a)if(!L(p))return`Invalid domain: ${p}. Please enter a valid URL (e.g., https://www.yourdomain.com)`;return!0},"validate")});n.push(...s.split(",").map(i=>i.trim()))}else if(t==="mobile"){let s=await E({default:r==null?void 0:r.join(","),message:`Enter iOS bundle ID or Android package name (e.g., com.company.appname) (separate multiple domains with a comma):${c}`,validate:e(i=>{let a=i.split(",");for(let p of a)if(p.trim().length===0)return"App identifier cannot be empty";return!0},"validate")});o.push(...s.split(",").map(i=>i.trim()))}return{whitelistedOrigins:n,whitelistedAppIdentifiers:o}}e(j,"getWhitelistedOriginsAndAppIdentifiersPrompt");async function J(){let t=await g(),r=await I();t||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1)),r||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let n=A("Creating key...");try{let o=await C({message:"Select Key Usage:",choices:[{name:"Server side",value:"server"},{name:"Client side",value:"client"}]}),c,s,i;o==="client"&&(c=await C({message:"Select client platform:",choices:[{name:"Web",value:"web"},{name:"Mobile",value:"mobile"}]}),{whitelistedOrigins:s,whitelistedAppIdentifiers:i}=await j(c));let a=await x(r);a||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let p=h(o,t,a),P=await V({message:`Select scopes for ${o} key:`,choices:p,validate:e(K=>K.length===0?"At least one scope must be selected":!0,"validate")}),f={usageOrigin:o,scopes:P};o==="client"&&(f.whitelistedOrigins=s,f.whitelistedAppIdentifiers=i),n.start();let d=await y(G.api.console.projects.apiKeys(r),W.POST,f);n.succeed("\u2705 API Key created successfully!"),console.log("Key ID:",d.apiKey._id),console.log("\u{1F512} Key Secret:",d.apiKey.clientSecret),o==="server"&&t==="production"&&console.log("Please save these credentials securely. The key secret will not be shown again."),process.exit(0)}catch(o){n.fail(`\u274C Failed to create key: ${o instanceof Error?o.message:"Unknown error"}`),process.exit(1)}}e(J,"createKey");export{J as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/create.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/delete.ts"],"names":[],"mappings":"AAOA,wBAA8B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var E=Object.defineProperty;var t=(r,o)=>E(r,"name",{value:o,configurable:!0});import{HttpMethods as j}from"@crossmint/common-consts";import{routes as I}from"@crossmint/common-consts";import{HttpMethods as g}from"@crossmint/common-consts";import h from"keytar";var v="crossmint-cli";async function p(r){return h.getPassword(v,r)}t(p,"get");async function u(){return p("environment")}t(u,"getEnvironment");async function m(){return p("sessionToken")}t(m,"getSessionToken");async function f(){return p("projectId")}t(f,"getProjectId");var k={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function l(r){return k[r]}t(l,"getCrossmintUrl");async function d(r,o=g.GET,e){let n=await m(),s=await u();n||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),s||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let i=`${l(s)}${r}`;return T(i,o,e,{Cookie:`sessionToken=${n}`})}t(d,"fetchAuthenticated");async function T(r,o=g.GET,e,n){let s={method:o,headers:{"Content-Type":"application/json",...n}};e&&(s.body=JSON.stringify(e));let i=await fetch(r,s);if(i.status>=400){let x=await i.json();throw new Error(`${x.message}`)}return await i.json()}t(T,"fetchJSON");import{confirm as S}from"@inquirer/prompts";import{createSpinner as P}from"nanospinner";function y(r){let o=P(r),e={start:t(n=>(o.start({text:n}),e),"start"),succeed:t(n=>(o.success({text:n}),e),"succeed"),fail:t(n=>(o.error({text:n}),e),"fail")};return e}t(y,"createSpinner");async function A(r){let o=await f();o||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let e=y("Deleting API key...");try{await S({message:"Are you sure you want to delete this API key? This action cannot be undone.",default:!1})||(e.fail("Operation cancelled"),process.exit(0)),e.start(),await d(I.api.console.projects.apiKeys(o,r),j.DELETE),e.succeed("\u2705 API key deleted successfully!")}catch(n){e.fail(`\u274C Failed to delete API key: ${n instanceof Error?n.message:"Unknown error"}`),process.exit(1)}}t(A,"deleteKey");export{A as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.test.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/delete.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/edit.ts"],"names":[],"mappings":"AAWA,wBAA8B,OAAO,CAAC,KAAK,EAAE,MAAM,iBAqElD"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var T=Object.defineProperty;var n=(o,e)=>T(o,"name",{value:e,configurable:!0});import{HttpMethods as G,routes as k}from"@crossmint/common-consts";import{HttpMethods as x}from"@crossmint/common-consts";import O from"keytar";var D="crossmint-cli";async function P(o){return O.getPassword(D,o)}n(P,"get");async function h(){return P("environment")}n(h,"getEnvironment");async function I(){return P("sessionToken")}n(I,"getSessionToken");async function S(){return P("projectId")}n(S,"getProjectId");var $={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function A(o){return $[o]}n(A,"getCrossmintUrl");async function y(o,e=x.GET,t){let r=await I(),a=await h();r||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),a||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let s=`${A(a)}${o}`;return b(s,e,t,{Cookie:`sessionToken=${r}`})}n(y,"fetchAuthenticated");async function b(o,e=x.GET,t,r){let a={method:e,headers:{"Content-Type":"application/json",...r}};t&&(a.body=JSON.stringify(t));let s=await fetch(o,a);if(s.status>=400){let i=await s.json();throw new Error(`${i.message}`)}return await s.json()}n(b,"fetchJSON");import{Separator as _}from"@inquirer/prompts";import{CLIENT_API_KEY_PUBLIC_SCOPES as M,SERVER_API_KEY_PUBLIC_SCOPES as N,APIKeyCategoryNames as R}from"@crossmint/products-console-types";function E(o,e,t,r=[]){let s=(o==="server"?N:M).reduce((i,c)=>{let{title:p,description:g,value:f,category:d}=c;return i[d]||(i[d]=[]),B(c,e,t)||i[d].push({name:`${p} (${f})`,value:f,description:g,checked:r.includes(f)}),i},{});return Object.entries(s).flatMap(([i,c])=>[new _(R[i]),...c])}n(E,"getScopeChoices");function B(o,e,t){return e==="production"&&o.projectPermission!=null&&(t==null?void 0:t.addons)!=null&&!t.addons[o.projectPermission]}n(B,"isScopeDisabled");import{checkbox as W}from"@inquirer/prompts";import{createSpinner as H}from"nanospinner";function j(o){let e=H(o),t={start:n(r=>(e.start({text:r}),t),"start"),succeed:n(r=>(e.success({text:r}),t),"succeed"),fail:n(r=>(e.error({text:r}),t),"fail")};return t}n(j,"createSpinner");import{routes as L}from"@crossmint/common-consts";async function v(o){return(await y(L.api.projects)).find(r=>r.id===o)}n(v,"getProject");import{input as K}from"@inquirer/prompts";function V(o){try{return new URL(o),!0}catch{return!1}}n(V,"isValidUrl");async function C(o,e){let t=[],r=[],a=e?`
|
|
2
|
+
Press [tab] to edit or [enter] to confirm current value`:"";if(o==="web"){let s=await K({default:e==null?void 0:e.join(","),message:`Enter whitelisted domain or localhost (e.g., https://www.yourdomain.com) (separate multiple domains with a comma):${a}`,validate:n(i=>{let c=i.split(",");for(let p of c)if(!V(p))return`Invalid domain: ${p}. Please enter a valid URL (e.g., https://www.yourdomain.com)`;return!0},"validate")});t.push(...s.split(",").map(i=>i.trim()))}else if(o==="mobile"){let s=await K({default:e==null?void 0:e.join(","),message:`Enter iOS bundle ID or Android package name (e.g., com.company.appname) (separate multiple domains with a comma):${a}`,validate:n(i=>{let c=i.split(",");for(let p of c)if(p.trim().length===0)return"App identifier cannot be empty";return!0},"validate")});r.push(...s.split(",").map(i=>i.trim()))}return{whitelistedOrigins:t,whitelistedAppIdentifiers:r}}n(C,"getWhitelistedOriginsAndAppIdentifiersPrompt");async function F(o){var a,s;let e=await h();e||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1));let t=await S();t||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let r=j("Fetching API key...");try{r.start();let c=(await y(k.api.console.projects.apiKeys(t))).find(l=>l._id.toString()===o);c||(r.fail("API key not found"),process.exit(1));let p,g;c.usageOrigin==="client"&&(r.succeed("\u{1F4CC} Current API Key Whitelisted Origins:"),{whitelistedOrigins:p,whitelistedAppIdentifiers:g}=await C(((a=c.whitelistedOrigins)==null?void 0:a.length)>0?"web":"mobile",((s=c.whitelistedOrigins)==null?void 0:s.length)>0?c.whitelistedOrigins:c.whitelistedAppIdentifiers)),r.succeed("\u{1F4CC} Current API Key Scopes:");let f=await v(t);f||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let d=E(c.usageOrigin,e,f,c.scopes),w=await W({message:`Select scopes for ${c.usageOrigin} key:`,choices:d,validate:n(l=>l.length===0?"At least one scope must be selected":!0,"validate")});if(J(c,w)||Y(c,p,g)){r.start("Updating API key scopes...");let l={apiKeyId:o,...c,scopes:w};c.usageOrigin==="client"&&(l.whitelistedOrigins=p,l.whitelistedAppIdentifiers=g),await y(k.api.console.projects.apiKeys(t),G.PUT,l)}r.succeed("\u2705 API key scopes updated successfully!")}catch(i){r.fail(`\u274C Failed to update API key: ${i instanceof Error?i.message:"Unknown error"}`),process.exit(1)}}n(F,"editKey");function J(o,e){return o.scopes.some(t=>!e.includes(t))||e.some(t=>!o.scopes.includes(t))}n(J,"scopesChanged");function Y(o,e,t){var r,a;return o.usageOrigin==="client"&&(((r=o.whitelistedOrigins)==null?void 0:r.some(s=>!(e!=null&&e.includes(s))))||(e==null?void 0:e.some(s=>{var i;return!((i=o.whitelistedOrigins)!=null&&i.includes(s))}))||((a=o.whitelistedAppIdentifiers)==null?void 0:a.some(s=>!(t!=null&&t.includes(s))))||(t==null?void 0:t.some(s=>{var i;return!((i=o.whitelistedAppIdentifiers)!=null&&i.includes(s))})))}n(Y,"originsChanged");export{F as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.test.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/edit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
var L=Object.defineProperty;var n=(o,e)=>L(o,"name",{value:e,configurable:!0});import{select as T,checkbox as X}from"@inquirer/prompts";import{routes as Z,HttpMethods as ee}from"@crossmint/common-consts";import{Separator as R}from"@inquirer/prompts";import{CLIENT_API_KEY_PUBLIC_SCOPES as N,SERVER_API_KEY_PUBLIC_SCOPES as B,APIKeyCategoryNames as H}from"@crossmint/products-console-types";function A(o,e,t,r=[]){let c=(o==="server"?B:N).reduce((i,a)=>{let{title:s,description:h,value:d,category:f}=a;return i[f]||(i[f]=[]),F(a,e,t)||i[f].push({name:`${s} (${d})`,value:d,description:h,checked:r.includes(d)}),i},{});return Object.entries(c).flatMap(([i,a])=>[new R(H[i]),...a])}n(A,"getScopeChoices");function F(o,e,t){return e==="production"&&o.projectPermission!=null&&(t==null?void 0:t.addons)!=null&&!t.addons[o.projectPermission]}n(F,"isScopeDisabled");import{HttpMethods as $}from"@crossmint/common-consts";import W from"keytar";var V="crossmint-cli";async function S(o){return W.getPassword(V,o)}n(S,"get");async function y(){return S("environment")}n(y,"getEnvironment");async function C(){return S("sessionToken")}n(C,"getSessionToken");async function P(){return S("projectId")}n(P,"getProjectId");var J={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function O(o){return J[o]}n(O,"getCrossmintUrl");async function u(o,e=$.GET,t){let r=await C(),p=await y();r||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),p||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let c=`${O(p)}${o}`;return Y(c,e,t,{Cookie:`sessionToken=${r}`})}n(u,"fetchAuthenticated");async function Y(o,e=$.GET,t,r){let p={method:e,headers:{"Content-Type":"application/json",...r}};t&&(p.body=JSON.stringify(t));let c=await fetch(o,p);if(c.status>=400){let i=await c.json();throw new Error(`${i.message}`)}return await c.json()}n(Y,"fetchJSON");import{createSpinner as q}from"nanospinner";function w(o){let e=q(o),t={start:n(r=>(e.start({text:r}),t),"start"),succeed:n(r=>(e.success({text:r}),t),"succeed"),fail:n(r=>(e.error({text:r}),t),"fail")};return t}n(w,"createSpinner");import{routes as z}from"@crossmint/common-consts";async function x(o){return(await u(z.api.projects)).find(r=>r.id===o)}n(x,"getProject");import{input as k}from"@inquirer/prompts";function Q(o){try{return new URL(o),!0}catch{return!1}}n(Q,"isValidUrl");async function K(o,e){let t=[],r=[],p=e?`
|
|
2
|
+
Press [tab] to edit or [enter] to confirm current value`:"";if(o==="web"){let c=await k({default:e==null?void 0:e.join(","),message:`Enter whitelisted domain or localhost (e.g., https://www.yourdomain.com) (separate multiple domains with a comma):${p}`,validate:n(i=>{let a=i.split(",");for(let s of a)if(!Q(s))return`Invalid domain: ${s}. Please enter a valid URL (e.g., https://www.yourdomain.com)`;return!0},"validate")});t.push(...c.split(",").map(i=>i.trim()))}else if(o==="mobile"){let c=await k({default:e==null?void 0:e.join(","),message:`Enter iOS bundle ID or Android package name (e.g., com.company.appname) (separate multiple domains with a comma):${p}`,validate:n(i=>{let a=i.split(",");for(let s of a)if(s.trim().length===0)return"App identifier cannot be empty";return!0},"validate")});r.push(...c.split(",").map(i=>i.trim()))}return{whitelistedOrigins:t,whitelistedAppIdentifiers:r}}n(K,"getWhitelistedOriginsAndAppIdentifiersPrompt");async function U(){let o=await y(),e=await P();o||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1)),e||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let t=w("Creating key...");try{let r=await T({message:"Select Key Usage:",choices:[{name:"Server side",value:"server"},{name:"Client side",value:"client"}]}),p,c,i;r==="client"&&(p=await T({message:"Select client platform:",choices:[{name:"Web",value:"web"},{name:"Mobile",value:"mobile"}]}),{whitelistedOrigins:c,whitelistedAppIdentifiers:i}=await K(p));let a=await x(e);a||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let s=A(r,o,a),h=await X({message:`Select scopes for ${r} key:`,choices:s,validate:n(I=>I.length===0?"At least one scope must be selected":!0,"validate")}),d={usageOrigin:r,scopes:h};r==="client"&&(d.whitelistedOrigins=c,d.whitelistedAppIdentifiers=i),t.start();let f=await u(Z.api.console.projects.apiKeys(e),ee.POST,d);t.succeed("\u2705 API Key created successfully!"),console.log("Key ID:",f.apiKey._id),console.log("\u{1F512} Key Secret:",f.apiKey.clientSecret),r==="server"&&o==="production"&&console.log("Please save these credentials securely. The key secret will not be shown again."),process.exit(0)}catch(r){t.fail(`\u274C Failed to create key: ${r instanceof Error?r.message:"Unknown error"}`),process.exit(1)}}n(U,"createKey");import{routes as re}from"@crossmint/common-consts";import{APIKeyUsageOriginArray as oe}from"@crossmint/products-console-types";import{capitalizeFirstLetter as ne}from"@crossmint/common-string-utils";import{spawn as te}from"child_process";var E=class E{output="";pager;constructor(){this.pager=te("less",["-R"],{stdio:["pipe","inherit","inherit"]}),this.pager.on("exit",e=>{console.log(this.output),process.exit(e??0)})}add(e){this.output+=e}shouldUsePager(){let e=process.stdout.rows;return this.output.split(`
|
|
3
|
+
`).length>e}write(){var e,t;this.shouldUsePager()?((e=this.pager.stdin)==null||e.write(this.output),(t=this.pager.stdin)==null||t.end()):this.pager.kill()}};n(E,"Pager");var j=E;import v from"chalk";async function b(o){let e=await y(),t=await P();t||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1)),o&&!oe.includes(o)&&(console.error("Invalid key type. Please use 'server' or 'client'."),process.exit(1));let r=w("Fetching API keys...");try{r.start();let p=await u(re.api.console.projects.apiKeys(t)),c=o?p.filter(s=>s.usageOrigin===o):p;if(c.length===0)return r.succeed("\u{1F50D} No API keys found for this project. To create a new API key, run `crossmint keys create`"),process.exit(0);r.succeed("\u{1F4CC} List of API Keys:");let i=new j,a=v.bold.magenta("=========");c.forEach((s,h)=>{i.add(`
|
|
4
|
+
${a}
|
|
5
|
+
|
|
6
|
+
`),i.add(`${v.bold(`${h+1}. Key ID:`)} ${s._id}
|
|
7
|
+
`);let d=s.usageOrigin==="server"&&e==="production"?`******************${s.clientSecret.slice(-4)}`:s.clientSecret;i.add(` ${v.bold("Key Secret:")} ${d}
|
|
8
|
+
|
|
9
|
+
`);let f=[["Type",ne(s.usageOrigin)],["Created By",s.createdBy],["Created",s.createdAt?new Date(s.createdAt).toLocaleString():void 0],["Scopes",s.scopes.join(", ")]];s.usageOrigin==="client"&&(s.whitelistedOrigins.length>0&&f.push(["Whitelisted Origins",s.whitelistedOrigins.join(", ")]),s.whitelistedAppIdentifiers&&s.whitelistedAppIdentifiers.length>0&&f.push(["Whitelisted App IDs",s.whitelistedAppIdentifiers.join(", ")])),f.forEach(([I,g])=>{g!==void 0&&i.add(`${v.cyan(I.padEnd(20))} ${g}
|
|
10
|
+
`)})}),i.add(`
|
|
11
|
+
${a}`),i.write()}catch(p){r.fail(`\u274C Failed to fetch keys: ${p instanceof Error?p.message:"Unknown error"}`),process.exit(1)}}n(b,"listKeys");import{HttpMethods as ie}from"@crossmint/common-consts";import{routes as se}from"@crossmint/common-consts";import{confirm as ce}from"@inquirer/prompts";async function D(o){let e=await P();e||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let t=w("Deleting API key...");try{await ce({message:"Are you sure you want to delete this API key? This action cannot be undone.",default:!1})||(t.fail("Operation cancelled"),process.exit(0)),t.start(),await u(se.api.console.projects.apiKeys(e,o),ie.DELETE),t.succeed("\u2705 API key deleted successfully!")}catch(r){t.fail(`\u274C Failed to delete API key: ${r instanceof Error?r.message:"Unknown error"}`),process.exit(1)}}n(D,"deleteKey");import{HttpMethods as ae,routes as M}from"@crossmint/common-consts";import{checkbox as pe}from"@inquirer/prompts";async function _(o){var p,c;let e=await y();e||(console.error("There is no environment selected, please first run `crossmint login`"),process.exit(1));let t=await P();t||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1));let r=w("Fetching API key...");try{r.start();let a=(await u(M.api.console.projects.apiKeys(t))).find(g=>g._id.toString()===o);a||(r.fail("API key not found"),process.exit(1));let s,h;a.usageOrigin==="client"&&(r.succeed("\u{1F4CC} Current API Key Whitelisted Origins:"),{whitelistedOrigins:s,whitelistedAppIdentifiers:h}=await K(((p=a.whitelistedOrigins)==null?void 0:p.length)>0?"web":"mobile",((c=a.whitelistedOrigins)==null?void 0:c.length)>0?a.whitelistedOrigins:a.whitelistedAppIdentifiers)),r.succeed("\u{1F4CC} Current API Key Scopes:");let d=await x(t);d||(console.error("\u274C Project not found, please run `crossmint project select`"),process.exit(1));let f=A(a.usageOrigin,e,d,a.scopes),I=await pe({message:`Select scopes for ${a.usageOrigin} key:`,choices:f,validate:n(g=>g.length===0?"At least one scope must be selected":!0,"validate")});if(le(a,I)||me(a,s,h)){r.start("Updating API key scopes...");let g={apiKeyId:o,...a,scopes:I};a.usageOrigin==="client"&&(g.whitelistedOrigins=s,g.whitelistedAppIdentifiers=h),await u(M.api.console.projects.apiKeys(t),ae.PUT,g)}r.succeed("\u2705 API key scopes updated successfully!")}catch(i){r.fail(`\u274C Failed to update API key: ${i instanceof Error?i.message:"Unknown error"}`),process.exit(1)}}n(_,"editKey");function le(o,e){return o.scopes.some(t=>!e.includes(t))||e.some(t=>!o.scopes.includes(t))}n(le,"scopesChanged");function me(o,e,t){var r,p;return o.usageOrigin==="client"&&(((r=o.whitelistedOrigins)==null?void 0:r.some(c=>!(e!=null&&e.includes(c))))||(e==null?void 0:e.some(c=>{var i;return!((i=o.whitelistedOrigins)!=null&&i.includes(c))}))||((p=o.whitelistedAppIdentifiers)==null?void 0:p.some(c=>!(t!=null&&t.includes(c))))||(t==null?void 0:t.some(c=>{var i;return!((i=o.whitelistedAppIdentifiers)!=null&&i.includes(c))})))}n(me,"originsChanged");export{U as create,D as delete,_ as edit,b as list};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/list.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAA0C,MAAM,mCAAmC,CAAC;AAM9G,wBAA8B,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,sBAyEjE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
var T=Object.defineProperty;var e=(r,t)=>T(r,"name",{value:t,configurable:!0});import{routes as H}from"@crossmint/common-consts";import{HttpMethods as I}from"@crossmint/common-consts";import O from"keytar";var K="crossmint-cli";async function d(r){return O.getPassword(K,r)}e(d,"get");async function g(){return d("environment")}e(g,"getEnvironment");async function y(){return d("sessionToken")}e(y,"getSessionToken");async function v(){return d("projectId")}e(v,"getProjectId");var C={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function E(r){return C[r]}e(E,"getCrossmintUrl");async function P(r,t=I.GET,o){let s=await y(),i=await g();s||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),i||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let c=`${E(i)}${r}`;return N(c,t,o,{Cookie:`sessionToken=${s}`})}e(P,"fetchAuthenticated");async function N(r,t=I.GET,o,s){let i={method:t,headers:{"Content-Type":"application/json",...s}};o&&(i.body=JSON.stringify(o));let c=await fetch(r,i);if(c.status>=400){let a=await c.json();throw new Error(`${a.message}`)}return await c.json()}e(N,"fetchJSON");import{APIKeyUsageOriginArray as L}from"@crossmint/products-console-types";import{capitalizeFirstLetter as M}from"@crossmint/common-string-utils";import{spawn as k}from"child_process";var h=class h{output="";pager;constructor(){this.pager=k("less",["-R"],{stdio:["pipe","inherit","inherit"]}),this.pager.on("exit",t=>{console.log(this.output),process.exit(t??0)})}add(t){this.output+=t}shouldUsePager(){let t=process.stdout.rows;return this.output.split(`
|
|
2
|
+
`).length>t}write(){var t,o;this.shouldUsePager()?((t=this.pager.stdin)==null||t.write(this.output),(o=this.pager.stdin)==null||o.end()):this.pager.kill()}};e(h,"Pager");var l=h;import f from"chalk";import{createSpinner as D}from"nanospinner";function A(r){let t=D(r),o={start:e(s=>(t.start({text:s}),o),"start"),succeed:e(s=>(t.success({text:s}),o),"succeed"),fail:e(s=>(t.error({text:s}),o),"fail")};return o}e(A,"createSpinner");async function R(r){let t=await g(),o=await v();o||(console.error("There is no project selected, please first run `crossmint project select`"),process.exit(1)),r&&!L.includes(r)&&(console.error("Invalid key type. Please use 'server' or 'client'."),process.exit(1));let s=A("Fetching API keys...");try{s.start();let i=await P(H.api.console.projects.apiKeys(o)),c=r?i.filter(n=>n.usageOrigin===r):i;if(c.length===0)return s.succeed("\u{1F50D} No API keys found for this project. To create a new API key, run `crossmint keys create`"),process.exit(0);s.succeed("\u{1F4CC} List of API Keys:");let a=new l,w=f.bold.magenta("=========");c.forEach((n,S)=>{a.add(`
|
|
3
|
+
${w}
|
|
4
|
+
|
|
5
|
+
`),a.add(`${f.bold(`${S+1}. Key ID:`)} ${n._id}
|
|
6
|
+
`);let j=n.usageOrigin==="server"&&t==="production"?`******************${n.clientSecret.slice(-4)}`:n.clientSecret;a.add(` ${f.bold("Key Secret:")} ${j}
|
|
7
|
+
|
|
8
|
+
`);let m=[["Type",M(n.usageOrigin)],["Created By",n.createdBy],["Created",n.createdAt?new Date(n.createdAt).toLocaleString():void 0],["Scopes",n.scopes.join(", ")]];n.usageOrigin==="client"&&(n.whitelistedOrigins.length>0&&m.push(["Whitelisted Origins",n.whitelistedOrigins.join(", ")]),n.whitelistedAppIdentifiers&&n.whitelistedAppIdentifiers.length>0&&m.push(["Whitelisted App IDs",n.whitelistedAppIdentifiers.join(", ")])),m.forEach(([$,x])=>{x!==void 0&&a.add(`${f.cyan($.padEnd(20))} ${x}
|
|
9
|
+
`)})}),a.add(`
|
|
10
|
+
${w}`),a.write()}catch(i){s.fail(`\u274C Failed to fetch keys: ${i instanceof Error?i.message:"Unknown error"}`),process.exit(1)}}e(R,"listKeys");export{R as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../src/commands/keys/list.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAYA,wBAA8B,KAAK,kBA8ClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var M=Object.defineProperty;var t=(e,n)=>M(e,"name",{value:n,configurable:!0});var z={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function m(e){return z[e]}t(m,"getCrossmintUrl");import S from"keytar";var P="crossmint-cli";async function l(e,n){return S.setPassword(P,e,n)}t(l,"set");async function f(e){return S.getPassword(P,e)}t(f,"get");function k(e){return l("environment",e)}t(k,"setEnvironment");async function d(){return f("environment")}t(d,"getEnvironment");function T(e){return l("sessionToken",e)}t(T,"setSessionToken");async function I(){return f("sessionToken")}t(I,"getSessionToken");function v(e){return l("projectId",e)}t(v,"setProjectId");import{select as J}from"@inquirer/prompts";import{HttpMethods as y}from"@crossmint/common-consts";async function _(e,n=y.GET,r){let o=await I(),c=await d();o||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),c||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let s=`${m(c)}${e}`;return u(s,n,r,{Cookie:`sessionToken=${o}`})}t(_,"fetchAuthenticated");async function $(e,n=y.GET,r){let o=await d();o||(console.error("\u274C Environment not found"),process.exit(1));let c=`${m(o)}${e}`;return u(c,n,r)}t($,"fetchUnauthenticated");async function u(e,n=y.GET,r,o){let c={method:n,headers:{"Content-Type":"application/json",...o}};r&&(c.body=JSON.stringify(r));let s=await fetch(e,c);if(s.status>=400){let i=await s.json();throw new Error(`${i.message}`)}return await s.json()}t(u,"fetchJSON");import{routes as D}from"@crossmint/common-consts";import{select as F}from"@inquirer/prompts";import{createSpinner as A}from"nanospinner";function N(e){let n=A(e),r={start:t(o=>(n.start({text:o}),r),"start"),succeed:t(o=>(n.success({text:o}),r),"succeed"),fail:t(o=>(n.error({text:o}),r),"fail")};return r}t(N,"createSpinner");async function x(){let e=N("Fetching projects...").start();try{let n=await _(D.api.projects);if(!n||n.length===0)return e.fail("No projects found. Create a new project using `crossmint project create`"),process.exit(0);if(e.succeed("Fetched projects"),n.length===1){let o=n[0];return console.log(`You only have one project: ${o.name}`),console.log("To create another project, run `crossmint project create`"),await v(o.id),console.log(`\u2705 Project ${o.name} selected`),process.exit(0)}let r=await F({message:"Select a project:",choices:n.map(o=>({name:o.name,value:o,description:o.description}))});await v(r.id),console.log(`\u2705 Project ${r.name} selected`),process.exit(0)}catch{e.fail("Failed to fetch projects"),process.exit(1)}}t(x,"selectProject");import Y from"open";import U from"crypto";async function H(){let n=U.randomBytes(32).toString("base64url"),o=U.createHash("sha256").update(n).digest().toString("base64url");return await l("pkceCodeVerifier",n),o}t(H,"generateCodeChallenge");async function L(){return await f("pkceCodeVerifier")}t(L,"getCodeVerifier");import G from"http";import{HttpMethods as O}from"@crossmint/common-consts";import{routes as V}from"@crossmint/common-consts";async function g(){let e=await d();return e||(console.error("\u274C Environment not found"),process.exit(1)),e==="local"?{uri:"test.stytch.com",projectId:"project-test-8eb55d3d-949f-4e0f-aea6-c9ba740f7813",clientId:"connected-app-test-4d27d6d8-3491-45c8-9bb0-b05f89cb7a1a"}:e==="staging"?{uri:"api.stytch.com",projectId:"project-live-b7c564af-0c0d-4662-bfc0-72bed1049cfe",clientId:"connected-app-live-47cd5bf1-c155-42c1-9f36-5d35853b34a7"}:{uri:"api.stytch.com",projectId:"project-live-7a1cb98d-b8b7-4471-aaf6-f8af67a0df94",clientId:"connected-app-live-a72edd7e-6ff3-4002-a13a-e7ca66354bd1"}}t(g,"getStytchConfig");async function w(e){return new Promise((n,r)=>{let o=G.createServer(async(s,i)=>{try{let E=new URL(s.url||"",`http://${s.headers.host}`).searchParams.get("code");if(!E){i.writeHead(400,{"Content-Type":"text/plain"}),i.end("No code provided");return}let h=await g(),C=await u(`https://${h.uri}/v1/public/${h.projectId}/oauth2/token`,O.POST,{grant_type:"authorization_code",code:E,client_id:h.clientId,redirect_uri:"http://127.0.0.1:3456/callback",code_verifier:await L()}),R=await $(V.authentication.exchangeAccessToken,O.POST,{accessToken:C.access_token});await T(R.sessionToken),i.writeHead(302,{Location:`${m(e)}${V.console.authorizeDevice.success}`}),i.end(),o.close(),n(C)}catch(j){i.writeHead(500,{"Content-Type":"text/plain"}),i.end("Error during authentication"),o.close(),r(j)}});o.listen(3456)})}t(w,"server");import{routes as B}from"@crossmint/common-consts";var q=!1;async function K(){try{console.log("\u{1F510} Crossmint CLI - Login");let e=await J({message:"Select environment:",choices:[{name:"Production",value:"production"},{name:"Staging",value:"staging"},...q?[{name:"Local",value:"local"}]:[]]}),n=m(e);n||(console.error(`Error: No URL found for ${e} environment`),process.exit(1)),await k(e);let r=w(e),{clientId:o}=await g(),s={code_challenge:await H(),code_challenge_method:"S256",scope:"full_access",response_type:"code",grant_type:"authorization_code",redirect_uri:"http://127.0.0.1:3456/callback",client_id:o},i=`${n}${B.console.authorizeDevice.index(s)}`;console.log("Opening browser for authentication..."),Y(i),await r,console.log(`\u2705 Login successful! You are now authenticated in the ${e} environment.`),await x()}catch{console.error("\u274C Login failed, please try again."),process.exit(1)}}t(K,"login");export{K as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../src/commands/login.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAEA,wBAA8B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var u=Object.defineProperty;var e=(n,a)=>u(n,"name",{value:a,configurable:!0});import g from"keytar";var d="crossmint-cli";async function t(n){return g.deletePassword(d,n)}e(t,"del");async function s(){return t("environment")}e(s,"deleteEnvironment");async function i(){return t("sessionToken")}e(i,"deleteSessionToken");async function c(){return t("projectId")}e(c,"deleteProjectId");async function l(){await i(),await s(),await c(),console.log("Logged out"),process.exit(0)}e(l,"logout");export{l as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/create.ts"],"names":[],"mappings":"AAMA,UAAU,oBAAoB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAA8B,aAAa,CAAC,OAAO,GAAE,oBAAyB,iBAkC7E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var E=Object.defineProperty;var t=(n,r)=>E(n,"name",{value:r,configurable:!0});import{confirm as k,input as I}from"@inquirer/prompts";import{HttpMethods as y}from"@crossmint/common-consts";import u from"keytar";var l="crossmint-cli";async function f(n,r){return u.setPassword(l,n,r)}t(f,"set");async function m(n){return u.getPassword(l,n)}t(m,"get");async function g(){return m("environment")}t(g,"getEnvironment");async function d(){return m("sessionToken")}t(d,"getSessionToken");function x(n){return f("projectId",n)}t(x,"setProjectId");var P={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function j(n){return P[n]}t(j,"getCrossmintUrl");async function h(n,r=y.GET,e){let o=await d(),s=await g();o||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),s||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let i=`${j(s)}${n}`;return S(i,r,e,{Cookie:`sessionToken=${o}`})}t(h,"fetchAuthenticated");async function S(n,r=y.GET,e,o){let s={method:r,headers:{"Content-Type":"application/json",...o}};e&&(s.body=JSON.stringify(e));let i=await fetch(n,s);if(i.status>=400){let p=await i.json();throw new Error(`${p.message}`)}return await i.json()}t(S,"fetchJSON");import{HttpMethods as $}from"@crossmint/common-consts";import{routes as C}from"@crossmint/common-consts";import{createSpinner as T}from"nanospinner";function w(n){let r=T(n),e={start:t(o=>(r.start({text:o}),e),"start"),succeed:t(o=>(r.success({text:o}),e),"succeed"),fail:t(o=>(r.error({text:o}),e),"fail")};return e}t(w,"createSpinner");async function N(n={}){let r=w();try{let e=n.name;e||(e=await I({message:"Enter project name:",validate:t(p=>p.length>0||"Project name is required","validate")})),r.start(`\u{1F680} Creating project "${e}" with Smart Wallets...`);let o=await h(C.api.console.projects.index,$.POST,{name:e,walletType:"smart_wallet",storageProvider:"ipfs",projectThumbnail:""}),s=JSON.parse(o);r.succeed(`\u2705 Project created successfully!
|
|
2
|
+
|
|
3
|
+
`),console.log(`\u{1F4CC} Project Details:
|
|
4
|
+
Name: ${e}
|
|
5
|
+
ID: ${s.kableClientId}
|
|
6
|
+
`),await k({message:"Do you want to select this project?"})&&(await x(s._id),console.log(`\u2705Project '${e}' selected`)),process.exit(0)}catch(e){r.fail(`\u274C Failed to create project: ${e instanceof Error?e.message:"Unknown error"}`),process.exit(1)}}t(N,"createProject");export{N as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/create.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/details.ts"],"names":[],"mappings":"AAIA,wBAA8B,kBAAkB,kBA+B/C"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var h=Object.defineProperty;var t=(o,n)=>h(o,"name",{value:n,configurable:!0});import v from"keytar";var E="crossmint-cli";async function p(o){return v.getPassword(E,o)}t(p,"get");async function l(){return p("environment")}t(l,"getEnvironment");async function m(){return p("sessionToken")}t(m,"getSessionToken");async function u(){return p("projectId")}t(u,"getProjectId");import{createSpinner as w}from"nanospinner";function f(o){let n=w(o),e={start:t(r=>(n.start({text:r}),e),"start"),succeed:t(r=>(n.success({text:r}),e),"succeed"),fail:t(r=>(n.error({text:r}),e),"fail")};return e}t(f,"createSpinner");import{HttpMethods as d}from"@crossmint/common-consts";var k={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function g(o){return k[o]}t(g,"getCrossmintUrl");async function j(o,n=d.GET,e){let r=await m(),c=await l();r||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),c||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let a=`${g(c)}${o}`;return S(a,n,e,{Cookie:`sessionToken=${r}`})}t(j,"fetchAuthenticated");async function S(o,n=d.GET,e,r){let c={method:n,headers:{"Content-Type":"application/json",...r}};e&&(c.body=JSON.stringify(e));let a=await fetch(o,c);if(a.status>=400){let y=await a.json();throw new Error(`${y.message}`)}return await a.json()}t(S,"fetchJSON");import{routes as T}from"@crossmint/common-consts";async function x(o){return(await j(T.api.projects)).find(r=>r.id===o)}t(x,"getProject");async function I(){let o=await u();o||(console.error("No project selected. Please select a project first using `crossmint project select`"),process.exit(1));let n=f("Fetching project details...").start();try{let e=await x(o);e||(n.fail("Project not found"),process.exit(1)),n.succeed("Fetched project details"),console.log(`
|
|
2
|
+
\u{1F4CC} Project Details:`),console.log(`Name: ${e.name}`),console.log(`ID: ${e.kableClientId}`),console.log(`Wallet Type: ${e.addons.nonCustodialWallets?"Smart":"Custodial"}`),process.exit(0)}catch(e){n.fail("Failed to fetch project details"),console.error("Error:",e instanceof Error?e.message:"Unknown error"),process.exit(1)}}t(I,"showProjectDetails");export{I as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"details.test.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/details.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
var $=Object.defineProperty;var o=(r,t)=>$(r,"name",{value:t,configurable:!0});import{HttpMethods as y}from"@crossmint/common-consts";import d from"keytar";var g="crossmint-cli";async function j(r,t){return d.setPassword(g,r,t)}o(j,"set");async function f(r){return d.getPassword(g,r)}o(f,"get");async function h(){return f("environment")}o(h,"getEnvironment");async function x(){return f("sessionToken")}o(x,"getSessionToken");function m(r){return j("projectId",r)}o(m,"setProjectId");async function P(){return f("projectId")}o(P,"getProjectId");var I={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function w(r){return I[r]}o(w,"getCrossmintUrl");async function p(r,t=y.GET,e){let n=await x(),i=await h();n||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),i||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let a=`${w(i)}${r}`;return C(a,t,e,{Cookie:`sessionToken=${n}`})}o(p,"fetchAuthenticated");async function C(r,t=y.GET,e,n){let i={method:t,headers:{"Content-Type":"application/json",...n}};e&&(i.body=JSON.stringify(e));let a=await fetch(r,i);if(a.status>=400){let u=await a.json();throw new Error(`${u.message}`)}return await a.json()}o(C,"fetchJSON");import{routes as D}from"@crossmint/common-consts";import{select as F}from"@inquirer/prompts";import{createSpinner as N}from"nanospinner";function l(r){let t=N(r),e={start:o(n=>(t.start({text:n}),e),"start"),succeed:o(n=>(t.success({text:n}),e),"succeed"),fail:o(n=>(t.error({text:n}),e),"fail")};return e}o(l,"createSpinner");async function v(){let r=l("Fetching projects...").start();try{let t=await p(D.api.projects);if(!t||t.length===0)return r.fail("No projects found. Create a new project using `crossmint project create`"),process.exit(0);if(r.succeed("Fetched projects"),t.length===1){let n=t[0];return console.log(`You only have one project: ${n.name}`),console.log("To create another project, run `crossmint project create`"),await m(n.id),console.log(`\u2705 Project ${n.name} selected`),process.exit(0)}let e=await F({message:"Select a project:",choices:t.map(n=>({name:n.name,value:n,description:n.description}))});await m(e.id),console.log(`\u2705 Project ${e.name} selected`),process.exit(0)}catch{r.fail("Failed to fetch projects"),process.exit(1)}}o(v,"selectProject");import{confirm as O,input as U}from"@inquirer/prompts";import{HttpMethods as M}from"@crossmint/common-consts";import{routes as A}from"@crossmint/common-consts";async function E(r={}){let t=l();try{let e=r.name;e||(e=await U({message:"Enter project name:",validate:o(u=>u.length>0||"Project name is required","validate")})),t.start(`\u{1F680} Creating project "${e}" with Smart Wallets...`);let n=await p(A.api.console.projects.index,M.POST,{name:e,walletType:"smart_wallet",storageProvider:"ipfs",projectThumbnail:""}),i=JSON.parse(n);t.succeed(`\u2705 Project created successfully!
|
|
2
|
+
|
|
3
|
+
`),console.log(`\u{1F4CC} Project Details:
|
|
4
|
+
Name: ${e}
|
|
5
|
+
ID: ${i.kableClientId}
|
|
6
|
+
`),await O({message:"Do you want to select this project?"})&&(await m(i._id),console.log(`\u2705Project '${e}' selected`)),process.exit(0)}catch(e){t.fail(`\u274C Failed to create project: ${e instanceof Error?e.message:"Unknown error"}`),process.exit(1)}}o(E,"createProject");import{routes as H}from"@crossmint/common-consts";async function S(r){return(await p(H.api.projects)).find(n=>n.id===r)}o(S,"getProject");async function T(){let r=await P();r||(console.error("No project selected. Please select a project first using `crossmint project select`"),process.exit(1));let t=l("Fetching project details...").start();try{let e=await S(r);e||(t.fail("Project not found"),process.exit(1)),t.succeed("Fetched project details"),console.log(`
|
|
7
|
+
\u{1F4CC} Project Details:`),console.log(`Name: ${e.name}`),console.log(`ID: ${e.kableClientId}`),console.log(`Wallet Type: ${e.addons.nonCustodialWallets?"Smart":"Custodial"}`),process.exit(0)}catch(e){t.fail("Failed to fetch project details"),console.error("Error:",e instanceof Error?e.message:"Unknown error"),process.exit(1)}}o(T,"showProjectDetails");export{E as create,T as details,v as select};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/select.ts"],"names":[],"mappings":"AAYA,wBAA8B,aAAa,mBAqC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var E=Object.defineProperty;var e=(t,n)=>E(t,"name",{value:n,configurable:!0});import{HttpMethods as j}from"@crossmint/common-consts";import u from"keytar";var g="crossmint-cli";async function l(t,n){return u.setPassword(g,t,n)}e(l,"set");async function p(t){return u.getPassword(g,t)}e(p,"get");async function f(){return p("environment")}e(f,"getEnvironment");async function d(){return p("sessionToken")}e(d,"getSessionToken");function m(t){return l("projectId",t)}e(m,"setProjectId");var P={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function x(t){return P[t]}e(x,"getCrossmintUrl");async function h(t,n=j.GET,r){let o=await d(),s=await f();o||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),s||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let i=`${x(s)}${t}`;return S(i,n,r,{Cookie:`sessionToken=${o}`})}e(h,"fetchAuthenticated");async function S(t,n=j.GET,r,o){let s={method:n,headers:{"Content-Type":"application/json",...o}};r&&(s.body=JSON.stringify(r));let i=await fetch(t,s);if(i.status>=400){let v=await i.json();throw new Error(`${v.message}`)}return await i.json()}e(S,"fetchJSON");import{routes as k}from"@crossmint/common-consts";import{select as I}from"@inquirer/prompts";import{createSpinner as T}from"nanospinner";function y(t){let n=T(t),r={start:e(o=>(n.start({text:o}),r),"start"),succeed:e(o=>(n.success({text:o}),r),"succeed"),fail:e(o=>(n.error({text:o}),r),"fail")};return r}e(y,"createSpinner");async function $(){let t=y("Fetching projects...").start();try{let n=await h(k.api.projects);if(!n||n.length===0)return t.fail("No projects found. Create a new project using `crossmint project create`"),process.exit(0);if(t.succeed("Fetched projects"),n.length===1){let o=n[0];return console.log(`You only have one project: ${o.name}`),console.log("To create another project, run `crossmint project create`"),await m(o.id),console.log(`\u2705 Project ${o.name} selected`),process.exit(0)}let r=await I({message:"Select a project:",choices:n.map(o=>({name:o.name,value:o,description:o.description}))});await m(r.id),console.log(`\u2705 Project ${r.name} selected`),process.exit(0)}catch{t.fail("Failed to fetch projects"),process.exit(1)}}e($,"selectProject");export{$ as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.test.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/select.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAOA,wBAA8B,MAAM,kBAWnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var x=Object.defineProperty;var t=(e,o)=>x(e,"name",{value:o,configurable:!0});import{HttpMethods as d}from"@crossmint/common-consts";import y from"keytar";var h="crossmint-cli";async function p(e){return y.getPassword(h,e)}t(p,"get");async function m(){return p("environment")}t(m,"getEnvironment");async function f(){return p("sessionToken")}t(f,"getSessionToken");async function g(){return p("projectId")}t(g,"getProjectId");var w={production:"https://www.crossmint.com",staging:"https://staging.crossmint.com",local:"http://localhost:3000"};function l(e){return w[e]}t(l,"getCrossmintUrl");async function u(e,o=d.GET,n){let r=await f(),s=await m();r||(console.error("\u274C Session not found, please run crossmint login"),process.exit(1)),s||(console.error("\u274C Environment not found, please run crossmint login"),process.exit(1));let i=`${l(s)}${e}`;return P(i,o,n,{Cookie:`sessionToken=${r}`})}t(u,"fetchAuthenticated");async function P(e,o=d.GET,n,r){let s={method:o,headers:{"Content-Type":"application/json",...r}};n&&(s.body=JSON.stringify(n));let i=await fetch(e,s);if(i.status>=400){let j=await i.json();throw new Error(`${j.message}`)}return await i.json()}t(P,"fetchJSON");import{routes as k}from"@crossmint/common-consts";import{routes as T}from"@crossmint/common-consts";async function v(e){return(await u(T.api.projects)).find(r=>r.id===e)}t(v,"getProject");import{capitalizeFirstLetter as I}from"@crossmint/common-string-utils";async function $(){let e=await m(),o=await g(),n=await v(o||""),r=await u(k.authentication.getSession);console.log(`You are logged in to \u{1F340}Crossmint as: ${r.user.email} - Environment: ${I(e)} - ${n?`Project: ${n.name}`:"No project selected"}`),process.exit(0)}t($,"whoami");export{$ as default};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { APIKeyScopes } from "@crossmint/products-console-types";
|
|
2
|
+
import { APIKeyUsageOrigin } from "@crossmint/products-console-types";
|
|
3
|
+
export type ClientPlatform = "web" | "mobile";
|
|
4
|
+
export type APIKeyPayload = {
|
|
5
|
+
apiKeyId?: string;
|
|
6
|
+
usageOrigin: APIKeyUsageOrigin;
|
|
7
|
+
scopes: APIKeyScopes[];
|
|
8
|
+
whitelistedOrigins?: string[];
|
|
9
|
+
whitelistedAppIdentifiers?: string[];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/types/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAEtE,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,EAAE,CAAC;CACxC,CAAC"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pager.d.ts","sourceRoot":"","sources":["../../src/utils/Pager.ts"],"names":[],"mappings":"AAEA,qBAAa,KAAK;IACd,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,KAAK,CAA2B;;IAUxC,GAAG,CAAC,OAAO,EAAE,MAAM;IAInB,OAAO,CAAC,cAAc;IAOtB,KAAK;CAQR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=Object.defineProperty;var i=(r,t)=>n(r,"name",{value:t,configurable:!0});import{spawn as p}from"child_process";var s=class s{output="";pager;constructor(){this.pager=p("less",["-R"],{stdio:["pipe","inherit","inherit"]}),this.pager.on("exit",t=>{console.log(this.output),process.exit(t??0)})}add(t){this.output+=t}shouldUsePager(){let t=process.stdout.rows;return this.output.split(`
|
|
2
|
+
`).length>t}write(){var t,e;this.shouldUsePager()?((t=this.pager.stdin)==null||t.write(this.output),(e=this.pager.stdin)==null||e.end()):this.pager.kill()}};i(s,"Pager");var o=s;export{o as Pager};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pager.test.d.ts","sourceRoot":"","sources":["../../src/utils/Pager.test.ts"],"names":[],"mappings":""}
|