@yoonion/mimi-seed-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -0
- package/dist/admob/tools.d.ts +39 -0
- package/dist/admob/tools.js +122 -0
- package/dist/appstore/auth.d.ts +9 -0
- package/dist/appstore/auth.js +53 -0
- package/dist/appstore/setup-cli.d.ts +2 -0
- package/dist/appstore/setup-cli.js +51 -0
- package/dist/appstore/tools.d.ts +7 -0
- package/dist/appstore/tools.js +119 -0
- package/dist/auth/cli.d.ts +2 -0
- package/dist/auth/cli.js +40 -0
- package/dist/auth/constants.d.ts +2 -0
- package/dist/auth/constants.js +11 -0
- package/dist/auth/google-auth.d.ts +22 -0
- package/dist/auth/google-auth.js +159 -0
- package/dist/firebase/tools.d.ts +60 -0
- package/dist/firebase/tools.js +183 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +447 -0
- package/dist/playstore/tools.d.ts +53 -0
- package/dist/playstore/tools.js +197 -0
- package/package.json +57 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
import http from 'node:http';
|
|
3
|
+
import open from 'open';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
const SCOPES = [
|
|
8
|
+
'https://www.googleapis.com/auth/firebase',
|
|
9
|
+
'https://www.googleapis.com/auth/cloud-platform',
|
|
10
|
+
'https://www.googleapis.com/auth/admob.readonly',
|
|
11
|
+
'https://www.googleapis.com/auth/admob.monetization',
|
|
12
|
+
'https://www.googleapis.com/auth/androidpublisher',
|
|
13
|
+
];
|
|
14
|
+
// Primary config dir. Legacy `~/.preseed` is read as a fallback during the
|
|
15
|
+
// rebrand so existing auth sessions don't force a re-login; new writes go to
|
|
16
|
+
// the new dir.
|
|
17
|
+
const TOKEN_DIR = path.join(os.homedir(), '.mimi-seed');
|
|
18
|
+
const LEGACY_TOKEN_DIR = path.join(os.homedir(), '.preseed');
|
|
19
|
+
const TOKEN_PATH = path.join(TOKEN_DIR, 'tokens.json');
|
|
20
|
+
const LEGACY_TOKEN_PATH = path.join(LEGACY_TOKEN_DIR, 'tokens.json');
|
|
21
|
+
const CREDENTIALS_PATH = path.join(TOKEN_DIR, 'credentials.json');
|
|
22
|
+
// Default OAuth client for development — users should replace with their own
|
|
23
|
+
const DEFAULT_CLIENT_ID = ''; // Will be set during auth setup
|
|
24
|
+
const DEFAULT_CLIENT_SECRET = '';
|
|
25
|
+
function ensureDir() {
|
|
26
|
+
if (!fs.existsSync(TOKEN_DIR)) {
|
|
27
|
+
fs.mkdirSync(TOKEN_DIR, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function getStoredCredentials() {
|
|
31
|
+
if (!fs.existsSync(CREDENTIALS_PATH))
|
|
32
|
+
return null;
|
|
33
|
+
try {
|
|
34
|
+
const data = JSON.parse(fs.readFileSync(CREDENTIALS_PATH, 'utf-8'));
|
|
35
|
+
return { clientId: data.clientId, clientSecret: data.clientSecret };
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function saveCredentials(clientId, clientSecret) {
|
|
42
|
+
ensureDir();
|
|
43
|
+
fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify({ clientId, clientSecret }, null, 2), { mode: 0o600 });
|
|
44
|
+
}
|
|
45
|
+
export function getStoredTokens() {
|
|
46
|
+
// Prefer new dir; fall back to legacy ~/.preseed during the rebrand window.
|
|
47
|
+
const pathToRead = fs.existsSync(TOKEN_PATH)
|
|
48
|
+
? TOKEN_PATH
|
|
49
|
+
: fs.existsSync(LEGACY_TOKEN_PATH)
|
|
50
|
+
? LEGACY_TOKEN_PATH
|
|
51
|
+
: null;
|
|
52
|
+
if (!pathToRead)
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(fs.readFileSync(pathToRead, 'utf-8'));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function saveTokens(tokens) {
|
|
62
|
+
ensureDir();
|
|
63
|
+
fs.writeFileSync(TOKEN_PATH, JSON.stringify(tokens, null, 2), { mode: 0o600 });
|
|
64
|
+
}
|
|
65
|
+
export function createOAuth2Client(clientId, clientSecret) {
|
|
66
|
+
return new google.auth.OAuth2(clientId, clientSecret, 'http://localhost:9876/callback');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get authenticated OAuth2 client.
|
|
70
|
+
* Returns null if not authenticated yet.
|
|
71
|
+
*/
|
|
72
|
+
export function getAuthenticatedClient() {
|
|
73
|
+
const creds = getStoredCredentials();
|
|
74
|
+
if (!creds)
|
|
75
|
+
return null;
|
|
76
|
+
const tokens = getStoredTokens();
|
|
77
|
+
if (!tokens)
|
|
78
|
+
return null;
|
|
79
|
+
const client = createOAuth2Client(creds.clientId, creds.clientSecret);
|
|
80
|
+
client.setCredentials(tokens);
|
|
81
|
+
// Auto-refresh
|
|
82
|
+
client.on('tokens', (newTokens) => {
|
|
83
|
+
const stored = getStoredTokens();
|
|
84
|
+
if (stored) {
|
|
85
|
+
saveTokens({
|
|
86
|
+
...stored,
|
|
87
|
+
...(newTokens.access_token && { access_token: newTokens.access_token }),
|
|
88
|
+
...(newTokens.refresh_token && { refresh_token: newTokens.refresh_token }),
|
|
89
|
+
...(newTokens.expiry_date && { expiry_date: newTokens.expiry_date }),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return client;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Interactive login — opens browser, waits for callback
|
|
97
|
+
*/
|
|
98
|
+
export async function login(clientId, clientSecret) {
|
|
99
|
+
saveCredentials(clientId, clientSecret);
|
|
100
|
+
const oauth2Client = createOAuth2Client(clientId, clientSecret);
|
|
101
|
+
const authUrl = oauth2Client.generateAuthUrl({
|
|
102
|
+
access_type: 'offline',
|
|
103
|
+
scope: SCOPES,
|
|
104
|
+
prompt: 'consent',
|
|
105
|
+
});
|
|
106
|
+
return new Promise((resolve, reject) => {
|
|
107
|
+
const server = http.createServer(async (req, res) => {
|
|
108
|
+
try {
|
|
109
|
+
const url = new URL(req.url, `http://localhost:9876`);
|
|
110
|
+
if (url.pathname !== '/callback') {
|
|
111
|
+
res.writeHead(404);
|
|
112
|
+
res.end();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const code = url.searchParams.get('code');
|
|
116
|
+
if (!code) {
|
|
117
|
+
res.writeHead(400);
|
|
118
|
+
res.end('No code');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const { tokens } = await oauth2Client.getToken(code);
|
|
122
|
+
if (!tokens.access_token || !tokens.refresh_token) {
|
|
123
|
+
throw new Error('Token response missing required fields');
|
|
124
|
+
}
|
|
125
|
+
const stored = {
|
|
126
|
+
access_token: tokens.access_token,
|
|
127
|
+
refresh_token: tokens.refresh_token,
|
|
128
|
+
token_type: tokens.token_type ?? 'Bearer',
|
|
129
|
+
expiry_date: tokens.expiry_date ?? Date.now() + 3600_000,
|
|
130
|
+
};
|
|
131
|
+
saveTokens(stored);
|
|
132
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
133
|
+
res.end(`
|
|
134
|
+
<html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
|
|
135
|
+
<div style="text-align:center">
|
|
136
|
+
<h1>✅ Mimi Seed 인증 완료!</h1>
|
|
137
|
+
<p>이 창을 닫고 Claude Code로 돌아가세요.</p>
|
|
138
|
+
</div>
|
|
139
|
+
</body></html>
|
|
140
|
+
`);
|
|
141
|
+
server.close();
|
|
142
|
+
resolve(stored);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
res.writeHead(500);
|
|
146
|
+
res.end('Auth error');
|
|
147
|
+
server.close();
|
|
148
|
+
reject(err);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
server.on('error', (err) => {
|
|
152
|
+
reject(new Error(`포트 9876이 이미 사용 중입니다. 다른 mimi-seed auth 프로세스를 종료하세요.`));
|
|
153
|
+
});
|
|
154
|
+
server.listen(9876, () => {
|
|
155
|
+
console.log('🔐 브라우저에서 Google 로그인 중...');
|
|
156
|
+
open(authUrl);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { OAuth2Client } from 'google-auth-library';
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Management API + Cloud Resource Manager 래퍼
|
|
4
|
+
*/
|
|
5
|
+
export declare function listProjects(auth: OAuth2Client): Promise<{
|
|
6
|
+
projectId: string | null | undefined;
|
|
7
|
+
displayName: string | null | undefined;
|
|
8
|
+
state: string | null | undefined;
|
|
9
|
+
projectNumber: string | null | undefined;
|
|
10
|
+
}[]>;
|
|
11
|
+
export declare function getProject(auth: OAuth2Client, projectId: string): Promise<import("googleapis").firebase_v1beta1.Schema$FirebaseProject>;
|
|
12
|
+
export declare function listAndroidApps(auth: OAuth2Client, projectId: string): Promise<{
|
|
13
|
+
appId: string | null | undefined;
|
|
14
|
+
packageName: string | null | undefined;
|
|
15
|
+
displayName: string | null | undefined;
|
|
16
|
+
state: string | null | undefined;
|
|
17
|
+
}[]>;
|
|
18
|
+
export declare function createAndroidApp(auth: OAuth2Client, projectId: string, packageName: string, displayName: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
19
|
+
export declare function getAndroidConfig(auth: OAuth2Client, projectId: string, appId: string): Promise<{
|
|
20
|
+
filename: string | null | undefined;
|
|
21
|
+
content: string | null;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function deleteAndroidApp(auth: OAuth2Client, projectId: string, appId: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
24
|
+
export declare function listIosApps(auth: OAuth2Client, projectId: string): Promise<{
|
|
25
|
+
appId: string | null | undefined;
|
|
26
|
+
bundleId: string | null | undefined;
|
|
27
|
+
displayName: string | null | undefined;
|
|
28
|
+
state: string | null | undefined;
|
|
29
|
+
}[]>;
|
|
30
|
+
export declare function createIosApp(auth: OAuth2Client, projectId: string, bundleId: string, displayName: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
31
|
+
export declare function getIosConfig(auth: OAuth2Client, projectId: string, appId: string): Promise<{
|
|
32
|
+
filename: string | null | undefined;
|
|
33
|
+
content: string | null;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function deleteIosApp(auth: OAuth2Client, projectId: string, appId: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
36
|
+
export declare function listWebApps(auth: OAuth2Client, projectId: string): Promise<{
|
|
37
|
+
appId: string | null | undefined;
|
|
38
|
+
displayName: string | null | undefined;
|
|
39
|
+
state: string | null | undefined;
|
|
40
|
+
}[]>;
|
|
41
|
+
export declare function createWebApp(auth: OAuth2Client, projectId: string, displayName: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
42
|
+
export declare function getWebConfig(auth: OAuth2Client, projectId: string, appId: string): Promise<import("googleapis").firebase_v1beta1.Schema$WebAppConfig>;
|
|
43
|
+
export declare function deleteWebApp(auth: OAuth2Client, projectId: string, appId: string): Promise<import("googleapis").firebase_v1beta1.Schema$Operation>;
|
|
44
|
+
export declare function enableService(auth: OAuth2Client, projectId: string, serviceId: string): Promise<{
|
|
45
|
+
service: string;
|
|
46
|
+
state: string | null | undefined;
|
|
47
|
+
}>;
|
|
48
|
+
export declare function listEnabledServices(auth: OAuth2Client, projectId: string): Promise<{
|
|
49
|
+
name: string | null | undefined;
|
|
50
|
+
title: string | null | undefined;
|
|
51
|
+
}[]>;
|
|
52
|
+
export declare function enableCommonServices(auth: OAuth2Client, projectId: string): Promise<({
|
|
53
|
+
service: string;
|
|
54
|
+
status: string;
|
|
55
|
+
message?: undefined;
|
|
56
|
+
} | {
|
|
57
|
+
service: string;
|
|
58
|
+
status: string;
|
|
59
|
+
message: any;
|
|
60
|
+
})[]>;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Management API + Cloud Resource Manager 래퍼
|
|
4
|
+
*/
|
|
5
|
+
// ─── 프로젝트 ───
|
|
6
|
+
export async function listProjects(auth) {
|
|
7
|
+
const res = await google.firebase('v1beta1').projects.list({ auth });
|
|
8
|
+
return (res.data.results ?? []).map((p) => ({
|
|
9
|
+
projectId: p.projectId,
|
|
10
|
+
displayName: p.displayName,
|
|
11
|
+
state: p.state,
|
|
12
|
+
projectNumber: p.projectNumber,
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
export async function getProject(auth, projectId) {
|
|
16
|
+
const res = await google.firebase('v1beta1').projects.get({
|
|
17
|
+
auth,
|
|
18
|
+
name: `projects/${projectId}`,
|
|
19
|
+
});
|
|
20
|
+
return res.data;
|
|
21
|
+
}
|
|
22
|
+
// ─── Android 앱 ───
|
|
23
|
+
export async function listAndroidApps(auth, projectId) {
|
|
24
|
+
const res = await google.firebase('v1beta1').projects.androidApps.list({
|
|
25
|
+
auth,
|
|
26
|
+
parent: `projects/${projectId}`,
|
|
27
|
+
});
|
|
28
|
+
return (res.data.apps ?? []).map((a) => ({
|
|
29
|
+
appId: a.appId,
|
|
30
|
+
packageName: a.packageName,
|
|
31
|
+
displayName: a.displayName,
|
|
32
|
+
state: a.state,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
export async function createAndroidApp(auth, projectId, packageName, displayName) {
|
|
36
|
+
const res = await google.firebase('v1beta1').projects.androidApps.create({
|
|
37
|
+
auth,
|
|
38
|
+
parent: `projects/${projectId}`,
|
|
39
|
+
requestBody: { packageName, displayName },
|
|
40
|
+
});
|
|
41
|
+
return res.data;
|
|
42
|
+
}
|
|
43
|
+
export async function getAndroidConfig(auth, projectId, appId) {
|
|
44
|
+
const res = await google.firebase('v1beta1').projects.androidApps.getConfig({
|
|
45
|
+
auth,
|
|
46
|
+
name: `projects/${projectId}/androidApps/${appId}/config`,
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
filename: res.data.configFilename,
|
|
50
|
+
content: res.data.configFileContents
|
|
51
|
+
? Buffer.from(res.data.configFileContents, 'base64').toString('utf-8')
|
|
52
|
+
: null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function deleteAndroidApp(auth, projectId, appId) {
|
|
56
|
+
const res = await google.firebase('v1beta1').projects.androidApps.remove({
|
|
57
|
+
auth,
|
|
58
|
+
name: `projects/${projectId}/androidApps/${appId}`,
|
|
59
|
+
requestBody: { immediate: true },
|
|
60
|
+
});
|
|
61
|
+
return res.data;
|
|
62
|
+
}
|
|
63
|
+
// ─── iOS 앱 ───
|
|
64
|
+
export async function listIosApps(auth, projectId) {
|
|
65
|
+
const res = await google.firebase('v1beta1').projects.iosApps.list({
|
|
66
|
+
auth,
|
|
67
|
+
parent: `projects/${projectId}`,
|
|
68
|
+
});
|
|
69
|
+
return (res.data.apps ?? []).map((a) => ({
|
|
70
|
+
appId: a.appId,
|
|
71
|
+
bundleId: a.bundleId,
|
|
72
|
+
displayName: a.displayName,
|
|
73
|
+
state: a.state,
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
export async function createIosApp(auth, projectId, bundleId, displayName) {
|
|
77
|
+
const res = await google.firebase('v1beta1').projects.iosApps.create({
|
|
78
|
+
auth,
|
|
79
|
+
parent: `projects/${projectId}`,
|
|
80
|
+
requestBody: { bundleId, displayName },
|
|
81
|
+
});
|
|
82
|
+
return res.data;
|
|
83
|
+
}
|
|
84
|
+
export async function getIosConfig(auth, projectId, appId) {
|
|
85
|
+
const res = await google.firebase('v1beta1').projects.iosApps.getConfig({
|
|
86
|
+
auth,
|
|
87
|
+
name: `projects/${projectId}/iosApps/${appId}/config`,
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
filename: res.data.configFilename,
|
|
91
|
+
content: res.data.configFileContents
|
|
92
|
+
? Buffer.from(res.data.configFileContents, 'base64').toString('utf-8')
|
|
93
|
+
: null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export async function deleteIosApp(auth, projectId, appId) {
|
|
97
|
+
const res = await google.firebase('v1beta1').projects.iosApps.remove({
|
|
98
|
+
auth,
|
|
99
|
+
name: `projects/${projectId}/iosApps/${appId}`,
|
|
100
|
+
requestBody: { immediate: true },
|
|
101
|
+
});
|
|
102
|
+
return res.data;
|
|
103
|
+
}
|
|
104
|
+
// ─── Web 앱 ───
|
|
105
|
+
export async function listWebApps(auth, projectId) {
|
|
106
|
+
const res = await google.firebase('v1beta1').projects.webApps.list({
|
|
107
|
+
auth,
|
|
108
|
+
parent: `projects/${projectId}`,
|
|
109
|
+
});
|
|
110
|
+
return (res.data.apps ?? []).map((a) => ({
|
|
111
|
+
appId: a.appId,
|
|
112
|
+
displayName: a.displayName,
|
|
113
|
+
state: a.state,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
export async function createWebApp(auth, projectId, displayName) {
|
|
117
|
+
const res = await google.firebase('v1beta1').projects.webApps.create({
|
|
118
|
+
auth,
|
|
119
|
+
parent: `projects/${projectId}`,
|
|
120
|
+
requestBody: { displayName },
|
|
121
|
+
});
|
|
122
|
+
return res.data;
|
|
123
|
+
}
|
|
124
|
+
export async function getWebConfig(auth, projectId, appId) {
|
|
125
|
+
const res = await google.firebase('v1beta1').projects.webApps.getConfig({
|
|
126
|
+
auth,
|
|
127
|
+
name: `projects/${projectId}/webApps/${appId}/config`,
|
|
128
|
+
});
|
|
129
|
+
return res.data;
|
|
130
|
+
}
|
|
131
|
+
export async function deleteWebApp(auth, projectId, appId) {
|
|
132
|
+
const res = await google.firebase('v1beta1').projects.webApps.remove({
|
|
133
|
+
auth,
|
|
134
|
+
name: `projects/${projectId}/webApps/${appId}`,
|
|
135
|
+
requestBody: { immediate: true },
|
|
136
|
+
});
|
|
137
|
+
return res.data;
|
|
138
|
+
}
|
|
139
|
+
// ─── 서비스 활성화 ───
|
|
140
|
+
export async function enableService(auth, projectId, serviceId) {
|
|
141
|
+
const serviceusage = google.serviceusage('v1');
|
|
142
|
+
const res = await serviceusage.services.enable({
|
|
143
|
+
auth,
|
|
144
|
+
name: `projects/${projectId}/services/${serviceId}`,
|
|
145
|
+
});
|
|
146
|
+
return { service: serviceId, state: res.data.name };
|
|
147
|
+
}
|
|
148
|
+
export async function listEnabledServices(auth, projectId) {
|
|
149
|
+
const serviceusage = google.serviceusage('v1');
|
|
150
|
+
const res = await serviceusage.services.list({
|
|
151
|
+
auth,
|
|
152
|
+
parent: `projects/${projectId}`,
|
|
153
|
+
filter: 'state:ENABLED',
|
|
154
|
+
pageSize: 200,
|
|
155
|
+
});
|
|
156
|
+
return (res.data.services ?? []).map((s) => ({
|
|
157
|
+
name: s.config?.name,
|
|
158
|
+
title: s.config?.title,
|
|
159
|
+
}));
|
|
160
|
+
}
|
|
161
|
+
// ─── 편의 함수 ───
|
|
162
|
+
const COMMON_SERVICES = [
|
|
163
|
+
'firebase.googleapis.com',
|
|
164
|
+
'firestore.googleapis.com',
|
|
165
|
+
'firebaseauth.googleapis.com',
|
|
166
|
+
'firebasestorage.googleapis.com',
|
|
167
|
+
'fcm.googleapis.com',
|
|
168
|
+
'identitytoolkit.googleapis.com',
|
|
169
|
+
'cloudresourcemanager.googleapis.com',
|
|
170
|
+
];
|
|
171
|
+
export async function enableCommonServices(auth, projectId) {
|
|
172
|
+
const results = [];
|
|
173
|
+
for (const svc of COMMON_SERVICES) {
|
|
174
|
+
try {
|
|
175
|
+
await enableService(auth, projectId, svc);
|
|
176
|
+
results.push({ service: svc, status: 'enabled' });
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
results.push({ service: svc, status: 'error', message: err.message });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return results;
|
|
183
|
+
}
|
package/dist/index.d.ts
ADDED