megastudy-letter 1.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/MegastudyLetterClient.d.ts +25 -0
  4. package/dist/MegastudyLetterClient.d.ts.map +1 -0
  5. package/dist/MegastudyLetterClient.js +203 -0
  6. package/dist/MegastudyLetterClient.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +177 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/index.d.ts +5 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +10 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/internal/cookieJar.d.ts +20 -0
  16. package/dist/internal/cookieJar.d.ts.map +1 -0
  17. package/dist/internal/cookieJar.js +150 -0
  18. package/dist/internal/cookieJar.js.map +1 -0
  19. package/dist/internal/encoding.d.ts +2 -0
  20. package/dist/internal/encoding.d.ts.map +1 -0
  21. package/dist/internal/encoding.js +43 -0
  22. package/dist/internal/encoding.js.map +1 -0
  23. package/dist/internal/html.d.ts +4 -0
  24. package/dist/internal/html.d.ts.map +1 -0
  25. package/dist/internal/html.js +37 -0
  26. package/dist/internal/html.js.map +1 -0
  27. package/dist/internal/http.d.ts +24 -0
  28. package/dist/internal/http.d.ts.map +1 -0
  29. package/dist/internal/http.js +57 -0
  30. package/dist/internal/http.js.map +1 -0
  31. package/dist/internal/multipartEucKr.d.ts +18 -0
  32. package/dist/internal/multipartEucKr.d.ts.map +1 -0
  33. package/dist/internal/multipartEucKr.js +37 -0
  34. package/dist/internal/multipartEucKr.js.map +1 -0
  35. package/dist/internal/parsers/classList.d.ts +3 -0
  36. package/dist/internal/parsers/classList.d.ts.map +1 -0
  37. package/dist/internal/parsers/classList.js +19 -0
  38. package/dist/internal/parsers/classList.js.map +1 -0
  39. package/dist/internal/parsers/parentList.d.ts +3 -0
  40. package/dist/internal/parsers/parentList.d.ts.map +1 -0
  41. package/dist/internal/parsers/parentList.js +52 -0
  42. package/dist/internal/parsers/parentList.js.map +1 -0
  43. package/dist/internal/parsers/writeContext.d.ts +3 -0
  44. package/dist/internal/parsers/writeContext.d.ts.map +1 -0
  45. package/dist/internal/parsers/writeContext.js +25 -0
  46. package/dist/internal/parsers/writeContext.js.map +1 -0
  47. package/dist/types.d.ts +64 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +3 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +41 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 GurumNyang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,79 @@
1
+ # megastudy-letter.js
2
+
3
+ 메가스터디 학부모편지(부모님편지) 서비스를 자동화하는 **Node.js용 라이브러리/CLI**입니다.
4
+
5
+ 지원 기능:
6
+ - 메가스터디 계정 로그인(ID/비번)
7
+ - 부모님편지 게시판 목록 조회
8
+ - 부모님편지 작성/게시
9
+
10
+ 기본 대상은 `seochob.megastudy.net` 이지만, 지점별로 `*.megastudy.net` 형태로 호스트만 바꾸면 동작하도록 설계했습니다.
11
+
12
+ ## 설치
13
+
14
+ ```bash
15
+ npm install megastudy-letter
16
+ ```
17
+
18
+ ## 라이브러리 사용법
19
+
20
+ ```typescript
21
+ import MegastudyLetterClient from 'megastudy-letter';
22
+
23
+ const client = new MegastudyLetterClient({ host: 'seochob.megastudy.net' });
24
+
25
+ await client.login({ userId: '아이디', password: '비밀번호' });
26
+
27
+ // 게시판 목록 조회 (전체글/내글)
28
+ const all = await client.listParentLetters({ listMode: 'Y', page: 1 });
29
+ const mine = await client.listParentLetters({ listMode: 'N', page: 1 });
30
+
31
+ // 반(담임) 목록 조회 (글쓰기 폼의 sclass 옵션)
32
+ const classes = await client.getClassList();
33
+
34
+ // 편지 작성/게시
35
+ await client.postParentLetter({
36
+ receiver: '학생 이름',
37
+ classId: classes[0]?.value ?? '1484',
38
+ writer: '보내는 사람 이름',
39
+ relation: '관계(예: 부/모/본인)',
40
+ title: '제목',
41
+ content: '내용',
42
+ });
43
+ ```
44
+
45
+ ## CLI 사용법
46
+
47
+ ```bash
48
+ # 로그인 확인
49
+ megastudy-letter login --host seochob.megastudy.net --userid <id> --passwd <pw>
50
+
51
+ # 게시판 목록 조회
52
+ megastudy-letter list --host seochob.megastudy.net --userid <id> --passwd <pw> --mode all --page 1
53
+ megastudy-letter list --host seochob.megastudy.net --userid <id> --passwd <pw> --mode mine --page 1 --json
54
+
55
+ # 반 목록 조회
56
+ megastudy-letter classes --host seochob.megastudy.net --userid <id> --passwd <pw>
57
+
58
+ # 편지 게시
59
+ megastudy-letter post --host seochob.megastudy.net --userid <id> --passwd <pw> --class 1484 --title "제목" --content-file ./newsletter.txt
60
+ ```
61
+
62
+ 환경변수로도 지정할 수 있습니다:
63
+ - `MEGASTUDY_USERID`
64
+ - `MEGASTUDY_PASSWD`
65
+
66
+ ## 개발
67
+
68
+ ```bash
69
+ npm install
70
+ npm run build
71
+ npm run dev
72
+ npm run lint
73
+ npm run format
74
+ npm run clean
75
+ ```
76
+
77
+ ## License
78
+
79
+ MIT
@@ -0,0 +1,25 @@
1
+ import { CookieJar } from './internal/cookieJar';
2
+ import type { ClassOption, GetClassListParams, ListParentLettersParams, LoginParams, ParentLetterListResult, PostParentLetterInput, PostParentLetterResult, WriteContext } from './types';
3
+ export type MegastudyLetterClientOptions = {
4
+ baseUrl?: string;
5
+ host?: string;
6
+ userAgent?: string;
7
+ };
8
+ export declare class MegastudyLetterClient {
9
+ private http;
10
+ private baseUrl;
11
+ constructor(options?: MegastudyLetterClientOptions);
12
+ getCookieJar(): CookieJar;
13
+ isLoggedIn(): boolean;
14
+ login(params: LoginParams): Promise<void>;
15
+ listParentLetters(params?: ListParentLettersParams): Promise<ParentLetterListResult>;
16
+ private getCampusDetailCode;
17
+ getClassList(params?: GetClassListParams): Promise<ClassOption[]>;
18
+ getWriteContext(): Promise<WriteContext>;
19
+ postParentLetter(input: PostParentLetterInput, options?: {
20
+ verify?: boolean;
21
+ }): Promise<PostParentLetterResult & {
22
+ writeContext: WriteContext;
23
+ }>;
24
+ }
25
+ //# sourceMappingURL=MegastudyLetterClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegastudyLetterClient.d.ts","sourceRoot":"","sources":["../src/MegastudyLetterClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAMjD,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EAEX,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyBF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,4BAAiC;IAOtD,YAAY,IAAI,SAAS;IAIzB,UAAU,IAAI,OAAO;IAKf,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCzC,iBAAiB,CACrB,MAAM,GAAE,uBAA4B,GACnC,OAAO,CAAC,sBAAsB,CAAC;IAwBlC,OAAO,CAAC,mBAAmB;IAYrB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAuBrE,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IAoBxC,gBAAgB,CACpB,KAAK,EAAE,qBAAqB,EAC5B,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACjC,OAAO,CAAC,sBAAsB,GAAG;QAAE,YAAY,EAAE,YAAY,CAAA;KAAE,CAAC;CA6EpE"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MegastudyLetterClient = void 0;
4
+ const cookieJar_1 = require("./internal/cookieJar");
5
+ const http_1 = require("./internal/http");
6
+ const multipartEucKr_1 = require("./internal/multipartEucKr");
7
+ const classList_1 = require("./internal/parsers/classList");
8
+ const parentList_1 = require("./internal/parsers/parentList");
9
+ const writeContext_1 = require("./internal/parsers/writeContext");
10
+ const COOKIE_CAMPUS = 'campus%5Fmega';
11
+ const COOKIE_CAMPUS_DETAIL_CODE = 'MEGA%5FCAMPUS%5FDETAIL%5FCODE';
12
+ function ensureBaseUrl(options) {
13
+ if (options.baseUrl) {
14
+ if (/^https?:\/\//i.test(options.baseUrl))
15
+ return options.baseUrl;
16
+ return `https://${options.baseUrl}`;
17
+ }
18
+ const host = options.host ?? 'seochob.megastudy.net';
19
+ return /^https?:\/\//i.test(host) ? host : `https://${host}`;
20
+ }
21
+ function extractAlertMessage(html) {
22
+ const m = html.match(/alert\(\s*['"]([\s\S]*?)['"]\s*\)/i);
23
+ const raw = m?.[1]?.trim();
24
+ if (!raw)
25
+ return undefined;
26
+ return raw
27
+ .replace(/\\r\\n/g, '\n')
28
+ .replace(/\\n/g, '\n')
29
+ .replace(/\\r/g, '\r')
30
+ .replace(/\\t/g, '\t');
31
+ }
32
+ class MegastudyLetterClient {
33
+ constructor(options = {}) {
34
+ const baseUrl = ensureBaseUrl(options).replace(/\/+$/, '');
35
+ this.baseUrl = baseUrl;
36
+ const jar = new cookieJar_1.CookieJar();
37
+ this.http = new http_1.HttpClient(jar, { baseUrl, userAgent: options.userAgent });
38
+ }
39
+ getCookieJar() {
40
+ return this.http.getCookieJar();
41
+ }
42
+ isLoggedIn() {
43
+ const v = this.http.getCookieJar().getCookieValue(COOKIE_CAMPUS);
44
+ return typeof v === 'string' && v.length > 0;
45
+ }
46
+ async login(params) {
47
+ const returnUrl = params.returnUrl ?? '';
48
+ await this.http.request('/member/login.asp', {
49
+ method: 'GET',
50
+ headers: {
51
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
52
+ },
53
+ });
54
+ const body = new URLSearchParams({
55
+ rtnUrl: returnUrl,
56
+ userid: params.userId,
57
+ passwd: params.password,
58
+ });
59
+ const res = await this.http.request('/member/login_proc.asp', {
60
+ method: 'POST',
61
+ headers: {
62
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
63
+ 'content-type': 'application/x-www-form-urlencoded',
64
+ referer: `${this.baseUrl}/member/login.asp`,
65
+ },
66
+ body: body.toString(),
67
+ });
68
+ const alertMsg = extractAlertMessage(res.text);
69
+ if (alertMsg)
70
+ throw new Error(`Login failed: ${alertMsg}`);
71
+ if (!this.isLoggedIn()) {
72
+ throw new Error('Login failed: missing session cookie (campus_mega).');
73
+ }
74
+ }
75
+ async listParentLetters(params = {}) {
76
+ if (!this.isLoggedIn()) {
77
+ throw new Error('Not logged in. Call login() first.');
78
+ }
79
+ const page = params.page ?? 1;
80
+ const listMode = params.listMode ?? 'Y';
81
+ const url = `/megastudy/story/parent.asp?curPage=${encodeURIComponent(String(page))}&curGroupPage=&Gubun=&listMode=${encodeURIComponent(listMode)}`;
82
+ const res = await this.http.request(url, {
83
+ method: 'GET',
84
+ headers: {
85
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
86
+ },
87
+ });
88
+ const items = (0, parentList_1.parseParentList)(res.text);
89
+ return { page, listMode, items };
90
+ }
91
+ getCampusDetailCode() {
92
+ const code = this.http
93
+ .getCookieJar()
94
+ .getCookieValue(COOKIE_CAMPUS_DETAIL_CODE);
95
+ if (!code) {
96
+ throw new Error(`Missing cookie ${COOKIE_CAMPUS_DETAIL_CODE}; login first.`);
97
+ }
98
+ return code;
99
+ }
100
+ async getClassList(params = {}) {
101
+ if (!this.isLoggedIn()) {
102
+ throw new Error('Not logged in. Call login() first.');
103
+ }
104
+ const acacode = params.acacode ?? this.getCampusDetailCode();
105
+ const dbClass = params.dbClass ?? '';
106
+ const url = `/megastudy/story/classlist_ax.asp?acacode=${encodeURIComponent(acacode)}&DBclass=${encodeURIComponent(dbClass)}`;
107
+ const res = await this.http.request(url, {
108
+ method: 'GET',
109
+ headers: {
110
+ accept: 'text/html, */*; q=0.01',
111
+ 'x-requested-with': 'XMLHttpRequest',
112
+ referer: `${this.baseUrl}/megastudy/story/parent_write.asp?listMode=Y&Gubun=`,
113
+ },
114
+ });
115
+ return (0, classList_1.parseClassList)(res.text);
116
+ }
117
+ async getWriteContext() {
118
+ if (!this.isLoggedIn()) {
119
+ throw new Error('Not logged in. Call login() first.');
120
+ }
121
+ const res = await this.http.request('/megastudy/story/parent_write.asp?listMode=Y&Gubun=', {
122
+ method: 'GET',
123
+ headers: {
124
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
125
+ referer: `${this.baseUrl}/megastudy/story/parent.asp`,
126
+ },
127
+ });
128
+ return (0, writeContext_1.parseWriteContext)(res.text);
129
+ }
130
+ async postParentLetter(input, options = {}) {
131
+ if (!this.isLoggedIn()) {
132
+ throw new Error('Not logged in. Call login() first.');
133
+ }
134
+ const writeContext = await this.getWriteContext();
135
+ const { body, contentType } = (0, multipartEucKr_1.buildMultipartEucKrBody)({
136
+ fields: [
137
+ { name: 'Code', value: writeContext.code },
138
+ { name: 'oldfile', value: writeContext.oldfile },
139
+ { name: 'SessionMcode', value: writeContext.sessionMcode },
140
+ { name: 'Pass', value: input.pass ?? writeContext.pass },
141
+ {
142
+ name: 'SCode_detail',
143
+ value: input.scodeDetail ?? writeContext.scodeDetail,
144
+ },
145
+ { name: 'Receiver', value: input.receiver ?? '' },
146
+ { name: 'sclass', value: input.classId },
147
+ { name: 'Writer', value: input.writer ?? '' },
148
+ { name: 'Relation', value: input.relation ?? '' },
149
+ { name: 'Title', value: input.title },
150
+ { name: 'contents', value: input.content },
151
+ { name: 'wrkr_no', value: writeContext.wrkrNo },
152
+ ],
153
+ file: input.file
154
+ ? {
155
+ name: 'ufile',
156
+ filename: input.file.filename,
157
+ contentType: input.file.contentType ?? 'application/octet-stream',
158
+ data: input.file.data,
159
+ }
160
+ : undefined,
161
+ });
162
+ const res = await this.http.request('/megastudy/story/LetterEx.asp', {
163
+ method: 'POST',
164
+ headers: {
165
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
166
+ origin: this.baseUrl,
167
+ referer: `${this.baseUrl}/megastudy/story/parent_write.asp?listMode=Y&Gubun=`,
168
+ 'content-type': contentType,
169
+ 'content-length': String(body.length),
170
+ },
171
+ body,
172
+ });
173
+ const message = extractAlertMessage(res.text);
174
+ const ok = res.status >= 200 &&
175
+ res.status < 300 &&
176
+ (!message || !/오류|실패/i.test(message));
177
+ if (ok && options.verify !== false) {
178
+ try {
179
+ const mine = await this.listParentLetters({ page: 1, listMode: 'N' });
180
+ const found = mine.items.find((it) => it.title === input.title);
181
+ if (!found) {
182
+ return {
183
+ ok: false,
184
+ message: 'Posted, but verification failed.',
185
+ raw: res.text,
186
+ writeContext,
187
+ };
188
+ }
189
+ }
190
+ catch {
191
+ return {
192
+ ok: false,
193
+ message: 'Posted, but verification failed.',
194
+ raw: res.text,
195
+ writeContext,
196
+ };
197
+ }
198
+ }
199
+ return { ok, message, raw: res.text, writeContext };
200
+ }
201
+ }
202
+ exports.MegastudyLetterClient = MegastudyLetterClient;
203
+ //# sourceMappingURL=MegastudyLetterClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MegastudyLetterClient.js","sourceRoot":"","sources":["../src/MegastudyLetterClient.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,177 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_process_1 = __importDefault(require("node:process"));
9
+ const MegastudyLetterClient_1 = require("./MegastudyLetterClient");
10
+ node_process_1.default.stdout.on('error', (err) => {
11
+ if (err.code === 'EPIPE')
12
+ node_process_1.default.exit(0);
13
+ });
14
+ function parseArgs(argv) {
15
+ const positionals = [];
16
+ const flags = {};
17
+ for (let i = 0; i < argv.length; i++) {
18
+ const arg = argv[i];
19
+ if (arg === '--') {
20
+ positionals.push(...argv.slice(i + 1));
21
+ break;
22
+ }
23
+ if (!arg.startsWith('--')) {
24
+ positionals.push(arg);
25
+ continue;
26
+ }
27
+ const trimmed = arg.slice(2);
28
+ const eq = trimmed.indexOf('=');
29
+ if (eq !== -1) {
30
+ const key = trimmed.slice(0, eq);
31
+ const value = trimmed.slice(eq + 1);
32
+ flags[key] = value;
33
+ continue;
34
+ }
35
+ const key = trimmed;
36
+ const next = argv[i + 1];
37
+ if (next && !next.startsWith('-')) {
38
+ flags[key] = next;
39
+ i++;
40
+ continue;
41
+ }
42
+ flags[key] = true;
43
+ }
44
+ return { positionals, flags };
45
+ }
46
+ function flagString(flags, key) {
47
+ const v = flags[key];
48
+ if (typeof v === 'string')
49
+ return v;
50
+ return undefined;
51
+ }
52
+ function flagBool(flags, key) {
53
+ const v = flags[key];
54
+ if (typeof v === 'boolean')
55
+ return v;
56
+ if (typeof v === 'string')
57
+ return v === 'true' || v === '1';
58
+ return false;
59
+ }
60
+ function requireString(flags, key, envKeys = []) {
61
+ const direct = flagString(flags, key);
62
+ if (direct)
63
+ return direct;
64
+ for (const envKey of envKeys) {
65
+ const v = node_process_1.default.env[envKey];
66
+ if (v)
67
+ return v;
68
+ }
69
+ throw new Error(`Missing required option --${key}`);
70
+ }
71
+ function help() {
72
+ return [
73
+ 'megastudy-letter (reverse engineered)',
74
+ '',
75
+ 'Commands:',
76
+ ' login --host <sub.megastudy.net> --userid <id> --passwd <pw>',
77
+ ' list --host ... --userid ... --passwd ... [--mode all|mine] [--page 1] [--json]',
78
+ ' classes --host ... --userid ... --passwd ... [--json]',
79
+ ' post --host ... --userid ... --passwd ... --class <id> --title <t> [--content <c>|--content-file <p>] [--receiver <name>] [--writer <name>] [--relation <rel>] [--json] [--no-verify]',
80
+ '',
81
+ 'Env (optional): MEGASTUDY_USERID, MEGASTUDY_PASSWD',
82
+ ].join('\n');
83
+ }
84
+ async function readContent(flags) {
85
+ const fromFlag = flagString(flags, 'content');
86
+ if (fromFlag)
87
+ return fromFlag;
88
+ const fromFile = flagString(flags, 'content-file');
89
+ if (fromFile)
90
+ return await promises_1.default.readFile(fromFile, 'utf8');
91
+ if (!node_process_1.default.stdin.isTTY) {
92
+ const stdin = await promises_1.default.readFile('/dev/stdin', 'utf8').catch(() => '');
93
+ if (stdin.trim().length > 0)
94
+ return stdin;
95
+ }
96
+ throw new Error('Missing content: use --content, --content-file, or stdin.');
97
+ }
98
+ async function main() {
99
+ const { positionals, flags } = parseArgs(node_process_1.default.argv.slice(2));
100
+ const cmd = positionals[0];
101
+ if (!cmd || cmd === 'help' || flagBool(flags, 'help')) {
102
+ node_process_1.default.stdout.write(`${help()}\n`);
103
+ return;
104
+ }
105
+ const host = flagString(flags, 'host') ?? 'seochob.megastudy.net';
106
+ const client = new MegastudyLetterClient_1.MegastudyLetterClient({ host });
107
+ if (cmd === 'login') {
108
+ const userId = requireString(flags, 'userid', ['MEGASTUDY_USERID']);
109
+ const password = requireString(flags, 'passwd', ['MEGASTUDY_PASSWD']);
110
+ await client.login({ userId, password });
111
+ node_process_1.default.stdout.write('OK\n');
112
+ return;
113
+ }
114
+ if (cmd === 'list') {
115
+ const userId = requireString(flags, 'userid', ['MEGASTUDY_USERID']);
116
+ const password = requireString(flags, 'passwd', ['MEGASTUDY_PASSWD']);
117
+ await client.login({ userId, password });
118
+ const mode = flagString(flags, 'mode') ?? 'all';
119
+ const listMode = mode === 'mine' ? 'N' : 'Y';
120
+ const page = Number(flagString(flags, 'page') ?? '1');
121
+ const result = await client.listParentLetters({ page, listMode });
122
+ if (flagBool(flags, 'json')) {
123
+ node_process_1.default.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
124
+ return;
125
+ }
126
+ for (const item of result.items) {
127
+ const no = item.isNotice ? 'notice' : String(item.number ?? '');
128
+ node_process_1.default.stdout.write(`${no}\t${item.status ?? ''}\t${item.date}\t${item.writer}\t${item.title}\n`);
129
+ }
130
+ return;
131
+ }
132
+ if (cmd === 'classes') {
133
+ const userId = requireString(flags, 'userid', ['MEGASTUDY_USERID']);
134
+ const password = requireString(flags, 'passwd', ['MEGASTUDY_PASSWD']);
135
+ await client.login({ userId, password });
136
+ const result = await client.getClassList();
137
+ if (flagBool(flags, 'json')) {
138
+ node_process_1.default.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
139
+ return;
140
+ }
141
+ for (const c of result) {
142
+ node_process_1.default.stdout.write(`${c.value}\t${c.label}\n`);
143
+ }
144
+ return;
145
+ }
146
+ if (cmd === 'post') {
147
+ const userId = requireString(flags, 'userid', ['MEGASTUDY_USERID']);
148
+ const password = requireString(flags, 'passwd', ['MEGASTUDY_PASSWD']);
149
+ await client.login({ userId, password });
150
+ const classId = requireString(flags, 'class');
151
+ const title = requireString(flags, 'title');
152
+ const content = await readContent(flags);
153
+ const receiver = flagString(flags, 'receiver') ?? '';
154
+ const writer = flagString(flags, 'writer') ?? '';
155
+ const relation = flagString(flags, 'relation') ?? '';
156
+ const verify = !flagBool(flags, 'no-verify');
157
+ const result = await client.postParentLetter({ receiver, classId, writer, relation, title, content }, { verify });
158
+ if (flagBool(flags, 'json')) {
159
+ node_process_1.default.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
160
+ return;
161
+ }
162
+ if (!result.ok) {
163
+ node_process_1.default.stderr.write(`${result.message ?? 'Failed'}\n`);
164
+ node_process_1.default.exitCode = 1;
165
+ return;
166
+ }
167
+ node_process_1.default.stdout.write(`${result.message ?? 'OK'}\n`);
168
+ return;
169
+ }
170
+ node_process_1.default.stderr.write(`Unknown command: ${cmd}\n\n${help()}\n`);
171
+ node_process_1.default.exitCode = 1;
172
+ }
173
+ main().catch((err) => {
174
+ node_process_1.default.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`);
175
+ node_process_1.default.exitCode = 1;
176
+ });
177
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AACA,gEAAkC;AAClC,gEAAmC;AAEnC,mEAAgE;AAIhE,sBAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;IACxD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,sBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAU,EAAE,CAAC;IAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM;QACR,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACpC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAClB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,KAAY,EAAE,GAAW;IAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAY,EAAE,GAAW;IACzC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAC;IAC5D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAY,EAAE,GAAW,EAAE,UAAoB,EAAE;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,sBAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,IAAI;IACX,OAAO;QACL,uCAAuC;QACvC,EAAE;QACF,WAAW;QACX,kEAAkE;QAClE,sFAAsF;QACtF,yDAAyD;QACzD,4LAA4L;QAC5L,EAAE;QACF,oDAAoD;KACrD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAY;IACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,QAAQ;QAAE,OAAO,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEzD,IAAI,CAAC,sBAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,sBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QACtD,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,uBAAuB,CAAC;IAClE,MAAM,MAAM,GAAG,IAAI,6CAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzC,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5B,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAChE,sBAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,CAC7E,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QAC3C,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5B,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QAErD,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC1C,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EACvD,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAC5B,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,IAAI,CAAC,CAAC;YACxD,sBAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/D,sBAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,sBAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9E,sBAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { MegastudyLetterClient } from './MegastudyLetterClient';
2
+ export { MegastudyLetterClient as default } from './MegastudyLetterClient';
3
+ export type { ClassOption, GetClassListParams, ListParentLettersParams, LoginParams, ParentLetterListItem, ParentLetterListMode, ParentLetterListResult, PostParentLetterInput, PostParentLetterResult, WriteContext, } from './types';
4
+ export { CookieJar } from './internal/cookieJar';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,qBAAqB,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,GACb,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CookieJar = exports.default = exports.MegastudyLetterClient = void 0;
4
+ var MegastudyLetterClient_1 = require("./MegastudyLetterClient");
5
+ Object.defineProperty(exports, "MegastudyLetterClient", { enumerable: true, get: function () { return MegastudyLetterClient_1.MegastudyLetterClient; } });
6
+ var MegastudyLetterClient_2 = require("./MegastudyLetterClient");
7
+ Object.defineProperty(exports, "default", { enumerable: true, get: function () { return MegastudyLetterClient_2.MegastudyLetterClient; } });
8
+ var cookieJar_1 = require("./internal/cookieJar");
9
+ Object.defineProperty(exports, "CookieJar", { enumerable: true, get: function () { return cookieJar_1.CookieJar; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAAvD,8HAAA,qBAAqB,OAAA;AAC9B,iEAA2E;AAAlE,gHAAA,qBAAqB,OAAW;AAczC,kDAAiD;AAAxC,sGAAA,SAAS,OAAA"}
@@ -0,0 +1,20 @@
1
+ type Cookie = {
2
+ name: string;
3
+ value: string;
4
+ domain: string;
5
+ path: string;
6
+ secure: boolean;
7
+ hostOnly: boolean;
8
+ expiresAt?: number;
9
+ };
10
+ export declare class CookieJar {
11
+ private cookies;
12
+ setCookiesFromResponse(requestUrl: string, setCookieHeaders: string[]): void;
13
+ getCookieHeader(requestUrl: string): string | undefined;
14
+ getCookieValue(name: string): string | undefined;
15
+ hasCookie(name: string): boolean;
16
+ toJSON(): Cookie[];
17
+ static fromJSON(cookies: Cookie[]): CookieJar;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=cookieJar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookieJar.d.ts","sourceRoot":"","sources":["../../src/internal/cookieJar.ts"],"names":[],"mappings":"AAAA,KAAK,MAAM,GAAG;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2FF,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAsB;IAErC,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE,GACzB,IAAI;IAmBP,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAmBvD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAShD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,MAAM,IAAI,MAAM,EAAE;IAOlB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS;CAe9C"}