freee-demo-kit 0.1.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 (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +35 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/auth.d.ts +3 -0
  8. package/dist/commands/auth.d.ts.map +1 -0
  9. package/dist/commands/auth.js +57 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/corrupt.d.ts +3 -0
  12. package/dist/commands/corrupt.d.ts.map +1 -0
  13. package/dist/commands/corrupt.js +72 -0
  14. package/dist/commands/corrupt.js.map +1 -0
  15. package/dist/commands/dry-run.d.ts +3 -0
  16. package/dist/commands/dry-run.d.ts.map +1 -0
  17. package/dist/commands/dry-run.js +59 -0
  18. package/dist/commands/dry-run.js.map +1 -0
  19. package/dist/commands/list.d.ts +3 -0
  20. package/dist/commands/list.d.ts.map +1 -0
  21. package/dist/commands/list.js +58 -0
  22. package/dist/commands/list.js.map +1 -0
  23. package/dist/commands/load-all.d.ts +3 -0
  24. package/dist/commands/load-all.d.ts.map +1 -0
  25. package/dist/commands/load-all.js +69 -0
  26. package/dist/commands/load-all.js.map +1 -0
  27. package/dist/commands/load.d.ts +25 -0
  28. package/dist/commands/load.d.ts.map +1 -0
  29. package/dist/commands/load.js +197 -0
  30. package/dist/commands/load.js.map +1 -0
  31. package/dist/commands/reset.d.ts +3 -0
  32. package/dist/commands/reset.d.ts.map +1 -0
  33. package/dist/commands/reset.js +117 -0
  34. package/dist/commands/reset.js.map +1 -0
  35. package/dist/commands/setup.d.ts +4 -0
  36. package/dist/commands/setup.d.ts.map +1 -0
  37. package/dist/commands/setup.js +190 -0
  38. package/dist/commands/setup.js.map +1 -0
  39. package/dist/commands/status.d.ts +3 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +25 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/commands/validate.d.ts +5 -0
  44. package/dist/commands/validate.d.ts.map +1 -0
  45. package/dist/commands/validate.js +132 -0
  46. package/dist/commands/validate.js.map +1 -0
  47. package/dist/commands/verify.d.ts +3 -0
  48. package/dist/commands/verify.d.ts.map +1 -0
  49. package/dist/commands/verify.js +87 -0
  50. package/dist/commands/verify.js.map +1 -0
  51. package/dist/commands/whoami.d.ts +3 -0
  52. package/dist/commands/whoami.d.ts.map +1 -0
  53. package/dist/commands/whoami.js +31 -0
  54. package/dist/commands/whoami.js.map +1 -0
  55. package/dist/types/freee.d.ts +112 -0
  56. package/dist/types/freee.d.ts.map +1 -0
  57. package/dist/types/freee.js +3 -0
  58. package/dist/types/freee.js.map +1 -0
  59. package/dist/types/preset.d.ts +14 -0
  60. package/dist/types/preset.d.ts.map +1 -0
  61. package/dist/types/preset.js +2 -0
  62. package/dist/types/preset.js.map +1 -0
  63. package/dist/utils/accounting-validator.d.ts +13 -0
  64. package/dist/utils/accounting-validator.d.ts.map +1 -0
  65. package/dist/utils/accounting-validator.js +95 -0
  66. package/dist/utils/accounting-validator.js.map +1 -0
  67. package/dist/utils/auth-flow.d.ts +17 -0
  68. package/dist/utils/auth-flow.d.ts.map +1 -0
  69. package/dist/utils/auth-flow.js +137 -0
  70. package/dist/utils/auth-flow.js.map +1 -0
  71. package/dist/utils/config.d.ts +11 -0
  72. package/dist/utils/config.d.ts.map +1 -0
  73. package/dist/utils/config.js +13 -0
  74. package/dist/utils/config.js.map +1 -0
  75. package/dist/utils/confirm-company.d.ts +7 -0
  76. package/dist/utils/confirm-company.d.ts.map +1 -0
  77. package/dist/utils/confirm-company.js +20 -0
  78. package/dist/utils/confirm-company.js.map +1 -0
  79. package/dist/utils/corrupt-injector.d.ts +17 -0
  80. package/dist/utils/corrupt-injector.d.ts.map +1 -0
  81. package/dist/utils/corrupt-injector.js +123 -0
  82. package/dist/utils/corrupt-injector.js.map +1 -0
  83. package/dist/utils/env-loader.d.ts +9 -0
  84. package/dist/utils/env-loader.d.ts.map +1 -0
  85. package/dist/utils/env-loader.js +12 -0
  86. package/dist/utils/env-loader.js.map +1 -0
  87. package/dist/utils/env-writer.d.ts +10 -0
  88. package/dist/utils/env-writer.d.ts.map +1 -0
  89. package/dist/utils/env-writer.js +40 -0
  90. package/dist/utils/env-writer.js.map +1 -0
  91. package/dist/utils/freee-api.d.ts +24 -0
  92. package/dist/utils/freee-api.d.ts.map +1 -0
  93. package/dist/utils/freee-api.js +175 -0
  94. package/dist/utils/freee-api.js.map +1 -0
  95. package/dist/utils/logger.d.ts +6 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +22 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/pkce.d.ts +12 -0
  100. package/dist/utils/pkce.d.ts.map +1 -0
  101. package/dist/utils/pkce.js +18 -0
  102. package/dist/utils/pkce.js.map +1 -0
  103. package/dist/utils/preset-loader.d.ts +3 -0
  104. package/dist/utils/preset-loader.d.ts.map +1 -0
  105. package/dist/utils/preset-loader.js +47 -0
  106. package/dist/utils/preset-loader.js.map +1 -0
  107. package/dist/utils/preset-validator.d.ts +10 -0
  108. package/dist/utils/preset-validator.d.ts.map +1 -0
  109. package/dist/utils/preset-validator.js +23 -0
  110. package/dist/utils/preset-validator.js.map +1 -0
  111. package/dist/utils/state-store.d.ts +6 -0
  112. package/dist/utils/state-store.d.ts.map +1 -0
  113. package/dist/utils/state-store.js +37 -0
  114. package/dist/utils/state-store.js.map +1 -0
  115. package/dist/utils/token-store.d.ts +6 -0
  116. package/dist/utils/token-store.d.ts.map +1 -0
  117. package/dist/utils/token-store.js +30 -0
  118. package/dist/utils/token-store.js.map +1 -0
  119. package/package.json +58 -0
  120. package/presets/README.md +182 -0
  121. package/presets/accounting/README.md +3 -0
  122. package/presets/accounting/construction/preset.json +309 -0
  123. package/presets/accounting/freelance-invoice/preset.json +261 -0
  124. package/presets/accounting/full-year/preset.json +1534 -0
  125. package/presets/accounting/it-startup/preset.json +472 -0
  126. package/presets/accounting/manufacturing/preset.json +333 -0
  127. package/presets/accounting/medical/preset.json +453 -0
  128. package/presets/accounting/non-profit/preset.json +375 -0
  129. package/presets/accounting/npo-subsidy/preset.json +454 -0
  130. package/presets/accounting/payroll-agency/preset.json +286 -0
  131. package/presets/accounting/quickstart/preset.json +917 -0
  132. package/presets/accounting/real-estate/preset.json +453 -0
  133. package/presets/accounting/restaurant/preset.json +349 -0
  134. package/presets/accounting/retail/preset.json +536 -0
  135. package/presets/accounting/sole-proprietor/preset.json +408 -0
  136. package/presets/advanced/multi-company/README.md +3 -0
  137. package/presets/advanced/multi-company/preset.json +640 -0
  138. package/presets/advanced/multi-period/README.md +3 -0
  139. package/presets/advanced/multi-period/preset.json +633 -0
  140. package/presets/common/depreciation/preset.json +433 -0
  141. package/presets/errors/consumption-tax/preset.json +136 -0
  142. package/presets/errors/depreciation-method/preset.json +133 -0
  143. package/presets/errors/duplicate-journal/preset.json +181 -0
  144. package/presets/errors/entertainment/preset.json +108 -0
  145. package/presets/errors/mixed/preset.json +171 -0
  146. package/presets/errors/officer-pay/preset.json +100 -0
  147. package/presets/errors/overdue-receivable/preset.json +157 -0
  148. package/presets/errors/tax-code/preset.json +140 -0
  149. package/presets/errors/year-end-closing/preset.json +163 -0
  150. package/presets/expenses/README.md +3 -0
  151. package/presets/expenses/quickstart/preset.json +240 -0
  152. package/presets/hr/README.md +3 -0
  153. package/presets/hr/quickstart/preset.json +443 -0
  154. package/presets/invoices/README.md +3 -0
  155. package/presets/invoices/quickstart/preset.json +246 -0
  156. package/presets/invoices/subscription/preset.json +263 -0
  157. package/presets/unclassified/quickstart/preset.json +182 -0
@@ -0,0 +1,112 @@
1
+ export interface FreeeCompany {
2
+ id: number;
3
+ name: string;
4
+ display_name: string;
5
+ }
6
+ export interface FreeeUser {
7
+ id: number;
8
+ email: string;
9
+ display_name: string;
10
+ companies: FreeeCompany[];
11
+ }
12
+ export interface FreeeTokens {
13
+ access_token: string;
14
+ refresh_token: string;
15
+ token_type: string;
16
+ expires_at: number;
17
+ company_id?: number;
18
+ }
19
+ export type WalletableType = 'bank_account' | 'credit_card' | 'wallet' | 'other';
20
+ export interface WalletableData {
21
+ type: WalletableType;
22
+ name: string;
23
+ bank_code?: string;
24
+ bank_branch_code?: string;
25
+ account_number?: string;
26
+ }
27
+ export interface FreeeWalletable {
28
+ id: number;
29
+ type: WalletableType;
30
+ name: string;
31
+ company_id: number;
32
+ }
33
+ export interface DealDetail {
34
+ account_item_id?: number;
35
+ account_item_name?: string;
36
+ tax_code: number;
37
+ amount: number;
38
+ description?: string;
39
+ entry_side?: 'credit' | 'debit';
40
+ }
41
+ export interface DealData {
42
+ issue_date: string;
43
+ type: 'income' | 'expense';
44
+ amount?: number;
45
+ partner_name?: string;
46
+ details: DealDetail[];
47
+ }
48
+ export interface FreeeDeal {
49
+ id: number;
50
+ company_id: number;
51
+ issue_date: string;
52
+ type: 'income' | 'expense';
53
+ amount: number;
54
+ }
55
+ export interface ManualJournalDetail {
56
+ entry_side: 'credit' | 'debit';
57
+ account_item_id?: number;
58
+ account_item_name?: string;
59
+ tax_code: number;
60
+ amount: number;
61
+ description?: string;
62
+ }
63
+ export interface ManualJournalData {
64
+ issue_date: string;
65
+ details: ManualJournalDetail[];
66
+ }
67
+ export interface FreeeManualJournal {
68
+ id: number;
69
+ company_id: number;
70
+ issue_date: string;
71
+ }
72
+ export interface FreeeAccountItem {
73
+ id: number;
74
+ name: string;
75
+ account_category: string;
76
+ }
77
+ export interface FreeeTax {
78
+ id: number;
79
+ code: number;
80
+ name: string;
81
+ }
82
+ export interface ErrorManifestItem {
83
+ rule: string;
84
+ location: string;
85
+ description: string;
86
+ expected_fix: string;
87
+ }
88
+ export interface PresetDefinition {
89
+ name: string;
90
+ description: string;
91
+ version: string;
92
+ expected: {
93
+ walletables: number;
94
+ deals: number;
95
+ manualJournals: number;
96
+ plTotal?: number;
97
+ };
98
+ data: {
99
+ walletables: WalletableData[];
100
+ deals: DealData[];
101
+ manualJournals: ManualJournalData[];
102
+ };
103
+ error_manifest?: ErrorManifestItem[];
104
+ }
105
+ export interface PresetState {
106
+ preset: string;
107
+ loadedAt: string;
108
+ walletableIds: number[];
109
+ dealIds: number[];
110
+ manualJournalIds: number[];
111
+ }
112
+ //# sourceMappingURL=freee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freee.d.ts","sourceRoot":"","sources":["../../src/types/freee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // freee REST API response types
2
+ export {};
3
+ //# sourceMappingURL=freee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freee.js","sourceRoot":"","sources":["../../src/types/freee.ts"],"names":[],"mappings":"AAAA,gCAAgC"}
@@ -0,0 +1,14 @@
1
+ export interface Preset {
2
+ name: string;
3
+ description: string;
4
+ category: 'accounting' | 'invoices' | 'expenses' | 'hr' | 'advanced';
5
+ version: string;
6
+ resources: PresetResource[];
7
+ }
8
+ export interface PresetResource {
9
+ type: 'deals' | 'manual_journals' | 'walletables' | 'account_items' | 'partners';
10
+ file: string;
11
+ count: number;
12
+ }
13
+ export type PresetCategory = 'accounting' | 'invoices' | 'expenses' | 'hr' | 'advanced';
14
+ //# sourceMappingURL=preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.d.ts","sourceRoot":"","sources":["../../src/types/preset.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,UAAU,CAAC;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preset.js","sourceRoot":"","sources":["../../src/types/preset.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { PresetDefinition } from '../types/freee.js';
2
+ export interface AccountingIssue {
3
+ severity: 'error' | 'warning';
4
+ rule: string;
5
+ message: string;
6
+ context?: string;
7
+ }
8
+ export interface AccountingValidationResult {
9
+ issues: AccountingIssue[];
10
+ passed: boolean;
11
+ }
12
+ export declare function runAccountingValidation(preset: PresetDefinition): AccountingValidationResult;
13
+ //# sourceMappingURL=accounting-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-validator.d.ts","sourceRoot":"","sources":["../../src/utils/accounting-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;CACjB;AAoBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,0BAA0B,CA6E5F"}
@@ -0,0 +1,95 @@
1
+ const OFFICER_KEYWORDS = ['取締役', '役員', '監査役'];
2
+ const TAX_CODE_RULES = {
3
+ '役員報酬': { allowedCodes: [0], severity: 'error' },
4
+ '給料手当': { allowedCodes: [0], severity: 'error' },
5
+ '外注費': { allowedCodes: [34, 18], severity: 'error' },
6
+ '売上高': { allowedCodes: [21, 13], severity: 'error' },
7
+ '交際費': { allowedCodes: [34, 18], severity: 'warning' },
8
+ '地代家賃': { allowedCodes: [0, 34], severity: 'warning' },
9
+ '諸会費': { allowedCodes: [0], severity: 'warning' },
10
+ };
11
+ // 手動仕訳(振替・未払計上等)では tax_code:0 が正当な仕入・費用科目
12
+ // 例: 外注費の月末未払計上仕訳は tax_code:0 で問題なし
13
+ const JOURNAL_SKIP_ACCOUNTS = new Set(['外注費', '交際費', '地代家賃', '諸会費']);
14
+ const ENTERTAINMENT_MONTHLY_LIMIT = 667000;
15
+ export function runAccountingValidation(preset) {
16
+ const issues = [];
17
+ // OFFICER-PAY-001
18
+ for (const deal of preset.data.deals) {
19
+ const partnerName = deal.partner_name ?? '';
20
+ const isOfficer = OFFICER_KEYWORDS.some(kw => partnerName.includes(kw));
21
+ if (!isOfficer)
22
+ continue;
23
+ for (const detail of deal.details) {
24
+ if (detail.account_item_name === '給料手当') {
25
+ issues.push({
26
+ severity: 'error',
27
+ rule: 'OFFICER-PAY-001',
28
+ message: `役員報酬の誤計上: ${deal.issue_date} ${partnerName} — 「給料手当」は役員には不可。「役員報酬」を使用してください`,
29
+ });
30
+ }
31
+ }
32
+ }
33
+ // TAX-CODE-001 — deals
34
+ for (const deal of preset.data.deals) {
35
+ for (const detail of deal.details) {
36
+ const name = detail.account_item_name;
37
+ if (!name)
38
+ continue;
39
+ const rule = TAX_CODE_RULES[name];
40
+ if (!rule)
41
+ continue;
42
+ if (!rule.allowedCodes.includes(detail.tax_code)) {
43
+ issues.push({
44
+ severity: rule.severity,
45
+ rule: 'TAX-CODE-001',
46
+ message: `税区分不整合: ${deal.issue_date} 勘定科目「${name}」に tax_code:${detail.tax_code} が設定されています(期待値: ${rule.allowedCodes.join(',')})`,
47
+ });
48
+ }
49
+ }
50
+ }
51
+ // TAX-CODE-001 — manualJournals(仕入・費用科目の振替仕訳は tax_code:0 が正当なのでスキップ)
52
+ for (const mj of preset.data.manualJournals) {
53
+ for (const detail of mj.details) {
54
+ const name = detail.account_item_name;
55
+ if (!name)
56
+ continue;
57
+ if (JOURNAL_SKIP_ACCOUNTS.has(name))
58
+ continue;
59
+ const rule = TAX_CODE_RULES[name];
60
+ if (!rule)
61
+ continue;
62
+ if (!rule.allowedCodes.includes(detail.tax_code)) {
63
+ issues.push({
64
+ severity: rule.severity,
65
+ rule: 'TAX-CODE-001',
66
+ message: `税区分不整合: ${mj.issue_date} 勘定科目「${name}」に tax_code:${detail.tax_code} が設定されています(期待値: ${rule.allowedCodes.join(',')})`,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ // ENTERTAINMENT-001
72
+ const monthlyTotals = new Map();
73
+ for (const deal of preset.data.deals) {
74
+ for (const detail of deal.details) {
75
+ if (detail.account_item_name !== '交際費')
76
+ continue;
77
+ const [year, month] = deal.issue_date.split('-');
78
+ const key = `${year}-${month}`;
79
+ monthlyTotals.set(key, (monthlyTotals.get(key) ?? 0) + detail.amount);
80
+ }
81
+ }
82
+ for (const [key, total] of monthlyTotals) {
83
+ if (total > ENTERTAINMENT_MONTHLY_LIMIT) {
84
+ const [year, month] = key.split('-');
85
+ issues.push({
86
+ severity: 'warning',
87
+ rule: 'ENTERTAINMENT-001',
88
+ message: `交際費月次上限警告: ${year}年${month}月 合計¥${total.toLocaleString()} (目安¥667,000/月)`,
89
+ });
90
+ }
91
+ }
92
+ const passed = !issues.some(i => i.severity === 'error');
93
+ return { issues, passed };
94
+ }
95
+ //# sourceMappingURL=accounting-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting-validator.js","sourceRoot":"","sources":["../../src/utils/accounting-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const REDIRECT_URI = "http://localhost:8080/callback";
2
+ export interface AuthResult {
3
+ displayName: string;
4
+ email: string;
5
+ companies: {
6
+ id: number;
7
+ name: string;
8
+ }[];
9
+ }
10
+ /**
11
+ * freee OAuth PKCE フローを実行してトークンを保存する。
12
+ * 認証後のユーザー情報を返す。
13
+ *
14
+ * @param onBrowserOpen - ブラウザを開く前に URL を受け取るコールバック(省略可)
15
+ */
16
+ export declare function runOAuthPkceFlow(onBrowserOpen?: (url: string) => void): Promise<AuthResult>;
17
+ //# sourceMappingURL=auth-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-flow.d.ts","sourceRoot":"","sources":["../../src/utils/auth-flow.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,mCAA+C,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3C;AAmGD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACpC,OAAO,CAAC,UAAU,CAAC,CAgDrB"}
@@ -0,0 +1,137 @@
1
+ import http from 'node:http';
2
+ import { URL } from 'node:url';
3
+ import { generateCodeVerifier, generateCodeChallenge } from './pkce.js';
4
+ import { saveTokens } from './token-store.js';
5
+ import { FreeeApiClient } from './freee-api.js';
6
+ import { info, warn, error as logError } from './logger.js';
7
+ const FREEE_AUTH_URL = 'https://accounts.secure.freee.co.jp/public_api/authorize';
8
+ const FREEE_TOKEN_URL = 'https://accounts.secure.freee.co.jp/public_api/token';
9
+ const CALLBACK_PORT = 8080;
10
+ export const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}/callback`;
11
+ async function openBrowser(url) {
12
+ const { exec } = await import('node:child_process');
13
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
14
+ exec(`${cmd} "${url}"`);
15
+ }
16
+ async function startCallbackServer() {
17
+ return new Promise((resolve, reject) => {
18
+ const timeout = setTimeout(() => {
19
+ server.close();
20
+ reject(new Error('OAuth callback timed out after 120 seconds'));
21
+ }, 120_000);
22
+ const server = http.createServer((req, res) => {
23
+ if (!req.url)
24
+ return;
25
+ const url = new URL(req.url, `http://localhost:${CALLBACK_PORT}`);
26
+ if (url.pathname !== '/callback')
27
+ return;
28
+ const code = url.searchParams.get('code');
29
+ const state = url.searchParams.get('state');
30
+ const errorParam = url.searchParams.get('error');
31
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
32
+ res.end(`
33
+ <!DOCTYPE html><html><body style="font-family:sans-serif;text-align:center;padding:2rem">
34
+ <h2>✅ freee 認証完了</h2>
35
+ <p>このタブを閉じてターミナルに戻ってください。</p>
36
+ </body></html>
37
+ `);
38
+ server.close();
39
+ clearTimeout(timeout);
40
+ if (errorParam || !code || !state) {
41
+ reject(new Error(`OAuth error: ${errorParam ?? 'missing code or state'}`));
42
+ }
43
+ else {
44
+ resolve({ code, state });
45
+ }
46
+ });
47
+ server.listen(CALLBACK_PORT, () => {
48
+ info(`Waiting for OAuth callback on port ${CALLBACK_PORT}...`);
49
+ });
50
+ server.on('error', (err) => {
51
+ clearTimeout(timeout);
52
+ reject(err);
53
+ });
54
+ });
55
+ }
56
+ async function exchangeCodeForTokens(code, codeVerifier) {
57
+ const clientId = process.env['FREEE_CLIENT_ID'];
58
+ const clientSecret = process.env['FREEE_CLIENT_SECRET'];
59
+ if (!clientId)
60
+ throw new Error('FREEE_CLIENT_ID environment variable is not set');
61
+ if (!clientSecret)
62
+ throw new Error('FREEE_CLIENT_SECRET environment variable is not set');
63
+ const body = new URLSearchParams({
64
+ grant_type: 'authorization_code',
65
+ client_id: clientId,
66
+ client_secret: clientSecret,
67
+ code,
68
+ redirect_uri: REDIRECT_URI,
69
+ code_verifier: codeVerifier,
70
+ });
71
+ const res = await fetch(FREEE_TOKEN_URL, {
72
+ method: 'POST',
73
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
74
+ body: body.toString(),
75
+ });
76
+ if (!res.ok) {
77
+ const text = await res.text();
78
+ throw new Error(`Token exchange failed (${res.status}): ${text}`);
79
+ }
80
+ const data = (await res.json());
81
+ return {
82
+ access_token: data.access_token,
83
+ refresh_token: data.refresh_token,
84
+ token_type: data.token_type,
85
+ expires_at: (data.created_at + data.expires_in) * 1000,
86
+ };
87
+ }
88
+ /**
89
+ * freee OAuth PKCE フローを実行してトークンを保存する。
90
+ * 認証後のユーザー情報を返す。
91
+ *
92
+ * @param onBrowserOpen - ブラウザを開く前に URL を受け取るコールバック(省略可)
93
+ */
94
+ export async function runOAuthPkceFlow(onBrowserOpen) {
95
+ const clientId = process.env['FREEE_CLIENT_ID'];
96
+ if (!clientId) {
97
+ logError('FREEE_CLIENT_ID environment variable is not set.');
98
+ throw new Error('FREEE_CLIENT_ID is not set');
99
+ }
100
+ const codeVerifier = generateCodeVerifier();
101
+ const codeChallenge = await generateCodeChallenge(codeVerifier);
102
+ const state = Math.random().toString(36).slice(2);
103
+ const authUrl = new URL(FREEE_AUTH_URL);
104
+ authUrl.searchParams.set('client_id', clientId);
105
+ authUrl.searchParams.set('redirect_uri', REDIRECT_URI);
106
+ authUrl.searchParams.set('response_type', 'code');
107
+ authUrl.searchParams.set('state', state);
108
+ authUrl.searchParams.set('code_challenge', codeChallenge);
109
+ authUrl.searchParams.set('code_challenge_method', 'S256');
110
+ const urlString = authUrl.toString();
111
+ onBrowserOpen?.(urlString);
112
+ try {
113
+ await openBrowser(urlString);
114
+ }
115
+ catch {
116
+ warn('Could not open browser automatically. Please open the URL above manually.');
117
+ }
118
+ const { code, state: returnedState } = await startCallbackServer();
119
+ if (returnedState !== state) {
120
+ throw new Error('OAuth state mismatch. Possible CSRF attack.');
121
+ }
122
+ const tokens = await exchangeCodeForTokens(code, codeVerifier);
123
+ await saveTokens(tokens);
124
+ try {
125
+ const client = new FreeeApiClient();
126
+ const me = await client.getMe();
127
+ return {
128
+ displayName: me.display_name,
129
+ email: me.email,
130
+ companies: me.companies.map(c => ({ id: c.id, name: c.name })),
131
+ };
132
+ }
133
+ catch {
134
+ return { displayName: '(ユーザー情報取得失敗)', email: '', companies: [] };
135
+ }
136
+ }
137
+ //# sourceMappingURL=auth-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-flow.js","sourceRoot":"","sources":["../../src/utils/auth-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const CONFIG_DIR: string;
2
+ export declare const TOKEN_FILE: string;
3
+ export declare const CONFIG_FILE: string;
4
+ export declare const STATE_FILE: string;
5
+ export interface FdkConfig {
6
+ defaultCompanyId?: number;
7
+ apiDelay?: number;
8
+ }
9
+ export declare function getConfigDir(): string;
10
+ export declare function getTokenFile(): string;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,eAAO,MAAM,UAAU,QAAkC,CAAC;AAC1D,eAAO,MAAM,WAAW,QAAkC,CAAC;AAC3D,eAAO,MAAM,UAAU,QAAiC,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
@@ -0,0 +1,13 @@
1
+ import { homedir } from 'os';
2
+ import { join } from 'path';
3
+ export const CONFIG_DIR = join(homedir(), '.config', 'fdk');
4
+ export const TOKEN_FILE = join(CONFIG_DIR, 'tokens.json');
5
+ export const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
6
+ export const STATE_FILE = join(CONFIG_DIR, 'state.json');
7
+ export function getConfigDir() {
8
+ return CONFIG_DIR;
9
+ }
10
+ export function getTokenFile() {
11
+ return TOKEN_FILE;
12
+ }
13
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAOzD,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * write 系コマンド実行前に事業所名を表示してユーザーに確認を求める。
3
+ * --yes フラグが true の場合はスキップして即 true を返す。
4
+ * デフォルト(空エンター)は No。
5
+ */
6
+ export declare function confirmCompany(companyName: string, companyId: number, yes: boolean): Promise<boolean>;
7
+ //# sourceMappingURL=confirm-company.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-company.d.ts","sourceRoot":"","sources":["../../src/utils/confirm-company.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,OAAO,CAAC,CAclB"}
@@ -0,0 +1,20 @@
1
+ import * as readline from 'node:readline';
2
+ /**
3
+ * write 系コマンド実行前に事業所名を表示してユーザーに確認を求める。
4
+ * --yes フラグが true の場合はスキップして即 true を返す。
5
+ * デフォルト(空エンター)は No。
6
+ */
7
+ export async function confirmCompany(companyName, companyId, yes) {
8
+ if (yes)
9
+ return true;
10
+ console.log(`\n⚠️ 対象事業所: ${companyName} (ID: ${companyId})`);
11
+ console.log(' この事業所にデータを書き込みます。');
12
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
13
+ return new Promise(resolve => {
14
+ rl.question(' 続行しますか? [y/N]: ', answer => {
15
+ rl.close();
16
+ resolve(answer === 'y' || answer === 'Y');
17
+ });
18
+ });
19
+ }
20
+ //# sourceMappingURL=confirm-company.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-company.js","sourceRoot":"","sources":["../../src/utils/confirm-company.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,SAAiB,EACjB,GAAY;IAEZ,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,SAAS,SAAS,GAAG,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE;YACzC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { PresetDefinition, ErrorManifestItem } from '../types/freee.js';
2
+ export interface CorruptOptions {
3
+ rules: ('officer-pay' | 'tax-code' | 'entertainment')[];
4
+ }
5
+ export interface CorruptResult {
6
+ preset: PresetDefinition;
7
+ manifest: ErrorManifestItem[];
8
+ }
9
+ /** OFFICER-PAY-001: 役員報酬 → 給料手当 に置換 */
10
+ export declare function injectOfficerPay(preset: PresetDefinition): CorruptResult;
11
+ /** TAX-CODE-001: 対象科目の税区分を誤った値に置換 */
12
+ export declare function injectTaxCode(preset: PresetDefinition): CorruptResult;
13
+ /** ENTERTAINMENT-001: 交際費の月合計が 667,000 超になるよう増幅 */
14
+ export declare function injectEntertainment(preset: PresetDefinition): CorruptResult;
15
+ /** 複数ルールを順次適用して CorruptResult を返す */
16
+ export declare function runCorrupt(preset: PresetDefinition, options: CorruptOptions): CorruptResult;
17
+ //# sourceMappingURL=corrupt-injector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corrupt-injector.d.ts","sourceRoot":"","sources":["../../src/utils/corrupt-injector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAY,MAAM,mBAAmB,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,CAAC,aAAa,GAAG,UAAU,GAAG,eAAe,CAAC,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,gBAAgB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAiBD,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAuBxE;AAED,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAsBrE;AAKD,mDAAmD;AACnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CA2C3E;AAED,qCAAqC;AACrC,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,GAAG,aAAa,CAkB3F"}