@willbooster/shared-lib 4.0.2 → 4.0.4

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 (52) hide show
  1. package/dist/error.cjs.map +1 -0
  2. package/dist/error.d.ts +26 -0
  3. package/dist/error.js.map +1 -0
  4. package/dist/index.d.ts +5 -0
  5. package/dist/mail.cjs.map +1 -0
  6. package/dist/{esm/mail.d.ts → mail.d.ts} +3 -3
  7. package/dist/mail.js.map +1 -0
  8. package/dist/shuffle.cjs.map +1 -0
  9. package/dist/shuffle.d.ts +1 -0
  10. package/dist/shuffle.js.map +1 -0
  11. package/dist/sleep.cjs.map +1 -0
  12. package/dist/sleep.d.ts +1 -0
  13. package/dist/sleep.js.map +1 -0
  14. package/dist/zenkaku.cjs.map +1 -0
  15. package/dist/zenkaku.d.ts +1 -0
  16. package/dist/zenkaku.js.map +1 -0
  17. package/package.json +9 -9
  18. package/dist/cjs/error.cjs.map +0 -1
  19. package/dist/cjs/error.d.cts +0 -27
  20. package/dist/cjs/index.d.cts +0 -5
  21. package/dist/cjs/mail.cjs.map +0 -1
  22. package/dist/cjs/mail.d.cts +0 -10
  23. package/dist/cjs/shuffle.cjs.map +0 -1
  24. package/dist/cjs/shuffle.d.cts +0 -2
  25. package/dist/cjs/sleep.cjs.map +0 -1
  26. package/dist/cjs/sleep.d.cts +0 -2
  27. package/dist/cjs/zenkaku.cjs.map +0 -1
  28. package/dist/cjs/zenkaku.d.cts +0 -2
  29. package/dist/esm/error.d.ts +0 -27
  30. package/dist/esm/error.js.map +0 -1
  31. package/dist/esm/index.d.ts +0 -5
  32. package/dist/esm/mail.js.map +0 -1
  33. package/dist/esm/shuffle.d.ts +0 -2
  34. package/dist/esm/shuffle.js.map +0 -1
  35. package/dist/esm/sleep.d.ts +0 -2
  36. package/dist/esm/sleep.js.map +0 -1
  37. package/dist/esm/zenkaku.d.ts +0 -2
  38. package/dist/esm/zenkaku.js.map +0 -1
  39. /package/dist/{cjs/error.cjs → error.cjs} +0 -0
  40. /package/dist/{esm/error.js → error.js} +0 -0
  41. /package/dist/{cjs/index.cjs → index.cjs} +0 -0
  42. /package/dist/{cjs/index.cjs.map → index.cjs.map} +0 -0
  43. /package/dist/{esm/index.js → index.js} +0 -0
  44. /package/dist/{esm/index.js.map → index.js.map} +0 -0
  45. /package/dist/{cjs/mail.cjs → mail.cjs} +0 -0
  46. /package/dist/{esm/mail.js → mail.js} +0 -0
  47. /package/dist/{cjs/shuffle.cjs → shuffle.cjs} +0 -0
  48. /package/dist/{esm/shuffle.js → shuffle.js} +0 -0
  49. /package/dist/{cjs/sleep.cjs → sleep.cjs} +0 -0
  50. /package/dist/{esm/sleep.js → sleep.js} +0 -0
  51. /package/dist/{cjs/zenkaku.cjs → zenkaku.cjs} +0 -0
  52. /package/dist/{esm/zenkaku.js → zenkaku.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.cjs","sources":["../src/error.ts"],"sourcesContent":["import { sleep } from './sleep.js';\n\n/**\n * Convert an object to an error.\n * @param obj The object to convert.\n */\nexport function errorify(obj: unknown): Error {\n if (obj instanceof Error) return obj;\n if (typeof obj === 'string') return new Error(obj);\n try {\n return new Error(JSON.stringify(obj));\n } catch {\n return new Error(String(obj));\n }\n}\n\nexport function ignoreError<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n // do nothing\n }\n}\n\nexport function ignoreEnoent<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport async function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch {\n // do nothing\n }\n}\n\nexport async function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport interface RetryOptions {\n beforeRetry?: (error: unknown) => Promise<void>;\n handleError?: (error: unknown) => Promise<void>;\n retryCount?: number;\n retryLogger?: (message: string) => void;\n sleepMilliseconds?: number;\n}\n\n/**\n * Retry the given function.\n * @param func The function to retry.\n * @param beforeRetry The function to call immediately before retrying.\n * @param handleError The function to call when an error occurs.\n * @param retryCount The maximum number of retries.\n * @param retryLogger The function to log retrying.\n * @param sleepMilliseconds The number of milliseconds to sleep before retrying.\n */\nexport async function withRetry<T>(\n func: (failedCount: number) => Promise<T>,\n { beforeRetry, handleError, retryCount = 3, retryLogger, sleepMilliseconds = 0 }: RetryOptions\n): Promise<T> {\n let failedCount = 0;\n for (;;) {\n try {\n return await func(failedCount);\n } catch (error) {\n await handleError?.(error);\n failedCount++;\n if (failedCount >= retryCount) {\n throw error;\n }\n if (sleepMilliseconds > 0) {\n await sleep(sleepMilliseconds);\n }\n retryLogger?.(`Retry due to: ${error instanceof Error ? error.stack : error}`);\n await beforeRetry?.(error);\n }\n }\n}\n"],"names":["obj","Error","JSON","stringify","_unused","String","fn","error","code","async","_unused2","_unused3","func","beforeRetry","handleError","retryCount","retryLogger","sleepMilliseconds","failedCount","sleep","stack"],"mappings":"2DAMO,SAAkBA,GACvB,GAAIA,aAAeC,MAAO,OAAOD,EACjC,GAAmB,iBAARA,EAAkB,OAAO,IAAIC,MAAMD,GAC9C,IACE,OAAO,IAAIC,MAAMC,KAAKC,UAAUH,GACjC,CAAC,MAAAI,GACA,OAAO,IAAIH,MAAMI,OAAOL,GAC1B,CACF,uBAUO,SAAyBM,GAC9B,IACE,OAAOA,GACR,CAAC,MAAOC,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,4BAUOE,eAAoCH,GACzC,IACE,aAAaA,GACd,CAAC,MAAOC,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,sBApCO,SAAwBD,GAC7B,IACE,OAAOA,GACR,CAAC,MAAAI,GACA,CAEJ,2BAaOD,eAAmCH,GACxC,IACE,aAAaA,GACd,CAAC,MAAAK,GACA,CAEJ,oBA8BOF,eACLG,GACAC,YAAEA,EAAWC,YAAEA,EAAWC,WAAEA,EAAa,EAACC,YAAEA,EAAWC,kBAAEA,EAAoB,IAE7E,IAAIC,EAAc,EAClB,OACE,IACE,aAAaN,EAAKM,EACnB,CAAC,MAAOX,GAGP,SAFiB,MAAXO,OAAW,EAAXA,EAAcP,IACpBW,IACIA,GAAeH,EACjB,MAAMR,EAEJU,EAAoB,SAChBE,EAAAA,MAAMF,GAEdD,MAAAA,GAAAA,EAAe,iBAAgBT,aAAiBN,MAAQM,EAAMa,MAAQb,WACrD,MAAXM,OAAW,EAAXA,EAAcN,GACtB,CAEJ"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Convert an object to an error.
3
+ * @param obj The object to convert.
4
+ */
5
+ export declare function errorify(obj: unknown): Error;
6
+ export declare function ignoreError<T>(fn: () => T): T | undefined;
7
+ export declare function ignoreEnoent<T>(fn: () => T): T | undefined;
8
+ export declare function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
9
+ export declare function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
10
+ export interface RetryOptions {
11
+ beforeRetry?: (error: unknown) => Promise<void>;
12
+ handleError?: (error: unknown) => Promise<void>;
13
+ retryCount?: number;
14
+ retryLogger?: (message: string) => void;
15
+ sleepMilliseconds?: number;
16
+ }
17
+ /**
18
+ * Retry the given function.
19
+ * @param func The function to retry.
20
+ * @param beforeRetry The function to call immediately before retrying.
21
+ * @param handleError The function to call when an error occurs.
22
+ * @param retryCount The maximum number of retries.
23
+ * @param retryLogger The function to log retrying.
24
+ * @param sleepMilliseconds The number of milliseconds to sleep before retrying.
25
+ */
26
+ export declare function withRetry<T>(func: (failedCount: number) => Promise<T>, { beforeRetry, handleError, retryCount, retryLogger, sleepMilliseconds }: RetryOptions): Promise<T>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sources":["../src/error.ts"],"sourcesContent":["import { sleep } from './sleep.js';\n\n/**\n * Convert an object to an error.\n * @param obj The object to convert.\n */\nexport function errorify(obj: unknown): Error {\n if (obj instanceof Error) return obj;\n if (typeof obj === 'string') return new Error(obj);\n try {\n return new Error(JSON.stringify(obj));\n } catch {\n return new Error(String(obj));\n }\n}\n\nexport function ignoreError<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n // do nothing\n }\n}\n\nexport function ignoreEnoent<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport async function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch {\n // do nothing\n }\n}\n\nexport async function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport interface RetryOptions {\n beforeRetry?: (error: unknown) => Promise<void>;\n handleError?: (error: unknown) => Promise<void>;\n retryCount?: number;\n retryLogger?: (message: string) => void;\n sleepMilliseconds?: number;\n}\n\n/**\n * Retry the given function.\n * @param func The function to retry.\n * @param beforeRetry The function to call immediately before retrying.\n * @param handleError The function to call when an error occurs.\n * @param retryCount The maximum number of retries.\n * @param retryLogger The function to log retrying.\n * @param sleepMilliseconds The number of milliseconds to sleep before retrying.\n */\nexport async function withRetry<T>(\n func: (failedCount: number) => Promise<T>,\n { beforeRetry, handleError, retryCount = 3, retryLogger, sleepMilliseconds = 0 }: RetryOptions\n): Promise<T> {\n let failedCount = 0;\n for (;;) {\n try {\n return await func(failedCount);\n } catch (error) {\n await handleError?.(error);\n failedCount++;\n if (failedCount >= retryCount) {\n throw error;\n }\n if (sleepMilliseconds > 0) {\n await sleep(sleepMilliseconds);\n }\n retryLogger?.(`Retry due to: ${error instanceof Error ? error.stack : error}`);\n await beforeRetry?.(error);\n }\n }\n}\n"],"names":["errorify","obj","Error","JSON","stringify","_unused","String","ignoreError","fn","_unused2","ignoreEnoent","error","code","async","ignoreErrorAsync","_unused3","ignoreEnoentAsync","withRetry","func","beforeRetry","handleError","retryCount","retryLogger","sleepMilliseconds","failedCount","sleep","stack"],"mappings":"mCAMO,SAASA,EAASC,GACvB,GAAIA,aAAeC,MAAO,OAAOD,EACjC,GAAmB,iBAARA,EAAkB,OAAO,IAAIC,MAAMD,GAC9C,IACE,OAAO,IAAIC,MAAMC,KAAKC,UAAUH,GACjC,CAAC,MAAAI,GACA,OAAO,IAAIH,MAAMI,OAAOL,GAC1B,CACF,CAEO,SAASM,EAAeC,GAC7B,IACE,OAAOA,GACR,CAAC,MAAAC,GACA,CAEJ,CAEO,SAASC,EAAgBF,GAC9B,IACE,OAAOA,GACR,CAAC,MAAOG,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,CAEOE,eAAeC,EAAoBN,GACxC,IACE,aAAaA,GACd,CAAC,MAAAO,GACA,CAEJ,CAEOF,eAAeG,EAAqBR,GACzC,IACE,aAAaA,GACd,CAAC,MAAOG,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,CAmBOE,eAAeI,EACpBC,GACAC,YAAEA,EAAWC,YAAEA,EAAWC,WAAEA,EAAa,EAACC,YAAEA,EAAWC,kBAAEA,EAAoB,IAE7E,IAAIC,EAAc,EAClB,OACE,IACE,aAAaN,EAAKM,EACnB,CAAC,MAAOb,GAGP,SAFiB,MAAXS,OAAW,EAAXA,EAAcT,IACpBa,IACIA,GAAeH,EACjB,MAAMV,EAEJY,EAAoB,SAChBE,EAAMF,GAEdD,MAAAA,GAAAA,EAAe,iBAAgBX,aAAiBT,MAAQS,EAAMe,MAAQf,WACrD,MAAXQ,OAAW,EAAXA,EAAcR,GACtB,CAEJ"}
@@ -0,0 +1,5 @@
1
+ export { errorify, ignoreError, ignoreEnoent, ignoreErrorAsync, ignoreEnoentAsync, withRetry } from './error.js';
2
+ export { shuffle } from './shuffle.js';
3
+ export { zenkakuAlphanumericalsToHankaku } from './zenkaku.js';
4
+ export { mailTemplates } from './mail.js';
5
+ export type { RetryOptions } from './error.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.cjs","sources":["../src/mail.ts"],"sourcesContent":["export interface MailData {\n from: string;\n subject: string;\n text: string;\n}\n\nclass MailTemplates {\n resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData {\n return {\n from: 'no-reply@willbooster.dev',\n subject: 'パスワード再設定のご案内',\n text: `\n${appName} をご利用いただき誠にありがとうございます。\n\nお客様からパスワード再設定のリクエストを受け取りました。\n以下のURLをクリックして、新しいパスワードを設定してください。\n\n${resetUrl}\n${\n expirationDuration\n ? `\n上記のURLは発行から約${expirationDuration}で失効します。\n期限を過ぎてしまった場合や、URLが機能しない場合は、\n恐れ入りますが、再度パスワードを再設定してください。\n`\n : ''\n}\nなお、本メールアドレスは配信専用ですので、返信いただけません。\n\n引き続き ${appName} をよろしくお願い申し上げます。\n `.trim(),\n };\n }\n}\n\nexport const mailTemplates = new MailTemplates();\n"],"names":["mailTemplates","resetPassword","appName","resetUrl","expirationDuration","from","subject","text","trim"],"mappings":"mBAmCaA,EAAgB,IA7B7B,MACEC,aAAAA,CAAcC,EAAiBC,EAAkBC,GAC/C,MAAO,CACLC,KAAM,2BACNC,QAAS,eACTC,KAAO,KACXL,gGAKAC,MAEAC,EACK,iBACOA,sEAIR,+CAICF,0BACDM,OAEJ"}
@@ -1,4 +1,4 @@
1
- interface MailData {
1
+ export interface MailData {
2
2
  from: string;
3
3
  subject: string;
4
4
  text: string;
@@ -6,5 +6,5 @@ interface MailData {
6
6
  declare class MailTemplates {
7
7
  resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData;
8
8
  }
9
- declare const mailTemplates: MailTemplates;
10
- export { MailData, mailTemplates };
9
+ export declare const mailTemplates: MailTemplates;
10
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.js","sources":["../src/mail.ts"],"sourcesContent":["export interface MailData {\n from: string;\n subject: string;\n text: string;\n}\n\nclass MailTemplates {\n resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData {\n return {\n from: 'no-reply@willbooster.dev',\n subject: 'パスワード再設定のご案内',\n text: `\n${appName} をご利用いただき誠にありがとうございます。\n\nお客様からパスワード再設定のリクエストを受け取りました。\n以下のURLをクリックして、新しいパスワードを設定してください。\n\n${resetUrl}\n${\n expirationDuration\n ? `\n上記のURLは発行から約${expirationDuration}で失効します。\n期限を過ぎてしまった場合や、URLが機能しない場合は、\n恐れ入りますが、再度パスワードを再設定してください。\n`\n : ''\n}\nなお、本メールアドレスは配信専用ですので、返信いただけません。\n\n引き続き ${appName} をよろしくお願い申し上げます。\n `.trim(),\n };\n }\n}\n\nexport const mailTemplates = new MailTemplates();\n"],"names":["mailTemplates","resetPassword","appName","resetUrl","expirationDuration","from","subject","text","trim"],"mappings":"MAmCaA,EAAgB,IA7B7B,MACEC,aAAAA,CAAcC,EAAiBC,EAAkBC,GAC/C,MAAO,CACLC,KAAM,2BACNC,QAAS,eACTC,KAAO,KACXL,gGAKAC,MAEAC,EACK,iBACOA,sEAIR,+CAICF,0BACDM,OAEJ"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.cjs","sources":["../src/shuffle.ts"],"sourcesContent":["export function shuffle<T>(array: T[]): T[] {\n for (let index = array.length - 1; index > 0; index--) {\n const index_ = Math.floor(Math.random() * (index + 1));\n [array[index], array[index_]] = [array[index_], array[index]];\n }\n return array;\n}\n"],"names":["array","index","length","index_","Math","floor","random"],"mappings":"6BAAO,SAAoBA,GACzB,IAAK,IAAIC,EAAQD,EAAME,OAAS,EAAGD,EAAQ,EAAGA,IAAS,CACrD,MAAME,EAASC,KAAKC,MAAMD,KAAKE,UAAYL,EAAQ,KAClDD,EAAMC,GAAQD,EAAMG,IAAW,CAACH,EAAMG,GAASH,EAAMC,GACxD,CACA,OAAOD,CACT"}
@@ -0,0 +1 @@
1
+ export declare function shuffle<T>(array: T[]): T[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shuffle.js","sources":["../src/shuffle.ts"],"sourcesContent":["export function shuffle<T>(array: T[]): T[] {\n for (let index = array.length - 1; index > 0; index--) {\n const index_ = Math.floor(Math.random() * (index + 1));\n [array[index], array[index_]] = [array[index_], array[index]];\n }\n return array;\n}\n"],"names":["shuffle","array","index","length","index_","Math","floor","random"],"mappings":"AAAO,SAASA,EAAWC,GACzB,IAAK,IAAIC,EAAQD,EAAME,OAAS,EAAGD,EAAQ,EAAGA,IAAS,CACrD,MAAME,EAASC,KAAKC,MAAMD,KAAKE,UAAYL,EAAQ,KAClDD,EAAMC,GAAQD,EAAMG,IAAW,CAACH,EAAMG,GAASH,EAAMC,GACxD,CACA,OAAOD,CACT"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.cjs","sources":["../src/sleep.ts"],"sourcesContent":["export async function sleep(milliseconds: number): Promise<void> {\n return new Promise((r) => setTimeout(r, milliseconds));\n}\n"],"names":["async","milliseconds","Promise","r","setTimeout"],"mappings":"2BAAOA,eAAqBC,GAC1B,OAAO,IAAIC,SAASC,GAAMC,WAAWD,EAAGF,IAC1C"}
@@ -0,0 +1 @@
1
+ export declare function sleep(milliseconds: number): Promise<void>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sources":["../src/sleep.ts"],"sourcesContent":["export async function sleep(milliseconds: number): Promise<void> {\n return new Promise((r) => setTimeout(r, milliseconds));\n}\n"],"names":["async","sleep","milliseconds","Promise","r","setTimeout"],"mappings":"AAAOA,eAAeC,EAAMC,GAC1B,OAAO,IAAIC,SAASC,GAAMC,WAAWD,EAAGF,IAC1C"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zenkaku.cjs","sources":["../src/zenkaku.ts"],"sourcesContent":["export function zenkakuAlphanumericalsToHankaku(str: string): string {\n return str.replaceAll(/[0-9A-Za-z]/g, (s: string) => {\n return String.fromCodePoint((s.codePointAt(0) ?? 0) - 0xfe_e0);\n });\n}\n"],"names":["str","replaceAll","s","_s$codePointAt","String","fromCodePoint","codePointAt"],"mappings":"qDAAO,SAAyCA,GAC9C,OAAOA,EAAIC,WAAW,gBAAiBC,IAAc,IAAAC,EACnD,OAAOC,OAAOC,eAA+BF,OAAjBA,EAACD,EAAEI,YAAY,IAAEH,EAAI,GAAK,MAAQ,GAElE"}
@@ -0,0 +1 @@
1
+ export declare function zenkakuAlphanumericalsToHankaku(str: string): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zenkaku.js","sources":["../src/zenkaku.ts"],"sourcesContent":["export function zenkakuAlphanumericalsToHankaku(str: string): string {\n return str.replaceAll(/[0-9A-Za-z]/g, (s: string) => {\n return String.fromCodePoint((s.codePointAt(0) ?? 0) - 0xfe_e0);\n });\n}\n"],"names":["zenkakuAlphanumericalsToHankaku","str","replaceAll","s","_s$codePointAt","String","fromCodePoint","codePointAt"],"mappings":"AAAO,SAASA,EAAgCC,GAC9C,OAAOA,EAAIC,WAAW,gBAAiBC,IAAc,IAAAC,EACnD,OAAOC,OAAOC,eAA+BF,OAAjBA,EAACD,EAAEI,YAAY,IAAEH,EAAI,GAAK,MAAQ,GAElE"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@willbooster/shared-lib",
3
- "version": "4.0.2",
3
+ "version": "4.0.4",
4
4
  "license": "Apache-2.0",
5
5
  "author": "WillBooster Inc.",
6
6
  "sideEffects": false,
7
7
  "type": "module",
8
8
  "exports": {
9
9
  ".": {
10
- "require": "./dist/cjs/index.cjs",
11
- "import": "./dist/esm/index.js",
12
- "types": "./dist/esm/index.d.ts"
10
+ "require": "./dist/index.cjs",
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
13
  },
14
14
  "./src": {
15
15
  "require": "./src/index.ts",
@@ -17,9 +17,9 @@
17
17
  "types": "./src/index.ts"
18
18
  }
19
19
  },
20
- "main": "dist/cjs/index.cjs",
21
- "module": "dist/esm/index.js",
22
- "types": "dist/esm/index.d.ts",
20
+ "main": "dist/index.cjs",
21
+ "module": "dist/index.js",
22
+ "types": "dist/index.d.ts",
23
23
  "files": [
24
24
  "bin/",
25
25
  "dist/"
@@ -42,7 +42,7 @@
42
42
  "@typescript-eslint/parser": "6.7.0",
43
43
  "@willbooster/eslint-config-ts": "10.5.0",
44
44
  "@willbooster/prettier-config": "9.1.1",
45
- "build-ts": "8.4.3",
45
+ "build-ts": "9.1.4",
46
46
  "eslint": "8.49.0",
47
47
  "eslint-config-prettier": "9.0.0",
48
48
  "eslint-import-resolver-typescript": "3.6.0",
@@ -55,7 +55,7 @@
55
55
  "prettier": "3.0.3",
56
56
  "sort-package-json": "2.5.1",
57
57
  "typescript": "5.2.2",
58
- "vitest": "0.34.3"
58
+ "vitest": "0.34.4"
59
59
  },
60
60
  "publishConfig": {
61
61
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.cjs","sources":["../../src/error.ts"],"sourcesContent":["import { sleep } from './sleep.js';\n\n/**\n * Convert an object to an error.\n * @param obj The object to convert.\n */\nexport function errorify(obj: unknown): Error {\n if (obj instanceof Error) return obj;\n if (typeof obj === 'string') return new Error(obj);\n try {\n return new Error(JSON.stringify(obj));\n } catch {\n return new Error(String(obj));\n }\n}\n\nexport function ignoreError<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n // do nothing\n }\n}\n\nexport function ignoreEnoent<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport async function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch {\n // do nothing\n }\n}\n\nexport async function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport interface RetryOptions {\n beforeRetry: ((error: unknown) => Promise<void>) | undefined;\n handleError: ((error: unknown) => Promise<void>) | undefined;\n retryCount: number;\n retryLogger: ((message: string) => void) | undefined;\n sleepMilliseconds: number;\n}\n\n/**\n * Retry the given function.\n * @param func The function to retry.\n * @param beforeRetry The function to call immediately before retrying.\n * @param handleError The function to call when an error occurs.\n * @param retryCount The maximum number of retries.\n * @param retryLogger The function to log retrying.\n * @param sleepMilliseconds The number of milliseconds to sleep before retrying.\n */\nexport async function withRetry<T>(\n func: (failedCount: number) => Promise<T>,\n {\n beforeRetry = undefined,\n handleError = undefined,\n retryCount = 3,\n retryLogger = undefined,\n sleepMilliseconds = 0,\n }: RetryOptions\n): Promise<T> {\n let failedCount = 0;\n for (;;) {\n try {\n return await func(failedCount);\n } catch (error) {\n await handleError?.(error);\n failedCount++;\n if (failedCount >= retryCount) {\n throw error;\n }\n if (sleepMilliseconds > 0) {\n await sleep(sleepMilliseconds);\n }\n retryLogger?.(`Retry due to: ${error instanceof Error ? error.stack : error}`);\n await beforeRetry?.(error);\n }\n }\n}\n"],"names":["obj","Error","JSON","stringify","_unused","String","fn","error","code","async","_unused2","_unused3","func","beforeRetry","handleError","retryCount","retryLogger","sleepMilliseconds","failedCount","sleep","stack"],"mappings":"2DAMO,SAAkBA,GACvB,GAAIA,aAAeC,MAAO,OAAOD,EACjC,GAAmB,iBAARA,EAAkB,OAAO,IAAIC,MAAMD,GAC9C,IACE,OAAO,IAAIC,MAAMC,KAAKC,UAAUH,GACjC,CAAC,MAAAI,GACA,OAAO,IAAIH,MAAMI,OAAOL,GAC1B,CACF,uBAUO,SAAyBM,GAC9B,IACE,OAAOA,GACR,CAAC,MAAOC,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,4BAUOE,eAAoCH,GACzC,IACE,aAAaA,GACd,CAAC,MAAOC,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,sBApCO,SAAwBD,GAC7B,IACE,OAAOA,GACR,CAAC,MAAAI,GACA,CAEJ,2BAaOD,eAAmCH,GACxC,IACE,aAAaA,GACd,CAAC,MAAAK,GACA,CAEJ,oBA8BOF,eACLG,GACAC,YACEA,EAAuBC,YACvBA,EAAuBC,WACvBA,EAAa,EAACC,YACdA,EAAuBC,kBACvBA,EAAoB,IAGtB,IAAIC,EAAc,EAClB,OACE,IACE,aAAaN,EAAKM,EACnB,CAAC,MAAOX,GAGP,SAFiB,MAAXO,OAAW,EAAXA,EAAcP,IACpBW,IACIA,GAAeH,EACjB,MAAMR,EAEJU,EAAoB,SAChBE,EAAAA,MAAMF,GAEdD,MAAAA,GAAAA,EAAe,iBAAgBT,aAAiBN,MAAQM,EAAMa,MAAQb,WACrD,MAAXM,OAAW,EAAXA,EAAcN,GACtB,CAEJ"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Convert an object to an error.
3
- * @param obj The object to convert.
4
- */
5
- declare function errorify(obj: unknown): Error;
6
- declare function ignoreError<T>(fn: () => T): T | undefined;
7
- declare function ignoreEnoent<T>(fn: () => T): T | undefined;
8
- declare function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
9
- declare function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
10
- interface RetryOptions {
11
- beforeRetry: ((error: unknown) => Promise<void>) | undefined;
12
- handleError: ((error: unknown) => Promise<void>) | undefined;
13
- retryCount: number;
14
- retryLogger: ((message: string) => void) | undefined;
15
- sleepMilliseconds: number;
16
- }
17
- /**
18
- * Retry the given function.
19
- * @param func The function to retry.
20
- * @param beforeRetry The function to call immediately before retrying.
21
- * @param handleError The function to call when an error occurs.
22
- * @param retryCount The maximum number of retries.
23
- * @param retryLogger The function to log retrying.
24
- * @param sleepMilliseconds The number of milliseconds to sleep before retrying.
25
- */
26
- declare function withRetry<T>(func: (failedCount: number) => Promise<T>, { beforeRetry, handleError, retryCount, retryLogger, sleepMilliseconds, }: RetryOptions): Promise<T>;
27
- export { errorify, ignoreError, ignoreEnoent, ignoreErrorAsync, ignoreEnoentAsync, RetryOptions, withRetry };
@@ -1,5 +0,0 @@
1
- export { errorify, ignoreError, ignoreEnoent, ignoreErrorAsync, ignoreEnoentAsync, withRetry } from "./error.js";
2
- export { shuffle } from "./shuffle.js";
3
- export { zenkakuAlphanumericalsToHankaku } from "./zenkaku.js";
4
- export { mailTemplates } from "./mail.js";
5
- export type { RetryOptions } from "./error.js";
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.cjs","sources":["../../src/mail.ts"],"sourcesContent":["export interface MailData {\n from: string;\n subject: string;\n text: string;\n}\n\nclass MailTemplates {\n resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData {\n return {\n from: 'no-reply@willbooster.dev',\n subject: 'パスワード再設定のご案内',\n text: `\n${appName} をご利用いただき誠にありがとうございます。\n\nお客様からパスワード再設定のリクエストを受け取りました。\n以下のURLをクリックして、新しいパスワードを設定してください。\n\n${resetUrl}\n${\n expirationDuration\n ? `\n上記のURLは発行から約${expirationDuration}で失効します。\n期限を過ぎてしまった場合や、URLが機能しない場合は、\n恐れ入りますが、再度パスワードを再設定してください。\n`\n : ''\n}\nなお、本メールアドレスは配信専用ですので、返信いただけません。\n\n引き続き ${appName} をよろしくお願い申し上げます。\n `.trim(),\n };\n }\n}\n\nexport const mailTemplates = new MailTemplates();\n"],"names":["mailTemplates","resetPassword","appName","resetUrl","expirationDuration","from","subject","text","trim"],"mappings":"mBAmCaA,EAAgB,IA7B7B,MACEC,aAAAA,CAAcC,EAAiBC,EAAkBC,GAC/C,MAAO,CACLC,KAAM,2BACNC,QAAS,eACTC,KAAO,KACXL,gGAKAC,MAEAC,EACK,iBACOA,sEAIR,+CAICF,0BACDM,OAEJ"}
@@ -1,10 +0,0 @@
1
- interface MailData {
2
- from: string;
3
- subject: string;
4
- text: string;
5
- }
6
- declare class MailTemplates {
7
- resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData;
8
- }
9
- declare const mailTemplates: MailTemplates;
10
- export { MailData, mailTemplates };
@@ -1 +0,0 @@
1
- {"version":3,"file":"shuffle.cjs","sources":["../../src/shuffle.ts"],"sourcesContent":["export function shuffle<T>(array: T[]): T[] {\n for (let index = array.length - 1; index > 0; index--) {\n const index_ = Math.floor(Math.random() * (index + 1));\n [array[index], array[index_]] = [array[index_], array[index]];\n }\n return array;\n}\n"],"names":["array","index","length","index_","Math","floor","random"],"mappings":"6BAAO,SAAoBA,GACzB,IAAK,IAAIC,EAAQD,EAAME,OAAS,EAAGD,EAAQ,EAAGA,IAAS,CACrD,MAAME,EAASC,KAAKC,MAAMD,KAAKE,UAAYL,EAAQ,KAClDD,EAAMC,GAAQD,EAAMG,IAAW,CAACH,EAAMG,GAASH,EAAMC,GACxD,CACA,OAAOD,CACT"}
@@ -1,2 +0,0 @@
1
- declare function shuffle<T>(array: T[]): T[];
2
- export { shuffle };
@@ -1 +0,0 @@
1
- {"version":3,"file":"sleep.cjs","sources":["../../src/sleep.ts"],"sourcesContent":["export async function sleep(milliseconds: number): Promise<void> {\n return new Promise((r) => setTimeout(r, milliseconds));\n}\n"],"names":["async","milliseconds","Promise","r","setTimeout"],"mappings":"2BAAOA,eAAqBC,GAC1B,OAAO,IAAIC,SAASC,GAAMC,WAAWD,EAAGF,IAC1C"}
@@ -1,2 +0,0 @@
1
- declare function sleep(milliseconds: number): Promise<void>;
2
- export { sleep };
@@ -1 +0,0 @@
1
- {"version":3,"file":"zenkaku.cjs","sources":["../../src/zenkaku.ts"],"sourcesContent":["export function zenkakuAlphanumericalsToHankaku(str: string): string {\n return str.replaceAll(/[0-9A-Za-z]/g, (s: string) => {\n return String.fromCodePoint((s.codePointAt(0) ?? 0) - 0xfe_e0);\n });\n}\n"],"names":["str","replaceAll","s","_s$codePointAt","String","fromCodePoint","codePointAt"],"mappings":"qDAAO,SAAyCA,GAC9C,OAAOA,EAAIC,WAAW,gBAAiBC,IAAc,IAAAC,EACnD,OAAOC,OAAOC,eAA+BF,OAAjBA,EAACD,EAAEI,YAAY,IAAEH,EAAI,GAAK,MAAQ,GAElE"}
@@ -1,2 +0,0 @@
1
- declare function zenkakuAlphanumericalsToHankaku(str: string): string;
2
- export { zenkakuAlphanumericalsToHankaku };
@@ -1,27 +0,0 @@
1
- /**
2
- * Convert an object to an error.
3
- * @param obj The object to convert.
4
- */
5
- declare function errorify(obj: unknown): Error;
6
- declare function ignoreError<T>(fn: () => T): T | undefined;
7
- declare function ignoreEnoent<T>(fn: () => T): T | undefined;
8
- declare function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
9
- declare function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined>;
10
- interface RetryOptions {
11
- beforeRetry: ((error: unknown) => Promise<void>) | undefined;
12
- handleError: ((error: unknown) => Promise<void>) | undefined;
13
- retryCount: number;
14
- retryLogger: ((message: string) => void) | undefined;
15
- sleepMilliseconds: number;
16
- }
17
- /**
18
- * Retry the given function.
19
- * @param func The function to retry.
20
- * @param beforeRetry The function to call immediately before retrying.
21
- * @param handleError The function to call when an error occurs.
22
- * @param retryCount The maximum number of retries.
23
- * @param retryLogger The function to log retrying.
24
- * @param sleepMilliseconds The number of milliseconds to sleep before retrying.
25
- */
26
- declare function withRetry<T>(func: (failedCount: number) => Promise<T>, { beforeRetry, handleError, retryCount, retryLogger, sleepMilliseconds, }: RetryOptions): Promise<T>;
27
- export { errorify, ignoreError, ignoreEnoent, ignoreErrorAsync, ignoreEnoentAsync, RetryOptions, withRetry };
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.js","sources":["../../src/error.ts"],"sourcesContent":["import { sleep } from './sleep.js';\n\n/**\n * Convert an object to an error.\n * @param obj The object to convert.\n */\nexport function errorify(obj: unknown): Error {\n if (obj instanceof Error) return obj;\n if (typeof obj === 'string') return new Error(obj);\n try {\n return new Error(JSON.stringify(obj));\n } catch {\n return new Error(String(obj));\n }\n}\n\nexport function ignoreError<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n // do nothing\n }\n}\n\nexport function ignoreEnoent<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport async function ignoreErrorAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch {\n // do nothing\n }\n}\n\nexport async function ignoreEnoentAsync<T>(fn: () => Promise<T>): Promise<T | undefined> {\n try {\n return await fn();\n } catch (error) {\n if (typeof error === 'object' && error && 'code' in error && error.code === 'ENOENT') {\n return;\n }\n throw error;\n }\n}\n\nexport interface RetryOptions {\n beforeRetry: ((error: unknown) => Promise<void>) | undefined;\n handleError: ((error: unknown) => Promise<void>) | undefined;\n retryCount: number;\n retryLogger: ((message: string) => void) | undefined;\n sleepMilliseconds: number;\n}\n\n/**\n * Retry the given function.\n * @param func The function to retry.\n * @param beforeRetry The function to call immediately before retrying.\n * @param handleError The function to call when an error occurs.\n * @param retryCount The maximum number of retries.\n * @param retryLogger The function to log retrying.\n * @param sleepMilliseconds The number of milliseconds to sleep before retrying.\n */\nexport async function withRetry<T>(\n func: (failedCount: number) => Promise<T>,\n {\n beforeRetry = undefined,\n handleError = undefined,\n retryCount = 3,\n retryLogger = undefined,\n sleepMilliseconds = 0,\n }: RetryOptions\n): Promise<T> {\n let failedCount = 0;\n for (;;) {\n try {\n return await func(failedCount);\n } catch (error) {\n await handleError?.(error);\n failedCount++;\n if (failedCount >= retryCount) {\n throw error;\n }\n if (sleepMilliseconds > 0) {\n await sleep(sleepMilliseconds);\n }\n retryLogger?.(`Retry due to: ${error instanceof Error ? error.stack : error}`);\n await beforeRetry?.(error);\n }\n }\n}\n"],"names":["errorify","obj","Error","JSON","stringify","_unused","String","ignoreError","fn","_unused2","ignoreEnoent","error","code","async","ignoreErrorAsync","_unused3","ignoreEnoentAsync","withRetry","func","beforeRetry","handleError","retryCount","retryLogger","sleepMilliseconds","failedCount","sleep","stack"],"mappings":"mCAMO,SAASA,EAASC,GACvB,GAAIA,aAAeC,MAAO,OAAOD,EACjC,GAAmB,iBAARA,EAAkB,OAAO,IAAIC,MAAMD,GAC9C,IACE,OAAO,IAAIC,MAAMC,KAAKC,UAAUH,GACjC,CAAC,MAAAI,GACA,OAAO,IAAIH,MAAMI,OAAOL,GAC1B,CACF,CAEO,SAASM,EAAeC,GAC7B,IACE,OAAOA,GACR,CAAC,MAAAC,GACA,CAEJ,CAEO,SAASC,EAAgBF,GAC9B,IACE,OAAOA,GACR,CAAC,MAAOG,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,CAEOE,eAAeC,EAAoBN,GACxC,IACE,aAAaA,GACd,CAAC,MAAAO,GACA,CAEJ,CAEOF,eAAeG,EAAqBR,GACzC,IACE,aAAaA,GACd,CAAC,MAAOG,GACP,GAAqB,iBAAVA,GAAsBA,GAAS,SAAUA,GAAwB,WAAfA,EAAMC,KACjE,OAEF,MAAMD,CACR,CACF,CAmBOE,eAAeI,EACpBC,GACAC,YACEA,EAAuBC,YACvBA,EAAuBC,WACvBA,EAAa,EAACC,YACdA,EAAuBC,kBACvBA,EAAoB,IAGtB,IAAIC,EAAc,EAClB,OACE,IACE,aAAaN,EAAKM,EACnB,CAAC,MAAOb,GAGP,SAFiB,MAAXS,OAAW,EAAXA,EAAcT,IACpBa,IACIA,GAAeH,EACjB,MAAMV,EAEJY,EAAoB,SAChBE,EAAMF,GAEdD,MAAAA,GAAAA,EAAe,iBAAgBX,aAAiBT,MAAQS,EAAMe,MAAQf,WACrD,MAAXQ,OAAW,EAAXA,EAAcR,GACtB,CAEJ"}
@@ -1,5 +0,0 @@
1
- export { errorify, ignoreError, ignoreEnoent, ignoreErrorAsync, ignoreEnoentAsync, withRetry } from "./error.js";
2
- export { shuffle } from "./shuffle.js";
3
- export { zenkakuAlphanumericalsToHankaku } from "./zenkaku.js";
4
- export { mailTemplates } from "./mail.js";
5
- export type { RetryOptions } from "./error.js";
@@ -1 +0,0 @@
1
- {"version":3,"file":"mail.js","sources":["../../src/mail.ts"],"sourcesContent":["export interface MailData {\n from: string;\n subject: string;\n text: string;\n}\n\nclass MailTemplates {\n resetPassword(appName: string, resetUrl: string, expirationDuration?: string): MailData {\n return {\n from: 'no-reply@willbooster.dev',\n subject: 'パスワード再設定のご案内',\n text: `\n${appName} をご利用いただき誠にありがとうございます。\n\nお客様からパスワード再設定のリクエストを受け取りました。\n以下のURLをクリックして、新しいパスワードを設定してください。\n\n${resetUrl}\n${\n expirationDuration\n ? `\n上記のURLは発行から約${expirationDuration}で失効します。\n期限を過ぎてしまった場合や、URLが機能しない場合は、\n恐れ入りますが、再度パスワードを再設定してください。\n`\n : ''\n}\nなお、本メールアドレスは配信専用ですので、返信いただけません。\n\n引き続き ${appName} をよろしくお願い申し上げます。\n `.trim(),\n };\n }\n}\n\nexport const mailTemplates = new MailTemplates();\n"],"names":["mailTemplates","resetPassword","appName","resetUrl","expirationDuration","from","subject","text","trim"],"mappings":"MAmCaA,EAAgB,IA7B7B,MACEC,aAAAA,CAAcC,EAAiBC,EAAkBC,GAC/C,MAAO,CACLC,KAAM,2BACNC,QAAS,eACTC,KAAO,KACXL,gGAKAC,MAEAC,EACK,iBACOA,sEAIR,+CAICF,0BACDM,OAEJ"}
@@ -1,2 +0,0 @@
1
- declare function shuffle<T>(array: T[]): T[];
2
- export { shuffle };
@@ -1 +0,0 @@
1
- {"version":3,"file":"shuffle.js","sources":["../../src/shuffle.ts"],"sourcesContent":["export function shuffle<T>(array: T[]): T[] {\n for (let index = array.length - 1; index > 0; index--) {\n const index_ = Math.floor(Math.random() * (index + 1));\n [array[index], array[index_]] = [array[index_], array[index]];\n }\n return array;\n}\n"],"names":["shuffle","array","index","length","index_","Math","floor","random"],"mappings":"AAAO,SAASA,EAAWC,GACzB,IAAK,IAAIC,EAAQD,EAAME,OAAS,EAAGD,EAAQ,EAAGA,IAAS,CACrD,MAAME,EAASC,KAAKC,MAAMD,KAAKE,UAAYL,EAAQ,KAClDD,EAAMC,GAAQD,EAAMG,IAAW,CAACH,EAAMG,GAASH,EAAMC,GACxD,CACA,OAAOD,CACT"}
@@ -1,2 +0,0 @@
1
- declare function sleep(milliseconds: number): Promise<void>;
2
- export { sleep };
@@ -1 +0,0 @@
1
- {"version":3,"file":"sleep.js","sources":["../../src/sleep.ts"],"sourcesContent":["export async function sleep(milliseconds: number): Promise<void> {\n return new Promise((r) => setTimeout(r, milliseconds));\n}\n"],"names":["async","sleep","milliseconds","Promise","r","setTimeout"],"mappings":"AAAOA,eAAeC,EAAMC,GAC1B,OAAO,IAAIC,SAASC,GAAMC,WAAWD,EAAGF,IAC1C"}
@@ -1,2 +0,0 @@
1
- declare function zenkakuAlphanumericalsToHankaku(str: string): string;
2
- export { zenkakuAlphanumericalsToHankaku };
@@ -1 +0,0 @@
1
- {"version":3,"file":"zenkaku.js","sources":["../../src/zenkaku.ts"],"sourcesContent":["export function zenkakuAlphanumericalsToHankaku(str: string): string {\n return str.replaceAll(/[0-9A-Za-z]/g, (s: string) => {\n return String.fromCodePoint((s.codePointAt(0) ?? 0) - 0xfe_e0);\n });\n}\n"],"names":["zenkakuAlphanumericalsToHankaku","str","replaceAll","s","_s$codePointAt","String","fromCodePoint","codePointAt"],"mappings":"AAAO,SAASA,EAAgCC,GAC9C,OAAOA,EAAIC,WAAW,gBAAiBC,IAAc,IAAAC,EACnD,OAAOC,OAAOC,eAA+BF,OAAjBA,EAACD,EAAEI,YAAY,IAAEH,EAAI,GAAK,MAAQ,GAElE"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes