@dizzlkheinz/ynab-mcpb 0.18.3 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +87 -8
- package/bin/ynab-mcp-server.cjs +2 -2
- package/bin/ynab-mcp-server.js +3 -3
- package/biome.json +39 -0
- package/dist/bundle/index.cjs +67 -67
- package/dist/index.d.ts +1 -1
- package/dist/index.js +27 -27
- package/dist/server/YNABMCPServer.d.ts +3 -4
- package/dist/server/YNABMCPServer.js +111 -116
- package/dist/server/budgetResolver.d.ts +6 -5
- package/dist/server/budgetResolver.js +46 -36
- package/dist/server/cacheKeys.js +6 -6
- package/dist/server/cacheManager.js +14 -11
- package/dist/server/completions.d.ts +2 -2
- package/dist/server/completions.js +20 -15
- package/dist/server/config.d.ts +10 -5
- package/dist/server/config.js +24 -7
- package/dist/server/deltaCache.d.ts +2 -2
- package/dist/server/deltaCache.js +22 -16
- package/dist/server/deltaCache.merge.d.ts +2 -2
- package/dist/server/diagnostics.d.ts +4 -4
- package/dist/server/diagnostics.js +38 -32
- package/dist/server/errorHandler.d.ts +5 -12
- package/dist/server/errorHandler.js +219 -217
- package/dist/server/prompts.d.ts +2 -2
- package/dist/server/prompts.js +45 -45
- package/dist/server/rateLimiter.js +4 -4
- package/dist/server/requestLogger.d.ts +1 -1
- package/dist/server/requestLogger.js +40 -35
- package/dist/server/resources.d.ts +3 -3
- package/dist/server/resources.js +55 -52
- package/dist/server/responseFormatter.js +6 -6
- package/dist/server/securityMiddleware.d.ts +2 -2
- package/dist/server/securityMiddleware.js +22 -20
- package/dist/server/serverKnowledgeStore.js +1 -1
- package/dist/server/toolRegistry.d.ts +3 -3
- package/dist/server/toolRegistry.js +47 -40
- package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
- package/dist/tools/__tests__/deltaTestUtils.js +2 -2
- package/dist/tools/accountTools.d.ts +9 -8
- package/dist/tools/accountTools.js +47 -47
- package/dist/tools/adapters.d.ts +13 -8
- package/dist/tools/adapters.js +21 -11
- package/dist/tools/budgetTools.d.ts +8 -7
- package/dist/tools/budgetTools.js +22 -22
- package/dist/tools/categoryTools.d.ts +9 -8
- package/dist/tools/categoryTools.js +68 -59
- package/dist/tools/compareTransactions/formatter.d.ts +3 -3
- package/dist/tools/compareTransactions/formatter.js +9 -9
- package/dist/tools/compareTransactions/index.d.ts +6 -6
- package/dist/tools/compareTransactions/index.js +58 -43
- package/dist/tools/compareTransactions/matcher.d.ts +1 -1
- package/dist/tools/compareTransactions/matcher.js +28 -15
- package/dist/tools/compareTransactions/parser.d.ts +2 -2
- package/dist/tools/compareTransactions/parser.js +144 -138
- package/dist/tools/compareTransactions/types.d.ts +4 -4
- package/dist/tools/compareTransactions.d.ts +1 -1
- package/dist/tools/compareTransactions.js +1 -1
- package/dist/tools/deltaFetcher.d.ts +2 -2
- package/dist/tools/deltaFetcher.js +16 -15
- package/dist/tools/deltaSupport.d.ts +4 -4
- package/dist/tools/deltaSupport.js +35 -41
- package/dist/tools/exportTransactions.d.ts +5 -4
- package/dist/tools/exportTransactions.js +61 -59
- package/dist/tools/monthTools.d.ts +7 -6
- package/dist/tools/monthTools.js +31 -29
- package/dist/tools/payeeTools.d.ts +7 -6
- package/dist/tools/payeeTools.js +28 -28
- package/dist/tools/reconcileAdapter.d.ts +2 -2
- package/dist/tools/reconcileAdapter.js +21 -11
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +136 -57
- package/dist/tools/reconciliation/csvParser.d.ts +3 -3
- package/dist/tools/reconciliation/csvParser.js +128 -104
- package/dist/tools/reconciliation/executor.d.ts +4 -4
- package/dist/tools/reconciliation/executor.js +148 -109
- package/dist/tools/reconciliation/index.d.ts +10 -10
- package/dist/tools/reconciliation/index.js +96 -83
- package/dist/tools/reconciliation/matcher.d.ts +3 -3
- package/dist/tools/reconciliation/matcher.js +17 -16
- package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
- package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
- package/dist/tools/reconciliation/recommendationEngine.js +40 -40
- package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
- package/dist/tools/reconciliation/reportFormatter.js +79 -54
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +19 -16
- package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
- package/dist/tools/schemas/common.d.ts +1 -1
- package/dist/tools/schemas/common.js +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
- package/dist/tools/schemas/outputs/index.d.ts +14 -14
- package/dist/tools/schemas/outputs/index.js +14 -14
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
- package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
- package/dist/tools/schemas/shared/commonOutputs.js +15 -9
- package/dist/tools/transactionReadTools.d.ts +11 -0
- package/dist/tools/transactionReadTools.js +202 -0
- package/dist/tools/transactionSchemas.d.ts +309 -0
- package/dist/tools/transactionSchemas.js +235 -0
- package/dist/tools/transactionTools.d.ts +6 -302
- package/dist/tools/transactionTools.js +7 -2054
- package/dist/tools/transactionUtils.d.ts +31 -0
- package/dist/tools/transactionUtils.js +364 -0
- package/dist/tools/transactionWriteTools.d.ts +20 -0
- package/dist/tools/transactionWriteTools.js +1342 -0
- package/dist/tools/utilityTools.d.ts +5 -4
- package/dist/tools/utilityTools.js +11 -11
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +6 -6
- package/dist/types/reconciliation.d.ts +1 -1
- package/dist/types/toolRegistration.d.ts +14 -12
- package/dist/utils/amountUtils.js +1 -1
- package/dist/utils/dateUtils.js +4 -4
- package/dist/utils/errors.d.ts +3 -3
- package/dist/utils/errors.js +4 -4
- package/dist/utils/money.d.ts +2 -2
- package/dist/utils/money.js +8 -8
- package/dist/utils/validationError.d.ts +1 -1
- package/dist/utils/validationError.js +1 -1
- package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
- package/docs/assets/schemas/reconciliation-v2.json +360 -336
- package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
- package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
- package/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -109
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +205 -0
- package/scripts/run-domain-integration-tests.js +28 -18
- package/scripts/run-generate-mcpb.js +19 -17
- package/scripts/run-throttled-integration-tests.js +92 -83
- package/scripts/test-delta-params.mjs +149 -120
- package/scripts/test-recommendations.ts +36 -32
- package/scripts/tmpTransaction.ts +80 -43
- package/scripts/validate-env.js +98 -91
- package/scripts/verify-build.js +78 -76
- package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
- package/src/__tests__/performance.test.ts +723 -671
- package/src/__tests__/setup.ts +442 -395
- package/src/__tests__/smoke.e2e.test.ts +41 -39
- package/src/__tests__/testRunner.ts +314 -295
- package/src/__tests__/testUtils.ts +456 -364
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
- package/src/index.ts +68 -59
- package/src/server/CLAUDE.md +480 -0
- package/src/server/YNABMCPServer.ts +821 -794
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
- package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
- package/src/server/__tests__/budgetResolver.test.ts +466 -423
- package/src/server/__tests__/cacheManager.test.ts +891 -874
- package/src/server/__tests__/completions.integration.test.ts +115 -106
- package/src/server/__tests__/completions.test.ts +334 -313
- package/src/server/__tests__/config.test.ts +98 -86
- package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
- package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
- package/src/server/__tests__/deltaCache.test.ts +946 -759
- package/src/server/__tests__/diagnostics.test.ts +825 -792
- package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
- package/src/server/__tests__/errorHandler.test.ts +402 -397
- package/src/server/__tests__/prompts.test.ts +424 -347
- package/src/server/__tests__/rateLimiter.test.ts +313 -309
- package/src/server/__tests__/requestLogger.test.ts +443 -403
- package/src/server/__tests__/resources.template.test.ts +196 -185
- package/src/server/__tests__/resources.test.ts +294 -288
- package/src/server/__tests__/security.integration.test.ts +487 -421
- package/src/server/__tests__/securityMiddleware.test.ts +519 -444
- package/src/server/__tests__/server-startup.integration.test.ts +509 -490
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
- package/src/server/__tests__/toolRegistration.test.ts +239 -210
- package/src/server/__tests__/toolRegistry.test.ts +907 -845
- package/src/server/budgetResolver.ts +221 -181
- package/src/server/cacheKeys.ts +6 -6
- package/src/server/cacheManager.ts +498 -484
- package/src/server/completions.ts +267 -243
- package/src/server/config.ts +35 -14
- package/src/server/deltaCache.merge.ts +146 -128
- package/src/server/deltaCache.ts +352 -309
- package/src/server/diagnostics.ts +257 -242
- package/src/server/errorHandler.ts +747 -744
- package/src/server/prompts.ts +181 -176
- package/src/server/rateLimiter.ts +131 -129
- package/src/server/requestLogger.ts +350 -322
- package/src/server/resources.ts +442 -374
- package/src/server/responseFormatter.ts +41 -37
- package/src/server/securityMiddleware.ts +223 -205
- package/src/server/serverKnowledgeStore.ts +67 -67
- package/src/server/toolRegistry.ts +508 -474
- package/src/tools/CLAUDE.md +604 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
- package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
- package/src/tools/__tests__/accountTools.test.ts +685 -638
- package/src/tools/__tests__/adapters.test.ts +142 -108
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
- package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
- package/src/tools/__tests__/budgetTools.test.ts +442 -413
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
- package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
- package/src/tools/__tests__/categoryTools.test.ts +656 -625
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
- package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
- package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
- package/src/tools/__tests__/compareTransactions.test.ts +352 -332
- package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
- package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
- package/src/tools/__tests__/deltaSupport.test.ts +211 -184
- package/src/tools/__tests__/deltaTestUtils.ts +37 -33
- package/src/tools/__tests__/exportTransactions.test.ts +205 -200
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
- package/src/tools/__tests__/monthTools.test.ts +561 -512
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
- package/src/tools/__tests__/payeeTools.test.ts +486 -434
- package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
- package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
- package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
- package/src/tools/__tests__/utilityTools.test.ts +68 -58
- package/src/tools/accountTools.ts +293 -271
- package/src/tools/adapters.ts +120 -63
- package/src/tools/budgetTools.ts +121 -116
- package/src/tools/categoryTools.ts +379 -339
- package/src/tools/compareTransactions/formatter.ts +131 -119
- package/src/tools/compareTransactions/index.ts +249 -214
- package/src/tools/compareTransactions/matcher.ts +259 -209
- package/src/tools/compareTransactions/parser.ts +517 -487
- package/src/tools/compareTransactions/types.ts +38 -38
- package/src/tools/compareTransactions.ts +1 -1
- package/src/tools/deltaFetcher.ts +281 -260
- package/src/tools/deltaSupport.ts +264 -259
- package/src/tools/exportTransactions.ts +230 -218
- package/src/tools/monthTools.ts +180 -165
- package/src/tools/payeeTools.ts +152 -140
- package/src/tools/reconcileAdapter.ts +297 -246
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
- package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
- package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
- package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
- package/src/tools/reconciliation/analyzer.ts +582 -406
- package/src/tools/reconciliation/csvParser.ts +656 -609
- package/src/tools/reconciliation/executor.ts +1290 -1128
- package/src/tools/reconciliation/index.ts +580 -528
- package/src/tools/reconciliation/matcher.ts +256 -240
- package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
- package/src/tools/reconciliation/recommendationEngine.ts +357 -345
- package/src/tools/reconciliation/reportFormatter.ts +349 -276
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -153
- package/src/tools/reconciliation/ynabAdapter.ts +17 -15
- package/src/tools/schemas/CLAUDE.md +546 -0
- package/src/tools/schemas/common.ts +1 -1
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
- package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
- package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
- package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
- package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
- package/src/tools/schemas/outputs/index.ts +163 -163
- package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
- package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
- package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
- package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
- package/src/tools/schemas/shared/commonOutputs.ts +27 -19
- package/src/tools/toolCategories.ts +114 -114
- package/src/tools/transactionReadTools.ts +327 -0
- package/src/tools/transactionSchemas.ts +484 -0
- package/src/tools/transactionTools.ts +107 -2990
- package/src/tools/transactionUtils.ts +621 -0
- package/src/tools/transactionWriteTools.ts +2110 -0
- package/src/tools/utilityTools.ts +46 -41
- package/src/types/CLAUDE.md +477 -0
- package/src/types/__tests__/index.test.ts +51 -51
- package/src/types/index.ts +43 -39
- package/src/types/integration-tests.d.ts +26 -26
- package/src/types/reconciliation.ts +29 -29
- package/src/types/toolAnnotations.ts +30 -30
- package/src/types/toolRegistration.ts +43 -32
- package/src/utils/CLAUDE.md +508 -0
- package/src/utils/__tests__/dateUtils.test.ts +174 -168
- package/src/utils/__tests__/money.test.ts +193 -187
- package/src/utils/amountUtils.ts +5 -5
- package/src/utils/baseError.ts +5 -5
- package/src/utils/dateUtils.ts +29 -26
- package/src/utils/errors.ts +14 -14
- package/src/utils/money.ts +66 -52
- package/src/utils/validationError.ts +1 -1
- package/tsconfig.json +29 -29
- package/tsconfig.prod.json +16 -16
- package/vitest-reporters/split-json-reporter.ts +247 -204
- package/vitest.config.ts +99 -95
- package/.prettierignore +0 -10
- package/.prettierrc.json +0 -10
- package/eslint.config.js +0 -49
|
@@ -4,148 +4,195 @@
|
|
|
4
4
|
* Usage: node scripts/create-pr-description.js [options]
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
11
|
|
|
12
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
13
|
const __dirname = path.dirname(__filename);
|
|
14
14
|
|
|
15
15
|
// Read the PR template
|
|
16
|
-
const templatePath = path.join(
|
|
17
|
-
|
|
16
|
+
const templatePath = path.join(
|
|
17
|
+
__dirname,
|
|
18
|
+
"..",
|
|
19
|
+
".github",
|
|
20
|
+
"pull_request_template.md",
|
|
21
|
+
);
|
|
22
|
+
const template = fs.readFileSync(templatePath, "utf-8");
|
|
18
23
|
|
|
19
24
|
// Function to detect the repository's default branch
|
|
20
25
|
function getDefaultBranch() {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
26
|
+
try {
|
|
27
|
+
// Try to get the default branch from origin/HEAD
|
|
28
|
+
const defaultBranch = execSync(
|
|
29
|
+
"git symbolic-ref refs/remotes/origin/HEAD",
|
|
30
|
+
{
|
|
31
|
+
encoding: "utf-8",
|
|
32
|
+
},
|
|
33
|
+
)
|
|
34
|
+
.trim()
|
|
35
|
+
.replace("refs/remotes/origin/", "");
|
|
36
|
+
return defaultBranch;
|
|
37
|
+
} catch (err) {
|
|
38
|
+
// Fallback: try common branch names
|
|
39
|
+
try {
|
|
40
|
+
execSync("git rev-parse --verify origin/main", {
|
|
41
|
+
encoding: "utf-8",
|
|
42
|
+
stdio: "ignore",
|
|
43
|
+
});
|
|
44
|
+
return "main";
|
|
45
|
+
} catch {
|
|
46
|
+
try {
|
|
47
|
+
execSync("git rev-parse --verify origin/master", {
|
|
48
|
+
encoding: "utf-8",
|
|
49
|
+
stdio: "ignore",
|
|
50
|
+
});
|
|
51
|
+
return "master";
|
|
52
|
+
} catch {
|
|
53
|
+
console.warn(
|
|
54
|
+
'Could not detect default branch, using "main" as fallback',
|
|
55
|
+
);
|
|
56
|
+
return "main";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
44
60
|
}
|
|
45
61
|
|
|
46
62
|
// Read package.json for version info
|
|
47
63
|
const packageJson = JSON.parse(
|
|
48
|
-
|
|
64
|
+
fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"),
|
|
49
65
|
);
|
|
50
66
|
|
|
51
67
|
// Read CHANGELOG.md if it exists
|
|
52
|
-
let changelogEntries =
|
|
68
|
+
let changelogEntries = "";
|
|
53
69
|
try {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
70
|
+
const changelog = fs.readFileSync(
|
|
71
|
+
path.join(__dirname, "..", "CHANGELOG.md"),
|
|
72
|
+
"utf-8",
|
|
73
|
+
);
|
|
74
|
+
// Extract the latest version entries
|
|
75
|
+
const latestSection = changelog.split("##")[1];
|
|
76
|
+
changelogEntries = latestSection
|
|
77
|
+
? `## Latest Changes\n\n${latestSection}`
|
|
78
|
+
: "";
|
|
58
79
|
} catch (err) {
|
|
59
|
-
|
|
80
|
+
// No changelog
|
|
60
81
|
}
|
|
61
82
|
|
|
62
83
|
// Detect the default branch
|
|
63
84
|
const defaultBranch = getDefaultBranch();
|
|
64
85
|
|
|
65
86
|
// Get git info
|
|
66
|
-
let commitMessages =
|
|
87
|
+
let commitMessages = "";
|
|
67
88
|
try {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
const branch = execSync("git branch --show-current", {
|
|
90
|
+
encoding: "utf-8",
|
|
91
|
+
}).trim();
|
|
92
|
+
|
|
93
|
+
// Get commit messages since branching from default branch
|
|
94
|
+
const commits = execSync(
|
|
95
|
+
`git log ${defaultBranch}..${branch} --pretty=format:"- %s"`,
|
|
96
|
+
{
|
|
97
|
+
encoding: "utf-8",
|
|
98
|
+
},
|
|
99
|
+
).trim();
|
|
100
|
+
|
|
101
|
+
if (commits) {
|
|
102
|
+
commitMessages = `## Commits\n\n${commits}\n\n`;
|
|
103
|
+
}
|
|
78
104
|
} catch (err) {
|
|
79
|
-
|
|
105
|
+
console.warn("Could not get git commit info");
|
|
80
106
|
}
|
|
81
107
|
|
|
82
108
|
// Get file change stats
|
|
83
|
-
let changeStats =
|
|
109
|
+
let changeStats = "";
|
|
84
110
|
try {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
111
|
+
const stats = execSync(`git diff --shortstat ${defaultBranch}...HEAD`, {
|
|
112
|
+
encoding: "utf-8",
|
|
113
|
+
}).trim();
|
|
88
114
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
115
|
+
if (stats) {
|
|
116
|
+
changeStats = `**Changes**: ${stats}\n\n`;
|
|
117
|
+
}
|
|
92
118
|
} catch (err) {
|
|
93
|
-
|
|
119
|
+
console.warn("Could not get change stats");
|
|
94
120
|
}
|
|
95
121
|
|
|
96
122
|
// Get previous version from default branch
|
|
97
123
|
function getPreviousVersion() {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
124
|
+
try {
|
|
125
|
+
// Try to get package.json from default branch
|
|
126
|
+
const previousPackageJson = execSync(
|
|
127
|
+
`git show origin/${defaultBranch}:package.json`,
|
|
128
|
+
{
|
|
129
|
+
encoding: "utf-8",
|
|
130
|
+
},
|
|
131
|
+
);
|
|
132
|
+
const previousPkg = JSON.parse(previousPackageJson);
|
|
133
|
+
return previousPkg.version;
|
|
134
|
+
} catch (err) {
|
|
135
|
+
// Fallback: try to get the latest git tag
|
|
136
|
+
try {
|
|
137
|
+
const latestTag = execSync("git describe --tags --abbrev=0", {
|
|
138
|
+
encoding: "utf-8",
|
|
139
|
+
}).trim();
|
|
140
|
+
// Remove 'v' prefix if present
|
|
141
|
+
return latestTag.replace(/^v/, "");
|
|
142
|
+
} catch {
|
|
143
|
+
// Fallback: try to get tags sorted by version
|
|
144
|
+
try {
|
|
145
|
+
const tags = execSync("git tag --sort=-v:refname", {
|
|
146
|
+
encoding: "utf-8",
|
|
147
|
+
}).trim();
|
|
148
|
+
const latestTag = tags.split("\n")[0];
|
|
149
|
+
if (latestTag) {
|
|
150
|
+
return latestTag.replace(/^v/, "");
|
|
151
|
+
}
|
|
152
|
+
} catch {
|
|
153
|
+
console.warn(
|
|
154
|
+
"Could not determine previous version, using current version as fallback",
|
|
155
|
+
);
|
|
156
|
+
return packageJson.version;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return packageJson.version;
|
|
130
161
|
}
|
|
131
162
|
|
|
132
163
|
// Smart defaults based on branch name and commits
|
|
133
164
|
function detectChangeType(branchName, commits) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
165
|
+
const name = branchName.toLowerCase();
|
|
166
|
+
const commitText = commits.toLowerCase();
|
|
167
|
+
|
|
168
|
+
if (
|
|
169
|
+
name.includes("major") ||
|
|
170
|
+
commitText.includes("breaking") ||
|
|
171
|
+
commitText.includes("major:")
|
|
172
|
+
) {
|
|
173
|
+
return "Major";
|
|
174
|
+
}
|
|
175
|
+
if (
|
|
176
|
+
name.includes("minor") ||
|
|
177
|
+
name.includes("feature") ||
|
|
178
|
+
name.includes("feat")
|
|
179
|
+
) {
|
|
180
|
+
return "Minor";
|
|
181
|
+
}
|
|
182
|
+
if (
|
|
183
|
+
name.includes("patch") ||
|
|
184
|
+
name.includes("fix") ||
|
|
185
|
+
name.includes("hotfix")
|
|
186
|
+
) {
|
|
187
|
+
return "Patch";
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return "Unknown";
|
|
146
191
|
}
|
|
147
192
|
|
|
148
|
-
const branch = execSync(
|
|
193
|
+
const branch = execSync("git branch --show-current", {
|
|
194
|
+
encoding: "utf-8",
|
|
195
|
+
}).trim();
|
|
149
196
|
const changeType = detectChangeType(branch, commitMessages);
|
|
150
197
|
|
|
151
198
|
// Build the description
|
|
@@ -153,51 +200,53 @@ let description = template;
|
|
|
153
200
|
|
|
154
201
|
// Add summary if we have commits
|
|
155
202
|
if (commitMessages) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
203
|
+
const summarySection = commitMessages.split("\n").slice(0, 5).join("\n");
|
|
204
|
+
description = description.replace(
|
|
205
|
+
"Describe the change and its motivation.",
|
|
206
|
+
`Describe the change and its motivation.\n\n${summarySection}`,
|
|
207
|
+
);
|
|
161
208
|
}
|
|
162
209
|
|
|
163
210
|
// Pre-check the type of change if we detected it
|
|
164
|
-
if (changeType ===
|
|
165
|
-
|
|
166
|
-
} else if (changeType ===
|
|
167
|
-
|
|
168
|
-
} else if (changeType ===
|
|
169
|
-
|
|
211
|
+
if (changeType === "Major") {
|
|
212
|
+
description = description.replace("- [ ] Major", "- [x] Major");
|
|
213
|
+
} else if (changeType === "Minor") {
|
|
214
|
+
description = description.replace("- [ ] Minor", "- [x] Minor");
|
|
215
|
+
} else if (changeType === "Patch") {
|
|
216
|
+
description = description.replace("- [ ] Patch", "- [x] Patch");
|
|
170
217
|
}
|
|
171
218
|
|
|
172
219
|
// Add version info
|
|
173
220
|
const currentVersion = packageJson.version;
|
|
174
221
|
const previousVersion = getPreviousVersion();
|
|
175
222
|
description = description.replace(
|
|
176
|
-
|
|
177
|
-
|
|
223
|
+
"`X.Y.Z` → `X.Y.Z`",
|
|
224
|
+
`\`${previousVersion}\` → \`${currentVersion}\``,
|
|
178
225
|
);
|
|
179
226
|
|
|
180
227
|
// Add changelog entries if available
|
|
181
228
|
if (changelogEntries) {
|
|
182
|
-
|
|
229
|
+
description += `\n\n---\n\n${changelogEntries}`;
|
|
183
230
|
}
|
|
184
231
|
|
|
185
232
|
// Add change stats if available
|
|
186
233
|
if (changeStats) {
|
|
187
|
-
|
|
234
|
+
description += `\n\n${changeStats}`;
|
|
188
235
|
}
|
|
189
236
|
|
|
190
237
|
// Add commit history
|
|
191
238
|
if (commitMessages) {
|
|
192
|
-
|
|
239
|
+
description += `\n${commitMessages}`;
|
|
193
240
|
}
|
|
194
241
|
|
|
195
242
|
// Output the description
|
|
196
243
|
console.log(description);
|
|
197
244
|
|
|
198
245
|
// Optionally write to file
|
|
199
|
-
const outputPath = path.join(__dirname,
|
|
246
|
+
const outputPath = path.join(__dirname, "..", ".pr-description.md");
|
|
200
247
|
fs.writeFileSync(outputPath, description);
|
|
201
248
|
console.error(`\n✅ PR description written to: ${outputPath}`);
|
|
202
|
-
console.error(
|
|
203
|
-
console.error(
|
|
249
|
+
console.error("\nTo create PR with this description:");
|
|
250
|
+
console.error(
|
|
251
|
+
` gh pr create --body-file .pr-description.md --title "Your PR title"`,
|
|
252
|
+
);
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clean test runner for all test suites
|
|
4
|
+
* Runs unit, integration, e2e, and performance tests with summarized output
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Filter out DEP0190 deprecation warning for shell spawn (safe in this controlled context)
|
|
8
|
+
// We use shell:true intentionally for cross-platform npm execution
|
|
9
|
+
// Must remove default listeners first, then add filtered handler
|
|
10
|
+
process.removeAllListeners("warning");
|
|
11
|
+
process.on("warning", (warning) => {
|
|
12
|
+
// Check both code and message for DEP0190 (shell spawn with args)
|
|
13
|
+
const isDep0190 =
|
|
14
|
+
warning.code === "DEP0190" ||
|
|
15
|
+
(warning.name === "DeprecationWarning" &&
|
|
16
|
+
warning.message?.includes("DEP0190"));
|
|
17
|
+
if (isDep0190) {
|
|
18
|
+
return; // Suppress only this specific warning
|
|
19
|
+
}
|
|
20
|
+
console.warn(warning);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
import { spawn } from "node:child_process";
|
|
24
|
+
|
|
25
|
+
const isFull = process.argv.includes("--full");
|
|
26
|
+
|
|
27
|
+
const SUITES = [
|
|
28
|
+
{ name: "Unit", script: "test:unit" },
|
|
29
|
+
{
|
|
30
|
+
name: "Integration",
|
|
31
|
+
script: isFull ? "test:integration:full" : "test:integration:core",
|
|
32
|
+
},
|
|
33
|
+
{ name: "E2E", script: "test:e2e" },
|
|
34
|
+
{ name: "Performance", script: "test:performance" },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
const results = [];
|
|
38
|
+
let hasFailure = false;
|
|
39
|
+
|
|
40
|
+
async function runSuite(suite) {
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
const start = Date.now();
|
|
43
|
+
process.stdout.write(`Running ${suite.name} tests... `);
|
|
44
|
+
|
|
45
|
+
const proc = spawn("npm", ["run", suite.script], {
|
|
46
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
47
|
+
shell: true,
|
|
48
|
+
cwd: process.cwd(),
|
|
49
|
+
env: { ...process.env, FORCE_COLOR: "0" },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
let stdout = "";
|
|
53
|
+
let stderr = "";
|
|
54
|
+
|
|
55
|
+
proc.stdout?.on("data", (data) => {
|
|
56
|
+
stdout += data.toString();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
proc.stderr?.on("data", (data) => {
|
|
60
|
+
stderr += data.toString();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
proc.on("error", (err) => {
|
|
64
|
+
console.log("\x1b[31m✗\x1b[0m (spawn error)");
|
|
65
|
+
hasFailure = true;
|
|
66
|
+
results.push({
|
|
67
|
+
name: suite.name,
|
|
68
|
+
passed: 0,
|
|
69
|
+
failed: 0,
|
|
70
|
+
skipped: 0,
|
|
71
|
+
duration: ((Date.now() - start) / 1000).toFixed(1),
|
|
72
|
+
success: false,
|
|
73
|
+
stdout: "",
|
|
74
|
+
stderr: err.message,
|
|
75
|
+
});
|
|
76
|
+
resolve();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
proc.on("close", (code) => {
|
|
80
|
+
const duration = ((Date.now() - start) / 1000).toFixed(1);
|
|
81
|
+
|
|
82
|
+
// Parse results from output
|
|
83
|
+
// Vitest format: "Tests 1584 passed | 13 skipped (1597)"
|
|
84
|
+
// Also handles: "Tests 1584 passed (1584)"
|
|
85
|
+
let passed = 0;
|
|
86
|
+
let failed = 0;
|
|
87
|
+
let skipped = 0;
|
|
88
|
+
|
|
89
|
+
// Look for the Tests summary line (last occurrence)
|
|
90
|
+
const lines = stdout.split("\n");
|
|
91
|
+
for (const line of lines) {
|
|
92
|
+
// Skip "Test Files" line, we want "Tests" line
|
|
93
|
+
if (line.includes("Tests") && !line.includes("Test Files")) {
|
|
94
|
+
const passMatch = line.match(/(\d+)\s+passed/);
|
|
95
|
+
const failMatch = line.match(/(\d+)\s+failed/);
|
|
96
|
+
const skipMatch = line.match(/(\d+)\s+skipped/);
|
|
97
|
+
|
|
98
|
+
if (passMatch) passed = Number.parseInt(passMatch[1], 10);
|
|
99
|
+
if (failMatch) failed = Number.parseInt(failMatch[1], 10);
|
|
100
|
+
if (skipMatch) skipped = Number.parseInt(skipMatch[1], 10);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const success = code === 0;
|
|
105
|
+
if (!success) hasFailure = true;
|
|
106
|
+
|
|
107
|
+
const status = success ? "\x1b[32m✓\x1b[0m" : "\x1b[31m✗\x1b[0m";
|
|
108
|
+
console.log(`${status} (${duration}s)`);
|
|
109
|
+
|
|
110
|
+
results.push({
|
|
111
|
+
name: suite.name,
|
|
112
|
+
passed,
|
|
113
|
+
failed,
|
|
114
|
+
skipped,
|
|
115
|
+
duration,
|
|
116
|
+
success,
|
|
117
|
+
stdout: success ? "" : stdout,
|
|
118
|
+
stderr: success ? "" : stderr,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
resolve();
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function main() {
|
|
127
|
+
const title = isFull ? "Running All Tests (Full Suite)" : "Running All Tests";
|
|
128
|
+
console.log(`\n\x1b[1m━━━ ${title} ━━━\x1b[0m\n`);
|
|
129
|
+
|
|
130
|
+
for (const suite of SUITES) {
|
|
131
|
+
await runSuite(suite);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Print summary
|
|
135
|
+
console.log("\n\x1b[1m━━━ Test Summary ━━━\x1b[0m\n");
|
|
136
|
+
|
|
137
|
+
const totalPassed = results.reduce((sum, r) => sum + r.passed, 0);
|
|
138
|
+
const totalFailed = results.reduce((sum, r) => sum + r.failed, 0);
|
|
139
|
+
const totalSkipped = results.reduce((sum, r) => sum + r.skipped, 0);
|
|
140
|
+
const totalDuration = results
|
|
141
|
+
.reduce((sum, r) => sum + Number.parseFloat(r.duration), 0)
|
|
142
|
+
.toFixed(1);
|
|
143
|
+
|
|
144
|
+
// Table header
|
|
145
|
+
console.log("Suite Passed Failed Skipped Time");
|
|
146
|
+
console.log("─".repeat(50));
|
|
147
|
+
|
|
148
|
+
for (const r of results) {
|
|
149
|
+
const status = r.success ? "\x1b[32m✓\x1b[0m" : "\x1b[31m✗\x1b[0m";
|
|
150
|
+
const name = r.name.padEnd(12);
|
|
151
|
+
const passed = String(r.passed).padStart(6);
|
|
152
|
+
const failed =
|
|
153
|
+
r.failed > 0
|
|
154
|
+
? `\x1b[31m${String(r.failed).padStart(8)}\x1b[0m`
|
|
155
|
+
: String(r.failed).padStart(8);
|
|
156
|
+
const skipped = String(r.skipped).padStart(9);
|
|
157
|
+
const time = `${r.duration}s`.padStart(7);
|
|
158
|
+
console.log(`${status} ${name} ${passed} ${failed} ${skipped} ${time}`);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
console.log("─".repeat(50));
|
|
162
|
+
|
|
163
|
+
const totalStatus = hasFailure ? "\x1b[31m✗\x1b[0m" : "\x1b[32m✓\x1b[0m";
|
|
164
|
+
const totalLabel = "Total".padEnd(12);
|
|
165
|
+
const passedStr = String(totalPassed).padStart(6);
|
|
166
|
+
const failedStr =
|
|
167
|
+
totalFailed > 0
|
|
168
|
+
? `\x1b[31m${String(totalFailed).padStart(8)}\x1b[0m`
|
|
169
|
+
: String(totalFailed).padStart(8);
|
|
170
|
+
const skippedStr = String(totalSkipped).padStart(9);
|
|
171
|
+
const timeStr = `${totalDuration}s`.padStart(7);
|
|
172
|
+
console.log(
|
|
173
|
+
`${totalStatus} ${totalLabel} ${passedStr} ${failedStr} ${skippedStr} ${timeStr}`,
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
console.log();
|
|
177
|
+
|
|
178
|
+
// Print failures if any
|
|
179
|
+
if (hasFailure) {
|
|
180
|
+
console.log("\x1b[31m━━━ Failures ━━━\x1b[0m\n");
|
|
181
|
+
for (const r of results.filter((r) => !r.success)) {
|
|
182
|
+
console.log(`\x1b[1m${r.name}:\x1b[0m`);
|
|
183
|
+
if (r.stdout) {
|
|
184
|
+
// Show last 3000 chars of stdout to capture test failures without overwhelming output
|
|
185
|
+
const trimmedStdout =
|
|
186
|
+
r.stdout.length > 3000 ? `...${r.stdout.slice(-3000)}` : r.stdout;
|
|
187
|
+
console.log("\x1b[2mOutput:\x1b[0m");
|
|
188
|
+
console.log(trimmedStdout);
|
|
189
|
+
}
|
|
190
|
+
if (r.stderr) {
|
|
191
|
+
console.log("\x1b[2mErrors:\x1b[0m");
|
|
192
|
+
console.log(r.stderr);
|
|
193
|
+
}
|
|
194
|
+
console.log();
|
|
195
|
+
}
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
console.log("\x1b[32mAll tests passed!\x1b[0m\n");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
main().catch((err) => {
|
|
203
|
+
console.error("Test runner error:", err);
|
|
204
|
+
process.exit(1);
|
|
205
|
+
});
|
|
@@ -2,35 +2,45 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Runs domain-scoped integration tests with tier filtering.
|
|
4
4
|
*/
|
|
5
|
-
import { spawn } from
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
6
|
|
|
7
7
|
const rawArgs = process.argv.slice(2);
|
|
8
|
-
const separatorIndex = rawArgs.indexOf(
|
|
9
|
-
const domainArgs =
|
|
10
|
-
|
|
8
|
+
const separatorIndex = rawArgs.indexOf("--");
|
|
9
|
+
const domainArgs =
|
|
10
|
+
separatorIndex === -1 ? rawArgs : rawArgs.slice(0, separatorIndex);
|
|
11
|
+
const passthroughArgs =
|
|
12
|
+
separatorIndex === -1 ? [] : rawArgs.slice(separatorIndex + 1);
|
|
11
13
|
|
|
12
14
|
if (domainArgs.length === 0) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
console.error(
|
|
16
|
+
"Usage: node scripts/run-domain-integration-tests.js <domain> [domain ...]",
|
|
17
|
+
);
|
|
18
|
+
process.exit(1);
|
|
15
19
|
}
|
|
16
20
|
|
|
17
|
-
const domains = domainArgs.join(
|
|
21
|
+
const domains = domainArgs.join(",");
|
|
18
22
|
const env = {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
...process.env,
|
|
24
|
+
INTEGRATION_TEST_TIER: "domain",
|
|
25
|
+
INTEGRATION_TEST_DOMAINS: domains,
|
|
22
26
|
};
|
|
23
27
|
|
|
24
|
-
const vitestArgs = [
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
const vitestArgs = [
|
|
29
|
+
"vitest",
|
|
30
|
+
"run",
|
|
31
|
+
"--project",
|
|
32
|
+
"integration:domain",
|
|
33
|
+
...passthroughArgs,
|
|
34
|
+
];
|
|
35
|
+
const runner = "npx";
|
|
36
|
+
const useShell = process.platform === "win32";
|
|
27
37
|
|
|
28
38
|
const child = spawn(runner, vitestArgs, {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
stdio: "inherit",
|
|
40
|
+
env,
|
|
41
|
+
shell: useShell,
|
|
32
42
|
});
|
|
33
43
|
|
|
34
|
-
child.on(
|
|
35
|
-
|
|
44
|
+
child.on("close", (code) => {
|
|
45
|
+
process.exit(code ?? 1);
|
|
36
46
|
});
|