chukyo-sdk 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.
Files changed (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/dist/cjs/albo/client.js +133 -0
  4. package/dist/cjs/albo/index.js +55 -0
  5. package/dist/cjs/albo/parser/albo.js +110 -0
  6. package/dist/cjs/albo/types/albo.js +351 -0
  7. package/dist/cjs/albo/types/alboCalendar.js +51 -0
  8. package/dist/cjs/albo/types/alboCommon.js +55 -0
  9. package/dist/cjs/albo/types/alboInformation.js +136 -0
  10. package/dist/cjs/albo/types/alboMenu.js +92 -0
  11. package/dist/cjs/albo/types/alboQuestionnaire.js +229 -0
  12. package/dist/cjs/albo/types/alboSharedItem.js +137 -0
  13. package/dist/cjs/albo/types/alboSystem.js +103 -0
  14. package/dist/cjs/albo/types/alboUniversalForm.js +51 -0
  15. package/dist/cjs/common/dom.js +137 -0
  16. package/dist/cjs/common/utils.js +29 -0
  17. package/dist/cjs/constants.js +127 -0
  18. package/dist/cjs/core/request.js +39 -0
  19. package/dist/cjs/cubics/client.js +49 -0
  20. package/dist/cjs/cubics/index.js +22 -0
  21. package/dist/cjs/cubics/parser/cubics.js +103 -0
  22. package/dist/cjs/cubics/types/cubics.js +90 -0
  23. package/dist/cjs/errors.js +55 -0
  24. package/dist/cjs/index.js +50 -0
  25. package/dist/cjs/manabo/client.js +135 -0
  26. package/dist/cjs/manabo/index.js +44 -0
  27. package/dist/cjs/manabo/parser/manaboClass.js +386 -0
  28. package/dist/cjs/manabo/parser/manaboEntry.js +38 -0
  29. package/dist/cjs/manabo/parser/manaboMail.js +153 -0
  30. package/dist/cjs/manabo/parser/manaboNews.js +26 -0
  31. package/dist/cjs/manabo/parser/manaboTimetable.js +93 -0
  32. package/dist/cjs/manabo/types/manaboClass.js +223 -0
  33. package/dist/cjs/manabo/types/manaboEntry.js +43 -0
  34. package/dist/cjs/manabo/types/manaboMail.js +117 -0
  35. package/dist/cjs/manabo/types/manaboNews.js +20 -0
  36. package/dist/cjs/manabo/types/manaboTimetable.js +79 -0
  37. package/dist/cjs/package.json +1 -0
  38. package/dist/cjs/shib/builder.js +239 -0
  39. package/dist/cjs/shib/index.js +32 -0
  40. package/dist/cjs/shib/parser/shibLogin.js +138 -0
  41. package/dist/cjs/shib/parser/shibUser.js +51 -0
  42. package/dist/cjs/shib/types/common.js +2 -0
  43. package/dist/cjs/shib/types/shibLogin.js +92 -0
  44. package/dist/cjs/shib/types/shibUser.js +44 -0
  45. package/dist/cjs/transports/fetch.js +84 -0
  46. package/dist/cjs/types.js +9 -0
  47. package/dist/esm/albo/client.d.ts +80 -0
  48. package/dist/esm/albo/client.d.ts.map +1 -0
  49. package/dist/esm/albo/client.js +129 -0
  50. package/dist/esm/albo/index.d.ts +12 -0
  51. package/dist/esm/albo/index.d.ts.map +1 -0
  52. package/dist/esm/albo/index.js +11 -0
  53. package/dist/esm/albo/parser/albo.d.ts +69 -0
  54. package/dist/esm/albo/parser/albo.d.ts.map +1 -0
  55. package/dist/esm/albo/parser/albo.js +84 -0
  56. package/dist/esm/albo/types/albo.d.ts +460 -0
  57. package/dist/esm/albo/types/albo.d.ts.map +1 -0
  58. package/dist/esm/albo/types/albo.js +348 -0
  59. package/dist/esm/albo/types/alboCalendar.d.ts +58 -0
  60. package/dist/esm/albo/types/alboCalendar.d.ts.map +1 -0
  61. package/dist/esm/albo/types/alboCalendar.js +48 -0
  62. package/dist/esm/albo/types/alboCommon.d.ts +52 -0
  63. package/dist/esm/albo/types/alboCommon.d.ts.map +1 -0
  64. package/dist/esm/albo/types/alboCommon.js +51 -0
  65. package/dist/esm/albo/types/alboInformation.d.ts +214 -0
  66. package/dist/esm/albo/types/alboInformation.d.ts.map +1 -0
  67. package/dist/esm/albo/types/alboInformation.js +133 -0
  68. package/dist/esm/albo/types/alboMenu.d.ts +114 -0
  69. package/dist/esm/albo/types/alboMenu.d.ts.map +1 -0
  70. package/dist/esm/albo/types/alboMenu.js +89 -0
  71. package/dist/esm/albo/types/alboQuestionnaire.d.ts +442 -0
  72. package/dist/esm/albo/types/alboQuestionnaire.d.ts.map +1 -0
  73. package/dist/esm/albo/types/alboQuestionnaire.js +226 -0
  74. package/dist/esm/albo/types/alboSharedItem.d.ts +205 -0
  75. package/dist/esm/albo/types/alboSharedItem.d.ts.map +1 -0
  76. package/dist/esm/albo/types/alboSharedItem.js +134 -0
  77. package/dist/esm/albo/types/alboSystem.d.ts +129 -0
  78. package/dist/esm/albo/types/alboSystem.d.ts.map +1 -0
  79. package/dist/esm/albo/types/alboSystem.js +100 -0
  80. package/dist/esm/albo/types/alboUniversalForm.d.ts +63 -0
  81. package/dist/esm/albo/types/alboUniversalForm.d.ts.map +1 -0
  82. package/dist/esm/albo/types/alboUniversalForm.js +48 -0
  83. package/dist/esm/common/dom.d.ts +35 -0
  84. package/dist/esm/common/dom.d.ts.map +1 -0
  85. package/dist/esm/common/dom.js +120 -0
  86. package/dist/esm/common/utils.d.ts +15 -0
  87. package/dist/esm/common/utils.d.ts.map +1 -0
  88. package/dist/esm/common/utils.js +22 -0
  89. package/dist/esm/constants.d.ts +113 -0
  90. package/dist/esm/constants.d.ts.map +1 -0
  91. package/dist/esm/constants.js +124 -0
  92. package/dist/esm/core/request.d.ts +29 -0
  93. package/dist/esm/core/request.d.ts.map +1 -0
  94. package/dist/esm/core/request.js +33 -0
  95. package/dist/esm/cubics/client.d.ts +13 -0
  96. package/dist/esm/cubics/client.d.ts.map +1 -0
  97. package/dist/esm/cubics/client.js +45 -0
  98. package/dist/esm/cubics/index.d.ts +4 -0
  99. package/dist/esm/cubics/index.d.ts.map +1 -0
  100. package/dist/esm/cubics/index.js +3 -0
  101. package/dist/esm/cubics/parser/cubics.d.ts +8 -0
  102. package/dist/esm/cubics/parser/cubics.d.ts.map +1 -0
  103. package/dist/esm/cubics/parser/cubics.js +99 -0
  104. package/dist/esm/cubics/types/cubics.d.ts +94 -0
  105. package/dist/esm/cubics/types/cubics.d.ts.map +1 -0
  106. package/dist/esm/cubics/types/cubics.js +87 -0
  107. package/dist/esm/errors.d.ts +46 -0
  108. package/dist/esm/errors.d.ts.map +1 -0
  109. package/dist/esm/errors.js +46 -0
  110. package/dist/esm/index.d.ts +19 -0
  111. package/dist/esm/index.d.ts.map +1 -0
  112. package/dist/esm/index.js +25 -0
  113. package/dist/esm/manabo/client.d.ts +75 -0
  114. package/dist/esm/manabo/client.d.ts.map +1 -0
  115. package/dist/esm/manabo/client.js +131 -0
  116. package/dist/esm/manabo/index.d.ts +12 -0
  117. package/dist/esm/manabo/index.d.ts.map +1 -0
  118. package/dist/esm/manabo/index.js +11 -0
  119. package/dist/esm/manabo/parser/manaboClass.d.ts +9 -0
  120. package/dist/esm/manabo/parser/manaboClass.d.ts.map +1 -0
  121. package/dist/esm/manabo/parser/manaboClass.js +377 -0
  122. package/dist/esm/manabo/parser/manaboEntry.d.ts +8 -0
  123. package/dist/esm/manabo/parser/manaboEntry.d.ts.map +1 -0
  124. package/dist/esm/manabo/parser/manaboEntry.js +33 -0
  125. package/dist/esm/manabo/parser/manaboMail.d.ts +8 -0
  126. package/dist/esm/manabo/parser/manaboMail.d.ts.map +1 -0
  127. package/dist/esm/manabo/parser/manaboMail.js +145 -0
  128. package/dist/esm/manabo/parser/manaboNews.d.ts +7 -0
  129. package/dist/esm/manabo/parser/manaboNews.d.ts.map +1 -0
  130. package/dist/esm/manabo/parser/manaboNews.js +22 -0
  131. package/dist/esm/manabo/parser/manaboTimetable.d.ts +4 -0
  132. package/dist/esm/manabo/parser/manaboTimetable.d.ts.map +1 -0
  133. package/dist/esm/manabo/parser/manaboTimetable.js +89 -0
  134. package/dist/esm/manabo/types/manaboClass.d.ts +294 -0
  135. package/dist/esm/manabo/types/manaboClass.d.ts.map +1 -0
  136. package/dist/esm/manabo/types/manaboClass.js +220 -0
  137. package/dist/esm/manabo/types/manaboEntry.d.ts +24 -0
  138. package/dist/esm/manabo/types/manaboEntry.d.ts.map +1 -0
  139. package/dist/esm/manabo/types/manaboEntry.js +40 -0
  140. package/dist/esm/manabo/types/manaboMail.d.ts +103 -0
  141. package/dist/esm/manabo/types/manaboMail.d.ts.map +1 -0
  142. package/dist/esm/manabo/types/manaboMail.js +114 -0
  143. package/dist/esm/manabo/types/manaboNews.d.ts +15 -0
  144. package/dist/esm/manabo/types/manaboNews.d.ts.map +1 -0
  145. package/dist/esm/manabo/types/manaboNews.js +17 -0
  146. package/dist/esm/manabo/types/manaboTimetable.d.ts +88 -0
  147. package/dist/esm/manabo/types/manaboTimetable.d.ts.map +1 -0
  148. package/dist/esm/manabo/types/manaboTimetable.js +76 -0
  149. package/dist/esm/package.json +1 -0
  150. package/dist/esm/shib/builder.d.ts +154 -0
  151. package/dist/esm/shib/builder.d.ts.map +1 -0
  152. package/dist/esm/shib/builder.js +212 -0
  153. package/dist/esm/shib/index.d.ts +15 -0
  154. package/dist/esm/shib/index.d.ts.map +1 -0
  155. package/dist/esm/shib/index.js +14 -0
  156. package/dist/esm/shib/parser/shibLogin.d.ts +47 -0
  157. package/dist/esm/shib/parser/shibLogin.d.ts.map +1 -0
  158. package/dist/esm/shib/parser/shibLogin.js +127 -0
  159. package/dist/esm/shib/parser/shibUser.d.ts +11 -0
  160. package/dist/esm/shib/parser/shibUser.d.ts.map +1 -0
  161. package/dist/esm/shib/parser/shibUser.js +46 -0
  162. package/dist/esm/shib/types/common.d.ts +20 -0
  163. package/dist/esm/shib/types/common.d.ts.map +1 -0
  164. package/dist/esm/shib/types/common.js +1 -0
  165. package/dist/esm/shib/types/shibLogin.d.ts +62 -0
  166. package/dist/esm/shib/types/shibLogin.d.ts.map +1 -0
  167. package/dist/esm/shib/types/shibLogin.js +89 -0
  168. package/dist/esm/shib/types/shibUser.d.ts +36 -0
  169. package/dist/esm/shib/types/shibUser.d.ts.map +1 -0
  170. package/dist/esm/shib/types/shibUser.js +41 -0
  171. package/dist/esm/transports/fetch.d.ts +36 -0
  172. package/dist/esm/transports/fetch.d.ts.map +1 -0
  173. package/dist/esm/transports/fetch.js +80 -0
  174. package/dist/esm/types.d.ts +71 -0
  175. package/dist/esm/types.d.ts.map +1 -0
  176. package/dist/esm/types.js +8 -0
  177. package/package.json +72 -0
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseShibFido2DeviceList = exports.parseShibCsrfToken = void 0;
4
+ const dom_1 = require("../../common/dom");
5
+ const utils_1 = require("../../common/utils");
6
+ const shibUser_1 = require("../types/shibUser");
7
+ /** hidden input(name 指定)の value を返す。要素が無ければ null、value 属性のみ無ければ ""。 */
8
+ const getInputValue = (root, name) => {
9
+ const input = (0, dom_1.queryOne)(`input[name="${name}"]`, root);
10
+ if (!input) {
11
+ return null;
12
+ }
13
+ return (0, dom_1.getAttribute)(input, "value") ?? "";
14
+ };
15
+ /** 任意の ACE User ページから ACEUSER_CSRFTOKEN と procchk を抽出する。 */
16
+ const parseShibCsrfToken = (html) => {
17
+ const document = (0, dom_1.loadDocument)(html);
18
+ return shibUser_1.ShibCsrfTokenSchema.safeParse({
19
+ csrfToken: getInputValue(document, "ACEUSER_CSRFTOKEN") ?? "",
20
+ procchk: getInputValue(document, "procchk"),
21
+ });
22
+ };
23
+ exports.parseShibCsrfToken = parseShibCsrfToken;
24
+ /** `Fido2DeviceList` の一覧ページをパースする。 */
25
+ const parseShibFido2DeviceList = (html) => {
26
+ const document = (0, dom_1.loadDocument)(html);
27
+ const devices = (0, dom_1.queryAll)("td.c-table_check", document).map((checkCell) => {
28
+ const credentialId = (0, dom_1.getAttribute)(checkCell, "id") ?? "";
29
+ const row = (0, dom_1.closest)(checkCell, "tr");
30
+ const cells = row ? (0, dom_1.queryAll)("td", row) : [];
31
+ // cells[0] はチェックボックス列。以降が 名前 / 署名カウンタ / 登録日時 / 最終利用日時。
32
+ const text = (index) => (0, utils_1.normalizeWhitespace)((0, dom_1.getTextContent)(cells[index] ?? null));
33
+ const signCountText = text(2);
34
+ const signCount = signCountText !== "" && /^\d+$/.test(signCountText) ? Number(signCountText) : null;
35
+ const registeredAt = text(3);
36
+ const lastUsedAt = text(4);
37
+ return {
38
+ credentialId,
39
+ name: text(1),
40
+ signCount,
41
+ registeredAt: registeredAt !== "" ? registeredAt : null,
42
+ lastUsedAt: lastUsedAt !== "" ? lastUsedAt : null,
43
+ };
44
+ });
45
+ return shibUser_1.ShibFido2DeviceListSchema.safeParse({
46
+ csrfToken: getInputValue(document, "ACEUSER_CSRFTOKEN"),
47
+ procchk: getInputValue(document, "procchk"),
48
+ devices,
49
+ });
50
+ };
51
+ exports.parseShibFido2DeviceList = parseShibFido2DeviceList;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShibWebauthnRegistrationSchema = exports.ShibWebauthnAuthSchema = exports.ShibLoginResultSchema = exports.ShibCheckTypeSchema = void 0;
4
+ /**
5
+ * ログインフロー(CloudLink IdP)の各レスポンスを構造化する DTO。
6
+ *
7
+ * checktype.php → loginuserpass.php(PW / OTP / Passkey)→ webauthn.php の
8
+ * レスポンスを、後続処理に必要な最小情報へ落とし込む。値はサーバが返すものを通し、
9
+ * 判断(再認証・ログアウト等)は呼び出し側に委ねる。
10
+ */
11
+ const zod_1 = require("zod");
12
+ /** `checktype.php` の応答(利用可能な認証方式) */
13
+ exports.ShibCheckTypeSchema = zod_1.z.object({
14
+ /** 利用可能な認証方式("Password" / "OTP" / "Passkey" 等) @example ["Password","OTP"] */
15
+ authType: zod_1.z.array(zod_1.z.string()).meta({ description: "利用可能な認証方式", example: ["Password", "OTP"] }),
16
+ /** 応答に含まれる sessioninfo.AuthState(無ければ null) @example "_dummyauthstate:https://shib.chukyo-u.ac.jp/..." */
17
+ authState: zod_1.z
18
+ .string()
19
+ .nullable()
20
+ .meta({ description: "sessioninfo.AuthState", example: "_dummyauthstate:https://shib.chukyo-u.ac.jp/..." }),
21
+ });
22
+ /**
23
+ * `loginuserpass.php` のログイン結果。
24
+ * - `samlForm`: 認証成功。SP ACS への自動 POST フォームを抽出できた(次は SAML ACS へ POST)。
25
+ * - `otpRequired`: OTP 入力ページが表示された(authtype=2 で再送する)。
26
+ * - `error`: ID/PW(または OTP)誤り等の認証エラー。
27
+ */
28
+ exports.ShibLoginResultSchema = zod_1.z.discriminatedUnion("kind", [
29
+ zod_1.z.object({
30
+ kind: zod_1.z.literal("samlForm"),
31
+ /** SAML 自動 POST の action URL @example "https://shib.chukyo-u.ac.jp/clsp/saml/acs?client_name=idp1" */
32
+ action: zod_1.z
33
+ .string()
34
+ .meta({ description: "SAML 自動 POST の action", example: "https://shib.chukyo-u.ac.jp/clsp/saml/acs?client_name=idp1" }),
35
+ /** Base64 の SAMLResponse @example "PHNhbWxwOlJlc3BvbnNlPi4uLg==" */
36
+ samlResponse: zod_1.z.string().meta({ description: "Base64 の SAMLResponse", example: "PHNhbWxwOlJlc3BvbnNlPi4uLg==" }),
37
+ /** RelayState @example "https://shib.chukyo-u.ac.jp/clsp/saml/acs?client_name=idp1" */
38
+ relayState: zod_1.z
39
+ .string()
40
+ .meta({ description: "RelayState", example: "https://shib.chukyo-u.ac.jp/clsp/saml/acs?client_name=idp1" }),
41
+ }),
42
+ zod_1.z.object({
43
+ kind: zod_1.z.literal("otpRequired"),
44
+ }),
45
+ zod_1.z.object({
46
+ kind: zod_1.z.literal("error"),
47
+ }),
48
+ ]);
49
+ /**
50
+ * ログインフロー用 `webauthn.php`(start/finish-authentication)の応答。
51
+ * `revoked`(HTTP 4xx か status≠0)はパスキー無効化を示す構造として返す。SDK は自動処理しない。
52
+ */
53
+ exports.ShibWebauthnAuthSchema = zod_1.z.object({
54
+ /** 正常応答か(HTTP 200 かつ status===0) @example true */
55
+ ok: zod_1.z.boolean().meta({ description: "正常応答か", example: true }),
56
+ /** パスキー無効化を示すか(HTTP 4xx か status≠0) @example false */
57
+ revoked: zod_1.z.boolean().meta({ description: "パスキー無効化を示すか", example: false }),
58
+ /** 応答の status フィールド(4xx でボディ無しの場合 null) @example 0 */
59
+ status: zod_1.z.number().nullable().meta({ description: "status フィールド", example: 0 }),
60
+ /** 署名用チャレンジ(base64url、取得できなければ null) @example "X95CVnQJfLd9DwcjBkaDZelkEH0Dthn7e2-iV_5aah0" */
61
+ challenge: zod_1.z
62
+ .string()
63
+ .nullable()
64
+ .meta({ description: "署名用チャレンジ", example: "X95CVnQJfLd9DwcjBkaDZelkEH0Dthn7e2-iV_5aah0" }),
65
+ });
66
+ /** `User/webauthn`(start-registration)の応答。登録に必要な challenge / user を抽出する。 */
67
+ exports.ShibWebauthnRegistrationSchema = zod_1.z.object({
68
+ /** status フィールド(0 で正常) @example 0 */
69
+ status: zod_1.z.number().meta({ description: "status フィールド", example: 0 }),
70
+ /** 生成用チャレンジ(base64url) @example "1SZVUGityQOpj8TzCWc0KmAKpOGM7QfcJ8llEsIDH4k" */
71
+ challenge: zod_1.z.string().meta({ description: "生成用チャレンジ", example: "1SZVUGityQOpj8TzCWc0KmAKpOGM7QfcJ8llEsIDH4k" }),
72
+ /** サーバが割り当てるユーザ情報 */
73
+ user: zod_1.z.object({
74
+ /** User Handle(base64url) @example "bZ7pOaxNOfQn51w1p4PEDxouFn5R_CA1TLmgGKjutdo" */
75
+ id: zod_1.z.string().meta({ description: "User Handle", example: "bZ7pOaxNOfQn51w1p4PEDxouFn5R_CA1TLmgGKjutdo" }),
76
+ /** ユーザ名(学籍番号) @example "T000000" */
77
+ name: zod_1.z.string().meta({ description: "ユーザ名(学籍番号)", example: "T000000" }),
78
+ /** 表示名 @example "umebo for ios (a3f9k2x1)" */
79
+ displayName: zod_1.z.string().meta({ description: "表示名", example: "umebo for ios (a3f9k2x1)" }),
80
+ }),
81
+ /** RP 情報 */
82
+ rp: zod_1.z.object({
83
+ /** RP ID @example "shib.chukyo-u.ac.jp" */
84
+ id: zod_1.z.string().meta({ description: "RP ID", example: "shib.chukyo-u.ac.jp" }),
85
+ /** RP 名 @example "Chukyo University FIDO" */
86
+ name: zod_1.z.string().meta({ description: "RP 名", example: "Chukyo University FIDO" }),
87
+ }),
88
+ /** 許可される公開鍵アルゴリズム @example [{"type":"public-key","alg":-7}] */
89
+ pubKeyCredParams: zod_1.z
90
+ .array(zod_1.z.object({ type: zod_1.z.string(), alg: zod_1.z.number() }))
91
+ .meta({ description: "許可される公開鍵アルゴリズム", example: [{ type: "public-key", alg: -7 }] }),
92
+ });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShibFido2DeviceListSchema = exports.ShibFido2DeviceSchema = exports.ShibCsrfTokenSchema = void 0;
4
+ /**
5
+ * ACE User ポータル(`/User/*`)の各ページを構造化する DTO。
6
+ *
7
+ * これらのページは全 POST に CSRF トークン(ACEUSER_CSRFTOKEN)を伴い、
8
+ * hidden input に次リクエスト用の値(procchk 等)が埋め込まれている。
9
+ */
10
+ const zod_1 = require("zod");
11
+ /** 任意の ACE User ページから抽出する CSRF トークンと procchk。 */
12
+ exports.ShibCsrfTokenSchema = zod_1.z.object({
13
+ /** ACEUSER_CSRFTOKEN の値(次 POST に必須) @example "AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH" */
14
+ csrfToken: zod_1.z
15
+ .string()
16
+ .meta({ description: "ACEUSER_CSRFTOKEN の値", example: "AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH" }),
17
+ /** procchk hidden input の値(存在しなければ null、空文字はそのまま) @example "" */
18
+ procchk: zod_1.z.string().nullable().meta({ description: "procchk hidden の値", example: "" }),
19
+ });
20
+ /** 登録済み FIDO2 デバイス 1 件。 */
21
+ exports.ShibFido2DeviceSchema = zod_1.z.object({
22
+ /** Credential ID(削除時の selectedNmId / checkedKeys に使う) @example "Xyjw5D-UU8oFEtpXXz-jY-UET1U" */
23
+ credentialId: zod_1.z.string().meta({ description: "Credential ID", example: "Xyjw5D-UU8oFEtpXXz-jY-UET1U" }),
24
+ /** デバイス表示名 @example "umebo for ios (a3f9k2x1)" */
25
+ name: zod_1.z.string().meta({ description: "デバイス表示名", example: "umebo for ios (a3f9k2x1)" }),
26
+ /** 署名カウンタ(取得できなければ null) @example 0 */
27
+ signCount: zod_1.z.number().nullable().meta({ description: "署名カウンタ", example: 0 }),
28
+ /** 登録日時(表示文字列のまま) @example "2026/07/09 02:03:32 (JST)" */
29
+ registeredAt: zod_1.z.string().nullable().meta({ description: "登録日時", example: "2026/07/09 02:03:32 (JST)" }),
30
+ /** 最終利用日時(表示文字列のまま) @example "2026/07/09 02:03:32 (JST)" */
31
+ lastUsedAt: zod_1.z.string().nullable().meta({ description: "最終利用日時", example: "2026/07/09 02:03:32 (JST)" }),
32
+ });
33
+ /** `Fido2DeviceList` の一覧ページ。 */
34
+ exports.ShibFido2DeviceListSchema = zod_1.z.object({
35
+ /** ページの ACEUSER_CSRFTOKEN(無ければ null) @example "AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH" */
36
+ csrfToken: zod_1.z
37
+ .string()
38
+ .nullable()
39
+ .meta({ description: "ACEUSER_CSRFTOKEN", example: "AAAA-BBBB-CCCC-DDDD-EEEE-FFFF-GGGG-HHHH" }),
40
+ /** procchk hidden の値(削除完了 POST で使う。無ければ null) @example "bsTtqjrVjJgHU2yVadt0hc5qTkTq7RsX" */
41
+ procchk: zod_1.z.string().nullable().meta({ description: "procchk hidden の値", example: "bsTtqjrVjJgHU2yVadt0hc5qTkTq7RsX" }),
42
+ /** 登録済みデバイス一覧 */
43
+ devices: zod_1.z.array(exports.ShibFido2DeviceSchema).meta({ description: "登録済みデバイス一覧" }),
44
+ });
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchTransport = void 0;
4
+ /**
5
+ * WHATWG `fetch` を {@link Transport} に適合させる Adapter。
6
+ *
7
+ * - Node: 引数省略で `globalThis.fetch`(Node 18+)
8
+ * - Expo: `fetch` に `expo/fetch` の `fetch` を渡す
9
+ * - ブラウザ拡張: `fetchTransport(fetch, { credentials: "include" })` で
10
+ * ブラウザの Cookie ジャーを自動送信(SessionProvider 不要)
11
+ */
12
+ const errors_1 = require("../errors");
13
+ const isAbortError = (error) => error instanceof Error && (error.name === "AbortError" || error.name === "TimeoutError");
14
+ const fetchTransport = (fetchImpl = globalThis.fetch, options = {}) => {
15
+ const timeoutMs = options.timeoutMs ?? 10_000;
16
+ return {
17
+ async request(req) {
18
+ const controller = new AbortController();
19
+ let timedOut = false;
20
+ const timeoutId = setTimeout(() => {
21
+ timedOut = true;
22
+ controller.abort();
23
+ }, timeoutMs);
24
+ const onExternalAbort = () => controller.abort();
25
+ if (req.signal) {
26
+ if (req.signal.aborted) {
27
+ controller.abort();
28
+ }
29
+ else {
30
+ req.signal.addEventListener("abort", onExternalAbort);
31
+ }
32
+ }
33
+ const headers = { ...req.headers };
34
+ if (options.userAgent) {
35
+ headers["User-Agent"] = options.userAgent;
36
+ }
37
+ try {
38
+ const res = await fetchImpl(req.url, {
39
+ method: req.method,
40
+ headers,
41
+ ...(req.body != null ? { body: req.body } : {}),
42
+ signal: controller.signal,
43
+ credentials: options.credentials ?? "omit",
44
+ });
45
+ const responseHeaders = {};
46
+ res.headers.forEach((value, key) => {
47
+ responseHeaders[key.toLowerCase()] = value;
48
+ });
49
+ const result = {
50
+ status: res.status,
51
+ url: res.url || req.url,
52
+ body: await res.text(),
53
+ headers: responseHeaders,
54
+ };
55
+ const mapped = options.mapErrorStatus
56
+ ? options.mapErrorStatus(res.status, result)
57
+ : res.status === 503
58
+ ? new errors_1.ChukyoMaintenanceError()
59
+ : null;
60
+ if (mapped) {
61
+ throw mapped;
62
+ }
63
+ return result;
64
+ }
65
+ catch (error) {
66
+ if (error instanceof errors_1.ChukyoMaintenanceError) {
67
+ throw error;
68
+ }
69
+ if (isAbortError(error) && timedOut) {
70
+ throw new errors_1.TimeoutError({ cause: error });
71
+ }
72
+ // fetch 自体が throw(DNS 失敗・接続拒否・TLS・URL 不正など。HTTP 応答なし)
73
+ throw new errors_1.NetworkError({ cause: error });
74
+ }
75
+ finally {
76
+ clearTimeout(timeoutId);
77
+ if (req.signal) {
78
+ req.signal.removeEventListener("abort", onExternalAbort);
79
+ }
80
+ }
81
+ },
82
+ };
83
+ };
84
+ exports.fetchTransport = fetchTransport;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * SDK コアが依存する Adapter インターフェース群。
4
+ *
5
+ * SDK は「HTTP をどう実行するか({@link Transport})」と「Cookie をどう供給するか
6
+ * ({@link SessionProvider})」を知らない。これらを注入することで、Node / ブラウザ /
7
+ * ブラウザ拡張 / Expo / カスタムなど任意の環境で同じコードが動く。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,80 @@
1
+ import { type RequestContext } from "../core/request";
2
+ import type { AlboCalendarDTO, AlboInformationDTO, AlboPersonalDTO, AlboTimetableDTO } from "./types/albo";
3
+ import type { AlboCalendarOutlookEventDTO, AlboCalendarSourceDTO } from "./types/alboCalendar";
4
+ import type { AlboInformationCategoryTreeDTO, AlboInformationDetailDTO } from "./types/alboInformation";
5
+ import type { AlboQuestionnaireCategoryListDTO, AlboQuestionnaireDTO, AlboQuestionnaireDetailDTO } from "./types/alboQuestionnaire";
6
+ import type { AlboUniversalFormCategoryListDTO, AlboUniversalFormDTO } from "./types/alboUniversalForm";
7
+ import type { AlboMenuDTO, AlboMenuDetailDTO, AlboMenuLayoutDTO } from "./types/alboMenu";
8
+ import type { AlboActionLogDTO, AlboDeviceDTO, AlboLanguageSettingDTO, AlboSystemSettingDTO } from "./types/alboSystem";
9
+ import type { AlboSharedItemListDTO } from "./types/alboSharedItem";
10
+ export declare class AlboClient {
11
+ private readonly ctx;
12
+ constructor(ctx: RequestContext);
13
+ private fetchText;
14
+ /**
15
+ * 学年暦カレンダーを取得する。
16
+ *
17
+ * `calendarSourceUuid` 省略時は {@link ALBO_DEFAULT_CALENDAR_SOURCE_UUID}(学年暦・学部)を使う。
18
+ * 大学院など別ソースを取りたい場合は `getCalendarSource()` で UUID を取得し、ここに渡す。
19
+ * `startAt` / `endAt`(UNIX 秒)省略時は範囲指定なし(ブラウザの UI は「本日〜今年度末」を渡すが、
20
+ * SDK としては全件取得をデフォルトにしている)。
21
+ */
22
+ getCalendar(options?: {
23
+ calendarSourceUuid?: string;
24
+ startAt?: number;
25
+ endAt?: number;
26
+ addOutlookCalendar?: boolean;
27
+ pageSize?: number;
28
+ }): Promise<AlboCalendarDTO>;
29
+ /** お知らせ一覧を取得する */
30
+ getInformation(page?: number, pageSize?: number): Promise<AlboInformationDTO>;
31
+ /** 時間割を取得する */
32
+ getTimetable(): Promise<AlboTimetableDTO>;
33
+ /** ログイン確認(個人情報と同型。PII を含む) */
34
+ getAuthCheck(): Promise<AlboPersonalDTO>;
35
+ /** 個人情報を取得する(PII を含む) */
36
+ getPersonal(): Promise<AlboPersonalDTO>;
37
+ /** 購読中カレンダーソースの一覧を取得する */
38
+ getCalendarSource(): Promise<AlboCalendarSourceDTO>;
39
+ /**
40
+ * Outlook 連携イベントを取得する(未連携時は `result.message === "No token."` の応答)。
41
+ * `start_at` / `end_at` / `page_size` は実ブラウザも常に付与しているクエリで、省略はできない
42
+ * 前提で `startAt=0, endAt=0, pageSize=1`(=連携有無の確認用)をデフォルトにしている。
43
+ */
44
+ getCalendarOutlookEvent(n: number, options?: {
45
+ startAt?: number;
46
+ endAt?: number;
47
+ pageSize?: number;
48
+ }): Promise<AlboCalendarOutlookEventDTO>;
49
+ /** お知らせ詳細を取得する */
50
+ getInformationDetail(uuid: string): Promise<AlboInformationDetailDTO>;
51
+ /** お知らせカテゴリのツリーを取得する */
52
+ getInformationCategoryTree(): Promise<AlboInformationCategoryTreeDTO>;
53
+ /** アンケート一覧を取得する */
54
+ getQuestionnaire(page?: number, pageSize?: number): Promise<AlboQuestionnaireDTO>;
55
+ /** アンケート詳細(設問・回答含む)を取得する */
56
+ getQuestionnaireDetail(uuid: string): Promise<AlboQuestionnaireDetailDTO>;
57
+ /** アンケートカテゴリ一覧を取得する */
58
+ getQuestionnaireCategory(): Promise<AlboQuestionnaireCategoryListDTO>;
59
+ /** 汎用申請フォーム一覧を取得する */
60
+ getUniversalForm(page?: number, pageSize?: number): Promise<AlboUniversalFormDTO>;
61
+ /** 汎用申請カテゴリ一覧を取得する */
62
+ getUniversalFormCategory(page?: number, pageSize?: number): Promise<AlboUniversalFormCategoryListDTO>;
63
+ /** メニュー(タブ)一覧を取得する */
64
+ getMenu(): Promise<AlboMenuDTO>;
65
+ /** メニュー詳細(配置モジュール含む)を取得する */
66
+ getMenuDetail(uuid: string): Promise<AlboMenuDetailDTO>;
67
+ /** メニューのレイアウト設定を取得する */
68
+ getMenuLayout(uuid: string): Promise<AlboMenuLayoutDTO>;
69
+ /** システム設定一覧を取得する */
70
+ getSystemSetting(): Promise<AlboSystemSettingDTO>;
71
+ /** 翻訳(言語)設定を取得する */
72
+ getLanguageSetting(): Promise<AlboLanguageSettingDTO>;
73
+ /** ログイン済みデバイス一覧を取得する */
74
+ getDevice(page?: number, pageSize?: number): Promise<AlboDeviceDTO>;
75
+ /** 自分の操作ログを取得する */
76
+ getActionLog(page?: number, pageSize?: number): Promise<AlboActionLogDTO>;
77
+ /** 指定フォルダ配下のファイル一覧を取得する */
78
+ getSharedItem(page: number, folderUuid: string): Promise<AlboSharedItemListDTO>;
79
+ }
80
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/albo/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Albo クライアント。3システムで唯一まともな JSON REST API を持つ。
3
+ *
4
+ * ※ 個人情報を含むエンドポイント(auth/check-logged-in・personal)も提供する。
5
+ * PII の取り扱いは利用側の責務(SDK ではフィルタしない)。
6
+ */
7
+ import { ALBO_DEFAULT_CALENDAR_SOURCE_UUID, ALBO_URLS, SERVICES } from "../constants";
8
+ import { portalRequestText, unwrap } from "../core/request";
9
+ import { parseAlboActionLog, parseAlboAuthCheck, parseAlboCalendar, parseAlboCalendarOutlookEvent, parseAlboCalendarSource, parseAlboDevice, parseAlboInformation, parseAlboInformationCategoryTree, parseAlboInformationDetail, parseAlboLanguageSetting, parseAlboMenu, parseAlboMenuDetail, parseAlboMenuLayout, parseAlboPersonal, parseAlboQuestionnaire, parseAlboQuestionnaireCategory, parseAlboQuestionnaireDetail, parseAlboSharedItem, parseAlboSystemSetting, parseAlboTimetable, parseAlboUniversalForm, parseAlboUniversalFormCategory, } from "./parser/albo";
10
+ export class AlboClient {
11
+ ctx;
12
+ constructor(ctx) {
13
+ this.ctx = ctx;
14
+ }
15
+ fetchText(path) {
16
+ return portalRequestText(this.ctx, SERVICES.albo, {
17
+ method: "GET",
18
+ url: `${ALBO_URLS.base}${path}`,
19
+ });
20
+ }
21
+ /**
22
+ * 学年暦カレンダーを取得する。
23
+ *
24
+ * `calendarSourceUuid` 省略時は {@link ALBO_DEFAULT_CALENDAR_SOURCE_UUID}(学年暦・学部)を使う。
25
+ * 大学院など別ソースを取りたい場合は `getCalendarSource()` で UUID を取得し、ここに渡す。
26
+ * `startAt` / `endAt`(UNIX 秒)省略時は範囲指定なし(ブラウザの UI は「本日〜今年度末」を渡すが、
27
+ * SDK としては全件取得をデフォルトにしている)。
28
+ */
29
+ async getCalendar(options = {}) {
30
+ const { calendarSourceUuid = ALBO_DEFAULT_CALENDAR_SOURCE_UUID, startAt, endAt, addOutlookCalendar, pageSize = 1000, } = options;
31
+ const query = [
32
+ `page_size=${pageSize}`,
33
+ `calendar_source_uuid=${calendarSourceUuid}`,
34
+ ...(startAt != null ? [`start_at=${startAt}`] : []),
35
+ ...(endAt != null ? [`end_at=${endAt}`] : []),
36
+ ...(addOutlookCalendar != null ? [`add_outlook_calendar=${addOutlookCalendar ? "1" : "0"}`] : []),
37
+ ].join("&");
38
+ return unwrap(parseAlboCalendar(await this.fetchText(`/api/calendar/?${query}`)));
39
+ }
40
+ /** お知らせ一覧を取得する */
41
+ async getInformation(page = 1, pageSize = 20) {
42
+ return unwrap(parseAlboInformation(await this.fetchText(`/api/information/${page}?page_size=${pageSize}&category_uuid=`)));
43
+ }
44
+ /** 時間割を取得する */
45
+ async getTimetable() {
46
+ return unwrap(parseAlboTimetable(await this.fetchText("/api/class/time-table/")));
47
+ }
48
+ /** ログイン確認(個人情報と同型。PII を含む) */
49
+ async getAuthCheck() {
50
+ return unwrap(parseAlboAuthCheck(await this.fetchText("/api/auth/check-logged-in")));
51
+ }
52
+ /** 個人情報を取得する(PII を含む) */
53
+ async getPersonal() {
54
+ return unwrap(parseAlboPersonal(await this.fetchText("/api/auth/check-logged-in")));
55
+ }
56
+ /** 購読中カレンダーソースの一覧を取得する */
57
+ async getCalendarSource() {
58
+ return unwrap(parseAlboCalendarSource(await this.fetchText("/api/calendar-source/")));
59
+ }
60
+ /**
61
+ * Outlook 連携イベントを取得する(未連携時は `result.message === "No token."` の応答)。
62
+ * `start_at` / `end_at` / `page_size` は実ブラウザも常に付与しているクエリで、省略はできない
63
+ * 前提で `startAt=0, endAt=0, pageSize=1`(=連携有無の確認用)をデフォルトにしている。
64
+ */
65
+ async getCalendarOutlookEvent(n, options = {}) {
66
+ const { startAt = 0, endAt = 0, pageSize = 1 } = options;
67
+ return unwrap(parseAlboCalendarOutlookEvent(await this.fetchText(`/api/calendar/outlook-event/${n}?start_at=${startAt}&end_at=${endAt}&page_size=${pageSize}`)));
68
+ }
69
+ /** お知らせ詳細を取得する */
70
+ async getInformationDetail(uuid) {
71
+ return unwrap(parseAlboInformationDetail(await this.fetchText(`/api/information/view/${uuid}`)));
72
+ }
73
+ /** お知らせカテゴリのツリーを取得する */
74
+ async getInformationCategoryTree() {
75
+ return unwrap(parseAlboInformationCategoryTree(await this.fetchText("/api/information-category/tree")));
76
+ }
77
+ /** アンケート一覧を取得する */
78
+ async getQuestionnaire(page = 1, pageSize = 20) {
79
+ return unwrap(parseAlboQuestionnaire(await this.fetchText(`/api/questionnaire/${page}?page_size=${pageSize}`)));
80
+ }
81
+ /** アンケート詳細(設問・回答含む)を取得する */
82
+ async getQuestionnaireDetail(uuid) {
83
+ return unwrap(parseAlboQuestionnaireDetail(await this.fetchText(`/api/questionnaire/view/${uuid}`)));
84
+ }
85
+ /** アンケートカテゴリ一覧を取得する */
86
+ async getQuestionnaireCategory() {
87
+ return unwrap(parseAlboQuestionnaireCategory(await this.fetchText("/api/questionnaire-category")));
88
+ }
89
+ /** 汎用申請フォーム一覧を取得する */
90
+ async getUniversalForm(page = 1, pageSize = 20) {
91
+ return unwrap(parseAlboUniversalForm(await this.fetchText(`/api/universal-form/${page}?page_size=${pageSize}`)));
92
+ }
93
+ /** 汎用申請カテゴリ一覧を取得する */
94
+ async getUniversalFormCategory(page = 1, pageSize = 20) {
95
+ return unwrap(parseAlboUniversalFormCategory(await this.fetchText(`/api/universal-form-category/${page}?page_size=${pageSize}`)));
96
+ }
97
+ /** メニュー(タブ)一覧を取得する */
98
+ async getMenu() {
99
+ return unwrap(parseAlboMenu(await this.fetchText("/api/menu")));
100
+ }
101
+ /** メニュー詳細(配置モジュール含む)を取得する */
102
+ async getMenuDetail(uuid) {
103
+ return unwrap(parseAlboMenuDetail(await this.fetchText(`/api/menu/view/${uuid}`)));
104
+ }
105
+ /** メニューのレイアウト設定を取得する */
106
+ async getMenuLayout(uuid) {
107
+ return unwrap(parseAlboMenuLayout(await this.fetchText(`/api/menu-layout/view/${uuid}`)));
108
+ }
109
+ /** システム設定一覧を取得する */
110
+ async getSystemSetting() {
111
+ return unwrap(parseAlboSystemSetting(await this.fetchText("/api/system-setting")));
112
+ }
113
+ /** 翻訳(言語)設定を取得する */
114
+ async getLanguageSetting() {
115
+ return unwrap(parseAlboLanguageSetting(await this.fetchText("/api/language-setting/view")));
116
+ }
117
+ /** ログイン済みデバイス一覧を取得する */
118
+ async getDevice(page = 1, pageSize = 20) {
119
+ return unwrap(parseAlboDevice(await this.fetchText(`/api/device/${page}?page_size=${pageSize}`)));
120
+ }
121
+ /** 自分の操作ログを取得する */
122
+ async getActionLog(page = 1, pageSize = 20) {
123
+ return unwrap(parseAlboActionLog(await this.fetchText(`/api/action-log/user-view/${page}?page_size=${pageSize}`)));
124
+ }
125
+ /** 指定フォルダ配下のファイル一覧を取得する */
126
+ async getSharedItem(page, folderUuid) {
127
+ return unwrap(parseAlboSharedItem(await this.fetchText(`/api/shared-item/${page}/${folderUuid}`)));
128
+ }
129
+ }
@@ -0,0 +1,12 @@
1
+ export { parseAlboCalendar, parseAlboCalendarSource, parseAlboCalendarOutlookEvent, parseAlboInformation, parseAlboInformationDetail, parseAlboInformationCategoryTree, parseAlboQuestionnaire, parseAlboQuestionnaireDetail, parseAlboQuestionnaireCategory, parseAlboUniversalForm, parseAlboUniversalFormCategory, parseAlboMenu, parseAlboMenuDetail, parseAlboMenuLayout, parseAlboTimetable, parseAlboAuthCheck, parseAlboPersonal, parseAlboSystemSetting, parseAlboLanguageSetting, parseAlboDevice, parseAlboActionLog, parseAlboSharedItem, parseAlboActionResult, } from "./parser/albo";
2
+ export * from "./types/albo";
3
+ export * from "./types/alboCalendar";
4
+ export * from "./types/alboInformation";
5
+ export * from "./types/alboQuestionnaire";
6
+ export * from "./types/alboUniversalForm";
7
+ export * from "./types/alboMenu";
8
+ export * from "./types/alboSystem";
9
+ export * from "./types/alboSharedItem";
10
+ export { alboEnvelope, paginationShape, AlboActionResultSchema, type AlboActionResultDTO } from "./types/alboCommon";
11
+ export { AlboClient } from "./client";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/albo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,uBAAuB,EACvB,6BAA6B,EAC7B,oBAAoB,EACpB,0BAA0B,EAC1B,gCAAgC,EAChC,sBAAsB,EACtB,4BAA4B,EAC5B,8BAA8B,EAC9B,sBAAsB,EACtB,8BAA8B,EAC9B,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,eAAe,CAAC;AAEvB,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAErH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { parseAlboCalendar, parseAlboCalendarSource, parseAlboCalendarOutlookEvent, parseAlboInformation, parseAlboInformationDetail, parseAlboInformationCategoryTree, parseAlboQuestionnaire, parseAlboQuestionnaireDetail, parseAlboQuestionnaireCategory, parseAlboUniversalForm, parseAlboUniversalFormCategory, parseAlboMenu, parseAlboMenuDetail, parseAlboMenuLayout, parseAlboTimetable, parseAlboAuthCheck, parseAlboPersonal, parseAlboSystemSetting, parseAlboLanguageSetting, parseAlboDevice, parseAlboActionLog, parseAlboSharedItem, parseAlboActionResult, } from "./parser/albo";
2
+ export * from "./types/albo";
3
+ export * from "./types/alboCalendar";
4
+ export * from "./types/alboInformation";
5
+ export * from "./types/alboQuestionnaire";
6
+ export * from "./types/alboUniversalForm";
7
+ export * from "./types/alboMenu";
8
+ export * from "./types/alboSystem";
9
+ export * from "./types/alboSharedItem";
10
+ export { alboEnvelope, paginationShape, AlboActionResultSchema } from "./types/alboCommon";
11
+ export { AlboClient } from "./client";
@@ -0,0 +1,69 @@
1
+ /**
2
+ * albo(中京大学ポータル)の JSON API レスポンスをパースする。
3
+ * albo は3システムで唯一まともな JSON REST API を持つため、パースは JSON.parse + zod。
4
+ */
5
+ import type { ZodSafeParseResult } from "zod";
6
+ import { type AlboCalendarDTO, type AlboInformationDTO, type AlboPersonalDTO, type AlboTimetableDTO } from "../types/albo";
7
+ import { type AlboActionResultDTO } from "../types/alboCommon";
8
+ import { type AlboCalendarSourceDTO, type AlboCalendarOutlookEventDTO } from "../types/alboCalendar";
9
+ import { type AlboInformationDetailDTO, type AlboInformationCategoryTreeDTO } from "../types/alboInformation";
10
+ import { type AlboQuestionnaireDTO, type AlboQuestionnaireDetailDTO, type AlboQuestionnaireCategoryListDTO } from "../types/alboQuestionnaire";
11
+ import { type AlboUniversalFormDTO, type AlboUniversalFormCategoryListDTO } from "../types/alboUniversalForm";
12
+ import { type AlboMenuDTO, type AlboMenuDetailDTO, type AlboMenuLayoutDTO } from "../types/alboMenu";
13
+ import { type AlboSystemSettingDTO, type AlboLanguageSettingDTO, type AlboDeviceDTO, type AlboActionLogDTO } from "../types/alboSystem";
14
+ import { type AlboSharedItemListDTO } from "../types/alboSharedItem";
15
+ /** GET /api/calendar/ … 学年暦カレンダーのイベント一覧 */
16
+ export declare const parseAlboCalendar: (json: string) => ZodSafeParseResult<AlboCalendarDTO>;
17
+ /** GET /api/calendar-source/ … 購読中カレンダーソースの一覧 */
18
+ export declare const parseAlboCalendarSource: (json: string) => ZodSafeParseResult<AlboCalendarSourceDTO>;
19
+ /** GET /api/calendar/outlook-event/{n} … Outlook 連携イベント(未連携時はエラー応答) */
20
+ export declare const parseAlboCalendarOutlookEvent: (json: string) => ZodSafeParseResult<AlboCalendarOutlookEventDTO>;
21
+ /** GET /api/information/{page} … お知らせ一覧 */
22
+ export declare const parseAlboInformation: (json: string) => ZodSafeParseResult<AlboInformationDTO>;
23
+ /** GET /api/information/view/{uuid} … お知らせ詳細 */
24
+ export declare const parseAlboInformationDetail: (json: string) => ZodSafeParseResult<AlboInformationDetailDTO>;
25
+ /** GET /api/information-category/tree … お知らせカテゴリのツリー */
26
+ export declare const parseAlboInformationCategoryTree: (json: string) => ZodSafeParseResult<AlboInformationCategoryTreeDTO>;
27
+ /** GET /api/questionnaire/{page} … アンケート一覧 */
28
+ export declare const parseAlboQuestionnaire: (json: string) => ZodSafeParseResult<AlboQuestionnaireDTO>;
29
+ /** GET /api/questionnaire/view/{uuid}, PUT /api/questionnaire/answer/{uuid} … アンケート詳細/回答結果 */
30
+ export declare const parseAlboQuestionnaireDetail: (json: string) => ZodSafeParseResult<AlboQuestionnaireDetailDTO>;
31
+ /** GET /api/questionnaire-category … アンケートカテゴリ一覧 */
32
+ export declare const parseAlboQuestionnaireCategory: (json: string) => ZodSafeParseResult<AlboQuestionnaireCategoryListDTO>;
33
+ /** GET /api/universal-form/{page} … 申請フォーム一覧 */
34
+ export declare const parseAlboUniversalForm: (json: string) => ZodSafeParseResult<AlboUniversalFormDTO>;
35
+ /** GET /api/universal-form-category/{page} … 申請カテゴリ一覧 */
36
+ export declare const parseAlboUniversalFormCategory: (json: string) => ZodSafeParseResult<AlboUniversalFormCategoryListDTO>;
37
+ /** GET /api/menu … メニュー(タブ)一覧 */
38
+ export declare const parseAlboMenu: (json: string) => ZodSafeParseResult<AlboMenuDTO>;
39
+ /** GET /api/menu/view/{uuid} … メニュー詳細(配置モジュール含む) */
40
+ export declare const parseAlboMenuDetail: (json: string) => ZodSafeParseResult<AlboMenuDetailDTO>;
41
+ /** GET /api/menu-layout/view/{uuid}, POST /api/menu-layout/save/{uuid} … レイアウト設定 */
42
+ export declare const parseAlboMenuLayout: (json: string) => ZodSafeParseResult<AlboMenuLayoutDTO>;
43
+ /** GET /api/auth/check-logged-in … ログイン確認(レスポンスは個人情報と同型。PII を含む) */
44
+ export declare const parseAlboAuthCheck: (json: string) => ZodSafeParseResult<AlboPersonalDTO>;
45
+ /** ログイン後の個人情報(PII を含む) */
46
+ export declare const parseAlboPersonal: (json: string) => ZodSafeParseResult<AlboPersonalDTO>;
47
+ /** GET /api/system-setting … システム設定一覧 */
48
+ export declare const parseAlboSystemSetting: (json: string) => ZodSafeParseResult<AlboSystemSettingDTO>;
49
+ /** GET /api/language-setting/view … 翻訳(言語)設定 */
50
+ export declare const parseAlboLanguageSetting: (json: string) => ZodSafeParseResult<AlboLanguageSettingDTO>;
51
+ /** GET /api/device/{page} … ログイン済みデバイス一覧 */
52
+ export declare const parseAlboDevice: (json: string) => ZodSafeParseResult<AlboDeviceDTO>;
53
+ /** GET /api/action-log/user-view/{page} … 自分の操作ログ */
54
+ export declare const parseAlboActionLog: (json: string) => ZodSafeParseResult<AlboActionLogDTO>;
55
+ /** GET /api/shared-item/{page}/{folderUuid} … フォルダ配下のファイル一覧 */
56
+ export declare const parseAlboSharedItem: (json: string) => ZodSafeParseResult<AlboSharedItemListDTO>;
57
+ /** GET /api/class/time-table/ … 時間割 */
58
+ export declare const parseAlboTimetable: (json: string) => ZodSafeParseResult<AlboTimetableDTO>;
59
+ /**
60
+ * 既読化・ピン留め・いいね・ダウンロード準備・デバイス削除などの操作系 API が返す
61
+ * 汎用の結果(`{ message, count? }`)をパースする。対象エンドポイント例:
62
+ * - GET /api/information/set-read-all/
63
+ * - GET /api/information/add-good/{uuid}
64
+ * - PUT /api/information/set-pin-selected/ など set/unset-*-selected 一式
65
+ * - POST /api/shared-item/prepare-multiple-download/
66
+ * - DELETE /api/device/delete/{id}
67
+ */
68
+ export declare const parseAlboActionResult: (json: string) => ZodSafeParseResult<AlboActionResultDTO>;
69
+ //# sourceMappingURL=albo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"albo.d.ts","sourceRoot":"","sources":["../../../../src/albo/parser/albo.ts"],"names":[],"mappings":"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"}