@indigoai-us/hq-cli 5.77.13 → 5.78.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 +34 -0
- package/assets/scaffold/core/scripts/archive-old-threads.sh +86 -0
- package/assets/scaffold/core/scripts/backfill-company-skill-mirrors.sh +73 -0
- package/assets/scaffold/core/scripts/backfill-workspace-mirror.sh +51 -0
- package/assets/scaffold/core/scripts/codex-skill-bridge.sh +550 -0
- package/assets/scaffold/core/scripts/detect-stale-core-policy-mirror.sh +185 -0
- package/assets/scaffold/core/scripts/hq-status-summary.sh +187 -0
- package/assets/scaffold/core/scripts/ontology-readme-drift.sh +264 -0
- package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +93 -0
- package/assets/scaffold/core/scripts/rebuild-all-indexes.sh +69 -0
- package/assets/scaffold/core/scripts/rebuild-companies-index.sh +206 -0
- package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +127 -0
- package/assets/scaffold/core/scripts/rebuild-orchestrator-index.sh +86 -0
- package/assets/scaffold/core/scripts/rebuild-projects-index.sh +105 -0
- package/assets/scaffold/core/scripts/rebuild-public-knowledge-index.sh +83 -0
- package/assets/scaffold/core/scripts/rebuild-reports-index.sh +114 -0
- package/assets/scaffold/core/scripts/rebuild-social-drafts-index.sh +135 -0
- package/assets/scaffold/core/scripts/rebuild-threads-index.sh +82 -0
- package/assets/scaffold/core/scripts/rebuild-workers-index.sh +97 -0
- package/assets/scaffold/core/scripts/resize-screenshot.sh +47 -0
- package/assets/scaffold/core/scripts/token-usage-report.sh +254 -0
- package/assets/scaffold/core/scripts/worktree.sh +136 -0
- package/dist/commands/agents.js +28 -12
- package/dist/commands/api-keys.js +100 -20
- package/dist/commands/core.d.ts +90 -0
- package/dist/commands/core.js +279 -0
- package/dist/commands/files-browse.d.ts +21 -0
- package/dist/commands/files-browse.js +145 -24
- package/dist/commands/files.js +33 -7
- package/dist/commands/members.js +16 -5
- package/dist/commands/pack-install.d.ts +14 -0
- package/dist/commands/pack-install.js +51 -2
- package/dist/commands/pkg-install.js +43 -0
- package/dist/commands/run.js +8 -0
- package/dist/commands/secrets.js +125 -65
- package/dist/main.js +6 -0
- package/dist/utils/api-key-command-gate.d.ts +45 -0
- package/dist/utils/api-key-command-gate.js +51 -0
- package/dist/utils/hq-roots.d.ts +91 -0
- package/dist/utils/hq-roots.js +212 -0
- package/dist/utils/resolve-vault-credential.d.ts +63 -3
- package/dist/utils/resolve-vault-credential.js +152 -6
- package/dist/utils/run-bundled-script.d.ts +66 -0
- package/dist/utils/run-bundled-script.js +80 -0
- package/dist/utils/vault-api.d.ts +21 -0
- package/dist/utils/vault-api.js +74 -3
- package/package.json +7 -1
- package/.claude/policies/hq-cli-interactive-reads-use-sts-vend.md +0 -49
- package/.github/workflows/ci.yml +0 -46
- package/.github/workflows/publish.yml +0 -36
- package/.github/workflows/scripts/smoke-test-pkg.sh +0 -97
- package/e2e/cli.test.ts +0 -128
- package/eslint.config.js +0 -37
- package/pnpm-workspace.yaml +0 -4
- package/scripts/chmod-bins.mjs +0 -49
- package/scripts/generate-dsn.mjs +0 -26
- package/scripts/generate-scan-packages-table.mjs +0 -113
- package/scripts/smoke-sources-signals.sh +0 -103
- package/src/bin/hq-auth-refresh.ts +0 -43
- package/src/cli-version.ts +0 -13
- package/src/commands/__fixtures__/make-tar.ts +0 -126
- package/src/commands/_patterns.ts +0 -10
- package/src/commands/add.ts +0 -75
- package/src/commands/agents.test.ts +0 -527
- package/src/commands/agents.ts +0 -923
- package/src/commands/api-keys.test.ts +0 -291
- package/src/commands/api-keys.ts +0 -382
- package/src/commands/artifact-verify.test.ts +0 -177
- package/src/commands/auth.test.ts +0 -82
- package/src/commands/auth.ts +0 -213
- package/src/commands/billing.test.ts +0 -158
- package/src/commands/billing.ts +0 -146
- package/src/commands/channels.test.ts +0 -74
- package/src/commands/channels.ts +0 -91
- package/src/commands/cloud-demote.test.ts +0 -401
- package/src/commands/cloud-demote.ts +0 -278
- package/src/commands/cloud-provision.test.ts +0 -1117
- package/src/commands/cloud-provision.ts +0 -942
- package/src/commands/cloud.pull-all.test.ts +0 -711
- package/src/commands/cloud.pull-per-company.test.ts +0 -188
- package/src/commands/cloud.push-all.test.ts +0 -485
- package/src/commands/cloud.scope-excluded-warning.test.ts +0 -22
- package/src/commands/cloud.selectors.test.ts +0 -208
- package/src/commands/cloud.status.test.ts +0 -160
- package/src/commands/cloud.test.ts +0 -41
- package/src/commands/cloud.ts +0 -2130
- package/src/commands/company.test.ts +0 -202
- package/src/commands/company.ts +0 -148
- package/src/commands/creators.test.ts +0 -60
- package/src/commands/creators.ts +0 -117
- package/src/commands/crm.test.ts +0 -179
- package/src/commands/crm.ts +0 -236
- package/src/commands/db-migrate.ts +0 -55
- package/src/commands/db-provision.ts +0 -114
- package/src/commands/db-sql.ts +0 -124
- package/src/commands/db-status.ts +0 -108
- package/src/commands/db.ts +0 -26
- package/src/commands/dm.test.ts +0 -748
- package/src/commands/dm.ts +0 -1226
- package/src/commands/feedback.test.ts +0 -413
- package/src/commands/feedback.ts +0 -169
- package/src/commands/files-browse.test.ts +0 -1249
- package/src/commands/files-browse.ts +0 -1506
- package/src/commands/files-delete.test.ts +0 -484
- package/src/commands/files-recovery.test.ts +0 -370
- package/src/commands/files.test.ts +0 -722
- package/src/commands/files.ts +0 -1446
- package/src/commands/group-grants.test.ts +0 -330
- package/src/commands/group-grants.ts +0 -455
- package/src/commands/groups.test.ts +0 -44
- package/src/commands/groups.ts +0 -368
- package/src/commands/integrations.test.ts +0 -633
- package/src/commands/integrations.ts +0 -507
- package/src/commands/list.ts +0 -85
- package/src/commands/login.ts +0 -52
- package/src/commands/logout.ts +0 -30
- package/src/commands/marketplace-install.test.ts +0 -543
- package/src/commands/marketplace-security.test.ts +0 -646
- package/src/commands/mcp-registration.test.ts +0 -2787
- package/src/commands/mcp-registration.ts +0 -2612
- package/src/commands/mcp-status.test.ts +0 -483
- package/src/commands/mcp-status.ts +0 -575
- package/src/commands/mcp-status.us011.test.ts +0 -243
- package/src/commands/meetings.test.ts +0 -522
- package/src/commands/meetings.ts +0 -789
- package/src/commands/members.test.ts +0 -1474
- package/src/commands/members.ts +0 -1181
- package/src/commands/onboard-identity-guard.test.ts +0 -99
- package/src/commands/onboard-identity-guard.ts +0 -103
- package/src/commands/onboard-join.test.ts +0 -96
- package/src/commands/onboard-join.ts +0 -101
- package/src/commands/onboard-warning.test.ts +0 -26
- package/src/commands/onboard-warning.ts +0 -12
- package/src/commands/onboard.ts +0 -267
- package/src/commands/outposts-heartbeat.test.ts +0 -299
- package/src/commands/outposts-heartbeat.ts +0 -310
- package/src/commands/outposts-replica-sync.test.ts +0 -272
- package/src/commands/outposts-self-deploy.test.ts +0 -243
- package/src/commands/outposts.test.ts +0 -1039
- package/src/commands/outposts.ts +0 -1935
- package/src/commands/pack-install-secret-authorization.test.ts +0 -115
- package/src/commands/pack-install.test.ts +0 -1469
- package/src/commands/pack-install.ts +0 -2247
- package/src/commands/pack-update-cache.test.ts +0 -149
- package/src/commands/packs.test.ts +0 -88
- package/src/commands/packs.ts +0 -622
- package/src/commands/people.test.ts +0 -807
- package/src/commands/people.ts +0 -422
- package/src/commands/pkg-install.dispatch.test.ts +0 -71
- package/src/commands/pkg-install.ts +0 -215
- package/src/commands/pkg-list.test.ts +0 -79
- package/src/commands/pkg-list.ts +0 -13
- package/src/commands/pkg-remove.ts +0 -71
- package/src/commands/pkg-update.ts +0 -189
- package/src/commands/publish.test.ts +0 -650
- package/src/commands/publish.ts +0 -580
- package/src/commands/reindex.test.ts +0 -259
- package/src/commands/reindex.ts +0 -274
- package/src/commands/rescue.test.ts +0 -39
- package/src/commands/rescue.ts +0 -210
- package/src/commands/run.env-local.test.ts +0 -88
- package/src/commands/run.test.ts +0 -45
- package/src/commands/run.ts +0 -184
- package/src/commands/safe-extract.test.ts +0 -459
- package/src/commands/safe-extract.ts +0 -444
- package/src/commands/secrets-scope.test.ts +0 -56
- package/src/commands/secrets-scope.ts +0 -32
- package/src/commands/secrets.parse-destination.test.ts +0 -38
- package/src/commands/secrets.test.ts +0 -2037
- package/src/commands/secrets.ts +0 -2240
- package/src/commands/signals.ts +0 -351
- package/src/commands/skill.test.ts +0 -770
- package/src/commands/skill.ts +0 -796
- package/src/commands/sources.ts +0 -362
- package/src/commands/sync-mode.test.ts +0 -366
- package/src/commands/sync-mode.ts +0 -387
- package/src/commands/sync-narrow.test.ts +0 -633
- package/src/commands/sync-narrow.ts +0 -555
- package/src/commands/sync.ts +0 -165
- package/src/commands/team-sync.ts +0 -628
- package/src/commands/update.ts +0 -71
- package/src/commands/whoami.ts +0 -83
- package/src/commands/workers.test.ts +0 -158
- package/src/commands/workers.ts +0 -301
- package/src/index.test.ts +0 -32
- package/src/index.ts +0 -20
- package/src/lib/db/control-plane.test.ts +0 -59
- package/src/lib/db/control-plane.ts +0 -113
- package/src/lib/db/local.test.ts +0 -81
- package/src/lib/db/local.ts +0 -148
- package/src/lib/db/migrate.test.ts +0 -133
- package/src/lib/db/migrate.ts +0 -137
- package/src/lib/db/paths.test.ts +0 -112
- package/src/lib/db/paths.ts +0 -128
- package/src/lib/db/remote-engine.test.ts +0 -44
- package/src/lib/db/remote-engine.ts +0 -148
- package/src/lib/db/remote-sql.test.ts +0 -32
- package/src/lib/db/remote-sql.ts +0 -62
- package/src/lib/db/sql.test.ts +0 -106
- package/src/lib/db/sql.ts +0 -192
- package/src/lib/hq-cloud-dep.smoke.test.ts +0 -75
- package/src/lib/local-tree-diff.test.ts +0 -301
- package/src/lib/local-tree-diff.ts +0 -362
- package/src/lib/narrow-hint-banner.test.ts +0 -235
- package/src/lib/narrow-hint-banner.ts +0 -212
- package/src/lib/plan-limit-nag.test.ts +0 -317
- package/src/lib/plan-limit-nag.ts +0 -264
- package/src/main.ts +0 -371
- package/src/node-preflight.test.ts +0 -60
- package/src/node-preflight.ts +0 -67
- package/src/outpost/session-heartbeat-bounds.test.ts +0 -195
- package/src/outpost/session-heartbeat-guard.test.ts +0 -105
- package/src/outpost/session-heartbeat-publisher.test.ts +0 -178
- package/src/outpost/session-heartbeat-publisher.ts +0 -186
- package/src/outpost/session-heartbeat-retain-guard.test.ts +0 -126
- package/src/outpost/session-heartbeat.test.ts +0 -459
- package/src/outpost/session-heartbeat.ts +0 -877
- package/src/packaging.test.ts +0 -109
- package/src/run/__fixtures__/discover-schemas/example.env.schema +0 -4
- package/src/run/discover-schemas.test.ts +0 -153
- package/src/run/discover-schemas.ts +0 -79
- package/src/run/hq-plugin.test.ts +0 -371
- package/src/run/hq-plugin.ts +0 -277
- package/src/run/varlock-shape.test.ts +0 -57
- package/src/schemas/hq-package.schema.json +0 -155
- package/src/sentry-before-send.test.ts +0 -359
- package/src/sentry-before-send.ts +0 -221
- package/src/sentry-epipe.test.ts +0 -37
- package/src/sentry-release.test.ts +0 -54
- package/src/sentry.test.ts +0 -24
- package/src/sentry.ts +0 -54
- package/src/strategies/link.ts +0 -62
- package/src/strategies/merge.ts +0 -142
- package/src/types.ts +0 -146
- package/src/utils/__fixtures__/scan-packages.generated-block.sh +0 -23
- package/src/utils/auth-error.test.ts +0 -40
- package/src/utils/auth-error.ts +0 -42
- package/src/utils/billing-gate.test.ts +0 -95
- package/src/utils/billing-gate.ts +0 -228
- package/src/utils/breadcrumb-buffer.ts +0 -18
- package/src/utils/cli-telemetry.test.ts +0 -153
- package/src/utils/cli-telemetry.ts +0 -61
- package/src/utils/cognito-session.machine.test.ts +0 -109
- package/src/utils/cognito-session.refresh.test.ts +0 -84
- package/src/utils/cognito-session.test.ts +0 -328
- package/src/utils/cognito-session.ts +0 -448
- package/src/utils/company-selection-error.test.ts +0 -42
- package/src/utils/company-selection-error.ts +0 -45
- package/src/utils/contribution-table.ts +0 -83
- package/src/utils/environmental-error.test.ts +0 -45
- package/src/utils/environmental-error.ts +0 -39
- package/src/utils/epipe.test.ts +0 -28
- package/src/utils/epipe.ts +0 -29
- package/src/utils/expected-cli-error.test.ts +0 -28
- package/src/utils/expected-cli-error.ts +0 -39
- package/src/utils/feedback-diagnostics.test.ts +0 -183
- package/src/utils/feedback-diagnostics.ts +0 -123
- package/src/utils/feedback-screenshots.test.ts +0 -134
- package/src/utils/feedback-screenshots.ts +0 -124
- package/src/utils/feedback-versions.test.ts +0 -98
- package/src/utils/feedback-versions.ts +0 -68
- package/src/utils/git.ts +0 -74
- package/src/utils/integrity.ts +0 -59
- package/src/utils/intercepted-process-exit.test.ts +0 -37
- package/src/utils/intercepted-process-exit.ts +0 -36
- package/src/utils/login-provider.test.ts +0 -42
- package/src/utils/login-provider.ts +0 -30
- package/src/utils/manifest.test.ts +0 -167
- package/src/utils/manifest.ts +0 -131
- package/src/utils/pack-contributions.test.ts +0 -603
- package/src/utils/pack-contributions.ts +0 -450
- package/src/utils/people.ts +0 -215
- package/src/utils/registry-client.ts +0 -204
- package/src/utils/registry.ts +0 -90
- package/src/utils/resolve-vault-credential.test.ts +0 -69
- package/src/utils/resolve-vault-credential.ts +0 -60
- package/src/utils/sandbox-runner-client.test.ts +0 -279
- package/src/utils/sandbox-runner-client.ts +0 -260
- package/src/utils/secrets-cache.ts +0 -183
- package/src/utils/sentry-identity.ts +0 -45
- package/src/utils/settle-with-timeout.test.ts +0 -21
- package/src/utils/settle-with-timeout.ts +0 -22
- package/src/utils/user-yaml-error.test.ts +0 -24
- package/src/utils/user-yaml-error.ts +0 -30
- package/src/utils/vault-api.test.ts +0 -536
- package/src/utils/vault-api.ts +0 -382
- package/src/utils/version-check.test.ts +0 -176
- package/src/utils/version-check.ts +0 -155
- package/src/utils/version-gate.test.ts +0 -1024
- package/src/utils/version-gate.ts +0 -702
- package/test/commands/db-tenant-isolation.test.ts +0 -94
- package/test/commands/db.test.ts +0 -85
- package/test/commands/signals.test.ts +0 -207
- package/test/commands/sources.test.ts +0 -231
- package/test/e2e/smoke-install-mcp.sh +0 -113
- package/test/fixtures/hq-pack-smoke-mcp/mcp/smoke-http.json +0 -1
- package/test/fixtures/hq-pack-smoke-mcp/package.yaml +0 -11
- package/test/fixtures/signals/action_item/sample.md +0 -16
- package/test/fixtures/signals/summary/sample.md +0 -12
- package/test/fixtures/sources/meetings/sample.md +0 -25
- package/test/helpers/cli-runner.ts +0 -150
- package/test/helpers/s3-list-mock.ts +0 -79
- package/test/helpers/vault-service-mock.ts +0 -295
- package/test/sources-signals/smoke.test.ts +0 -228
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -11
- package/vitest.e2e.config.ts +0 -7
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* vault-service-mock.ts — vault-service test double.
|
|
3
|
-
*
|
|
4
|
-
* Two collaborating pieces:
|
|
5
|
-
* 1. A `globalThis.fetch` stub for the vault-service JSON API (membership,
|
|
6
|
-
* entity lookup, STS vend, files list/presign).
|
|
7
|
-
* 2. A real ephemeral localhost HTTP server that serves the presigned-object
|
|
8
|
-
* GETs. As of hq-cloud >=6.14.x, `PresignObjectIO` fetches presigned URLs
|
|
9
|
-
* through Node's core HTTP client (`nodePresignedGet`), NOT
|
|
10
|
-
* `globalThis.fetch`, to bypass the runtime-bundled undici parser — so a
|
|
11
|
-
* fetch stub alone never intercepts them and the request escapes to real
|
|
12
|
-
* DNS (`ENOTFOUND`). A real (loopback) server is transport-agnostic: it
|
|
13
|
-
* works for both the fetch and node-http code paths, and future ones.
|
|
14
|
-
*
|
|
15
|
-
* `mockVaultService` is async (it awaits the server's `listen`) and returns a
|
|
16
|
-
* restore function for `afterEach` that both un-installs the fetch stub and
|
|
17
|
-
* closes the server.
|
|
18
|
-
*
|
|
19
|
-
* Handled JSON endpoints (URL path suffixes):
|
|
20
|
-
* GET .../membership/me returns { memberships: [...] }
|
|
21
|
-
* GET .../entity/by-slug/{type}/{slug} returns { entity: {...} }
|
|
22
|
-
* GET .../entity/{uid} returns { entity: {...} } (direct UID lookup)
|
|
23
|
-
* GET .../v1/files/list returns { objects, cursor, truncated }
|
|
24
|
-
* POST .../v1/files/presign returns { results, expiresAt } (URLs point at the local server)
|
|
25
|
-
* POST .../sts/vend returns { credentials, expiresAt }
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
import http from "node:http";
|
|
29
|
-
import type { AddressInfo } from "node:net";
|
|
30
|
-
import type { Membership, EntityInfo } from "@indigoai-us/hq-cloud";
|
|
31
|
-
|
|
32
|
-
export interface MockEntity {
|
|
33
|
-
/** Entity UID (e.g. "cmp_indigo_001") */
|
|
34
|
-
uid: string;
|
|
35
|
-
/** Human-readable stable slug (e.g. "indigo", "personal") */
|
|
36
|
-
slug: string;
|
|
37
|
-
/** S3 bucket name for this entity */
|
|
38
|
-
bucketName: string;
|
|
39
|
-
/** AWS region; defaults to "us-east-1" */
|
|
40
|
-
region?: string;
|
|
41
|
-
/** Entity role in this membership; defaults to "owner" */
|
|
42
|
-
role?: "owner" | "admin" | "member" | "guest";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface MockStsCredentials {
|
|
46
|
-
accessKeyId: string;
|
|
47
|
-
secretAccessKey: string;
|
|
48
|
-
sessionToken: string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/** A file served over the presigned-URL transport (HQ-59 company reads). */
|
|
52
|
-
export interface MockVaultFile {
|
|
53
|
-
/** Object key (e.g. "sources/meetings/abc.md") */
|
|
54
|
-
key: string;
|
|
55
|
-
/** Full file content as UTF-8 string */
|
|
56
|
-
content: string;
|
|
57
|
-
/** Optional override; defaults to 2026-01-01T00:00:00Z */
|
|
58
|
-
lastModified?: Date;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface MockVaultOptions {
|
|
62
|
-
entities: MockEntity[];
|
|
63
|
-
/** STS credentials returned for every POST /entities/{uid}/sts; defaults to test creds */
|
|
64
|
-
stsCredentials?: MockStsCredentials;
|
|
65
|
-
/**
|
|
66
|
-
* Files served over the presigned-URL transport (`GET /v1/files/list`,
|
|
67
|
-
* `POST /v1/files/presign`, then a GET against the minted URL). Supplied so
|
|
68
|
-
* company (cmp_) reads — which route through presign as of HQ-59 — resolve
|
|
69
|
-
* without touching real S3. Absent → those endpoints return empty/404.
|
|
70
|
-
*/
|
|
71
|
-
files?: MockVaultFile[];
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const DEFAULT_FILE_DATE = new Date("2026-01-01T00:00:00Z");
|
|
75
|
-
|
|
76
|
-
const DEFAULT_STS: MockStsCredentials = {
|
|
77
|
-
accessKeyId: "ASIAMOCK000000000001",
|
|
78
|
-
secretAccessKey: "mockSecretAccessKey",
|
|
79
|
-
sessionToken: "mockSessionToken",
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Start a loopback HTTP server that serves presigned-object GETs from the
|
|
84
|
-
* in-memory `files`. Each minted presign URL is `${origin}/obj?key=<key>`;
|
|
85
|
-
* the handler resolves the file (200 + body) or 404s (→ NoSuchKey in the
|
|
86
|
-
* reader). Returns the server + its `http://127.0.0.1:<port>` origin.
|
|
87
|
-
*/
|
|
88
|
-
async function startPresignedFileServer(
|
|
89
|
-
files: MockVaultFile[],
|
|
90
|
-
): Promise<{ server: http.Server; origin: string }> {
|
|
91
|
-
const server = http.createServer((req, res) => {
|
|
92
|
-
const requestUrl = new URL(req.url ?? "/", "http://127.0.0.1");
|
|
93
|
-
const key = requestUrl.searchParams.get("key") ?? "";
|
|
94
|
-
const file = files.find((f) => f.key === key);
|
|
95
|
-
if (!file) {
|
|
96
|
-
res.statusCode = 404;
|
|
97
|
-
res.setHeader("content-length", "0");
|
|
98
|
-
res.end();
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const body = Buffer.from(file.content, "utf-8");
|
|
102
|
-
res.writeHead(200, {
|
|
103
|
-
"content-type": "text/markdown",
|
|
104
|
-
"content-length": String(body.byteLength),
|
|
105
|
-
"last-modified": (file.lastModified ?? DEFAULT_FILE_DATE).toUTCString(),
|
|
106
|
-
etag: '"mock-etag"',
|
|
107
|
-
});
|
|
108
|
-
res.end(body);
|
|
109
|
-
});
|
|
110
|
-
await new Promise<void>((resolve) => {
|
|
111
|
-
server.listen(0, "127.0.0.1", resolve);
|
|
112
|
-
});
|
|
113
|
-
// Don't keep the event loop (or vitest) alive on this listener.
|
|
114
|
-
server.unref();
|
|
115
|
-
const { port } = server.address() as AddressInfo;
|
|
116
|
-
return { server, origin: `http://127.0.0.1:${port}` };
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Installs the vault-service test double (fetch stub + presigned-file server).
|
|
121
|
-
*
|
|
122
|
-
* @returns A restore function — call it in afterEach to un-install the stub and
|
|
123
|
-
* close the server.
|
|
124
|
-
*/
|
|
125
|
-
export async function mockVaultService(
|
|
126
|
-
opts: MockVaultOptions,
|
|
127
|
-
): Promise<() => void> {
|
|
128
|
-
const { entities, stsCredentials = DEFAULT_STS, files = [] } = opts;
|
|
129
|
-
const originalFetch = globalThis.fetch as typeof fetch | undefined;
|
|
130
|
-
|
|
131
|
-
const { server, origin: presignOrigin } = await startPresignedFileServer(files);
|
|
132
|
-
|
|
133
|
-
globalThis.fetch = async (
|
|
134
|
-
input: RequestInfo | URL,
|
|
135
|
-
init?: RequestInit,
|
|
136
|
-
): Promise<Response> => {
|
|
137
|
-
const url =
|
|
138
|
-
typeof input === "string"
|
|
139
|
-
? input
|
|
140
|
-
: input instanceof URL
|
|
141
|
-
? input.toString()
|
|
142
|
-
: (input as Request).url;
|
|
143
|
-
const method =
|
|
144
|
-
(init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
|
|
145
|
-
|
|
146
|
-
// ── Presigned-URL transport (HQ-59 company reads) ──────────────────────
|
|
147
|
-
// Production fetches presigned URLs over node http (served by the loopback
|
|
148
|
-
// server above), but keep a fetch branch too so any fetch-based transport
|
|
149
|
-
// resolves identically without escaping to the network.
|
|
150
|
-
if (url.startsWith(`${presignOrigin}/`)) {
|
|
151
|
-
const key = new URL(url).searchParams.get("key") ?? "";
|
|
152
|
-
const file = files.find((f) => f.key === key);
|
|
153
|
-
if (!file) return new Response("", { status: 404 });
|
|
154
|
-
return new Response(file.content, {
|
|
155
|
-
status: 200,
|
|
156
|
-
headers: {
|
|
157
|
-
"Content-Type": "text/markdown",
|
|
158
|
-
"Content-Length": String(Buffer.byteLength(file.content, "utf-8")),
|
|
159
|
-
"Last-Modified": (file.lastModified ?? DEFAULT_FILE_DATE).toUTCString(),
|
|
160
|
-
ETag: '"mock-etag"',
|
|
161
|
-
},
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// GET /v1/files/list?company=<uid>&prefix=<p>&cursor=<c> (VaultClient.listFiles)
|
|
166
|
-
if (method === "GET" && /\/v1\/files\/list(\?|$)/.test(url)) {
|
|
167
|
-
const prefix = new URL(url).searchParams.get("prefix") ?? "";
|
|
168
|
-
const objects = files
|
|
169
|
-
.filter((f) => f.key.startsWith(prefix))
|
|
170
|
-
.map((f) => ({
|
|
171
|
-
key: f.key,
|
|
172
|
-
size: Buffer.byteLength(f.content, "utf-8"),
|
|
173
|
-
lastModified: (f.lastModified ?? DEFAULT_FILE_DATE).toISOString(),
|
|
174
|
-
etag: "mock-etag",
|
|
175
|
-
permission: "read",
|
|
176
|
-
}));
|
|
177
|
-
return json({ objects, cursor: null, truncated: false });
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// POST /v1/files/presign (VaultClient.presign) — mint a per-key URL that
|
|
181
|
-
// the loopback server (and the GET branch above) resolves. Unknown keys
|
|
182
|
-
// still get a URL → that GET 404s, which the reader normalizes to
|
|
183
|
-
// NoSuchKey (the not-found path).
|
|
184
|
-
if (method === "POST" && /\/v1\/files\/presign$/.test(url)) {
|
|
185
|
-
const body = init?.body ? JSON.parse(init.body.toString()) : {};
|
|
186
|
-
const keys = (body.keys ?? []) as Array<{ key: string; op?: string }>;
|
|
187
|
-
// Echo the requested op and omit `error` on success. hq-cloud >=6.11.x
|
|
188
|
-
// validates each presign result with a strict schema (op ∈ get|put|delete;
|
|
189
|
-
// error must be a string when present), so the older `error: null` +
|
|
190
|
-
// missing-op shape no longer passes.
|
|
191
|
-
const results = keys.map((k) => ({
|
|
192
|
-
key: k.key,
|
|
193
|
-
op: k.op ?? "get",
|
|
194
|
-
url: `${presignOrigin}/obj?key=${encodeURIComponent(k.key)}`,
|
|
195
|
-
}));
|
|
196
|
-
return json({
|
|
197
|
-
results,
|
|
198
|
-
expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// GET /membership/me
|
|
203
|
-
if (method === "GET" && /\/membership\/me(\?.*)?$/.test(url)) {
|
|
204
|
-
const memberships: Partial<Membership>[] = entities.map((e) => ({
|
|
205
|
-
membershipKey: `mbr_${e.uid}`,
|
|
206
|
-
personUid: "prs_test_person_001",
|
|
207
|
-
companyUid: e.uid,
|
|
208
|
-
role: e.role ?? "owner",
|
|
209
|
-
status: "active",
|
|
210
|
-
invitedBy: "system",
|
|
211
|
-
invitedAt: "2026-01-01T00:00:00Z",
|
|
212
|
-
createdAt: "2026-01-01T00:00:00Z",
|
|
213
|
-
updatedAt: "2026-01-01T00:00:00Z",
|
|
214
|
-
}));
|
|
215
|
-
return json({ memberships });
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// GET /entity/by-slug/{type}/{slug}
|
|
219
|
-
const bySlugMatch = /\/entity\/by-slug\/[^/]+\/([^/?]+)/.exec(url);
|
|
220
|
-
if (method === "GET" && bySlugMatch) {
|
|
221
|
-
const slug = decodeURIComponent(bySlugMatch[1]);
|
|
222
|
-
const entity = entities.find((e) => e.slug === slug);
|
|
223
|
-
if (!entity) {
|
|
224
|
-
return json({ error: "Not found" }, 404);
|
|
225
|
-
}
|
|
226
|
-
const info: Partial<EntityInfo> = {
|
|
227
|
-
uid: entity.uid,
|
|
228
|
-
slug: entity.slug,
|
|
229
|
-
type: "company",
|
|
230
|
-
name: entity.slug,
|
|
231
|
-
bucketName: entity.bucketName,
|
|
232
|
-
status: "active",
|
|
233
|
-
};
|
|
234
|
-
return json({ entity: info });
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// GET /entity/{uid} (direct UID lookup — used by entity-resolver)
|
|
238
|
-
const entityUidMatch = /\/entity\/([^/?]+)$/.exec(url);
|
|
239
|
-
if (method === "GET" && entityUidMatch) {
|
|
240
|
-
const uid = decodeURIComponent(entityUidMatch[1]);
|
|
241
|
-
const entity = entities.find((e) => e.uid === uid);
|
|
242
|
-
if (!entity) {
|
|
243
|
-
return json({ error: `Entity '${uid}' not found` }, 404);
|
|
244
|
-
}
|
|
245
|
-
const info: Partial<EntityInfo> = {
|
|
246
|
-
uid: entity.uid,
|
|
247
|
-
slug: entity.slug,
|
|
248
|
-
type: "company",
|
|
249
|
-
name: entity.slug,
|
|
250
|
-
bucketName: entity.bucketName,
|
|
251
|
-
status: "active",
|
|
252
|
-
};
|
|
253
|
-
return json({ entity: info });
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// POST /sts/vend (canonical vault-service endpoint as of hq-cloud 5.21.0;
|
|
257
|
-
// the previously mocked POST /entities/{uid}/sts was the made-up path
|
|
258
|
-
// from 5.20.0 that never existed server-side.)
|
|
259
|
-
if (method === "POST" && url.endsWith("/sts/vend")) {
|
|
260
|
-
const body = init?.body ? JSON.parse(init.body.toString()) : {};
|
|
261
|
-
const uid = body.companyUid as string | undefined;
|
|
262
|
-
const entity = uid ? entities.find((e) => e.uid === uid) : undefined;
|
|
263
|
-
if (!entity) {
|
|
264
|
-
return json({ error: `Entity '${uid ?? "(missing companyUid)"}' not found` }, 404);
|
|
265
|
-
}
|
|
266
|
-
return json({
|
|
267
|
-
credentials: stsCredentials,
|
|
268
|
-
expiresAt: new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Unhandled — pass through if original fetch exists, else 500
|
|
273
|
-
if (originalFetch) {
|
|
274
|
-
return originalFetch(input, init);
|
|
275
|
-
}
|
|
276
|
-
return json({ error: `mockVaultService: unhandled request ${method} ${url}` }, 500);
|
|
277
|
-
};
|
|
278
|
-
|
|
279
|
-
return () => {
|
|
280
|
-
if (originalFetch) {
|
|
281
|
-
globalThis.fetch = originalFetch;
|
|
282
|
-
} else {
|
|
283
|
-
delete (globalThis as Record<string, unknown>).fetch;
|
|
284
|
-
}
|
|
285
|
-
server.closeAllConnections?.();
|
|
286
|
-
server.close();
|
|
287
|
-
};
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
function json(body: unknown, status = 200): Response {
|
|
291
|
-
return new Response(JSON.stringify(body), {
|
|
292
|
-
status,
|
|
293
|
-
headers: { "Content-Type": "application/json" },
|
|
294
|
-
});
|
|
295
|
-
}
|
|
@@ -1,228 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* smoke.test.ts — Phase 0 infrastructure smoke test (US-001).
|
|
3
|
-
*
|
|
4
|
-
* Validates that:
|
|
5
|
-
* 1. The fixture files exist and have the expected frontmatter shape.
|
|
6
|
-
* 2. mockS3WithEntries lists and retrieves entries with full round-trip fidelity.
|
|
7
|
-
* 3. mockVaultService intercepts /membership/me, /entity/{uid}, and /sts/vend correctly.
|
|
8
|
-
* 4. runCli(['hq', '--help']) exits 0 (basic wiring check).
|
|
9
|
-
*
|
|
10
|
-
* Note: assertions about 'sources'/'signals' appearing in `hq --help` are
|
|
11
|
-
* intentionally absent here — those land when US-006/US-007 register the
|
|
12
|
-
* commands and add them to buildProgram() in cli-runner.ts.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { readFileSync } from "fs";
|
|
16
|
-
import { dirname, join } from "path";
|
|
17
|
-
import { fileURLToPath } from "url";
|
|
18
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
19
|
-
import { GetObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
|
|
20
|
-
import { mockS3WithEntries } from "../helpers/s3-list-mock.js";
|
|
21
|
-
import { mockVaultService } from "../helpers/vault-service-mock.js";
|
|
22
|
-
import { runCli } from "../helpers/cli-runner.js";
|
|
23
|
-
|
|
24
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
25
|
-
|
|
26
|
-
const FIXTURES = join(__dirname, "../fixtures");
|
|
27
|
-
const SOURCE_PATH = join(FIXTURES, "sources/meetings/sample.md");
|
|
28
|
-
const SIGNAL_ACTION_PATH = join(FIXTURES, "signals/action_item/sample.md");
|
|
29
|
-
const SIGNAL_SUMMARY_PATH = join(FIXTURES, "signals/summary/sample.md");
|
|
30
|
-
|
|
31
|
-
// ---------------------------------------------------------------------------
|
|
32
|
-
// Fixture shape tests
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
describe("fixtures — file shape", () => {
|
|
36
|
-
it("source fixture has expected frontmatter fields", () => {
|
|
37
|
-
const content = readFileSync(SOURCE_PATH, "utf-8");
|
|
38
|
-
expect(content).toContain("source_id:");
|
|
39
|
-
expect(content).toContain("channel: meeting");
|
|
40
|
-
expect(content).toContain("participants:");
|
|
41
|
-
expect(content).toContain("created_at:");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("action_item signal fixture has required signal fields", () => {
|
|
45
|
-
const content = readFileSync(SIGNAL_ACTION_PATH, "utf-8");
|
|
46
|
-
expect(content).toContain("signal_id:");
|
|
47
|
-
expect(content).toContain("signal_type: action_item");
|
|
48
|
-
expect(content).toContain("source_ref:");
|
|
49
|
-
expect(content).toContain("citations:");
|
|
50
|
-
expect(content).toContain("entity_refs:");
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("summary signal fixture has required signal fields", () => {
|
|
54
|
-
const content = readFileSync(SIGNAL_SUMMARY_PATH, "utf-8");
|
|
55
|
-
expect(content).toContain("signal_type: summary");
|
|
56
|
-
expect(content).toContain("source_ref:");
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
|
-
// S3 mock round-trip tests
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
|
|
64
|
-
describe("mockS3WithEntries — listing", () => {
|
|
65
|
-
it("lists all entries when no prefix filter is applied", async () => {
|
|
66
|
-
const sourceContent = readFileSync(SOURCE_PATH, "utf-8");
|
|
67
|
-
const signalContent = readFileSync(SIGNAL_ACTION_PATH, "utf-8");
|
|
68
|
-
|
|
69
|
-
const client = mockS3WithEntries({
|
|
70
|
-
entries: [
|
|
71
|
-
{ key: "sources/meetings/abc.md", content: sourceContent },
|
|
72
|
-
{ key: "signals/action_item/xyz.md", content: signalContent },
|
|
73
|
-
],
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const result = await client.send(
|
|
77
|
-
new ListObjectsV2Command({ Bucket: "mock-bucket" }),
|
|
78
|
-
) as { Contents: Array<{ Key: string; Size: number }> };
|
|
79
|
-
|
|
80
|
-
expect(result.Contents).toHaveLength(2);
|
|
81
|
-
const keys = result.Contents.map((c) => c.Key);
|
|
82
|
-
expect(keys).toContain("sources/meetings/abc.md");
|
|
83
|
-
expect(keys).toContain("signals/action_item/xyz.md");
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("filters by prefix — returns only matching entries", async () => {
|
|
87
|
-
const sourceContent = readFileSync(SOURCE_PATH, "utf-8");
|
|
88
|
-
const signalContent = readFileSync(SIGNAL_ACTION_PATH, "utf-8");
|
|
89
|
-
|
|
90
|
-
const client = mockS3WithEntries({
|
|
91
|
-
entries: [
|
|
92
|
-
{ key: "sources/meetings/abc.md", content: sourceContent },
|
|
93
|
-
{ key: "signals/action_item/xyz.md", content: signalContent },
|
|
94
|
-
],
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
const sourceList = await client.send(
|
|
98
|
-
new ListObjectsV2Command({ Bucket: "mock-bucket", Prefix: "sources/meetings/" }),
|
|
99
|
-
) as { Contents: Array<{ Key: string }> };
|
|
100
|
-
|
|
101
|
-
expect(sourceList.Contents).toHaveLength(1);
|
|
102
|
-
expect(sourceList.Contents[0].Key).toBe("sources/meetings/abc.md");
|
|
103
|
-
|
|
104
|
-
const signalList = await client.send(
|
|
105
|
-
new ListObjectsV2Command({ Bucket: "mock-bucket", Prefix: "signals/action_item/" }),
|
|
106
|
-
) as { Contents: Array<{ Key: string }> };
|
|
107
|
-
|
|
108
|
-
expect(signalList.Contents).toHaveLength(1);
|
|
109
|
-
expect(signalList.Contents[0].Key).toBe("signals/action_item/xyz.md");
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
describe("mockS3WithEntries — get round-trip", () => {
|
|
114
|
-
it("retrieves source content and preserves exact bytes", async () => {
|
|
115
|
-
const sourceContent = readFileSync(SOURCE_PATH, "utf-8");
|
|
116
|
-
|
|
117
|
-
const client = mockS3WithEntries({
|
|
118
|
-
entries: [{ key: "sources/meetings/abc.md", content: sourceContent }],
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
const result = await client.send(
|
|
122
|
-
new GetObjectCommand({ Bucket: "mock-bucket", Key: "sources/meetings/abc.md" }),
|
|
123
|
-
) as { Body: AsyncIterable<Uint8Array> };
|
|
124
|
-
|
|
125
|
-
const chunks: Buffer[] = [];
|
|
126
|
-
for await (const chunk of result.Body) {
|
|
127
|
-
chunks.push(Buffer.from(chunk));
|
|
128
|
-
}
|
|
129
|
-
const retrieved = Buffer.concat(chunks).toString("utf-8");
|
|
130
|
-
|
|
131
|
-
expect(retrieved).toBe(sourceContent);
|
|
132
|
-
// Spot-check frontmatter field survives round-trip
|
|
133
|
-
expect(retrieved).toContain("source_id: abc-meeting-001");
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it("retrieves signal content and preserves exact bytes", async () => {
|
|
137
|
-
const signalContent = readFileSync(SIGNAL_ACTION_PATH, "utf-8");
|
|
138
|
-
|
|
139
|
-
const client = mockS3WithEntries({
|
|
140
|
-
entries: [{ key: "signals/action_item/xyz.md", content: signalContent }],
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
const result = await client.send(
|
|
144
|
-
new GetObjectCommand({ Bucket: "mock-bucket", Key: "signals/action_item/xyz.md" }),
|
|
145
|
-
) as { Body: AsyncIterable<Uint8Array> };
|
|
146
|
-
|
|
147
|
-
const chunks: Buffer[] = [];
|
|
148
|
-
for await (const chunk of result.Body) {
|
|
149
|
-
chunks.push(Buffer.from(chunk));
|
|
150
|
-
}
|
|
151
|
-
const retrieved = Buffer.concat(chunks).toString("utf-8");
|
|
152
|
-
|
|
153
|
-
expect(retrieved).toBe(signalContent);
|
|
154
|
-
expect(retrieved).toContain("signal_type: action_item");
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it("throws NoSuchKey for missing entry", async () => {
|
|
158
|
-
const client = mockS3WithEntries({ entries: [] });
|
|
159
|
-
|
|
160
|
-
await expect(
|
|
161
|
-
client.send(new GetObjectCommand({ Bucket: "mock-bucket", Key: "does/not/exist.md" })),
|
|
162
|
-
).rejects.toMatchObject({ name: "NoSuchKey" });
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
// ---------------------------------------------------------------------------
|
|
167
|
-
// Vault-service mock tests
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
|
|
170
|
-
describe("mockVaultService — membership endpoint", () => {
|
|
171
|
-
let restore: (() => void) | undefined;
|
|
172
|
-
|
|
173
|
-
afterEach(() => {
|
|
174
|
-
restore?.();
|
|
175
|
-
restore = undefined;
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it("GET /membership/me returns memberships for all configured entities", async () => {
|
|
179
|
-
restore = await mockVaultService({
|
|
180
|
-
entities: [
|
|
181
|
-
{ uid: "cmp_indigo_001", slug: "indigo", bucketName: "hq-indigo-bucket" },
|
|
182
|
-
{ uid: "prs_personal_001", slug: "personal", bucketName: "hq-personal-bucket" },
|
|
183
|
-
],
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
const res = await fetch("https://vault-api.example.com/membership/me");
|
|
187
|
-
const body = (await res.json()) as { memberships: Array<{ companyUid: string }> };
|
|
188
|
-
|
|
189
|
-
expect(res.status).toBe(200);
|
|
190
|
-
expect(body.memberships).toHaveLength(2);
|
|
191
|
-
const uids = body.memberships.map((m) => m.companyUid);
|
|
192
|
-
expect(uids).toContain("cmp_indigo_001");
|
|
193
|
-
expect(uids).toContain("prs_personal_001");
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
it("POST /sts/vend returns credentials", async () => {
|
|
197
|
-
restore = await mockVaultService({
|
|
198
|
-
entities: [{ uid: "cmp_indigo_001", slug: "indigo", bucketName: "hq-indigo-bucket" }],
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
const res = await fetch("https://vault-api.example.com/sts/vend", {
|
|
202
|
-
method: "POST",
|
|
203
|
-
headers: { "Content-Type": "application/json" },
|
|
204
|
-
body: JSON.stringify({ companyUid: "cmp_indigo_001" }),
|
|
205
|
-
});
|
|
206
|
-
const body = (await res.json()) as {
|
|
207
|
-
credentials: { accessKeyId: string };
|
|
208
|
-
expiresAt: string;
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
expect(res.status).toBe(200);
|
|
212
|
-
expect(body.credentials.accessKeyId).toBe("ASIAMOCK000000000001");
|
|
213
|
-
expect(typeof body.expiresAt).toBe("string");
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
// ---------------------------------------------------------------------------
|
|
218
|
-
// CLI runner
|
|
219
|
-
// ---------------------------------------------------------------------------
|
|
220
|
-
|
|
221
|
-
describe("runCli — basic wiring", () => {
|
|
222
|
-
it("runCli(['hq', '--help']) exits 0 and emits non-empty stdout", async () => {
|
|
223
|
-
const result = await runCli(["hq", "--help"]);
|
|
224
|
-
expect(result.exitCode).toBe(0);
|
|
225
|
-
expect(result.stdout.length).toBeGreaterThan(0);
|
|
226
|
-
expect(result.stdout).toContain("hq");
|
|
227
|
-
});
|
|
228
|
-
});
|
package/tsconfig.json
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"lib": ["ES2022"],
|
|
7
|
-
"strict": true,
|
|
8
|
-
"esModuleInterop": true,
|
|
9
|
-
"skipLibCheck": true,
|
|
10
|
-
"forceConsistentCasingInFileNames": true,
|
|
11
|
-
"declaration": true,
|
|
12
|
-
"declarationMap": true,
|
|
13
|
-
"sourceMap": true,
|
|
14
|
-
"resolveJsonModule": true,
|
|
15
|
-
"outDir": "dist",
|
|
16
|
-
"rootDir": "src"
|
|
17
|
-
},
|
|
18
|
-
"include": ["src"],
|
|
19
|
-
"exclude": ["src/**/*.test.ts"]
|
|
20
|
-
}
|
package/vitest.config.ts
DELETED