forgeos 0.1.0-alpha.0 → 0.1.0-alpha.2
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/.npmignore +9 -1
- package/AGENTS.md +6 -1
- package/CHANGELOG.md +30 -0
- package/CONTRIBUTING.md +22 -1
- package/README.md +30 -3
- package/bin/forge.mjs +4 -3
- package/package.json +3 -1
- package/packages/eslint-plugin-forge/index.ts +15 -15
- package/packages/eslint-plugin-forge/package.json +10 -10
- package/packages/eslint-plugin-forge/src/check-source.ts +95 -95
- package/packages/eslint-plugin-forge/src/load-artifacts.ts +24 -24
- package/packages/eslint-plugin-forge/src/rule-no-forge-guard-violation.ts +93 -93
- package/src/forge/_generated/actionSubscriptions.json +2 -2
- package/src/forge/_generated/actionSubscriptions.ts +3 -3
- package/src/forge/_generated/agentAdapterManifest.json +2 -2
- package/src/forge/_generated/agentAdapterManifest.ts +3 -3
- package/src/forge/_generated/agentContract.json +2 -2
- package/src/forge/_generated/agentContract.ts +6786 -2
- package/src/forge/_generated/agentQuickstart.md +1 -1
- package/src/forge/_generated/aiContext.ts +1 -1
- package/src/forge/_generated/aiModels.json +1 -1
- package/src/forge/_generated/aiModels.ts +1 -1
- package/src/forge/_generated/aiProviders.json +1 -1
- package/src/forge/_generated/aiProviders.ts +1 -1
- package/src/forge/_generated/aiRegistry.json +2 -2
- package/src/forge/_generated/aiRegistry.ts +3 -3
- package/src/forge/_generated/api.json +2 -2
- package/src/forge/_generated/api.ts +1 -1
- package/src/forge/_generated/appGraph.json +2 -2
- package/src/forge/_generated/appGraph.ts +1297 -1141
- package/src/forge/_generated/appMap.md +1 -1
- package/src/forge/_generated/artifactManifest.json +2 -2
- package/src/forge/_generated/artifactManifest.ts +2 -2
- package/src/forge/_generated/authClaims.json +1 -1
- package/src/forge/_generated/authClaims.ts +1 -1
- package/src/forge/_generated/authConfig.json +1 -1
- package/src/forge/_generated/authConfig.ts +1 -1
- package/src/forge/_generated/authContext.ts +1 -1
- package/src/forge/_generated/authRegistry.json +1 -1
- package/src/forge/_generated/authRegistry.ts +1 -1
- package/src/forge/_generated/buildInfo.json +2 -2
- package/src/forge/_generated/buildInfo.ts +4 -4
- package/src/forge/_generated/capabilityMap.json +2 -2
- package/src/forge/_generated/capabilityMap.md +1 -1
- package/src/forge/_generated/capabilityMap.ts +2 -2
- package/src/forge/_generated/client.ts +1 -1
- package/src/forge/_generated/clientApi.ts +1 -1
- package/src/forge/_generated/clientManifest.json +2 -2
- package/src/forge/_generated/clientManifest.ts +3 -3
- package/src/forge/_generated/clientTypes.ts +1 -1
- package/src/forge/_generated/configRegistry.json +1 -1
- package/src/forge/_generated/configRegistry.ts +1 -1
- package/src/forge/_generated/dataGraph.json +2 -2
- package/src/forge/_generated/dataGraph.ts +3 -3
- package/src/forge/_generated/db.json +1 -1
- package/src/forge/_generated/db.ts +1 -1
- package/src/forge/_generated/dbSecurityManifest.json +1 -1
- package/src/forge/_generated/dbSecurityManifest.ts +1 -1
- package/src/forge/_generated/dbSessionContext.json +1 -1
- package/src/forge/_generated/dbSessionContext.ts +1 -1
- package/src/forge/_generated/deployManifest.json +2 -2
- package/src/forge/_generated/deployManifest.ts +7 -7
- package/src/forge/_generated/devManifest.json +2 -2
- package/src/forge/_generated/devManifest.ts +3 -3
- package/src/forge/_generated/envSchema.json +1 -1
- package/src/forge/_generated/envSchema.ts +1 -1
- package/src/forge/_generated/frontendGraph.json +1 -1
- package/src/forge/_generated/frontendGraph.ts +1 -1
- package/src/forge/_generated/importGuards.json +2 -2
- package/src/forge/_generated/importGuards.ts +35 -1
- package/src/forge/_generated/index.ts +1 -1
- package/src/forge/_generated/liveProductionManifest.json +1 -1
- package/src/forge/_generated/liveProductionManifest.ts +1 -1
- package/src/forge/_generated/liveProtocol.json +1 -1
- package/src/forge/_generated/liveProtocol.ts +1 -1
- package/src/forge/_generated/liveQueryRegistry.json +2 -2
- package/src/forge/_generated/liveQueryRegistry.ts +3 -3
- package/src/forge/_generated/liveTransportConfig.json +1 -1
- package/src/forge/_generated/liveTransportConfig.ts +1 -1
- package/src/forge/_generated/makeRegistry.json +2 -2
- package/src/forge/_generated/makeRegistry.ts +2 -2
- package/src/forge/_generated/makeTemplates.json +1 -1
- package/src/forge/_generated/makeTemplates.ts +1 -1
- package/src/forge/_generated/mockMap.json +1 -1
- package/src/forge/_generated/mockMap.ts +1 -1
- package/src/forge/_generated/operationPlaybooks.md +7 -5
- package/src/forge/_generated/packageGraph.json +2 -2
- package/src/forge/_generated/packageGraph.ts +90964 -14284
- package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
- package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
- package/src/forge/_generated/permissionMatrix.json +2 -2
- package/src/forge/_generated/permissionMatrix.ts +3 -3
- package/src/forge/_generated/policyRegistry.json +2 -2
- package/src/forge/_generated/policyRegistry.ts +3 -3
- package/src/forge/_generated/queryRegistry.json +2 -2
- package/src/forge/_generated/queryRegistry.ts +3 -3
- package/src/forge/_generated/react.d.ts +1 -1
- package/src/forge/_generated/react.ts +1 -1
- package/src/forge/_generated/reactManifest.json +2 -2
- package/src/forge/_generated/reactManifest.ts +3 -3
- package/src/forge/_generated/releaseManifest.json +2 -2
- package/src/forge/_generated/releaseManifest.ts +3 -3
- package/src/forge/_generated/rlsPolicies.json +1 -1
- package/src/forge/_generated/rlsPolicies.sql +1 -1
- package/src/forge/_generated/rlsPolicies.ts +1 -1
- package/src/forge/_generated/runtimeGraph.json +2 -2
- package/src/forge/_generated/runtimeGraph.ts +3 -3
- package/src/forge/_generated/runtimeMatrix.json +2 -2
- package/src/forge/_generated/runtimeMatrix.ts +106177 -7917
- package/src/forge/_generated/runtimeRegistry.ts +1 -1
- package/src/forge/_generated/runtimeRules.md +1 -1
- package/src/forge/_generated/secretRegistry.json +1 -1
- package/src/forge/_generated/secretRegistry.ts +1 -1
- package/src/forge/_generated/secretsContext.ts +1 -1
- package/src/forge/_generated/serverApi.ts +1 -1
- package/src/forge/_generated/sourceMapManifest.json +2 -2
- package/src/forge/_generated/sourceMapManifest.ts +2 -2
- package/src/forge/_generated/sqlPlan.json +1 -1
- package/src/forge/_generated/sqlPlan.ts +1 -1
- package/src/forge/_generated/subscriptionManifest.json +2 -2
- package/src/forge/_generated/subscriptionManifest.ts +3 -3
- package/src/forge/_generated/symbolicationManifest.json +2 -2
- package/src/forge/_generated/symbolicationManifest.ts +2 -2
- package/src/forge/_generated/telemetryRegistry.json +2 -2
- package/src/forge/_generated/telemetryRegistry.ts +3 -3
- package/src/forge/_generated/telemetrySinks.json +2 -2
- package/src/forge/_generated/telemetrySinks.ts +2 -2
- package/src/forge/_generated/tenantScope.json +2 -2
- package/src/forge/_generated/tenantScope.ts +3 -3
- package/src/forge/_generated/testGraph.json +2 -2
- package/src/forge/_generated/testGraph.ts +129 -75
- package/src/forge/_generated/testPlanRegistry.json +2 -2
- package/src/forge/_generated/testPlanRegistry.ts +2 -2
- package/src/forge/_generated/uiRoutes.json +1 -1
- package/src/forge/_generated/uiRoutes.ts +1 -1
- package/src/forge/_generated/uiScenarios.json +1 -1
- package/src/forge/_generated/uiScenarios.ts +1 -1
- package/src/forge/_generated/uiTestManifest.json +2 -2
- package/src/forge/_generated/uiTestManifest.ts +2 -2
- package/src/forge/_generated/workflowRegistry.json +2 -2
- package/src/forge/_generated/workflowRegistry.ts +3 -3
- package/src/forge/_generated/workflowSubscriptions.json +2 -2
- package/src/forge/_generated/workflowSubscriptions.ts +3 -3
- package/src/forge/cli/commands.ts +861 -861
- package/src/forge/cli/deps.ts +178 -11
- package/src/forge/cli/dev.ts +32 -5
- package/src/forge/cli/index.ts +7 -7
- package/src/forge/cli/main.ts +54 -54
- package/src/forge/cli/new.ts +29 -1
- package/src/forge/cli/output.ts +97 -97
- package/src/forge/cli/parse.ts +679 -673
- package/src/forge/cli/version.ts +1 -1
- package/src/forge/compiler/agent-contract/build.ts +28 -0
- package/src/forge/compiler/agent-contract/types.ts +16 -0
- package/src/forge/compiler/app-graph/build.ts +112 -112
- package/src/forge/compiler/app-graph/classify.ts +10 -10
- package/src/forge/compiler/app-graph/dup-symbol.ts +29 -29
- package/src/forge/compiler/app-graph/extract.ts +123 -123
- package/src/forge/compiler/app-graph/forge-apis.ts +29 -29
- package/src/forge/compiler/app-graph/index.ts +11 -11
- package/src/forge/compiler/app-graph/module-graph.ts +316 -316
- package/src/forge/compiler/app-graph/parser.ts +119 -119
- package/src/forge/compiler/app-graph/symbols.ts +48 -48
- package/src/forge/compiler/app-graph/tsconfig-hash.ts +62 -62
- package/src/forge/compiler/app-graph/types.ts +43 -43
- package/src/forge/compiler/app-graph/versions.ts +14 -14
- package/src/forge/compiler/cache/index.ts +17 -17
- package/src/forge/compiler/cache/key.ts +46 -46
- package/src/forge/compiler/cache/scheduler.ts +72 -72
- package/src/forge/compiler/cache/store.ts +78 -78
- package/src/forge/compiler/classifier/capabilities.ts +78 -78
- package/src/forge/compiler/classifier/classify.ts +113 -113
- package/src/forge/compiler/classifier/contexts.ts +188 -188
- package/src/forge/compiler/classifier/index.ts +18 -18
- package/src/forge/compiler/classifier/runtime-matrix.ts +45 -45
- package/src/forge/compiler/classifier/secrets.ts +41 -41
- package/src/forge/compiler/classifier/signals.ts +129 -129
- package/src/forge/compiler/diagnostics/codes.ts +125 -120
- package/src/forge/compiler/diagnostics/create.ts +87 -87
- package/src/forge/compiler/diagnostics/index.ts +41 -41
- package/src/forge/compiler/emitter/artifact-kind.ts +14 -14
- package/src/forge/compiler/emitter/barrel.ts +38 -38
- package/src/forge/compiler/emitter/constants.ts +7 -7
- package/src/forge/compiler/emitter/emit.ts +234 -237
- package/src/forge/compiler/emitter/index.ts +24 -24
- package/src/forge/compiler/emitter/lock.ts +61 -61
- package/src/forge/compiler/emitter/render.ts +73 -73
- package/src/forge/compiler/guards/artifacts.ts +96 -96
- package/src/forge/compiler/guards/check-import-guards.ts +106 -106
- package/src/forge/compiler/guards/index.ts +11 -11
- package/src/forge/compiler/guards/propagate-contexts.ts +57 -57
- package/src/forge/compiler/index.ts +17 -17
- package/src/forge/compiler/integration/add.ts +493 -493
- package/src/forge/compiler/integration/index.ts +17 -17
- package/src/forge/compiler/integration/plan.ts +279 -279
- package/src/forge/compiler/integration/render.ts +189 -189
- package/src/forge/compiler/integration/snapshot.ts +52 -52
- package/src/forge/compiler/orchestrator/discover.ts +214 -214
- package/src/forge/compiler/orchestrator/guards.ts +5 -5
- package/src/forge/compiler/orchestrator/index.ts +27 -27
- package/src/forge/compiler/orchestrator/manifest.ts +69 -69
- package/src/forge/compiler/orchestrator/orphans.ts +51 -51
- package/src/forge/compiler/orchestrator/plan.ts +804 -804
- package/src/forge/compiler/orchestrator/run.ts +178 -178
- package/src/forge/compiler/orchestrator/serialize.ts +859 -859
- package/src/forge/compiler/orchestrator/types.ts +23 -23
- package/src/forge/compiler/orchestrator/verify.ts +35 -35
- package/src/forge/compiler/package-graph/capabilities-stub.ts +33 -33
- package/src/forge/compiler/package-graph/checksum.ts +107 -97
- package/src/forge/compiler/package-graph/compiler.ts +444 -363
- package/src/forge/compiler/package-graph/constants.ts +4 -4
- package/src/forge/compiler/package-graph/exports-discovery.ts +91 -84
- package/src/forge/compiler/package-graph/extract-dts.ts +32 -32
- package/src/forge/compiler/package-graph/index.ts +24 -24
- package/src/forge/compiler/package-graph/jsdoc.ts +50 -50
- package/src/forge/compiler/package-graph/oracle.ts +326 -0
- package/src/forge/compiler/package-graph/read-file.ts +21 -21
- package/src/forge/compiler/package-graph/resolve.ts +131 -127
- package/src/forge/compiler/package-manager/adapter.ts +232 -232
- package/src/forge/compiler/package-manager/commands.ts +47 -47
- package/src/forge/compiler/package-manager/detect.ts +65 -65
- package/src/forge/compiler/package-manager/executor.ts +29 -29
- package/src/forge/compiler/package-manager/index.ts +22 -22
- package/src/forge/compiler/package-manager/parse-spec.ts +16 -16
- package/src/forge/compiler/package-manager/version.ts +20 -20
- package/src/forge/compiler/primitives/compare.ts +26 -26
- package/src/forge/compiler/primitives/hash.ts +42 -33
- package/src/forge/compiler/primitives/header.ts +43 -43
- package/src/forge/compiler/primitives/index.ts +45 -45
- package/src/forge/compiler/primitives/paths.ts +24 -24
- package/src/forge/compiler/primitives/serialize.ts +66 -66
- package/src/forge/compiler/primitives/sort.ts +87 -87
- package/src/forge/compiler/recipes/definitions.ts +269 -269
- package/src/forge/compiler/recipes/helpers.ts +37 -37
- package/src/forge/compiler/recipes/index.ts +21 -21
- package/src/forge/compiler/recipes/registry.ts +87 -87
- package/src/forge/compiler/sandbox/artifact-sanitize.ts +26 -26
- package/src/forge/compiler/sandbox/backends/child.ts +123 -123
- package/src/forge/compiler/sandbox/backends/docker.ts +173 -173
- package/src/forge/compiler/sandbox/index.ts +51 -51
- package/src/forge/compiler/sandbox/inspect.ts +143 -143
- package/src/forge/compiler/sandbox/inspector-entry.ts +115 -115
- package/src/forge/compiler/sandbox/limits.ts +31 -31
- package/src/forge/compiler/sandbox/scrub-env.ts +60 -60
- package/src/forge/compiler/sandbox/secret-scan.ts +54 -54
- package/src/forge/compiler/sandbox/serialize.ts +106 -106
- package/src/forge/compiler/sandbox/types.ts +7 -7
- package/src/forge/compiler/types/app-graph.ts +71 -71
- package/src/forge/compiler/types/capability.ts +29 -29
- package/src/forge/compiler/types/classification.ts +9 -9
- package/src/forge/compiler/types/cli.ts +85 -85
- package/src/forge/compiler/types/diagnostic.ts +2 -2
- package/src/forge/compiler/types/emit.ts +25 -25
- package/src/forge/compiler/types/import-guards.ts +19 -19
- package/src/forge/compiler/types/index.ts +98 -98
- package/src/forge/compiler/types/integration.ts +25 -25
- package/src/forge/compiler/types/json.ts +3 -3
- package/src/forge/compiler/types/lock.ts +37 -37
- package/src/forge/compiler/types/package-graph.ts +122 -77
- package/src/forge/compiler/types/runtime-matrix.ts +16 -16
- package/src/forge/compiler/types/runtime.ts +30 -30
- package/src/forge/compiler/types/sandbox.ts +24 -24
- package/src/forge/dev/server.ts +16 -2
- package/src/forge/refactor/index.ts +10 -2
- package/src/forge/refactor/runtime-rename.ts +598 -0
- package/src/forge/runtime/executor.ts +3 -2
- package/src/forge/runtime/live/live-query-runner.ts +2 -1
- package/src/forge/runtime/outbox/process.ts +2 -1
- package/src/forge/runtime/query/run-query.ts +2 -1
- package/src/forge/runtime/runner/run-entry.ts +2 -1
- package/src/forge/runtime/telemetry/sinks/posthog.ts +4 -5
- package/src/forge/runtime/telemetry/sinks/sentry.ts +4 -5
- package/src/forge/runtime/workflows/resolve-step.ts +2 -1
- package/src/forge/version.ts +3 -0
- package/templates/b2b-support-web/src/actions/captureTicketCreated.ts +7 -2
- package/templates/b2b-support-web/src/commands/closeTicket.ts +6 -1
- package/templates/b2b-support-web/src/commands/createTicket.ts +8 -2
- package/templates/b2b-support-web/src/queries/getTicket.ts +8 -1
- package/templates/b2b-support-web/web/components/CreateTicketForm.tsx +1 -2
- package/templates/b2b-support-web/web/components/PolicyDeniedDemo.tsx +1 -2
- package/templates/b2b-support-web/web/components/TicketList.tsx +1 -2
- package/templates/b2b-support-web/web/components/TraceDetails.tsx +1 -1
- package/templates/b2b-support-web/web/lib/forge.ts +1 -0
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { nodeFileSystem } from "../fs/index.ts";
|
|
3
3
|
import type { PackageManager } from "../types/runtime.ts";
|
|
4
|
-
|
|
5
|
-
/** Lockfiles checked in priority order when `packageManager` is absent. */
|
|
6
|
-
export const LOCKFILE_PM_MAP: readonly { file: string; pm: PackageManager }[] = [
|
|
7
|
-
{ file: "bun.lockb", pm: "bun" },
|
|
8
|
-
{ file: "bun.lock", pm: "bun" },
|
|
9
|
-
{ file: "pnpm-lock.yaml", pm: "pnpm" },
|
|
10
|
-
{ file: "yarn.lock", pm: "yarn" },
|
|
11
|
-
{ file: "package-lock.json", pm: "npm" },
|
|
12
|
-
] as const;
|
|
13
|
-
|
|
14
|
-
const PM_FROM_FIELD = /^(bun|npm|pnpm|yarn)(?:@|$)/;
|
|
15
|
-
|
|
16
|
-
export function parsePackageManagerField(value: string): PackageManager | null {
|
|
17
|
-
const match = value.trim().match(PM_FROM_FIELD);
|
|
18
|
-
return match ? (match[1] as PackageManager) : null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function getLockfileForPm(pm: PackageManager): string {
|
|
22
|
-
switch (pm) {
|
|
23
|
-
case "bun":
|
|
24
|
-
return "bun.lock";
|
|
25
|
-
case "npm":
|
|
26
|
-
return "package-lock.json";
|
|
27
|
-
case "pnpm":
|
|
28
|
-
return "pnpm-lock.yaml";
|
|
29
|
-
case "yarn":
|
|
30
|
-
return "yarn.lock";
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** All lockfile names that may exist for a given package manager. */
|
|
35
|
-
export function getLockfileCandidates(pm: PackageManager): readonly string[] {
|
|
36
|
-
if (pm === "bun") {
|
|
37
|
-
return ["bun.lock", "bun.lockb"];
|
|
38
|
-
}
|
|
39
|
-
return [getLockfileForPm(pm)];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function detectPackageManagerFromLockfiles(
|
|
43
|
-
workspaceRoot: string,
|
|
44
|
-
): PackageManager | null {
|
|
45
|
-
for (const { file, pm } of LOCKFILE_PM_MAP) {
|
|
46
|
-
if (nodeFileSystem.exists(join(workspaceRoot, file))) {
|
|
47
|
-
return pm;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return null;
|
|
51
|
-
}
|
|
52
|
-
|
|
4
|
+
|
|
5
|
+
/** Lockfiles checked in priority order when `packageManager` is absent. */
|
|
6
|
+
export const LOCKFILE_PM_MAP: readonly { file: string; pm: PackageManager }[] = [
|
|
7
|
+
{ file: "bun.lockb", pm: "bun" },
|
|
8
|
+
{ file: "bun.lock", pm: "bun" },
|
|
9
|
+
{ file: "pnpm-lock.yaml", pm: "pnpm" },
|
|
10
|
+
{ file: "yarn.lock", pm: "yarn" },
|
|
11
|
+
{ file: "package-lock.json", pm: "npm" },
|
|
12
|
+
] as const;
|
|
13
|
+
|
|
14
|
+
const PM_FROM_FIELD = /^(bun|npm|pnpm|yarn)(?:@|$)/;
|
|
15
|
+
|
|
16
|
+
export function parsePackageManagerField(value: string): PackageManager | null {
|
|
17
|
+
const match = value.trim().match(PM_FROM_FIELD);
|
|
18
|
+
return match ? (match[1] as PackageManager) : null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getLockfileForPm(pm: PackageManager): string {
|
|
22
|
+
switch (pm) {
|
|
23
|
+
case "bun":
|
|
24
|
+
return "bun.lock";
|
|
25
|
+
case "npm":
|
|
26
|
+
return "package-lock.json";
|
|
27
|
+
case "pnpm":
|
|
28
|
+
return "pnpm-lock.yaml";
|
|
29
|
+
case "yarn":
|
|
30
|
+
return "yarn.lock";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** All lockfile names that may exist for a given package manager. */
|
|
35
|
+
export function getLockfileCandidates(pm: PackageManager): readonly string[] {
|
|
36
|
+
if (pm === "bun") {
|
|
37
|
+
return ["bun.lock", "bun.lockb"];
|
|
38
|
+
}
|
|
39
|
+
return [getLockfileForPm(pm)];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function detectPackageManagerFromLockfiles(
|
|
43
|
+
workspaceRoot: string,
|
|
44
|
+
): PackageManager | null {
|
|
45
|
+
for (const { file, pm } of LOCKFILE_PM_MAP) {
|
|
46
|
+
if (nodeFileSystem.exists(join(workspaceRoot, file))) {
|
|
47
|
+
return pm;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
53
|
/**
|
|
54
54
|
* Detect the active package manager via `package.json#packageManager` or lockfile presence.
|
|
55
55
|
* Defaults to `npm` when the project has not declared a package manager.
|
|
@@ -58,22 +58,22 @@ export function detectPackageManagerFromLockfiles(
|
|
|
58
58
|
* launches from ambiguous `bun` associations.
|
|
59
59
|
*/
|
|
60
60
|
export function detectPackageManager(workspaceRoot: string): PackageManager {
|
|
61
|
-
const pkgPath = join(workspaceRoot, "package.json");
|
|
62
|
-
if (nodeFileSystem.exists(pkgPath)) {
|
|
63
|
-
try {
|
|
64
|
-
const pkg = JSON.parse((nodeFileSystem.readText(pkgPath) ?? "")) as {
|
|
65
|
-
packageManager?: string;
|
|
66
|
-
};
|
|
67
|
-
if (pkg.packageManager) {
|
|
68
|
-
const fromField = parsePackageManagerField(pkg.packageManager);
|
|
69
|
-
if (fromField) {
|
|
70
|
-
return fromField;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
} catch {
|
|
74
|
-
// fall through to lockfile detection
|
|
75
|
-
}
|
|
76
|
-
}
|
|
61
|
+
const pkgPath = join(workspaceRoot, "package.json");
|
|
62
|
+
if (nodeFileSystem.exists(pkgPath)) {
|
|
63
|
+
try {
|
|
64
|
+
const pkg = JSON.parse((nodeFileSystem.readText(pkgPath) ?? "")) as {
|
|
65
|
+
packageManager?: string;
|
|
66
|
+
};
|
|
67
|
+
if (pkg.packageManager) {
|
|
68
|
+
const fromField = parsePackageManagerField(pkg.packageManager);
|
|
69
|
+
if (fromField) {
|
|
70
|
+
return fromField;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
} catch {
|
|
74
|
+
// fall through to lockfile detection
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
77
|
|
|
78
78
|
return detectPackageManagerFromLockfiles(workspaceRoot) ?? "npm";
|
|
79
79
|
}
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
export interface CommandRunOptions {
|
|
10
10
|
cwd: string;
|
|
11
11
|
env?: Record<string, string | undefined>;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface CommandRunResult {
|
|
15
|
-
exitCode: number;
|
|
16
|
-
stdout: string;
|
|
17
|
-
stderr: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface CommandRunResult {
|
|
15
|
+
exitCode: number;
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
20
|
export interface CommandExecutor {
|
|
21
21
|
run(argv: string[], options: CommandRunOptions): Promise<CommandRunResult>;
|
|
22
22
|
}
|
|
@@ -67,27 +67,27 @@ function resolveWindowsCommand(command: string): string {
|
|
|
67
67
|
|
|
68
68
|
return command;
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
export class PackageManagerCommandError extends Error {
|
|
72
|
-
readonly exitCode: number;
|
|
73
|
-
readonly stdout: string;
|
|
74
|
-
readonly stderr: string;
|
|
75
|
-
readonly argv: readonly string[];
|
|
76
|
-
|
|
77
|
-
constructor(
|
|
78
|
-
message: string,
|
|
79
|
-
argv: readonly string[],
|
|
80
|
-
result: CommandRunResult,
|
|
81
|
-
) {
|
|
82
|
-
super(message);
|
|
83
|
-
this.name = "PackageManagerCommandError";
|
|
84
|
-
this.argv = argv;
|
|
85
|
-
this.exitCode = result.exitCode;
|
|
86
|
-
this.stdout = result.stdout;
|
|
87
|
-
this.stderr = result.stderr;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
70
|
+
|
|
71
|
+
export class PackageManagerCommandError extends Error {
|
|
72
|
+
readonly exitCode: number;
|
|
73
|
+
readonly stdout: string;
|
|
74
|
+
readonly stderr: string;
|
|
75
|
+
readonly argv: readonly string[];
|
|
76
|
+
|
|
77
|
+
constructor(
|
|
78
|
+
message: string,
|
|
79
|
+
argv: readonly string[],
|
|
80
|
+
result: CommandRunResult,
|
|
81
|
+
) {
|
|
82
|
+
super(message);
|
|
83
|
+
this.name = "PackageManagerCommandError";
|
|
84
|
+
this.argv = argv;
|
|
85
|
+
this.exitCode = result.exitCode;
|
|
86
|
+
this.stdout = result.stdout;
|
|
87
|
+
this.stderr = result.stderr;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
91
|
export const defaultCommandExecutor: CommandExecutor = {
|
|
92
92
|
async run(argv, options) {
|
|
93
93
|
const resolvedArgv = resolvePackageManagerArgv(argv);
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
PackageManagerAdapter,
|
|
3
|
-
DryRunAddResult,
|
|
4
|
-
CreatePackageManagerAdapterOptions,
|
|
5
|
-
} from "./adapter.ts";
|
|
6
|
-
export {
|
|
7
|
-
createPackageManagerAdapter,
|
|
8
|
-
detectAndCreatePackageManagerAdapter,
|
|
9
|
-
dryRunRecipeFallbackMessage,
|
|
10
|
-
detectPackageManager,
|
|
11
|
-
detectPackageManagerFromLockfiles,
|
|
12
|
-
getLockfileForPm,
|
|
13
|
-
getLockfileCandidates,
|
|
14
|
-
parsePackageManagerField,
|
|
15
|
-
LOCKFILE_PM_MAP,
|
|
16
|
-
buildAddCommand,
|
|
17
|
-
parsePackageName,
|
|
18
|
-
readInstalledVersion,
|
|
19
|
-
defaultCommandExecutor,
|
|
20
|
-
PackageManagerCommandError,
|
|
21
|
-
} from "./adapter.ts";
|
|
22
|
-
export type { CommandExecutor, CommandRunResult } from "./executor.ts";
|
|
1
|
+
export type {
|
|
2
|
+
PackageManagerAdapter,
|
|
3
|
+
DryRunAddResult,
|
|
4
|
+
CreatePackageManagerAdapterOptions,
|
|
5
|
+
} from "./adapter.ts";
|
|
6
|
+
export {
|
|
7
|
+
createPackageManagerAdapter,
|
|
8
|
+
detectAndCreatePackageManagerAdapter,
|
|
9
|
+
dryRunRecipeFallbackMessage,
|
|
10
|
+
detectPackageManager,
|
|
11
|
+
detectPackageManagerFromLockfiles,
|
|
12
|
+
getLockfileForPm,
|
|
13
|
+
getLockfileCandidates,
|
|
14
|
+
parsePackageManagerField,
|
|
15
|
+
LOCKFILE_PM_MAP,
|
|
16
|
+
buildAddCommand,
|
|
17
|
+
parsePackageName,
|
|
18
|
+
readInstalledVersion,
|
|
19
|
+
defaultCommandExecutor,
|
|
20
|
+
PackageManagerCommandError,
|
|
21
|
+
} from "./adapter.ts";
|
|
22
|
+
export type { CommandExecutor, CommandRunResult } from "./executor.ts";
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse a package name from an install spec (e.g. "lodash@4.17.21", "@scope/pkg@1.0.0").
|
|
3
|
-
*/
|
|
4
|
-
export function parsePackageName(spec: string): string {
|
|
5
|
-
const trimmed = spec.trim();
|
|
6
|
-
if (trimmed.startsWith("@")) {
|
|
7
|
-
const slashIdx = trimmed.indexOf("/");
|
|
8
|
-
if (slashIdx === -1) {
|
|
9
|
-
return trimmed;
|
|
10
|
-
}
|
|
11
|
-
const versionAt = trimmed.indexOf("@", slashIdx + 1);
|
|
12
|
-
return versionAt === -1 ? trimmed : trimmed.slice(0, versionAt);
|
|
13
|
-
}
|
|
14
|
-
const atIdx = trimmed.indexOf("@");
|
|
15
|
-
return atIdx === -1 ? trimmed : trimmed.slice(0, atIdx);
|
|
16
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Parse a package name from an install spec (e.g. "lodash@4.17.21", "@scope/pkg@1.0.0").
|
|
3
|
+
*/
|
|
4
|
+
export function parsePackageName(spec: string): string {
|
|
5
|
+
const trimmed = spec.trim();
|
|
6
|
+
if (trimmed.startsWith("@")) {
|
|
7
|
+
const slashIdx = trimmed.indexOf("/");
|
|
8
|
+
if (slashIdx === -1) {
|
|
9
|
+
return trimmed;
|
|
10
|
+
}
|
|
11
|
+
const versionAt = trimmed.indexOf("@", slashIdx + 1);
|
|
12
|
+
return versionAt === -1 ? trimmed : trimmed.slice(0, versionAt);
|
|
13
|
+
}
|
|
14
|
+
const atIdx = trimmed.indexOf("@");
|
|
15
|
+
return atIdx === -1 ? trimmed : trimmed.slice(0, atIdx);
|
|
16
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { nodeFileSystem } from "../fs/index.ts";
|
|
3
3
|
import { parsePackageName } from "./parse-spec.ts";
|
|
4
|
-
|
|
5
|
-
export function readInstalledVersion(
|
|
6
|
-
specOrName: string,
|
|
7
|
-
cwd: string,
|
|
8
|
-
): string | null {
|
|
4
|
+
|
|
5
|
+
export function readInstalledVersion(
|
|
6
|
+
specOrName: string,
|
|
7
|
+
cwd: string,
|
|
8
|
+
): string | null {
|
|
9
9
|
const name = parsePackageName(specOrName);
|
|
10
10
|
const segments = name.startsWith("@")
|
|
11
11
|
? name.split("/")
|
|
12
12
|
: [name];
|
|
13
|
-
const pkgJsonPath = join(cwd, "node_modules", ...segments, "package.json");
|
|
14
|
-
|
|
15
|
-
if (!nodeFileSystem.exists(pkgJsonPath)) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
try {
|
|
20
|
-
const pkg = JSON.parse((nodeFileSystem.readText(pkgJsonPath) ?? "")) as {
|
|
21
|
-
version?: string;
|
|
22
|
-
};
|
|
23
|
-
return typeof pkg.version === "string" ? pkg.version : null;
|
|
24
|
-
} catch {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
13
|
+
const pkgJsonPath = join(cwd, "node_modules", ...segments, "package.json");
|
|
14
|
+
|
|
15
|
+
if (!nodeFileSystem.exists(pkgJsonPath)) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const pkg = JSON.parse((nodeFileSystem.readText(pkgJsonPath) ?? "")) as {
|
|
21
|
+
version?: string;
|
|
22
|
+
};
|
|
23
|
+
return typeof pkg.version === "string" ? pkg.version : null;
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compare two strings by UTF-8 byte sequence (case-sensitive, locale-independent).
|
|
3
|
-
* Returns negative if a < b, positive if a > b, zero if equal.
|
|
4
|
-
*/
|
|
5
|
-
export function compareBytes(a: string, b: string): number {
|
|
6
|
-
const aBytes = new TextEncoder().encode(a);
|
|
7
|
-
const bBytes = new TextEncoder().encode(b);
|
|
8
|
-
const len = Math.min(aBytes.length, bBytes.length);
|
|
9
|
-
|
|
10
|
-
for (let i = 0; i < len; i++) {
|
|
11
|
-
const diff = aBytes[i]! - bBytes[i]!;
|
|
12
|
-
if (diff !== 0) {
|
|
13
|
-
return diff;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return aBytes.length - bBytes.length;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function compareBytesAsc(a: string, b: string): number {
|
|
21
|
-
return compareBytes(a, b);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function compareBytesDesc(a: string, b: string): number {
|
|
25
|
-
return compareBytes(b, a);
|
|
26
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Compare two strings by UTF-8 byte sequence (case-sensitive, locale-independent).
|
|
3
|
+
* Returns negative if a < b, positive if a > b, zero if equal.
|
|
4
|
+
*/
|
|
5
|
+
export function compareBytes(a: string, b: string): number {
|
|
6
|
+
const aBytes = new TextEncoder().encode(a);
|
|
7
|
+
const bBytes = new TextEncoder().encode(b);
|
|
8
|
+
const len = Math.min(aBytes.length, bBytes.length);
|
|
9
|
+
|
|
10
|
+
for (let i = 0; i < len; i++) {
|
|
11
|
+
const diff = aBytes[i]! - bBytes[i]!;
|
|
12
|
+
if (diff !== 0) {
|
|
13
|
+
return diff;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return aBytes.length - bBytes.length;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function compareBytesAsc(a: string, b: string): number {
|
|
21
|
+
return compareBytes(a, b);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function compareBytesDesc(a: string, b: string): number {
|
|
25
|
+
return compareBytes(b, a);
|
|
26
|
+
}
|
|
@@ -1,40 +1,49 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { stripDeterministicHeader } from "./header.ts";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* SHA-256 hash of UTF-8
|
|
6
|
-
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* SHA-256 hash of UTF-8 text, returned as lowercase hex.
|
|
6
|
+
*
|
|
7
|
+
* Forge generated artifacts must be stable across Windows and Linux checkouts.
|
|
8
|
+
* Git may materialize source files with CRLF locally and LF in CI, so text
|
|
9
|
+
* hashes normalize line endings. Use hashUtf8Bytes when byte-level identity is
|
|
10
|
+
* required.
|
|
11
|
+
*/
|
|
7
12
|
export function hashStable(content: string): string {
|
|
8
|
-
return createHash("sha256").update(content).digest("hex");
|
|
13
|
+
return createHash("sha256").update(normalizeHashText(content)).digest("hex");
|
|
9
14
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
15
|
+
|
|
16
|
+
export function normalizeHashText(content: string): string {
|
|
17
|
+
return content.replace(/\r\n?/g, "\n");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Hash content after stripping the deterministic header (for diff/cache keys).
|
|
22
|
+
*/
|
|
23
|
+
export function hashStableBody(content: string): string {
|
|
24
|
+
return hashStable(stripDeterministicHeader(content));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface StableSymbolIdInput {
|
|
28
|
+
kind: string;
|
|
29
|
+
canonicalModulePath: string;
|
|
30
|
+
qualifiedName: string;
|
|
31
|
+
exportPath: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Derive a collision-safe stable symbol id from kind + module + name + export path.
|
|
36
|
+
*/
|
|
37
|
+
export function deriveStableSymbolId(input: StableSymbolIdInput): string {
|
|
38
|
+
const parts = [
|
|
39
|
+
input.kind,
|
|
40
|
+
input.canonicalModulePath,
|
|
41
|
+
input.qualifiedName,
|
|
42
|
+
input.exportPath,
|
|
43
|
+
];
|
|
44
|
+
return hashStable(parts.join("\0"));
|
|
45
|
+
}
|
|
46
|
+
|
|
38
47
|
export function hashUtf8Bytes(bytes: Uint8Array): string {
|
|
39
48
|
return createHash("sha256").update(bytes).digest("hex");
|
|
40
49
|
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import { hashStable } from "./hash.ts";
|
|
2
|
-
|
|
3
|
-
export const DETERMINISTIC_HEADER_PREFIX = "// @forge-generated";
|
|
4
|
-
|
|
5
|
-
export interface DeterministicHeaderFields {
|
|
6
|
-
generatorVersion: string;
|
|
7
|
-
inputHash: string;
|
|
8
|
-
contentHash: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
1
|
+
import { hashStable } from "./hash.ts";
|
|
2
|
+
|
|
3
|
+
export const DETERMINISTIC_HEADER_PREFIX = "// @forge-generated";
|
|
4
|
+
|
|
5
|
+
export interface DeterministicHeaderFields {
|
|
6
|
+
generatorVersion: string;
|
|
7
|
+
inputHash: string;
|
|
8
|
+
contentHash: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
11
|
const HEADER_PATTERN =
|
|
12
12
|
/^\/\/ @forge-generated generator=([^\s]+) input=([^\s]+) content=([^\s]+)\r?\n/;
|
|
13
|
-
|
|
14
|
-
export function formatDeterministicHeader(
|
|
15
|
-
fields: DeterministicHeaderFields,
|
|
16
|
-
): string {
|
|
17
|
-
return `${DETERMINISTIC_HEADER_PREFIX} generator=${fields.generatorVersion} input=${fields.inputHash} content=${fields.contentHash}\n`;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function parseDeterministicHeader(
|
|
21
|
-
content: string,
|
|
22
|
-
): DeterministicHeaderFields | null {
|
|
23
|
-
const match = content.match(HEADER_PATTERN);
|
|
24
|
-
if (match === null) {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
generatorVersion: match[1]!,
|
|
30
|
-
inputHash: match[2]!,
|
|
31
|
-
contentHash: match[3]!,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function stripDeterministicHeader(content: string): string {
|
|
36
|
-
return content.replace(HEADER_PATTERN, "");
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function prependDeterministicHeader(
|
|
40
|
-
body: string,
|
|
41
|
-
fields: Omit<DeterministicHeaderFields, "contentHash">,
|
|
42
|
-
): string {
|
|
43
|
-
const contentHash = hashStable(body);
|
|
44
|
-
return formatDeterministicHeader({ ...fields, contentHash }) + body;
|
|
45
|
-
}
|
|
13
|
+
|
|
14
|
+
export function formatDeterministicHeader(
|
|
15
|
+
fields: DeterministicHeaderFields,
|
|
16
|
+
): string {
|
|
17
|
+
return `${DETERMINISTIC_HEADER_PREFIX} generator=${fields.generatorVersion} input=${fields.inputHash} content=${fields.contentHash}\n`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function parseDeterministicHeader(
|
|
21
|
+
content: string,
|
|
22
|
+
): DeterministicHeaderFields | null {
|
|
23
|
+
const match = content.match(HEADER_PATTERN);
|
|
24
|
+
if (match === null) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
generatorVersion: match[1]!,
|
|
30
|
+
inputHash: match[2]!,
|
|
31
|
+
contentHash: match[3]!,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function stripDeterministicHeader(content: string): string {
|
|
36
|
+
return content.replace(HEADER_PATTERN, "");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function prependDeterministicHeader(
|
|
40
|
+
body: string,
|
|
41
|
+
fields: Omit<DeterministicHeaderFields, "contentHash">,
|
|
42
|
+
): string {
|
|
43
|
+
const contentHash = hashStable(body);
|
|
44
|
+
return formatDeterministicHeader({ ...fields, contentHash }) + body;
|
|
45
|
+
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
export { Result, ok, err, isOk, isErr } from "./result.ts";
|
|
2
|
-
export type { Ok, Err } from "./result.ts";
|
|
3
|
-
export {
|
|
4
|
-
compareBytes,
|
|
5
|
-
compareBytesAsc,
|
|
6
|
-
compareBytesDesc,
|
|
7
|
-
} from "./compare.ts";
|
|
8
|
-
export { normalizePath, comparePaths } from "./paths.ts";
|
|
9
|
-
export {
|
|
10
|
-
hashStable,
|
|
11
|
-
hashStableBody,
|
|
12
|
-
deriveStableSymbolId,
|
|
13
|
-
hashUtf8Bytes,
|
|
14
|
-
} from "./hash.ts";
|
|
15
|
-
export type { StableSymbolIdInput } from "./hash.ts";
|
|
16
|
-
export {
|
|
17
|
-
DETERMINISTIC_HEADER_PREFIX,
|
|
18
|
-
formatDeterministicHeader,
|
|
19
|
-
parseDeterministicHeader,
|
|
20
|
-
stripDeterministicHeader,
|
|
21
|
-
prependDeterministicHeader,
|
|
22
|
-
} from "./header.ts";
|
|
23
|
-
export type { DeterministicHeaderFields } from "./header.ts";
|
|
24
|
-
export {
|
|
25
|
-
normalizeNewlines,
|
|
26
|
-
canonicalJson,
|
|
27
|
-
serializeCanonical,
|
|
28
|
-
serializeJsonValue,
|
|
29
|
-
} from "./serialize.ts";
|
|
30
|
-
export {
|
|
31
|
-
compareSymbols,
|
|
32
|
-
compareEdges,
|
|
33
|
-
comparePackages,
|
|
34
|
-
compareEntrypoints,
|
|
35
|
-
compareExports,
|
|
36
|
-
compareEmitFiles,
|
|
37
|
-
stableSortSymbols,
|
|
38
|
-
stableSortEdges,
|
|
39
|
-
stableSortPackages,
|
|
40
|
-
stableSortEntrypoints,
|
|
41
|
-
stableSortExports,
|
|
42
|
-
stableSortEmitFiles,
|
|
43
|
-
stableSortStrings,
|
|
44
|
-
stableSortByPath,
|
|
45
|
-
} from "./sort.ts";
|
|
1
|
+
export { Result, ok, err, isOk, isErr } from "./result.ts";
|
|
2
|
+
export type { Ok, Err } from "./result.ts";
|
|
3
|
+
export {
|
|
4
|
+
compareBytes,
|
|
5
|
+
compareBytesAsc,
|
|
6
|
+
compareBytesDesc,
|
|
7
|
+
} from "./compare.ts";
|
|
8
|
+
export { normalizePath, comparePaths } from "./paths.ts";
|
|
9
|
+
export {
|
|
10
|
+
hashStable,
|
|
11
|
+
hashStableBody,
|
|
12
|
+
deriveStableSymbolId,
|
|
13
|
+
hashUtf8Bytes,
|
|
14
|
+
} from "./hash.ts";
|
|
15
|
+
export type { StableSymbolIdInput } from "./hash.ts";
|
|
16
|
+
export {
|
|
17
|
+
DETERMINISTIC_HEADER_PREFIX,
|
|
18
|
+
formatDeterministicHeader,
|
|
19
|
+
parseDeterministicHeader,
|
|
20
|
+
stripDeterministicHeader,
|
|
21
|
+
prependDeterministicHeader,
|
|
22
|
+
} from "./header.ts";
|
|
23
|
+
export type { DeterministicHeaderFields } from "./header.ts";
|
|
24
|
+
export {
|
|
25
|
+
normalizeNewlines,
|
|
26
|
+
canonicalJson,
|
|
27
|
+
serializeCanonical,
|
|
28
|
+
serializeJsonValue,
|
|
29
|
+
} from "./serialize.ts";
|
|
30
|
+
export {
|
|
31
|
+
compareSymbols,
|
|
32
|
+
compareEdges,
|
|
33
|
+
comparePackages,
|
|
34
|
+
compareEntrypoints,
|
|
35
|
+
compareExports,
|
|
36
|
+
compareEmitFiles,
|
|
37
|
+
stableSortSymbols,
|
|
38
|
+
stableSortEdges,
|
|
39
|
+
stableSortPackages,
|
|
40
|
+
stableSortEntrypoints,
|
|
41
|
+
stableSortExports,
|
|
42
|
+
stableSortEmitFiles,
|
|
43
|
+
stableSortStrings,
|
|
44
|
+
stableSortByPath,
|
|
45
|
+
} from "./sort.ts";
|