@aigne/doc-smith 0.8.12-beta.7 → 0.8.12-beta.9

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 (284) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/agents/clear/choose-contents.mjs +14 -1
  3. package/agents/clear/clear-media-description.mjs +129 -0
  4. package/agents/clear/index.yaml +3 -1
  5. package/agents/evaluate/code-snippet.mjs +28 -24
  6. package/agents/evaluate/document-structure.yaml +0 -4
  7. package/agents/evaluate/document.yaml +1 -5
  8. package/agents/generate/index.yaml +1 -0
  9. package/agents/init/index.mjs +10 -0
  10. package/agents/media/batch-generate-media-description.yaml +44 -0
  11. package/agents/media/generate-media-description.yaml +47 -0
  12. package/agents/media/load-media-description.mjs +238 -0
  13. package/agents/publish/index.yaml +4 -0
  14. package/agents/publish/publish-docs.mjs +77 -5
  15. package/agents/publish/translate-meta.mjs +103 -0
  16. package/agents/update/generate-document.yaml +30 -28
  17. package/agents/update/index.yaml +1 -0
  18. package/agents/update/update-document-detail.yaml +3 -1
  19. package/agents/utils/load-sources.mjs +103 -53
  20. package/agents/utils/update-branding.mjs +69 -0
  21. package/aigne.yaml +6 -0
  22. package/assets/report-template/report.html +34 -34
  23. package/package.json +17 -2
  24. package/prompts/common/document/role-and-personality.md +3 -1
  25. package/prompts/detail/d2-diagram/guide.md +7 -1
  26. package/prompts/detail/d2-diagram/user-prompt.md +3 -0
  27. package/prompts/detail/generate/system-prompt.md +6 -7
  28. package/prompts/detail/generate/user-prompt.md +12 -3
  29. package/prompts/detail/update/user-prompt.md +0 -2
  30. package/prompts/evaluate/document-structure.md +6 -7
  31. package/prompts/evaluate/document.md +16 -25
  32. package/prompts/media/media-description/system-prompt.md +35 -0
  33. package/prompts/media/media-description/user-prompt.md +8 -0
  34. package/prompts/structure/update/user-prompt.md +0 -4
  35. package/utils/constants/index.mjs +0 -107
  36. package/utils/file-utils.mjs +86 -0
  37. package/utils/markdown-checker.mjs +0 -20
  38. package/utils/request.mjs +7 -0
  39. package/utils/upload-files.mjs +231 -0
  40. package/utils/utils.mjs +11 -1
  41. package/.aigne/doc-smith/config.yaml +0 -77
  42. package/.aigne/doc-smith/history.yaml +0 -37
  43. package/.aigne/doc-smith/output/structure-plan.json +0 -162
  44. package/.aigne/doc-smith/preferences.yml +0 -97
  45. package/.aigne/doc-smith/upload-cache.yaml +0 -1893
  46. package/.github/PULL_REQUEST_TEMPLATE.md +0 -28
  47. package/.github/workflows/ci.yml +0 -54
  48. package/.github/workflows/create-release-pr.yaml +0 -21
  49. package/.github/workflows/publish-docs.yml +0 -65
  50. package/.github/workflows/release.yml +0 -49
  51. package/.github/workflows/reviewer.yml +0 -54
  52. package/.release-please-manifest.json +0 -3
  53. package/RELEASE.md +0 -9
  54. package/assets/screenshots/doc-complete-setup.png +0 -0
  55. package/assets/screenshots/doc-generate-docs.png +0 -0
  56. package/assets/screenshots/doc-generate.png +0 -0
  57. package/assets/screenshots/doc-generated-successfully.png +0 -0
  58. package/assets/screenshots/doc-publish.png +0 -0
  59. package/assets/screenshots/doc-regenerate.png +0 -0
  60. package/assets/screenshots/doc-translate-langs.png +0 -0
  61. package/assets/screenshots/doc-translate.png +0 -0
  62. package/assets/screenshots/doc-update.png +0 -0
  63. package/biome.json +0 -73
  64. package/codecov.yml +0 -15
  65. package/docs/_sidebar.md +0 -15
  66. package/docs/configuration-initial-setup.ja.md +0 -179
  67. package/docs/configuration-initial-setup.md +0 -179
  68. package/docs/configuration-initial-setup.zh-TW.md +0 -179
  69. package/docs/configuration-initial-setup.zh.md +0 -179
  70. package/docs/configuration-managing-preferences.ja.md +0 -100
  71. package/docs/configuration-managing-preferences.md +0 -100
  72. package/docs/configuration-managing-preferences.zh-TW.md +0 -100
  73. package/docs/configuration-managing-preferences.zh.md +0 -100
  74. package/docs/configuration.ja.md +0 -96
  75. package/docs/configuration.md +0 -96
  76. package/docs/configuration.zh-TW.md +0 -96
  77. package/docs/configuration.zh.md +0 -96
  78. package/docs/getting-started.ja.md +0 -88
  79. package/docs/getting-started.md +0 -88
  80. package/docs/getting-started.zh-TW.md +0 -88
  81. package/docs/getting-started.zh.md +0 -88
  82. package/docs/guides-cleaning-up.ja.md +0 -51
  83. package/docs/guides-cleaning-up.md +0 -51
  84. package/docs/guides-cleaning-up.zh-TW.md +0 -51
  85. package/docs/guides-cleaning-up.zh.md +0 -51
  86. package/docs/guides-evaluating-documents.ja.md +0 -66
  87. package/docs/guides-evaluating-documents.md +0 -66
  88. package/docs/guides-evaluating-documents.zh-TW.md +0 -66
  89. package/docs/guides-evaluating-documents.zh.md +0 -66
  90. package/docs/guides-generating-documentation.ja.md +0 -151
  91. package/docs/guides-generating-documentation.md +0 -151
  92. package/docs/guides-generating-documentation.zh-TW.md +0 -151
  93. package/docs/guides-generating-documentation.zh.md +0 -151
  94. package/docs/guides-interactive-chat.ja.md +0 -85
  95. package/docs/guides-interactive-chat.md +0 -85
  96. package/docs/guides-interactive-chat.zh-TW.md +0 -85
  97. package/docs/guides-interactive-chat.zh.md +0 -85
  98. package/docs/guides-managing-history.ja.md +0 -48
  99. package/docs/guides-managing-history.md +0 -48
  100. package/docs/guides-managing-history.zh-TW.md +0 -48
  101. package/docs/guides-managing-history.zh.md +0 -48
  102. package/docs/guides-publishing-your-docs.ja.md +0 -78
  103. package/docs/guides-publishing-your-docs.md +0 -78
  104. package/docs/guides-publishing-your-docs.zh-TW.md +0 -78
  105. package/docs/guides-publishing-your-docs.zh.md +0 -78
  106. package/docs/guides-translating-documentation.ja.md +0 -95
  107. package/docs/guides-translating-documentation.md +0 -95
  108. package/docs/guides-translating-documentation.zh-TW.md +0 -95
  109. package/docs/guides-translating-documentation.zh.md +0 -95
  110. package/docs/guides-updating-documentation.ja.md +0 -77
  111. package/docs/guides-updating-documentation.md +0 -77
  112. package/docs/guides-updating-documentation.zh-TW.md +0 -77
  113. package/docs/guides-updating-documentation.zh.md +0 -77
  114. package/docs/guides.ja.md +0 -32
  115. package/docs/guides.md +0 -32
  116. package/docs/guides.zh-TW.md +0 -32
  117. package/docs/guides.zh.md +0 -32
  118. package/docs/overview.ja.md +0 -61
  119. package/docs/overview.md +0 -61
  120. package/docs/overview.zh-TW.md +0 -61
  121. package/docs/overview.zh.md +0 -61
  122. package/docs/release-notes.ja.md +0 -255
  123. package/docs/release-notes.md +0 -255
  124. package/docs/release-notes.zh-TW.md +0 -255
  125. package/docs/release-notes.zh.md +0 -255
  126. package/media.md +0 -19
  127. package/prompts/common/afs/afs-tools-usage.md +0 -5
  128. package/prompts/common/afs/use-afs-instruction.md +0 -1
  129. package/release-please-config.json +0 -14
  130. package/tests/agents/chat/chat.test.mjs +0 -46
  131. package/tests/agents/clear/choose-contents.test.mjs +0 -284
  132. package/tests/agents/clear/clear-auth-tokens.test.mjs +0 -268
  133. package/tests/agents/clear/clear-document-config.test.mjs +0 -167
  134. package/tests/agents/clear/clear-document-structure.test.mjs +0 -380
  135. package/tests/agents/clear/clear-generated-docs.test.mjs +0 -222
  136. package/tests/agents/evaluate/code-snippet.test.mjs +0 -163
  137. package/tests/agents/evaluate/fixtures/api-services.md +0 -87
  138. package/tests/agents/evaluate/fixtures/js-sdk.md +0 -94
  139. package/tests/agents/evaluate/generate-report.test.mjs +0 -312
  140. package/tests/agents/generate/check-document-structure.test.mjs +0 -45
  141. package/tests/agents/generate/check-need-generate-structure.test.mjs +0 -279
  142. package/tests/agents/generate/document-structure-tools/add-document.test.mjs +0 -449
  143. package/tests/agents/generate/document-structure-tools/delete-document.test.mjs +0 -410
  144. package/tests/agents/generate/document-structure-tools/generate-sub-structure.test.mjs +0 -277
  145. package/tests/agents/generate/document-structure-tools/move-document.test.mjs +0 -476
  146. package/tests/agents/generate/document-structure-tools/update-document.test.mjs +0 -548
  147. package/tests/agents/generate/generate-structure.test.mjs +0 -45
  148. package/tests/agents/generate/user-review-document-structure.test.mjs +0 -319
  149. package/tests/agents/history/view.test.mjs +0 -97
  150. package/tests/agents/init/init.test.mjs +0 -1657
  151. package/tests/agents/prefs/prefs.test.mjs +0 -431
  152. package/tests/agents/publish/publish-docs.test.mjs +0 -787
  153. package/tests/agents/translate/choose-language.test.mjs +0 -311
  154. package/tests/agents/translate/translate-document.test.mjs +0 -51
  155. package/tests/agents/update/check-document.test.mjs +0 -463
  156. package/tests/agents/update/check-update-is-single.test.mjs +0 -300
  157. package/tests/agents/update/document-tools/update-document-content.test.mjs +0 -329
  158. package/tests/agents/update/generate-document.test.mjs +0 -51
  159. package/tests/agents/update/save-and-translate-document.test.mjs +0 -369
  160. package/tests/agents/update/user-review-document.test.mjs +0 -582
  161. package/tests/agents/utils/action-success.test.mjs +0 -54
  162. package/tests/agents/utils/check-detail-result.test.mjs +0 -743
  163. package/tests/agents/utils/check-feedback-refiner.test.mjs +0 -478
  164. package/tests/agents/utils/choose-docs.test.mjs +0 -406
  165. package/tests/agents/utils/exit.test.mjs +0 -70
  166. package/tests/agents/utils/feedback-refiner.test.mjs +0 -51
  167. package/tests/agents/utils/find-item-by-path.test.mjs +0 -517
  168. package/tests/agents/utils/find-user-preferences-by-path.test.mjs +0 -382
  169. package/tests/agents/utils/format-document-structure.test.mjs +0 -364
  170. package/tests/agents/utils/fs.test.mjs +0 -267
  171. package/tests/agents/utils/load-sources.test.mjs +0 -1470
  172. package/tests/agents/utils/save-docs.test.mjs +0 -109
  173. package/tests/agents/utils/save-output.test.mjs +0 -315
  174. package/tests/agents/utils/save-single-doc.test.mjs +0 -364
  175. package/tests/agents/utils/transform-detail-datasources.test.mjs +0 -320
  176. package/tests/utils/auth-utils.test.mjs +0 -596
  177. package/tests/utils/blocklet.test.mjs +0 -336
  178. package/tests/utils/conflict-detector.test.mjs +0 -355
  179. package/tests/utils/constants.test.mjs +0 -295
  180. package/tests/utils/d2-utils.test.mjs +0 -437
  181. package/tests/utils/deploy.test.mjs +0 -399
  182. package/tests/utils/docs-finder-utils.test.mjs +0 -650
  183. package/tests/utils/file-utils.test.mjs +0 -521
  184. package/tests/utils/history-utils.test.mjs +0 -206
  185. package/tests/utils/kroki-utils.test.mjs +0 -646
  186. package/tests/utils/linter/fixtures/css/keyword-error.css +0 -1
  187. package/tests/utils/linter/fixtures/css/missing-semicolon.css +0 -1
  188. package/tests/utils/linter/fixtures/css/syntax-error.css +0 -1
  189. package/tests/utils/linter/fixtures/css/undeclare-variable.css +0 -1
  190. package/tests/utils/linter/fixtures/css/unused-variable.css +0 -2
  191. package/tests/utils/linter/fixtures/css/valid-code.css +0 -1
  192. package/tests/utils/linter/fixtures/dockerfile/keyword-error.dockerfile +0 -1
  193. package/tests/utils/linter/fixtures/dockerfile/missing-semicolon.dockerfile +0 -2
  194. package/tests/utils/linter/fixtures/dockerfile/syntax-error.dockerfile +0 -2
  195. package/tests/utils/linter/fixtures/dockerfile/undeclare-variable.dockerfile +0 -1
  196. package/tests/utils/linter/fixtures/dockerfile/unused-variable.dockerfile +0 -1
  197. package/tests/utils/linter/fixtures/dockerfile/valid-code.dockerfile +0 -2
  198. package/tests/utils/linter/fixtures/go/keyword-error.go +0 -5
  199. package/tests/utils/linter/fixtures/go/missing-semicolon.go +0 -5
  200. package/tests/utils/linter/fixtures/go/syntax-error.go +0 -6
  201. package/tests/utils/linter/fixtures/go/undeclare-variable.go +0 -5
  202. package/tests/utils/linter/fixtures/go/unused-variable.go +0 -5
  203. package/tests/utils/linter/fixtures/go/valid-code.go +0 -7
  204. package/tests/utils/linter/fixtures/js/keyword-error.js +0 -3
  205. package/tests/utils/linter/fixtures/js/missing-semicolon.js +0 -6
  206. package/tests/utils/linter/fixtures/js/syntax-error.js +0 -4
  207. package/tests/utils/linter/fixtures/js/undeclare-variable.js +0 -3
  208. package/tests/utils/linter/fixtures/js/unused-variable.js +0 -7
  209. package/tests/utils/linter/fixtures/js/valid-code.js +0 -15
  210. package/tests/utils/linter/fixtures/json/keyword-error.json +0 -1
  211. package/tests/utils/linter/fixtures/json/missing-semicolon.json +0 -1
  212. package/tests/utils/linter/fixtures/json/syntax-error.json +0 -1
  213. package/tests/utils/linter/fixtures/json/undeclare-variable.json +0 -1
  214. package/tests/utils/linter/fixtures/json/unused-variable.json +0 -1
  215. package/tests/utils/linter/fixtures/json/valid-code.json +0 -1
  216. package/tests/utils/linter/fixtures/jsx/keyword-error.jsx +0 -5
  217. package/tests/utils/linter/fixtures/jsx/missing-semicolon.jsx +0 -5
  218. package/tests/utils/linter/fixtures/jsx/syntax-error.jsx +0 -5
  219. package/tests/utils/linter/fixtures/jsx/undeclare-variable.jsx +0 -5
  220. package/tests/utils/linter/fixtures/jsx/unused-variable.jsx +0 -4
  221. package/tests/utils/linter/fixtures/jsx/valid-code.jsx +0 -5
  222. package/tests/utils/linter/fixtures/python/keyword-error.py +0 -3
  223. package/tests/utils/linter/fixtures/python/missing-semicolon.py +0 -2
  224. package/tests/utils/linter/fixtures/python/syntax-error.py +0 -3
  225. package/tests/utils/linter/fixtures/python/undeclare-variable.py +0 -3
  226. package/tests/utils/linter/fixtures/python/unused-variable.py +0 -6
  227. package/tests/utils/linter/fixtures/python/valid-code.py +0 -12
  228. package/tests/utils/linter/fixtures/ruby/keyword-error.rb +0 -2
  229. package/tests/utils/linter/fixtures/ruby/missing-semicolon.rb +0 -1
  230. package/tests/utils/linter/fixtures/ruby/syntax-error.rb +0 -2
  231. package/tests/utils/linter/fixtures/ruby/undeclare-variable.rb +0 -1
  232. package/tests/utils/linter/fixtures/ruby/unused-variable.rb +0 -2
  233. package/tests/utils/linter/fixtures/ruby/valid-code.rb +0 -1
  234. package/tests/utils/linter/fixtures/sass/keyword-error.sass +0 -2
  235. package/tests/utils/linter/fixtures/sass/missing-semicolon.sass +0 -3
  236. package/tests/utils/linter/fixtures/sass/syntax-error.sass +0 -3
  237. package/tests/utils/linter/fixtures/sass/undeclare-variable.sass +0 -2
  238. package/tests/utils/linter/fixtures/sass/unused-variable.sass +0 -4
  239. package/tests/utils/linter/fixtures/sass/valid-code.sass +0 -2
  240. package/tests/utils/linter/fixtures/scss/keyword-error.scss +0 -1
  241. package/tests/utils/linter/fixtures/scss/missing-semicolon.scss +0 -1
  242. package/tests/utils/linter/fixtures/scss/syntax-error.scss +0 -1
  243. package/tests/utils/linter/fixtures/scss/undeclare-variable.scss +0 -1
  244. package/tests/utils/linter/fixtures/scss/unused-variable.scss +0 -2
  245. package/tests/utils/linter/fixtures/scss/valid-code.scss +0 -1
  246. package/tests/utils/linter/fixtures/shell/keyword-error.sh +0 -5
  247. package/tests/utils/linter/fixtures/shell/missing-semicolon.sh +0 -3
  248. package/tests/utils/linter/fixtures/shell/syntax-error.sh +0 -4
  249. package/tests/utils/linter/fixtures/shell/undeclare-variable.sh +0 -3
  250. package/tests/utils/linter/fixtures/shell/unused-variable.sh +0 -4
  251. package/tests/utils/linter/fixtures/shell/valid-code.sh +0 -3
  252. package/tests/utils/linter/fixtures/ts/keyword-error.ts +0 -1
  253. package/tests/utils/linter/fixtures/ts/missing-semicolon.ts +0 -1
  254. package/tests/utils/linter/fixtures/ts/syntax-error.ts +0 -1
  255. package/tests/utils/linter/fixtures/ts/undeclare-variable.ts +0 -1
  256. package/tests/utils/linter/fixtures/ts/unused-variable.ts +0 -3
  257. package/tests/utils/linter/fixtures/ts/valid-code.ts +0 -3
  258. package/tests/utils/linter/fixtures/tsx/keyword-error.tsx +0 -5
  259. package/tests/utils/linter/fixtures/tsx/missing-semicolon.tsx +0 -5
  260. package/tests/utils/linter/fixtures/tsx/syntax-error.tsx +0 -5
  261. package/tests/utils/linter/fixtures/tsx/undeclare-variable.tsx +0 -6
  262. package/tests/utils/linter/fixtures/tsx/unused-variable.tsx +0 -6
  263. package/tests/utils/linter/fixtures/tsx/valid-code.tsx +0 -5
  264. package/tests/utils/linter/fixtures/vue/keyword-error.vue +0 -6
  265. package/tests/utils/linter/fixtures/vue/missing-semicolon.vue +0 -6
  266. package/tests/utils/linter/fixtures/vue/syntax-error.vue +0 -6
  267. package/tests/utils/linter/fixtures/vue/undeclare-variable.vue +0 -6
  268. package/tests/utils/linter/fixtures/vue/unused-variable.vue +0 -7
  269. package/tests/utils/linter/fixtures/vue/valid-code.vue +0 -6
  270. package/tests/utils/linter/fixtures/yaml/keyword-error.yml +0 -1
  271. package/tests/utils/linter/fixtures/yaml/missing-semicolon.yml +0 -2
  272. package/tests/utils/linter/fixtures/yaml/syntax-error.yml +0 -1
  273. package/tests/utils/linter/fixtures/yaml/undeclare-variable.yml +0 -1
  274. package/tests/utils/linter/fixtures/yaml/unused-variable.yml +0 -2
  275. package/tests/utils/linter/fixtures/yaml/valid-code.yml +0 -3
  276. package/tests/utils/linter/index.test.mjs +0 -440
  277. package/tests/utils/linter/scan-results.mjs +0 -42
  278. package/tests/utils/load-config.test.mjs +0 -141
  279. package/tests/utils/markdown/index.test.mjs +0 -478
  280. package/tests/utils/mermaid-validator.test.mjs +0 -541
  281. package/tests/utils/mock-chat-model.mjs +0 -12
  282. package/tests/utils/preferences-utils.test.mjs +0 -465
  283. package/tests/utils/save-value-to-config.test.mjs +0 -483
  284. package/tests/utils/utils.test.mjs +0 -941
@@ -1,399 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
2
- import * as openModule from "open";
3
- import * as authUtilsModule from "../../utils/auth-utils.mjs";
4
-
5
- // Import the deploy function
6
- import { deploy } from "../../utils/deploy.mjs";
7
- import * as utilsModule from "../../utils/utils.mjs";
8
-
9
- const TEST_HOME_URL = "https_home_test_url";
10
- const TEST_APP_URL = "https_app_test_url";
11
- const TEST_DASHBOARD_URL = "https_dashboard_test_url";
12
- const TEST_SUBSCRIPTION_URL = "https_subscription_test_url";
13
-
14
- // Mock BrokerClient
15
- const mockBrokerClient = {
16
- deploy: mock(),
17
- };
18
-
19
- const mockBrokerClientConstructor = mock(() => mockBrokerClient);
20
-
21
- // Mock the payment broker client module
22
- mock.module("@blocklet/payment-broker-client/node", () => ({
23
- BrokerClient: mockBrokerClientConstructor,
24
- STEPS: {
25
- PAYMENT_PENDING: "PAYMENT_PENDING",
26
- INSTALLATION_STARTING: "INSTALLATION_STARTING",
27
- SERVICE_STARTING: "SERVICE_STARTING",
28
- ACCESS_PREPARING: "ACCESS_PREPARING",
29
- ACCESS_READY: "ACCESS_READY",
30
- },
31
- }));
32
-
33
- describe("deploy", () => {
34
- let originalConsole;
35
- let consoleOutput;
36
- let getOfficialAccessTokenSpy;
37
- let saveValueToConfigSpy;
38
- let openDefaultSpy;
39
-
40
- beforeEach(() => {
41
- // Note: DOC_SMITH_BASE_URL is not set, so BASE_URL will be empty string
42
-
43
- // Mock console to capture output
44
- consoleOutput = [];
45
- originalConsole = {
46
- log: console.log,
47
- error: console.error,
48
- };
49
- console.log = (...args) => consoleOutput.push({ type: "log", args });
50
- console.error = (...args) => consoleOutput.push({ type: "error", args });
51
-
52
- // Mock dependencies
53
- getOfficialAccessTokenSpy = spyOn(authUtilsModule, "getOfficialAccessToken").mockResolvedValue(
54
- "mock-auth-token",
55
- );
56
- saveValueToConfigSpy = spyOn(utilsModule, "saveValueToConfig").mockResolvedValue();
57
- openDefaultSpy = spyOn(openModule, "default").mockResolvedValue();
58
-
59
- // Reset mocks
60
- mockBrokerClientConstructor.mockClear();
61
- mockBrokerClient.deploy.mockClear();
62
- });
63
-
64
- afterEach(() => {
65
- // Restore console
66
- console.log = originalConsole.log;
67
- console.error = originalConsole.error;
68
-
69
- // Restore all spies
70
- getOfficialAccessTokenSpy?.mockRestore();
71
- saveValueToConfigSpy?.mockRestore();
72
- openDefaultSpy?.mockRestore();
73
-
74
- // Clean up environment
75
- delete process.env.NODE_ENV;
76
- });
77
-
78
- test("successful deployment flow", async () => {
79
- // Mock successful deployment result
80
- const mockResult = {
81
- appUrl: TEST_APP_URL,
82
- homeUrl: TEST_HOME_URL,
83
- dashboardUrl: TEST_DASHBOARD_URL,
84
- subscriptionUrl: TEST_SUBSCRIPTION_URL,
85
- vendors: [{ token: "auth-token-123" }],
86
- };
87
-
88
- mockBrokerClient.deploy.mockResolvedValue(mockResult);
89
-
90
- const result = await deploy();
91
-
92
- // Verify BrokerClient was constructed with correct config
93
- expect(mockBrokerClientConstructor).toHaveBeenCalledWith({
94
- authToken: "mock-auth-token",
95
- baseUrl: "https://docsmith.aigne.io",
96
- });
97
-
98
- // Verify deploy was called with correct parameters
99
- expect(mockBrokerClient.deploy).toHaveBeenCalledWith(
100
- expect.objectContaining({
101
- cachedCheckoutId: undefined,
102
- cachedPaymentUrl: undefined,
103
- pageInfo: expect.objectContaining({
104
- successMessage: expect.objectContaining({
105
- en: expect.stringContaining("Congratulations"),
106
- zh: expect.stringContaining("恭喜您"),
107
- }),
108
- }),
109
- hooks: expect.objectContaining({
110
- PAYMENT_PENDING: expect.any(Function),
111
- INSTALLATION_STARTING: expect.any(Function),
112
- SERVICE_STARTING: expect.any(Function),
113
- ACCESS_PREPARING: expect.any(Function),
114
- ACCESS_READY: expect.any(Function),
115
- }),
116
- }),
117
- );
118
-
119
- // Verify result transformation
120
- expect(result).toEqual({
121
- appUrl: TEST_APP_URL,
122
- homeUrl: TEST_HOME_URL,
123
- dashboardUrl: TEST_DASHBOARD_URL,
124
- subscriptionUrl: TEST_SUBSCRIPTION_URL,
125
- token: "auth-token-123",
126
- });
127
-
128
- // Verify console output
129
- const logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
130
- expect(logs.some((log) => log.includes("🚀 Starting deployment..."))).toBe(true);
131
- });
132
-
133
- test("successful deployment with cached parameters", async () => {
134
- const mockResult = {
135
- appUrl: TEST_APP_URL,
136
- homeUrl: TEST_HOME_URL,
137
- vendors: [{ token: "auth-token-123" }],
138
- };
139
-
140
- mockBrokerClient.deploy.mockResolvedValue(mockResult);
141
-
142
- const result = await deploy("cached-checkout-id", "https://cached-payment.url");
143
-
144
- // Verify deploy was called with cached parameters
145
- expect(mockBrokerClient.deploy).toHaveBeenCalledWith(
146
- expect.objectContaining({
147
- cachedCheckoutId: "cached-checkout-id",
148
- cachedPaymentUrl: "https://cached-payment.url",
149
- }),
150
- );
151
-
152
- expect(result.appUrl).toBe(TEST_APP_URL);
153
- expect(result.token).toBe("auth-token-123");
154
- });
155
-
156
- test("handles missing auth token", async () => {
157
- getOfficialAccessTokenSpy.mockResolvedValue(null);
158
-
159
- await expect(deploy()).rejects.toThrow("Failed to get official access token");
160
-
161
- // Verify BrokerClient was not created
162
- expect(mockBrokerClientConstructor).not.toHaveBeenCalled();
163
- });
164
-
165
- test("handles BrokerClient deployment failure", async () => {
166
- const deployError = new Error("Deployment failed");
167
- mockBrokerClient.deploy.mockRejectedValue(deployError);
168
-
169
- await expect(deploy()).rejects.toThrow("Deployment failed");
170
-
171
- // Verify BrokerClient was created and deploy was called
172
- expect(mockBrokerClientConstructor).toHaveBeenCalled();
173
- expect(mockBrokerClient.deploy).toHaveBeenCalled();
174
- });
175
-
176
- test("PAYMENT_PENDING hook functionality", async () => {
177
- let paymentPendingHook;
178
-
179
- mockBrokerClient.deploy.mockImplementation(async (config) => {
180
- paymentPendingHook = config.hooks.PAYMENT_PENDING;
181
- return {
182
- appUrl: TEST_APP_URL,
183
- vendors: [{ token: "test-token" }],
184
- };
185
- });
186
-
187
- await deploy();
188
-
189
- // Test the PAYMENT_PENDING hook
190
- await paymentPendingHook({
191
- sessionId: "session-123",
192
- paymentUrl: "https://payment.test/session-123",
193
- isResuming: false,
194
- });
195
-
196
- // Verify saveValueToConfig was called
197
- expect(saveValueToConfigSpy).toHaveBeenCalledWith(
198
- "checkoutId",
199
- "session-123",
200
- "Checkout ID for document deployment website",
201
- );
202
- expect(saveValueToConfigSpy).toHaveBeenCalledWith(
203
- "paymentUrl",
204
- "https://payment.test/session-123",
205
- "Payment URL for document deployment website",
206
- );
207
-
208
- // Verify browser was opened
209
- expect(openDefaultSpy).toHaveBeenCalledWith("https://payment.test/session-123");
210
-
211
- // Verify console output
212
- const logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
213
- expect(logs.some((log) => log.includes("⏳ Step 1/4: Waiting for payment..."))).toBe(true);
214
- expect(logs.some((log) => log.includes("🔗 Payment link:"))).toBe(true);
215
- });
216
-
217
- test("PAYMENT_PENDING hook with isResuming=true", async () => {
218
- let paymentPendingHook;
219
-
220
- mockBrokerClient.deploy.mockImplementation(async (config) => {
221
- paymentPendingHook = config.hooks.PAYMENT_PENDING;
222
- return {
223
- appUrl: TEST_APP_URL,
224
- vendors: [{ token: "test-token" }],
225
- };
226
- });
227
-
228
- await deploy();
229
-
230
- // Test the PAYMENT_PENDING hook with isResuming=true
231
- await paymentPendingHook({
232
- sessionId: "session-123",
233
- paymentUrl: "https://payment.test/session-123",
234
- isResuming: true,
235
- });
236
-
237
- // Verify browser was NOT opened when resuming
238
- expect(openDefaultSpy).not.toHaveBeenCalled();
239
-
240
- // But saveValueToConfig should still be called
241
- expect(saveValueToConfigSpy).toHaveBeenCalledWith(
242
- "checkoutId",
243
- "session-123",
244
- "Checkout ID for document deployment website",
245
- );
246
- });
247
-
248
- test("other hooks functionality", async () => {
249
- let hooks;
250
-
251
- mockBrokerClient.deploy.mockImplementation(async (config) => {
252
- hooks = config.hooks;
253
- return {
254
- appUrl: TEST_APP_URL,
255
- vendors: [{ token: "test-token" }],
256
- };
257
- });
258
-
259
- await deploy();
260
-
261
- // Test INSTALLATION_STARTING hook
262
- hooks.INSTALLATION_STARTING();
263
- let logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
264
- expect(logs.some((log) => log.includes("📦 Step 2/4: Installing Website..."))).toBe(true);
265
-
266
- // Test SERVICE_STARTING hook
267
- hooks.SERVICE_STARTING();
268
- logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
269
- expect(logs.some((log) => log.includes("🚀 Step 3/4: Starting Website..."))).toBe(true);
270
-
271
- // Test ACCESS_PREPARING hook
272
- hooks.ACCESS_PREPARING();
273
- logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
274
- expect(logs.some((log) => log.includes("🌐 Step 4/4: Getting Website URL..."))).toBe(true);
275
-
276
- // Test ACCESS_READY hook without subscription
277
- await hooks.ACCESS_READY({
278
- appUrl: TEST_APP_URL,
279
- homeUrl: TEST_HOME_URL,
280
- });
281
- logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
282
- expect(logs.some((log) => log.includes("🔗 Your website is available at:"))).toBe(true);
283
- expect(logs.some((log) => log.includes(TEST_HOME_URL))).toBe(true);
284
-
285
- // Test ACCESS_READY hook with subscription
286
- await hooks.ACCESS_READY({
287
- appUrl: TEST_APP_URL,
288
- homeUrl: TEST_HOME_URL,
289
- subscriptionUrl: TEST_SUBSCRIPTION_URL,
290
- });
291
- logs = consoleOutput.filter((o) => o.type === "log").map((o) => o.args.join(" "));
292
- expect(logs.some((log) => log.includes("🔗 Your subscription management URL:"))).toBe(true);
293
- expect(logs.some((log) => log.includes(TEST_SUBSCRIPTION_URL))).toBe(true);
294
- });
295
-
296
- test("handles missing vendors in result", async () => {
297
- const mockResult = {
298
- appUrl: TEST_APP_URL,
299
- homeUrl: TEST_HOME_URL,
300
- vendors: null,
301
- };
302
-
303
- mockBrokerClient.deploy.mockResolvedValue(mockResult);
304
-
305
- const result = await deploy();
306
-
307
- expect(result.token).toBeUndefined();
308
- expect(result.appUrl).toBe(TEST_APP_URL);
309
- expect(result.homeUrl).toBe(TEST_HOME_URL);
310
- });
311
-
312
- test("handles empty vendors array in result", async () => {
313
- const mockResult = {
314
- appUrl: TEST_APP_URL,
315
- homeUrl: TEST_HOME_URL,
316
- vendors: [],
317
- };
318
-
319
- mockBrokerClient.deploy.mockResolvedValue(mockResult);
320
-
321
- const result = await deploy();
322
-
323
- expect(result.token).toBeUndefined();
324
- expect(result.appUrl).toBe(TEST_APP_URL);
325
- expect(result.homeUrl).toBe(TEST_HOME_URL);
326
- });
327
-
328
- test("uses default BASE_URL when not set", async () => {
329
- delete process.env.DOC_SMITH_BASE_URL;
330
-
331
- const mockResult = {
332
- appUrl: TEST_APP_URL,
333
- vendors: [{ token: "test-token" }],
334
- };
335
-
336
- mockBrokerClient.deploy.mockResolvedValue(mockResult);
337
-
338
- await deploy();
339
-
340
- // Verify BrokerClient was constructed with empty baseUrl
341
- expect(mockBrokerClientConstructor).toHaveBeenCalledWith(
342
- expect.objectContaining({
343
- authToken: "mock-auth-token",
344
- baseUrl: "https://docsmith.aigne.io",
345
- }),
346
- );
347
- });
348
-
349
- test("handles browser opening failure", async () => {
350
- openDefaultSpy.mockRejectedValue(new Error("Cannot open browser"));
351
-
352
- let paymentPendingHook;
353
- mockBrokerClient.deploy.mockImplementation(async (config) => {
354
- paymentPendingHook = config.hooks.PAYMENT_PENDING;
355
- return {
356
- appUrl: TEST_APP_URL,
357
- vendors: [{ token: "test-token" }],
358
- };
359
- });
360
-
361
- await deploy();
362
-
363
- // The hook should throw when browser opening fails (expected behavior)
364
- await expect(
365
- paymentPendingHook({
366
- sessionId: "session-123",
367
- paymentUrl: "https://payment.test/session-123",
368
- isResuming: false,
369
- }),
370
- ).rejects.toThrow("Cannot open browser");
371
-
372
- // Config should still be saved
373
- expect(saveValueToConfigSpy).toHaveBeenCalled();
374
- });
375
-
376
- test("handles saveValueToConfig failure", async () => {
377
- saveValueToConfigSpy.mockRejectedValue(new Error("Config save failed"));
378
-
379
- let paymentPendingHook;
380
- mockBrokerClient.deploy.mockImplementation(async (config) => {
381
- paymentPendingHook = config.hooks.PAYMENT_PENDING;
382
- return {
383
- appUrl: TEST_APP_URL,
384
- vendors: [{ token: "test-token" }],
385
- };
386
- });
387
-
388
- await deploy();
389
-
390
- // The hook should throw when config saving fails (expected behavior)
391
- await expect(
392
- paymentPendingHook({
393
- sessionId: "session-123",
394
- paymentUrl: "https://payment.test/session-123",
395
- isResuming: false,
396
- }),
397
- ).rejects.toThrow("Config save failed");
398
- });
399
- });