@caryhu/codemine-forge 0.0.1-alpha.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.
Files changed (84) hide show
  1. package/README.md +108 -0
  2. package/dist/build-pipeline/browser-bundle.d.ts +31 -0
  3. package/dist/build-pipeline/browser-bundle.js +584 -0
  4. package/dist/build-pipeline/diagnostics.d.ts +7 -0
  5. package/dist/build-pipeline/diagnostics.js +68 -0
  6. package/dist/build-pipeline/index.d.ts +3 -0
  7. package/dist/build-pipeline/index.js +16 -0
  8. package/dist/build-pipeline/pipeline.d.ts +12 -0
  9. package/dist/build-pipeline/pipeline.js +273 -0
  10. package/dist/build-pipeline/types.d.ts +77 -0
  11. package/dist/build-pipeline/types.js +4 -0
  12. package/dist/dev-server-preview/diagnostics.d.ts +5 -0
  13. package/dist/dev-server-preview/diagnostics.js +40 -0
  14. package/dist/dev-server-preview/index.d.ts +4 -0
  15. package/dist/dev-server-preview/index.js +16 -0
  16. package/dist/dev-server-preview/preview-document.d.ts +2 -0
  17. package/dist/dev-server-preview/preview-document.js +153 -0
  18. package/dist/dev-server-preview/server.d.ts +26 -0
  19. package/dist/dev-server-preview/server.js +279 -0
  20. package/dist/dev-server-preview/types.d.ts +105 -0
  21. package/dist/dev-server-preview/types.js +4 -0
  22. package/dist/esbuild-wasm-worker/diagnostics.d.ts +12 -0
  23. package/dist/esbuild-wasm-worker/diagnostics.js +53 -0
  24. package/dist/esbuild-wasm-worker/index.d.ts +4 -0
  25. package/dist/esbuild-wasm-worker/index.js +18 -0
  26. package/dist/esbuild-wasm-worker/service.d.ts +26 -0
  27. package/dist/esbuild-wasm-worker/service.js +260 -0
  28. package/dist/esbuild-wasm-worker/types.d.ts +139 -0
  29. package/dist/esbuild-wasm-worker/types.js +5 -0
  30. package/dist/esbuild-wasm-worker/worker-adapter.d.ts +38 -0
  31. package/dist/esbuild-wasm-worker/worker-adapter.js +165 -0
  32. package/dist/esbuild-wasm-worker/worker.d.ts +1 -0
  33. package/dist/esbuild-wasm-worker/worker.js +4 -0
  34. package/dist/forge-controller.d.ts +38 -0
  35. package/dist/forge-controller.js +79 -0
  36. package/dist/index.d.ts +7 -0
  37. package/dist/index.js +88 -0
  38. package/dist/package-resolution/cdn-source.d.ts +11 -0
  39. package/dist/package-resolution/cdn-source.js +164 -0
  40. package/dist/package-resolution/diagnostics.d.ts +15 -0
  41. package/dist/package-resolution/diagnostics.js +51 -0
  42. package/dist/package-resolution/errors.d.ts +5 -0
  43. package/dist/package-resolution/errors.js +11 -0
  44. package/dist/package-resolution/index.d.ts +6 -0
  45. package/dist/package-resolution/index.js +23 -0
  46. package/dist/package-resolution/manifest.d.ts +5 -0
  47. package/dist/package-resolution/manifest.js +128 -0
  48. package/dist/package-resolution/resolver.d.ts +17 -0
  49. package/dist/package-resolution/resolver.js +172 -0
  50. package/dist/package-resolution/types.d.ts +98 -0
  51. package/dist/package-resolution/types.js +4 -0
  52. package/dist/terminal-commands/diagnostics.d.ts +3 -0
  53. package/dist/terminal-commands/diagnostics.js +21 -0
  54. package/dist/terminal-commands/index.d.ts +7 -0
  55. package/dist/terminal-commands/index.js +22 -0
  56. package/dist/terminal-commands/npm-build.d.ts +7 -0
  57. package/dist/terminal-commands/npm-build.js +63 -0
  58. package/dist/terminal-commands/npm-dev.d.ts +7 -0
  59. package/dist/terminal-commands/npm-dev.js +68 -0
  60. package/dist/terminal-commands/npm-install.d.ts +8 -0
  61. package/dist/terminal-commands/npm-install.js +56 -0
  62. package/dist/terminal-commands/parser.d.ts +2 -0
  63. package/dist/terminal-commands/parser.js +52 -0
  64. package/dist/terminal-commands/terminal.d.ts +12 -0
  65. package/dist/terminal-commands/terminal.js +73 -0
  66. package/dist/terminal-commands/types.d.ts +65 -0
  67. package/dist/terminal-commands/types.js +4 -0
  68. package/dist/virtual-file-system/diagnostics.d.ts +14 -0
  69. package/dist/virtual-file-system/diagnostics.js +55 -0
  70. package/dist/virtual-file-system/errors.d.ts +5 -0
  71. package/dist/virtual-file-system/errors.js +11 -0
  72. package/dist/virtual-file-system/index.d.ts +26 -0
  73. package/dist/virtual-file-system/index.js +47 -0
  74. package/dist/virtual-file-system/limits.d.ts +4 -0
  75. package/dist/virtual-file-system/limits.js +33 -0
  76. package/dist/virtual-file-system/memory.d.ts +33 -0
  77. package/dist/virtual-file-system/memory.js +551 -0
  78. package/dist/virtual-file-system/path.d.ts +9 -0
  79. package/dist/virtual-file-system/path.js +47 -0
  80. package/dist/virtual-file-system/storage.d.ts +32 -0
  81. package/dist/virtual-file-system/storage.js +194 -0
  82. package/dist/virtual-file-system/types.d.ts +165 -0
  83. package/dist/virtual-file-system/types.js +2 -0
  84. package/package.json +43 -0
@@ -0,0 +1,17 @@
1
+ import type { ForgePackageResolutionResult, ForgePackageResolver, ForgePackageResolverOptions, ForgeResolvePackagesOptions } from "./types";
2
+ export declare class DefaultPackageResolver implements ForgePackageResolver {
3
+ private readonly options;
4
+ readonly capability: "package-resolution";
5
+ private readonly sources;
6
+ private readonly resolutionMode;
7
+ private readonly manifestPath;
8
+ private readonly now;
9
+ constructor(options: ForgePackageResolverOptions);
10
+ readManifest(manifestPath?: string): Promise<import("./types").ForgePackageManifest>;
11
+ resolve(options?: ForgeResolvePackagesOptions): Promise<ForgePackageResolutionResult>;
12
+ private resolveRequest;
13
+ private readCachedPackage;
14
+ private writeCachedPackage;
15
+ }
16
+ export declare function createPackageResolver(options: ForgePackageResolverOptions): ForgePackageResolver;
17
+ export declare function createPackageCacheKey(packageName: string, versionOrRange: string): string;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPackageCacheKey = exports.createPackageResolver = exports.DefaultPackageResolver = void 0;
4
+ const manifest_1 = require("./manifest");
5
+ const diagnostics_1 = require("./diagnostics");
6
+ const errors_1 = require("./errors");
7
+ const types_1 = require("./types");
8
+ const DEFAULT_RESOLUTION_MODE = "bundle-alias";
9
+ class DefaultPackageResolver {
10
+ constructor(options) {
11
+ this.options = options;
12
+ this.capability = types_1.PACKAGE_RESOLUTION_CAPABILITY;
13
+ this.sources = options.sources ?? [];
14
+ this.resolutionMode = options.resolutionMode ?? DEFAULT_RESOLUTION_MODE;
15
+ this.manifestPath = options.manifestPath ?? manifest_1.DEFAULT_FORGE_MANIFEST_PATH;
16
+ this.now = options.now ?? (() => new Date().toISOString());
17
+ }
18
+ readManifest(manifestPath = this.manifestPath) {
19
+ return (0, manifest_1.readPackageManifest)(this.options.fileSystem, manifestPath);
20
+ }
21
+ async resolve(options = {}) {
22
+ const manifest = await this.readManifest(options.manifestPath ?? this.manifestPath);
23
+ const requests = (0, manifest_1.collectDependencyRequests)(manifest);
24
+ const sources = options.sources ?? this.sources;
25
+ const resolutionMode = options.resolutionMode ?? this.resolutionMode;
26
+ const packages = [];
27
+ for (const request of requests) {
28
+ packages.push(await this.resolveRequest(request, sources));
29
+ }
30
+ packages.sort((left, right) => left.name.localeCompare(right.name));
31
+ const lock = createLockMetadata(packages, resolutionMode);
32
+ const resultBase = {
33
+ manifest,
34
+ requests,
35
+ packages,
36
+ lock,
37
+ warnings: [],
38
+ };
39
+ if (resolutionMode === "import-map") {
40
+ return {
41
+ ...resultBase,
42
+ importMap: createImportMap(packages),
43
+ };
44
+ }
45
+ return {
46
+ ...resultBase,
47
+ aliases: createBundleAliases(packages),
48
+ };
49
+ }
50
+ async resolveRequest(request, sources) {
51
+ const cachedPackage = await this.readCachedPackage(request);
52
+ if (cachedPackage !== undefined) {
53
+ return cachedPackage;
54
+ }
55
+ for (const source of sources) {
56
+ const packageRecord = await source.resolvePackage(request);
57
+ if (packageRecord === undefined) {
58
+ continue;
59
+ }
60
+ const normalizedRecord = normalizePackageRecord(request, source.id, packageRecord);
61
+ await this.writeCachedPackage(request, normalizedRecord);
62
+ return normalizedRecord;
63
+ }
64
+ throw new errors_1.ForgePackageResolutionError((0, diagnostics_1.createUnresolvedPackageDiagnostic)(request.name, request.requestedRange));
65
+ }
66
+ async readCachedPackage(request) {
67
+ if (this.options.storage === undefined) {
68
+ return undefined;
69
+ }
70
+ const cacheRecord = await this.options.storage.getPackageCacheRecord(createPackageCacheKey(request.name, request.requestedRange));
71
+ if (cacheRecord === undefined || !isForgePackageRecord(cacheRecord.value)) {
72
+ return undefined;
73
+ }
74
+ return {
75
+ ...cacheRecord.value,
76
+ requestedRange: request.requestedRange,
77
+ };
78
+ }
79
+ async writeCachedPackage(request, packageRecord) {
80
+ if (this.options.storage === undefined) {
81
+ return;
82
+ }
83
+ const records = [
84
+ createCacheRecord(createPackageCacheKey(request.name, request.requestedRange), packageRecord, this.now()),
85
+ ];
86
+ if (request.requestedRange !== packageRecord.version) {
87
+ records.push(createCacheRecord(createPackageCacheKey(request.name, packageRecord.version), packageRecord, this.now()));
88
+ }
89
+ for (const record of records) {
90
+ await this.options.storage.putPackageCacheRecord(record);
91
+ }
92
+ }
93
+ }
94
+ exports.DefaultPackageResolver = DefaultPackageResolver;
95
+ function createPackageResolver(options) {
96
+ return new DefaultPackageResolver(options);
97
+ }
98
+ exports.createPackageResolver = createPackageResolver;
99
+ function createPackageCacheKey(packageName, versionOrRange) {
100
+ return `package:${encodeURIComponent(packageName)}@${encodeURIComponent(versionOrRange)}`;
101
+ }
102
+ exports.createPackageCacheKey = createPackageCacheKey;
103
+ function normalizePackageRecord(request, sourceId, packageRecord) {
104
+ return {
105
+ ...packageRecord,
106
+ name: request.name,
107
+ requestedRange: request.requestedRange,
108
+ sourceId: packageRecord.sourceId || sourceId,
109
+ entry: normalizeEntryPath(packageRecord.entry),
110
+ dependencies: { ...packageRecord.dependencies },
111
+ files: { ...packageRecord.files },
112
+ };
113
+ }
114
+ function createLockMetadata(packages, resolutionMode) {
115
+ return {
116
+ lockfileVersion: 1,
117
+ resolutionMode,
118
+ packages: packages.map((packageRecord) => ({
119
+ name: packageRecord.name,
120
+ requestedRange: packageRecord.requestedRange,
121
+ version: packageRecord.version,
122
+ sourceId: packageRecord.sourceId,
123
+ entry: packageRecord.entry,
124
+ entryUrl: packageRecord.entryUrl,
125
+ integrity: packageRecord.integrity,
126
+ })),
127
+ };
128
+ }
129
+ function createImportMap(packages) {
130
+ return {
131
+ imports: Object.fromEntries(packages.map((packageRecord) => [
132
+ packageRecord.name,
133
+ packageRecord.entryUrl ?? createVirtualPackagePath(packageRecord),
134
+ ])),
135
+ };
136
+ }
137
+ function createBundleAliases(packages) {
138
+ return Object.fromEntries(packages.map((packageRecord) => [
139
+ packageRecord.name,
140
+ createVirtualPackagePath(packageRecord),
141
+ ]));
142
+ }
143
+ function createVirtualPackagePath(packageRecord) {
144
+ return `/.forge/packages/${packageRecord.name}@${packageRecord.version}${packageRecord.entry}`;
145
+ }
146
+ function normalizeEntryPath(entry) {
147
+ return entry.startsWith("/") ? entry : `/${entry}`;
148
+ }
149
+ function createCacheRecord(key, packageRecord, updatedAt) {
150
+ const encoded = new TextEncoder().encode(JSON.stringify(packageRecord));
151
+ return {
152
+ key,
153
+ value: packageRecord,
154
+ size: encoded.byteLength,
155
+ updatedAt,
156
+ };
157
+ }
158
+ function isForgePackageRecord(value) {
159
+ if (typeof value !== "object" || value === null) {
160
+ return false;
161
+ }
162
+ const record = value;
163
+ return (typeof record.name === "string" &&
164
+ typeof record.version === "string" &&
165
+ typeof record.requestedRange === "string" &&
166
+ typeof record.sourceId === "string" &&
167
+ typeof record.entry === "string" &&
168
+ typeof record.dependencies === "object" &&
169
+ record.dependencies !== null &&
170
+ typeof record.files === "object" &&
171
+ record.files !== null);
172
+ }
@@ -0,0 +1,98 @@
1
+ import type { ForgeDiagnostic, ForgeVirtualFileSystemStorage } from "../virtual-file-system";
2
+ import type { ForgeVirtualFileSystem } from "../virtual-file-system";
3
+ export declare const PACKAGE_RESOLUTION_CAPABILITY: "package-resolution";
4
+ export type ForgePackageResolutionMode = "import-map" | "bundle-alias";
5
+ export type ForgePackageResolutionDiagnosticCode = "invalid_dependency" | "invalid_manifest" | "unresolved_package" | "unsupported_range";
6
+ export interface ForgePackageResolutionDiagnostic {
7
+ readonly code: ForgePackageResolutionDiagnosticCode;
8
+ readonly severity: "error";
9
+ readonly message: string;
10
+ readonly path?: string;
11
+ readonly dependencyName?: string;
12
+ readonly requestedRange?: string;
13
+ readonly cause?: unknown;
14
+ }
15
+ export type ForgePackageDiagnostic = ForgeDiagnostic | ForgePackageResolutionDiagnostic;
16
+ export interface ForgePackageManifest {
17
+ readonly name?: string;
18
+ readonly version?: string;
19
+ readonly type?: string;
20
+ readonly scripts: Record<string, string>;
21
+ readonly dependencies: Record<string, string>;
22
+ readonly devDependencies: Record<string, string>;
23
+ readonly imports: Record<string, unknown>;
24
+ }
25
+ export type ForgeDependencyKind = "dependency" | "devDependency";
26
+ export interface ForgeDependencyRequest {
27
+ readonly name: string;
28
+ readonly requestedRange: string;
29
+ readonly kind: ForgeDependencyKind;
30
+ }
31
+ export interface ForgePackageFile {
32
+ readonly path: string;
33
+ readonly content?: string | Uint8Array;
34
+ readonly contentType?: string;
35
+ readonly size?: number;
36
+ }
37
+ export interface ForgePackageRecord {
38
+ readonly name: string;
39
+ readonly version: string;
40
+ readonly requestedRange: string;
41
+ readonly sourceId: string;
42
+ readonly entry: string;
43
+ readonly entryUrl?: string;
44
+ readonly browserEntry?: string;
45
+ readonly moduleEntry?: string;
46
+ readonly dependencies: Record<string, string>;
47
+ readonly files: Record<string, ForgePackageFile>;
48
+ readonly integrity?: string;
49
+ }
50
+ export interface ForgePackageLockPackage {
51
+ readonly name: string;
52
+ readonly requestedRange: string;
53
+ readonly version: string;
54
+ readonly sourceId: string;
55
+ readonly entry: string;
56
+ readonly entryUrl?: string;
57
+ readonly integrity?: string;
58
+ }
59
+ export interface ForgePackageLockMetadata {
60
+ readonly lockfileVersion: 1;
61
+ readonly resolutionMode: ForgePackageResolutionMode;
62
+ readonly packages: readonly ForgePackageLockPackage[];
63
+ }
64
+ export interface ForgeImportMap {
65
+ readonly imports: Record<string, string>;
66
+ }
67
+ export type ForgeBundleAliases = Record<string, string>;
68
+ export interface ForgePackageSource {
69
+ readonly id: string;
70
+ resolvePackage(request: ForgeDependencyRequest): Promise<ForgePackageRecord | undefined>;
71
+ }
72
+ export interface ForgePackageResolverOptions {
73
+ readonly fileSystem: ForgeVirtualFileSystem;
74
+ readonly storage?: ForgeVirtualFileSystemStorage;
75
+ readonly sources?: readonly ForgePackageSource[];
76
+ readonly resolutionMode?: ForgePackageResolutionMode;
77
+ readonly manifestPath?: string;
78
+ readonly now?: () => string;
79
+ }
80
+ export interface ForgeResolvePackagesOptions {
81
+ readonly sources?: readonly ForgePackageSource[];
82
+ readonly resolutionMode?: ForgePackageResolutionMode;
83
+ readonly manifestPath?: string;
84
+ }
85
+ export interface ForgePackageResolutionResult {
86
+ readonly manifest: ForgePackageManifest;
87
+ readonly requests: readonly ForgeDependencyRequest[];
88
+ readonly packages: readonly ForgePackageRecord[];
89
+ readonly lock: ForgePackageLockMetadata;
90
+ readonly importMap?: ForgeImportMap;
91
+ readonly aliases?: ForgeBundleAliases;
92
+ readonly warnings: readonly ForgePackageDiagnostic[];
93
+ }
94
+ export interface ForgePackageResolver {
95
+ readonly capability: typeof PACKAGE_RESOLUTION_CAPABILITY;
96
+ readManifest(manifestPath?: string): Promise<ForgePackageManifest>;
97
+ resolve(options?: ForgeResolvePackagesOptions): Promise<ForgePackageResolutionResult>;
98
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PACKAGE_RESOLUTION_CAPABILITY = void 0;
4
+ exports.PACKAGE_RESOLUTION_CAPABILITY = "package-resolution";
@@ -0,0 +1,3 @@
1
+ import type { ForgeTerminalDiagnostic } from "./types";
2
+ export declare function createParseErrorDiagnostic(commandText: string, message: string): ForgeTerminalDiagnostic;
3
+ export declare function createUnsupportedCommandDiagnostic(commandText: string): ForgeTerminalDiagnostic;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createUnsupportedCommandDiagnostic = exports.createParseErrorDiagnostic = void 0;
4
+ function createParseErrorDiagnostic(commandText, message) {
5
+ return {
6
+ code: "parse_error",
7
+ severity: "error",
8
+ message,
9
+ commandText,
10
+ };
11
+ }
12
+ exports.createParseErrorDiagnostic = createParseErrorDiagnostic;
13
+ function createUnsupportedCommandDiagnostic(commandText) {
14
+ return {
15
+ code: "unsupported_command",
16
+ severity: "error",
17
+ message: "Command is not supported by Forge.",
18
+ commandText,
19
+ };
20
+ }
21
+ exports.createUnsupportedCommandDiagnostic = createUnsupportedCommandDiagnostic;
@@ -0,0 +1,7 @@
1
+ export { createParseErrorDiagnostic, createUnsupportedCommandDiagnostic, } from "./diagnostics";
2
+ export { createNpmRunBuildCommandHandler, NpmRunBuildCommandHandler, } from "./npm-build";
3
+ export { createNpmInstallCommandHandler, NpmInstallCommandHandler, } from "./npm-install";
4
+ export { createNpmRunDevCommandHandler, NpmRunDevCommandHandler, } from "./npm-dev";
5
+ export { parseForgeCommandText } from "./parser";
6
+ export { createForgeTerminal, DefaultForgeTerminal } from "./terminal";
7
+ export { TERMINAL_COMMANDS_CAPABILITY, type ForgeCommand, type ForgeCommandContext, type ForgeCommandDiagnostic, type ForgeCommandHandler, type ForgeCommandParseResult, type ForgeCommandResult, type ForgeTerminal, type ForgeTerminalDiagnostic, type ForgeTerminalDiagnosticCode, type ForgeTerminalExecuteOptions, type ForgeTerminalOptions, type ForgeTerminalOutputKind, type ForgeTerminalOutputLine, } from "./types";
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TERMINAL_COMMANDS_CAPABILITY = exports.DefaultForgeTerminal = exports.createForgeTerminal = exports.parseForgeCommandText = exports.NpmRunDevCommandHandler = exports.createNpmRunDevCommandHandler = exports.NpmInstallCommandHandler = exports.createNpmInstallCommandHandler = exports.NpmRunBuildCommandHandler = exports.createNpmRunBuildCommandHandler = exports.createUnsupportedCommandDiagnostic = exports.createParseErrorDiagnostic = void 0;
4
+ var diagnostics_1 = require("./diagnostics");
5
+ Object.defineProperty(exports, "createParseErrorDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createParseErrorDiagnostic; } });
6
+ Object.defineProperty(exports, "createUnsupportedCommandDiagnostic", { enumerable: true, get: function () { return diagnostics_1.createUnsupportedCommandDiagnostic; } });
7
+ var npm_build_1 = require("./npm-build");
8
+ Object.defineProperty(exports, "createNpmRunBuildCommandHandler", { enumerable: true, get: function () { return npm_build_1.createNpmRunBuildCommandHandler; } });
9
+ Object.defineProperty(exports, "NpmRunBuildCommandHandler", { enumerable: true, get: function () { return npm_build_1.NpmRunBuildCommandHandler; } });
10
+ var npm_install_1 = require("./npm-install");
11
+ Object.defineProperty(exports, "createNpmInstallCommandHandler", { enumerable: true, get: function () { return npm_install_1.createNpmInstallCommandHandler; } });
12
+ Object.defineProperty(exports, "NpmInstallCommandHandler", { enumerable: true, get: function () { return npm_install_1.NpmInstallCommandHandler; } });
13
+ var npm_dev_1 = require("./npm-dev");
14
+ Object.defineProperty(exports, "createNpmRunDevCommandHandler", { enumerable: true, get: function () { return npm_dev_1.createNpmRunDevCommandHandler; } });
15
+ Object.defineProperty(exports, "NpmRunDevCommandHandler", { enumerable: true, get: function () { return npm_dev_1.NpmRunDevCommandHandler; } });
16
+ var parser_1 = require("./parser");
17
+ Object.defineProperty(exports, "parseForgeCommandText", { enumerable: true, get: function () { return parser_1.parseForgeCommandText; } });
18
+ var terminal_1 = require("./terminal");
19
+ Object.defineProperty(exports, "createForgeTerminal", { enumerable: true, get: function () { return terminal_1.createForgeTerminal; } });
20
+ Object.defineProperty(exports, "DefaultForgeTerminal", { enumerable: true, get: function () { return terminal_1.DefaultForgeTerminal; } });
21
+ var types_1 = require("./types");
22
+ Object.defineProperty(exports, "TERMINAL_COMMANDS_CAPABILITY", { enumerable: true, get: function () { return types_1.TERMINAL_COMMANDS_CAPABILITY; } });
@@ -0,0 +1,7 @@
1
+ import type { ForgeCommand, ForgeCommandContext, ForgeCommandHandler, ForgeCommandResult } from "./types";
2
+ export declare class NpmRunBuildCommandHandler implements ForgeCommandHandler {
3
+ readonly name = "npm run build";
4
+ canRun(command: ForgeCommand): boolean;
5
+ run(context: ForgeCommandContext): Promise<ForgeCommandResult>;
6
+ }
7
+ export declare function createNpmRunBuildCommandHandler(): ForgeCommandHandler;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNpmRunBuildCommandHandler = exports.NpmRunBuildCommandHandler = void 0;
4
+ class NpmRunBuildCommandHandler {
5
+ constructor() {
6
+ this.name = "npm run build";
7
+ }
8
+ canRun(command) {
9
+ return (command.argv.length === 3 &&
10
+ command.argv[0] === "npm" &&
11
+ command.argv[1] === "run" &&
12
+ command.argv[2] === "build");
13
+ }
14
+ async run(context) {
15
+ if (context.buildPipeline === undefined) {
16
+ return {
17
+ command: context.command,
18
+ exitCode: 127,
19
+ output: [stderr("Forge build pipeline is not configured.")],
20
+ diagnostics: [],
21
+ };
22
+ }
23
+ const buildResult = await context.buildPipeline.build();
24
+ if (!buildResult.success) {
25
+ const firstDiagnostic = buildResult.diagnostics[0];
26
+ return {
27
+ command: context.command,
28
+ exitCode: 1,
29
+ output: [stderr(firstDiagnostic?.message ?? "Forge build failed.")],
30
+ diagnostics: buildResult.diagnostics,
31
+ buildResult,
32
+ };
33
+ }
34
+ return {
35
+ command: context.command,
36
+ exitCode: 0,
37
+ output: [
38
+ stdout(`Forge emitted browser bundle for ${buildResult.entry}.`),
39
+ stdout("Forge wrote build manifest at /.forge/build/build-manifest.json."),
40
+ stdout(`Bundle entry: ${buildResult.browserBundle?.entryOutputPath ?? "unavailable"}.`),
41
+ ...warningOutput(buildResult.diagnostics),
42
+ ],
43
+ diagnostics: buildResult.diagnostics,
44
+ buildResult,
45
+ };
46
+ }
47
+ }
48
+ exports.NpmRunBuildCommandHandler = NpmRunBuildCommandHandler;
49
+ function createNpmRunBuildCommandHandler() {
50
+ return new NpmRunBuildCommandHandler();
51
+ }
52
+ exports.createNpmRunBuildCommandHandler = createNpmRunBuildCommandHandler;
53
+ function stdout(text) {
54
+ return { kind: "stdout", text };
55
+ }
56
+ function stderr(text) {
57
+ return { kind: "stderr", text };
58
+ }
59
+ function warningOutput(diagnostics) {
60
+ return diagnostics
61
+ .filter((diagnostic) => diagnostic.severity === "warning")
62
+ .map((diagnostic) => stderr(`Forge warning: ${diagnostic.message}`));
63
+ }
@@ -0,0 +1,7 @@
1
+ import type { ForgeCommand, ForgeCommandContext, ForgeCommandHandler, ForgeCommandResult } from "./types";
2
+ export declare class NpmRunDevCommandHandler implements ForgeCommandHandler {
3
+ readonly name = "npm run dev";
4
+ canRun(command: ForgeCommand): boolean;
5
+ run(context: ForgeCommandContext): Promise<ForgeCommandResult>;
6
+ }
7
+ export declare function createNpmRunDevCommandHandler(): ForgeCommandHandler;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNpmRunDevCommandHandler = exports.NpmRunDevCommandHandler = void 0;
4
+ class NpmRunDevCommandHandler {
5
+ constructor() {
6
+ this.name = "npm run dev";
7
+ }
8
+ canRun(command) {
9
+ return (command.argv.length === 3 &&
10
+ command.argv[0] === "npm" &&
11
+ command.argv[1] === "run" &&
12
+ command.argv[2] === "dev");
13
+ }
14
+ async run(context) {
15
+ if (context.devServerPreview === undefined) {
16
+ return {
17
+ command: context.command,
18
+ exitCode: 127,
19
+ output: [stderr("Forge dev server preview is not configured.")],
20
+ diagnostics: [],
21
+ };
22
+ }
23
+ const startResult = await context.devServerPreview.start();
24
+ if (!startResult.success) {
25
+ const firstDiagnostic = startResult.diagnostics[0];
26
+ return {
27
+ command: context.command,
28
+ exitCode: 1,
29
+ output: [
30
+ stderr(firstDiagnostic?.message ?? "Forge dev session failed to start."),
31
+ ],
32
+ diagnostics: startResult.diagnostics,
33
+ buildResult: startResult.buildResult,
34
+ devSession: startResult.session,
35
+ };
36
+ }
37
+ return {
38
+ command: context.command,
39
+ exitCode: 0,
40
+ output: [
41
+ stdout(`Forge started browser preview session ${startResult.session.id}.`),
42
+ stdout(`Preview URL: ${startResult.session.previewUrl}`),
43
+ stdout(`Preview revision ${startResult.session.revision} is ready as iframe HTML.`),
44
+ stdout("No real Vite server or TCP port was opened."),
45
+ ...warningOutput(startResult.diagnostics),
46
+ ],
47
+ diagnostics: startResult.diagnostics,
48
+ buildResult: startResult.buildResult,
49
+ devSession: startResult.session,
50
+ };
51
+ }
52
+ }
53
+ exports.NpmRunDevCommandHandler = NpmRunDevCommandHandler;
54
+ function createNpmRunDevCommandHandler() {
55
+ return new NpmRunDevCommandHandler();
56
+ }
57
+ exports.createNpmRunDevCommandHandler = createNpmRunDevCommandHandler;
58
+ function stdout(text) {
59
+ return { kind: "stdout", text };
60
+ }
61
+ function stderr(text) {
62
+ return { kind: "stderr", text };
63
+ }
64
+ function warningOutput(diagnostics) {
65
+ return diagnostics
66
+ .filter((diagnostic) => diagnostic.severity === "warning")
67
+ .map((diagnostic) => stderr(`Forge warning: ${diagnostic.message}`));
68
+ }
@@ -0,0 +1,8 @@
1
+ import type { ForgeCommand, ForgeCommandContext, ForgeCommandHandler, ForgeCommandResult } from "./types";
2
+ export declare class NpmInstallCommandHandler implements ForgeCommandHandler {
3
+ readonly name = "npm install";
4
+ readonly aliases: string[];
5
+ canRun(command: ForgeCommand): boolean;
6
+ run(context: ForgeCommandContext): Promise<ForgeCommandResult>;
7
+ }
8
+ export declare function createNpmInstallCommandHandler(): ForgeCommandHandler;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createNpmInstallCommandHandler = exports.NpmInstallCommandHandler = void 0;
4
+ const package_resolution_1 = require("../package-resolution");
5
+ class NpmInstallCommandHandler {
6
+ constructor() {
7
+ this.name = "npm install";
8
+ this.aliases = ["npm i"];
9
+ }
10
+ canRun(command) {
11
+ return (command.argv.length === 2 &&
12
+ command.argv[0] === "npm" &&
13
+ (command.argv[1] === "install" || command.argv[1] === "i"));
14
+ }
15
+ async run(context) {
16
+ try {
17
+ const packageResolution = await context.packageResolver.resolve();
18
+ const packageCount = packageResolution.packages.length;
19
+ const mode = packageResolution.lock.resolutionMode;
20
+ const output = [
21
+ stdout(`Forge resolved ${packageCount} package${packageCount === 1 ? "" : "s"}.`),
22
+ stdout(`Forge prepared browser package metadata using ${mode} mode.`),
23
+ stdout("No real node_modules directory was created."),
24
+ ];
25
+ return {
26
+ command: context.command,
27
+ exitCode: 0,
28
+ output,
29
+ diagnostics: [],
30
+ packageResolution,
31
+ };
32
+ }
33
+ catch (error) {
34
+ if (error instanceof package_resolution_1.ForgePackageResolutionError) {
35
+ return {
36
+ command: context.command,
37
+ exitCode: 1,
38
+ output: [stderr(error.diagnostic.message)],
39
+ diagnostics: [error.diagnostic],
40
+ };
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ }
46
+ exports.NpmInstallCommandHandler = NpmInstallCommandHandler;
47
+ function createNpmInstallCommandHandler() {
48
+ return new NpmInstallCommandHandler();
49
+ }
50
+ exports.createNpmInstallCommandHandler = createNpmInstallCommandHandler;
51
+ function stdout(text) {
52
+ return { kind: "stdout", text };
53
+ }
54
+ function stderr(text) {
55
+ return { kind: "stderr", text };
56
+ }
@@ -0,0 +1,2 @@
1
+ import type { ForgeCommandParseResult } from "./types";
2
+ export declare function parseForgeCommandText(commandText: string): ForgeCommandParseResult;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseForgeCommandText = void 0;
4
+ const diagnostics_1 = require("./diagnostics");
5
+ function parseForgeCommandText(commandText) {
6
+ const argv = [];
7
+ let current = "";
8
+ let quote;
9
+ for (let index = 0; index < commandText.length; index += 1) {
10
+ const char = commandText[index];
11
+ if (quote !== undefined) {
12
+ if (char === quote) {
13
+ quote = undefined;
14
+ continue;
15
+ }
16
+ current += char;
17
+ continue;
18
+ }
19
+ if (char === "\"" || char === "'") {
20
+ quote = char;
21
+ continue;
22
+ }
23
+ if (/\s/.test(char)) {
24
+ if (current.length > 0) {
25
+ argv.push(current);
26
+ current = "";
27
+ }
28
+ continue;
29
+ }
30
+ current += char;
31
+ }
32
+ if (quote !== undefined) {
33
+ return {
34
+ ok: false,
35
+ diagnostic: (0, diagnostics_1.createParseErrorDiagnostic)(commandText, "Command contains an unterminated quoted argument."),
36
+ };
37
+ }
38
+ if (current.length > 0) {
39
+ argv.push(current);
40
+ }
41
+ if (argv.length === 0) {
42
+ return {
43
+ ok: false,
44
+ diagnostic: (0, diagnostics_1.createParseErrorDiagnostic)(commandText, "Command text is empty."),
45
+ };
46
+ }
47
+ return {
48
+ ok: true,
49
+ argv,
50
+ };
51
+ }
52
+ exports.parseForgeCommandText = parseForgeCommandText;
@@ -0,0 +1,12 @@
1
+ import { type ForgeCommandResult, type ForgeTerminal, type ForgeTerminalOptions } from "./types";
2
+ export declare class DefaultForgeTerminal implements ForgeTerminal {
3
+ private readonly options;
4
+ readonly capability: "terminal-commands";
5
+ private readonly handlers;
6
+ private readonly cwd;
7
+ constructor(options: ForgeTerminalOptions);
8
+ execute(commandText: string, executeOptions?: {
9
+ readonly cwd?: string;
10
+ }): Promise<ForgeCommandResult>;
11
+ }
12
+ export declare function createForgeTerminal(options: ForgeTerminalOptions): ForgeTerminal;