@decohere/forge 0.0.1-dev.13 → 0.0.1-dev.131

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 (201) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +152 -0
  3. package/commonjs/src/actions/build.action.js +8 -6
  4. package/commonjs/src/actions/clean.action.js +6 -8
  5. package/commonjs/src/actions/commit.action.js +4 -6
  6. package/commonjs/src/actions/copy.action.js +62 -12
  7. package/commonjs/src/actions/dependency-report.action.js +8 -6
  8. package/commonjs/src/actions/dependency-sync.action.js +9 -5
  9. package/commonjs/src/actions/docker.action.js +209 -0
  10. package/commonjs/src/actions/index.js +6 -2
  11. package/commonjs/src/actions/link.action.js +154 -0
  12. package/commonjs/src/actions/package.action.js +234 -0
  13. package/commonjs/src/actions/paths.action.js +120 -0
  14. package/commonjs/src/actions/publish.action.js +4 -6
  15. package/commonjs/src/actions/sync-lock-file.action.js +2 -4
  16. package/commonjs/src/actions/tag.action.js +6 -9
  17. package/commonjs/src/actions/typecheck.action.js +67 -0
  18. package/commonjs/src/actions/unlink.action.js +74 -0
  19. package/commonjs/src/actions/version.action.js +14 -16
  20. package/commonjs/src/actions/watch.action.js +3 -5
  21. package/commonjs/src/commands/build.command.js +4 -3
  22. package/commonjs/src/commands/dependency.command.js +1 -3
  23. package/commonjs/src/commands/docker.command.js +26 -0
  24. package/commonjs/src/commands/forge.command.js +1 -3
  25. package/commonjs/src/commands/index.js +5 -2
  26. package/commonjs/src/commands/link.command.js +90 -0
  27. package/commonjs/src/commands/package.command.js +36 -0
  28. package/commonjs/src/commands/paths.command.js +24 -0
  29. package/commonjs/src/commands/publish.command.js +1 -3
  30. package/commonjs/src/commands/tag.command.js +1 -3
  31. package/commonjs/src/commands/typecheck.command.js +24 -0
  32. package/commonjs/src/commands/version.command.js +1 -3
  33. package/commonjs/src/const.js +0 -2
  34. package/commonjs/src/create-workspace.js +38 -0
  35. package/commonjs/src/errors.js +2 -4
  36. package/commonjs/src/extensions/project.extensions.js +11 -13
  37. package/commonjs/src/factories/swc-config.factory.js +29 -9
  38. package/commonjs/src/forge.module.js +23 -22
  39. package/commonjs/src/index.js +11 -2
  40. package/commonjs/src/packaging/dependency-pinner.service.js +118 -0
  41. package/commonjs/src/packaging/deployable.js +44 -0
  42. package/commonjs/src/packaging/import-graph.service.js +137 -0
  43. package/commonjs/src/packaging/release-exports.js +90 -0
  44. package/commonjs/src/packaging/ui-assets.js +75 -0
  45. package/commonjs/src/semver/index.js +18 -0
  46. package/commonjs/src/semver/semver.js +92 -0
  47. package/commonjs/src/services/dependency-resolver.service.js +70 -26
  48. package/commonjs/src/services/file-writer.service.js +2 -11
  49. package/commonjs/src/services/incremental-watch.js +24 -0
  50. package/commonjs/src/services/output-cache.js +39 -0
  51. package/commonjs/src/services/swc-transpiler.js +85 -99
  52. package/commonjs/src/services/transpile-cache.js +44 -0
  53. package/commonjs/src/services/ts-compiler-options.js +50 -0
  54. package/commonjs/src/services/ts-program-host.js +4 -6
  55. package/commonjs/src/services/type-emission-program.js +25 -10
  56. package/commonjs/src/services/type-emitter.js +60 -20
  57. package/commonjs/src/transpile/index.js +30 -0
  58. package/commonjs/src/types/build-target.type.js +0 -2
  59. package/commonjs/src/types/configuration.type.js +0 -2
  60. package/commonjs/src/types/dependency.types.js +0 -2
  61. package/commonjs/src/types/swc-config.type.js +0 -2
  62. package/commonjs/src/types/transform-response.model.js +3 -18
  63. package/commonjs/src/types/transformer.type.js +0 -2
  64. package/commonjs/src/types/workspace-config.type.js +0 -2
  65. package/commonjs/src/vitest/forge-build.plugin.js +28 -44
  66. package/commonjs/src/vitest/index.js +0 -2
  67. package/commonjs/src/workspace.config.js +39 -6
  68. package/es6/src/actions/build.action.js +7 -7
  69. package/es6/src/actions/clean.action.js +5 -8
  70. package/es6/src/actions/commit.action.js +3 -6
  71. package/es6/src/actions/copy.action.js +61 -12
  72. package/es6/src/actions/dependency-report.action.js +7 -7
  73. package/es6/src/actions/dependency-sync.action.js +8 -6
  74. package/es6/src/actions/docker.action.js +194 -0
  75. package/es6/src/actions/index.js +6 -2
  76. package/es6/src/actions/link.action.js +128 -0
  77. package/es6/src/actions/package.action.js +219 -0
  78. package/es6/src/actions/paths.action.js +97 -0
  79. package/es6/src/actions/publish.action.js +3 -6
  80. package/es6/src/actions/sync-lock-file.action.js +2 -4
  81. package/es6/src/actions/tag.action.js +5 -9
  82. package/es6/src/actions/typecheck.action.js +52 -0
  83. package/es6/src/actions/unlink.action.js +59 -0
  84. package/es6/src/actions/version.action.js +9 -12
  85. package/es6/src/actions/watch.action.js +2 -5
  86. package/es6/src/commands/build.command.js +4 -3
  87. package/es6/src/commands/dependency.command.js +1 -3
  88. package/es6/src/commands/docker.command.js +16 -0
  89. package/es6/src/commands/forge.command.js +1 -3
  90. package/es6/src/commands/index.js +5 -2
  91. package/es6/src/commands/link.command.js +67 -0
  92. package/es6/src/commands/package.command.js +26 -0
  93. package/es6/src/commands/paths.command.js +14 -0
  94. package/es6/src/commands/publish.command.js +1 -3
  95. package/es6/src/commands/tag.command.js +1 -3
  96. package/es6/src/commands/typecheck.command.js +14 -0
  97. package/es6/src/commands/version.command.js +1 -3
  98. package/es6/src/const.js +0 -2
  99. package/es6/src/create-workspace.js +26 -0
  100. package/es6/src/errors.js +1 -3
  101. package/es6/src/extensions/project.extensions.js +5 -7
  102. package/es6/src/factories/swc-config.factory.js +29 -9
  103. package/es6/src/forge.module.js +23 -22
  104. package/es6/src/index.js +3 -3
  105. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  106. package/es6/src/packaging/deployable.js +21 -0
  107. package/es6/src/packaging/import-graph.service.js +122 -0
  108. package/es6/src/packaging/release-exports.js +80 -0
  109. package/es6/src/packaging/ui-assets.js +49 -0
  110. package/es6/src/semver/index.js +1 -0
  111. package/es6/src/semver/semver.js +71 -0
  112. package/es6/src/services/dependency-resolver.service.js +70 -26
  113. package/es6/src/services/file-writer.service.js +2 -11
  114. package/es6/src/services/incremental-watch.js +18 -0
  115. package/es6/src/services/output-cache.js +29 -0
  116. package/es6/src/services/swc-transpiler.js +85 -99
  117. package/es6/src/services/transpile-cache.js +29 -0
  118. package/es6/src/services/ts-compiler-options.js +39 -0
  119. package/es6/src/services/ts-program-host.js +4 -6
  120. package/es6/src/services/type-emission-program.js +25 -10
  121. package/es6/src/services/type-emitter.js +57 -20
  122. package/es6/src/transpile/index.js +6 -0
  123. package/es6/src/types/build-target.type.js +0 -2
  124. package/es6/src/types/configuration.type.js +0 -2
  125. package/es6/src/types/dependency.types.js +0 -2
  126. package/es6/src/types/swc-config.type.js +0 -2
  127. package/es6/src/types/transform-response.model.js +0 -7
  128. package/es6/src/types/transformer.type.js +0 -2
  129. package/es6/src/types/workspace-config.type.js +0 -2
  130. package/es6/src/vitest/forge-build.plugin.js +27 -43
  131. package/es6/src/vitest/index.js +0 -2
  132. package/es6/src/workspace.config.js +39 -5
  133. package/package.json +20 -6
  134. package/types/src/actions/build.action.d.ts +5 -4
  135. package/types/src/actions/clean.action.d.ts +3 -3
  136. package/types/src/actions/commit.action.d.ts +3 -3
  137. package/types/src/actions/copy.action.d.ts +18 -3
  138. package/types/src/actions/dependency-report.action.d.ts +3 -3
  139. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  140. package/types/src/actions/docker.action.d.ts +38 -0
  141. package/types/src/actions/index.d.ts +6 -0
  142. package/types/src/actions/link.action.d.ts +25 -0
  143. package/types/src/actions/package.action.d.ts +38 -0
  144. package/types/src/actions/paths.action.d.ts +28 -0
  145. package/types/src/actions/publish.action.d.ts +4 -4
  146. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  147. package/types/src/actions/tag.action.d.ts +3 -3
  148. package/types/src/actions/typecheck.action.d.ts +14 -0
  149. package/types/src/actions/unlink.action.d.ts +9 -0
  150. package/types/src/actions/version.action.d.ts +4 -4
  151. package/types/src/actions/watch.action.d.ts +3 -3
  152. package/types/src/commands/build.command.d.ts +3 -2
  153. package/types/src/commands/dependency.command.d.ts +2 -2
  154. package/types/src/commands/docker.command.d.ts +6 -0
  155. package/types/src/commands/forge.command.d.ts +2 -2
  156. package/types/src/commands/index.d.ts +5 -0
  157. package/types/src/commands/link.command.d.ts +29 -0
  158. package/types/src/commands/package.command.d.ts +11 -0
  159. package/types/src/commands/paths.command.d.ts +6 -0
  160. package/types/src/commands/publish.command.d.ts +1 -1
  161. package/types/src/commands/tag.command.d.ts +1 -1
  162. package/types/src/commands/typecheck.command.d.ts +6 -0
  163. package/types/src/commands/version.command.d.ts +1 -1
  164. package/types/src/create-workspace.d.ts +7 -0
  165. package/types/src/errors.d.ts +1 -1
  166. package/types/src/extensions/project.extensions.d.ts +2 -2
  167. package/types/src/factories/swc-config.factory.d.ts +3 -2
  168. package/types/src/forge.module.d.ts +16 -4
  169. package/types/src/index.d.ts +3 -1
  170. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  171. package/types/src/packaging/deployable.d.ts +17 -0
  172. package/types/src/packaging/import-graph.service.d.ts +33 -0
  173. package/types/src/packaging/release-exports.d.ts +18 -0
  174. package/types/src/packaging/ui-assets.d.ts +21 -0
  175. package/types/src/semver/index.d.ts +1 -0
  176. package/types/src/semver/semver.d.ts +18 -0
  177. package/types/src/services/dependency-resolver.service.d.ts +8 -1
  178. package/types/src/services/file-writer.service.d.ts +1 -2
  179. package/types/src/services/incremental-watch.d.ts +13 -0
  180. package/types/src/services/output-cache.d.ts +10 -0
  181. package/types/src/services/swc-transpiler.d.ts +28 -15
  182. package/types/src/services/transpile-cache.d.ts +17 -0
  183. package/types/src/services/ts-compiler-options.d.ts +8 -0
  184. package/types/src/services/ts-program-host.d.ts +2 -2
  185. package/types/src/services/type-emission-program.d.ts +10 -3
  186. package/types/src/services/type-emitter.d.ts +21 -8
  187. package/types/src/transpile/index.d.ts +6 -0
  188. package/types/src/types/configuration.type.d.ts +6 -1
  189. package/types/src/types/dependency.types.d.ts +8 -9
  190. package/types/src/types/swc-config.type.d.ts +7 -1
  191. package/types/src/types/transform-response.model.d.ts +2 -7
  192. package/types/src/types/transformer.type.d.ts +3 -12
  193. package/types/src/types/workspace-config.type.d.ts +3 -3
  194. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  195. package/types/src/workspace.config.d.ts +6 -0
  196. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  197. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  198. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  199. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  200. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  201. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -1,9 +1,8 @@
1
- import type { Project } from "@decohere/mesh";
1
+ import type { Project } from "@decohere/workspace";
2
2
  import "../extensions/project.extensions.js";
3
3
  import type { TransformResponse } from "../types/transform-response.model.js";
4
4
  export declare class FileWriterService {
5
5
  #private;
6
- initialize(): Promise<void>;
7
6
  warmup(projects: Project[]): Promise<void>;
8
7
  enqueueOutput(response: TransformResponse): void;
9
8
  enqueueOutputs(responses: TransformResponse[]): void;
@@ -0,0 +1,13 @@
1
+ import type { ProjectFileEvent, Workspace } from "@decohere/workspace";
2
+ import type { Observable } from "@decohere/core/system";
3
+ import type { TransformResponse } from "../types/transform-response.model.js";
4
+ /**
5
+ * Runs a transformer's handler for every workspace file change and emits what it built. The
6
+ * handler invalidates the transformer's own caches, rebuilds, and returns the responses (empty
7
+ * for a deletion or when nothing was built).
8
+ */
9
+ export declare class IncrementalWatch {
10
+ #private;
11
+ get results$(): Observable<TransformResponse[]>;
12
+ watch(workspace: Workspace, handler: (evt: ProjectFileEvent) => Promise<TransformResponse[]>): void;
13
+ }
@@ -0,0 +1,10 @@
1
+ import type { TransformResponse } from "../types/transform-response.model.js";
2
+ /** The outputs each source file last built to, so watch mode can delete them when it goes. */
3
+ export declare class OutputCache {
4
+ #private;
5
+ get(sourcePath: string): TransformResponse[] | undefined;
6
+ /** Records the successful outputs, replacing what each of their source files had before. */
7
+ record(responses: TransformResponse[]): void;
8
+ /** Deletes the files a source built to and forgets them. */
9
+ delete(sourcePath: string): void;
10
+ }
@@ -1,34 +1,47 @@
1
- import type { Project } from "@decohere/mesh";
2
- import type { FileEx } from "@decohere/nexus/io";
1
+ import { type Project, type Tsconfig, type Workspace } from "@decohere/workspace";
2
+ import type { FileEx } from "@decohere/core/io";
3
+ import { type Options } from "@swc/core";
4
+ import type { Observable } from "@decohere/core/system";
3
5
  import { type BuildTarget, type TranspileTarget } from "../types/build-target.type.js";
4
6
  import "../extensions/project.extensions.js";
5
- import type { ProjectFileEvent, Tsconfig } from "@decohere/mesh";
6
- import { CachesOutputs } from "../mixins/caches-outputs.mixin.js";
7
- import { IncrementalTransform } from "../mixins/incremental-transform.mixin.js";
8
7
  import type { SwcConfig } from "../types/swc-config.type.js";
9
8
  import { TransformResponse } from "../types/transform-response.model.js";
10
9
  import type { Transformer } from "../types/transformer.type.js";
11
10
  export type TranspileOptions = {
12
11
  aliasPaths?: boolean;
12
+ sourceMaps?: boolean;
13
13
  tsConfig?: Tsconfig;
14
14
  userConfig?: SwcConfig;
15
+ workspace?: Workspace;
16
+ projects?: readonly Project[];
15
17
  };
16
- declare const SwcTranspiler_base: abstract new (...args: unknown[]) => CachesOutputs & IncrementalTransform;
17
- export declare class SwcTranspiler extends SwcTranspiler_base implements Transformer {
18
+ export declare class SwcTranspiler implements Transformer {
18
19
  #private;
19
20
  buildTargets: BuildTarget[];
21
+ get incrementalTransform$(): Observable<TransformResponse[]>;
22
+ watch(workspace: Workspace): void;
23
+ private withAliasContext;
20
24
  transformProject(projectArrayLike: Project | Project[], fileFilter?: (project: Project) => Promise<FileEx[]>, onOutput?: (response: TransformResponse) => void): Promise<TransformResponse[]>;
21
- transformFile(fileArrayLike: FileEx[] | FileEx, buildTarget: TranspileTarget, options?: TranspileOptions): Promise<TransformResponse[]>;
22
25
  /**
23
- * Synchronous, single-file variant of `transformFile`.
24
- * Reads the file with `fs.readFileSync` and transpiles via `swc.transformSync`.
25
- * Intended for callers that cannot await (e.g. Node.js `registerHooks` load hook).
26
+ * The SWC options for one project and target, without a filename. Building them reads the
27
+ * workspace's aliases and merges configs, so a caller that transpiles many files builds them
28
+ * once and passes them to {@link transformCode}.
26
29
  */
27
- transformFileSync(file: FileEx, buildTarget: TranspileTarget, options?: TranspileOptions): TransformResponse;
30
+ createBaseConfig(buildTarget: TranspileTarget, options?: TranspileOptions): Options;
31
+ /** Sync variant of {@link transformCode}, for the load hook, which cannot await. */
32
+ transformCodeSync(content: string, file: FileEx, buildTarget: TranspileTarget, baseConfig: Options): TransformResponse;
33
+ /**
34
+ * Compiles `content` as the source of `file`, without reading the file: for callers that
35
+ * already hold the code, such as the Vitest plugin, which must compile what Vite passes it
36
+ * rather than an earlier read of the disk. Async SWC, on the thread pool, so many
37
+ * calls in flight compile in parallel. With a `project`, the response carries where
38
+ * the build writes the output.
39
+ */
40
+ transformCode(content: string, file: FileEx, buildTarget: TranspileTarget, baseConfig: Options, project?: Project): Promise<TransformResponse>;
41
+ private static skippedEmpty;
42
+ private static succeeded;
28
43
  private transformTarget;
29
- private runTransform;
30
- protected onIncrementalFileEvent(evt: ProjectFileEvent): Promise<TransformResponse[]>;
44
+ private onIncrementalFileEvent;
31
45
  invalidateContentCache(_file: FileEx): void;
32
46
  private getFileContent;
33
47
  }
34
- export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Where compiled code is cached on disk, or null when caching is off:
3
+ *
4
+ * - `DECOHERE_CACHE=0` turns it off.
5
+ * - `DECOHERE_CACHE_DIR` puts it in that directory.
6
+ * - Otherwise `<root>/node_modules/.cache/decohere`, where tools keep caches, or when the
7
+ * workspace has no `node_modules`, `$XDG_CACHE_HOME/decohere`, then the OS temp directory.
8
+ *
9
+ * Flux keeps its entries in the `flux` folder inside it; `forge clean` removes the folder.
10
+ */
11
+ declare function directory(rootDir: string, env?: NodeJS.ProcessEnv): string | null;
12
+ /** The SWC version compiling: part of every cache key, so upgrading SWC misses. */
13
+ export declare const transpileCache: {
14
+ directory: typeof directory;
15
+ swcVersion: string;
16
+ };
17
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { Tsconfig } from "@decohere/workspace";
2
+ import ts from "typescript";
3
+ /**
4
+ * A project's compiler options as the TypeScript compiler parses its `tsconfig.json`: what
5
+ * type emission needs (enums, every option, tsc's own defaults). The workspace reads only
6
+ * what transpiling needs, without loading the compiler.
7
+ */
8
+ export declare function tsCompilerOptions(tsconfig: Tsconfig): ts.CompilerOptions;
@@ -1,4 +1,4 @@
1
- import type { FileEx } from "@decohere/nexus/io";
1
+ import type { FileEx } from "@decohere/core/io";
2
2
  import type ts from "typescript";
3
3
  /**
4
4
  * Wraps a TypeScript CompilerHost with cached file-system calls so that
@@ -14,7 +14,7 @@ export declare class TsProgramHost {
14
14
  /** Returns a stable string key for a set of compiler options that affect host behaviour. */
15
15
  hostKey(opts: ts.CompilerOptions): string;
16
16
  createHost(compilerOptions: ts.CompilerOptions): ts.CompilerHost;
17
- createProgram(files: FileEx[], compilerOptions: ts.CompilerOptions, host: ts.CompilerHost, oldProgram?: ts.Program): ts.Program;
17
+ createProgram(files: FileEx[], compilerOptions: ts.CompilerOptions, host: ts.CompilerHost, oldProgram?: ts.Program, requiredOptions?: ts.CompilerOptions): ts.Program;
18
18
  readFileFromDisk(fileName: string): string | undefined;
19
19
  fileExistsOnDisk(fileName: string): boolean;
20
20
  directoryExists(directoryName: string): boolean;
@@ -1,20 +1,27 @@
1
- import type { Project, Tsconfig } from "@decohere/mesh";
2
- import type { FileEx } from "@decohere/nexus/io";
1
+ import type { Project, Tsconfig } from "@decohere/workspace";
2
+ import type { FileEx } from "@decohere/core/io";
3
+ import ts from "typescript";
3
4
  import type { TsProgramHost } from "../services/ts-program-host.js";
4
5
  import { TransformResponse } from "../types/transform-response.model.js";
5
6
  export type TypeProgramProject = {
6
7
  project: Project;
7
8
  files: FileEx[];
8
9
  tsconfig: Tsconfig;
10
+ /** The compiler's parse of `tsconfig`. */
11
+ compilerOptions: ts.CompilerOptions;
9
12
  };
10
13
  export declare class TypeEmissionProgram {
11
14
  #private;
12
- constructor(group: TypeProgramProject[], hostFactory: TsProgramHost);
15
+ constructor(group: TypeProgramProject[], hostFactory: TsProgramHost, requiredOptions: ts.CompilerOptions);
16
+ check(): readonly ts.Diagnostic[];
17
+ formatDiagnostics(diagnostics: readonly ts.Diagnostic[]): string;
13
18
  private toEmissionTarget;
14
19
  private emittedKey;
15
20
  private buildTargetMaps;
16
21
  addFile(file: FileEx, project: Project): void;
17
22
  emit(fileFilter?: (project: Project) => Promise<FileEx[]>, onOutput?: (response: TransformResponse) => void): Promise<TransformResponse[]>;
23
+ private createProgram;
24
+ private refreshProgramIfNeeded;
18
25
  private emitAll;
19
26
  private emitFiltered;
20
27
  private toTransformResponse;
@@ -1,9 +1,8 @@
1
- import type { Project, ProjectFileEvent } from "@decohere/mesh";
2
- import type { FileEx } from "@decohere/nexus/io";
1
+ import type { Project, Workspace } from "@decohere/workspace";
2
+ import type { FileEx } from "@decohere/core/io";
3
+ import type { Observable } from "@decohere/core/system";
3
4
  import type ts from "typescript";
4
5
  import "../extensions/project.extensions.js";
5
- import { CachesOutputs } from "../mixins/caches-outputs.mixin.js";
6
- import { IncrementalTransform } from "../mixins/incremental-transform.mixin.js";
7
6
  import { type BuildTarget } from "../types/build-target.type.js";
8
7
  import type { TransformResponse } from "../types/transform-response.model.js";
9
8
  import type { Transformer } from "../types/transformer.type.js";
@@ -25,10 +24,17 @@ export declare const DEFAULT_TYPE_EMITTER_OPTIONS: Readonly<ts.CompilerOptions>;
25
24
  * tsconfig specifies. Applied after the user spread so they cannot be overridden.
26
25
  */
27
26
  export declare const REQUIRED_TYPE_EMITTER_OPTIONS: Readonly<ts.CompilerOptions>;
28
- declare const TypeEmitter_base: abstract new (...args: unknown[]) => CachesOutputs & IncrementalTransform;
29
- export declare class TypeEmitter extends TypeEmitter_base implements Transformer {
27
+ /** Compiler options enforced for `forge typecheck` — never emit JS or declarations. */
28
+ export declare const REQUIRED_TYPE_CHECK_OPTIONS: Readonly<ts.CompilerOptions>;
29
+ export type PrepareProgramsOptions = {
30
+ includeAllProjects?: boolean;
31
+ requiredCompilerOptions?: ts.CompilerOptions;
32
+ };
33
+ export declare class TypeEmitter implements Transformer {
30
34
  #private;
31
35
  buildTargets: BuildTarget[];
36
+ get incrementalTransform$(): Observable<TransformResponse[]>;
37
+ watch(workspace: Workspace): void;
32
38
  /**
33
39
  * Phase 1: fetch files, create TypeScript programs sequentially.
34
40
  * Called before transformProject() so that the heavy createProgram work
@@ -36,8 +42,15 @@ export declare class TypeEmitter extends TypeEmitter_base implements Transformer
36
42
  */
37
43
  init(projectArrayLike: Project[] | Project, _filter?: (project: Project) => Promise<FileEx[]>): Promise<void>;
38
44
  transformProject(projectArrayLike: Project[] | Project, filter?: (project: Project) => Promise<FileEx[]>, onOutput?: (response: TransformResponse) => void): Promise<TransformResponse[]>;
45
+ /**
46
+ * Type-check projects without emitting files. Includes every workspace project, not
47
+ * only those with a `types` build target (debug is es6-only).
48
+ */
49
+ checkProject(projectArrayLike: Project[] | Project): Promise<{
50
+ diagnostics: ts.Diagnostic[];
51
+ formatted: string;
52
+ }>;
39
53
  private preparePrograms;
40
- protected onIncrementalFileEvent(evt: ProjectFileEvent): Promise<TransformResponse[]>;
54
+ private onIncrementalFileEvent;
41
55
  private invalidateReadFileCache;
42
56
  }
43
- export {};
@@ -0,0 +1,6 @@
1
+ export { createWorkspace } from "../create-workspace.js";
2
+ export type { TranspileOptions } from "../services/swc-transpiler.js";
3
+ export { SwcTranspiler } from "../services/swc-transpiler.js";
4
+ export { transpileCache } from "../services/transpile-cache.js";
5
+ export type { BuildTarget, TranspileTarget } from "../types/build-target.type.js";
6
+ export { BuildTargets } from "../types/build-target.type.js";
@@ -1,6 +1,11 @@
1
- import type { Configuration } from "@decohere/mesh";
1
+ import type { Configuration } from "@decohere/workspace";
2
2
  import type { BuildTarget } from "./build-target.type.js";
3
3
  export type ForgeConfiguration = Configuration & {
4
4
  targets: BuildTarget[];
5
5
  aliasPaths?: boolean;
6
+ /**
7
+ * Inline source maps in emitted JavaScript (default true). They embed the full TypeScript
8
+ * source and absolute build paths, so published (release) output turns them off.
9
+ */
10
+ sourceMaps?: boolean;
6
11
  };
@@ -1,4 +1,4 @@
1
- import type { ResultStatus } from "@decohere/nexus/cli";
1
+ import type { ResultStatus } from "@decohere/devkit/cli";
2
2
  export type Package = {
3
3
  name: string;
4
4
  version?: string;
@@ -22,15 +22,14 @@ export type SyncprojectResult = ResultStatus & {
22
22
  projectName: string;
23
23
  drift?: DriftEntry | null;
24
24
  };
25
+ export type DependencyLists = {
26
+ dependencies: Record<string, string>;
27
+ devDependencies: Record<string, string>;
28
+ peerDependencies: Record<string, string>;
29
+ };
25
30
  export type DriftEntry = {
26
- original: {
27
- dependencies: Record<string, string>;
28
- devDependencies: Record<string, string>;
29
- };
30
- updated: {
31
- dependencies: Record<string, string>;
32
- devDependencies: Record<string, string>;
33
- };
31
+ original: DependencyLists;
32
+ updated: DependencyLists;
34
33
  };
35
34
  export type DependencyWarning = {
36
35
  file: string;
@@ -1,8 +1,14 @@
1
- import type { Tsconfig } from "@decohere/mesh";
1
+ import type { Project, Tsconfig, Workspace } from "@decohere/workspace";
2
2
  export type SwcConfigOptions = {
3
3
  aliasPaths?: boolean;
4
+ /** `false` drops source maps from the output. */
5
+ sourceMaps?: boolean;
4
6
  tsConfig?: Tsconfig;
5
7
  userConfig?: SwcConfig;
8
+ /** When set, convention aliases come from the full workspace package list. */
9
+ workspace?: Workspace;
10
+ /** Fallback package list when `workspace` is not set (e.g. a transform batch). */
11
+ projects?: readonly Project[];
6
12
  };
7
13
  export declare class SwcConfig {
8
14
  constructor(data?: Partial<SwcConfig>);
@@ -1,12 +1,7 @@
1
- import type { Project } from "@decohere/mesh";
2
- import type { File } from "@decohere/nexus/io";
1
+ import type { Project } from "@decohere/workspace";
2
+ import type { File } from "@decohere/core/io";
3
3
  import type { BuildTarget } from "./build-target.type.js";
4
4
  export type TransformOutcome = "success" | "failure" | "skipped";
5
- export declare const TransformOutcomes: {
6
- success: "success";
7
- failure: "failure";
8
- skipped: "skipped";
9
- };
10
5
  type TransformResponseBase = {
11
6
  file: File;
12
7
  config: unknown;
@@ -1,17 +1,8 @@
1
- import type { Project, Workspace } from "@decohere/mesh";
2
- import type { FileEx } from "@decohere/nexus/io";
3
- import type { Observable } from "rxjs";
1
+ import type { Project, Workspace } from "@decohere/workspace";
2
+ import type { FileEx } from "@decohere/core/io";
3
+ import type { Observable } from "@decohere/core/system";
4
4
  import type { BuildTarget } from "../types/build-target.type.js";
5
5
  import type { TransformResponse } from "./transform-response.model.js";
6
- export type FileEvent = {
7
- type: "changed" | "added";
8
- file: FileEx;
9
- project?: Project;
10
- } | {
11
- type: "deleted";
12
- file: FileEx;
13
- project: Project;
14
- };
15
6
  export declare const TransformerKey: unique symbol;
16
7
  export interface Transformer {
17
8
  readonly buildTargets: BuildTarget[];
@@ -1,6 +1,6 @@
1
- import type { ProjectOptions as BaseProjectOptions, WorkspaceOptions as BaseWorkspaceOptions } from "@decohere/mesh";
2
- import type { Action, CommandType } from "@decohere/nexus/cli";
3
- import type { Constructable } from "@decohere/nexus/reflection";
1
+ import type { ProjectOptions as BaseProjectOptions, WorkspaceOptions as BaseWorkspaceOptions } from "@decohere/workspace";
2
+ import type { Action, CommandType } from "@decohere/devkit/cli";
3
+ import type { Constructable } from "@decohere/core/reflection";
4
4
  import type { ForgeConfiguration } from "./configuration.type.js";
5
5
  export type ProjectOptions = Omit<BaseProjectOptions, "configurations"> & {
6
6
  configurations: ForgeConfiguration[];
@@ -2,8 +2,6 @@ export type ForgeBuildOptions = {
2
2
  buildConfig?: string;
3
3
  logLevel?: string;
4
4
  workspaceRoot?: string;
5
- /** Skip the build pre-warm entirely (e.g. when a pre-built artifact is already on disk). */
6
- skipBuild?: boolean;
7
5
  };
8
6
  export declare function forgeBuild(options?: ForgeBuildOptions): {
9
7
  name: string;
@@ -2,5 +2,11 @@ import type { ForgeConfiguration } from "./types/configuration.type.js";
2
2
  import type { WorkspaceOptions } from "./types/workspace-config.type.js";
3
3
  export declare const Debug: ForgeConfiguration;
4
4
  export declare const Release: ForgeConfiguration;
5
+ /**
6
+ * Link configuration: unpacked JS + co-located type declarations.
7
+ * Intended for `forge link` — symlinked into a consumer's node_modules so that
8
+ * both runtime resolution and TypeScript find the same output directory.
9
+ */
10
+ export declare const Link: ForgeConfiguration;
5
11
  export declare const DefaultConfigurations: ForgeConfiguration[];
6
12
  export declare const WorkspaceDefaults: WorkspaceOptions;
@@ -1,44 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "CachesOutputs", {
6
- enumerable: true,
7
- get: function() {
8
- return CachesOutputs;
9
- }
10
- });
11
- const _io = require("@decohere/nexus/io");
12
- class CachesOutputs {
13
- /** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */ get outputCache() {
14
- const self = this;
15
- if (self.__outputCache == null) {
16
- self.__outputCache = new Map();
17
- }
18
- return self.__outputCache;
19
- }
20
- cacheOutputs(responses) {
21
- const byFile = new Map();
22
- for (const response of responses){
23
- if (response.outcome !== "success") continue;
24
- const group = byFile.get(response.file.fullPath) ?? [];
25
- group.push(response);
26
- byFile.set(response.file.fullPath, group);
27
- }
28
- for (const [fullPath, group] of byFile){
29
- this.outputCache.set(fullPath, group);
30
- }
31
- }
32
- deleteCachedOutputs(filePath) {
33
- const outputs = this.outputCache.get(filePath);
34
- if (outputs == null) return;
35
- for (const response of outputs){
36
- if (response.outputPath != null) {
37
- void _io.io.deleteFile(response.outputPath);
38
- }
39
- }
40
- this.outputCache.delete(filePath);
41
- }
42
- }
43
-
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvY2FjaGVzLW91dHB1dHMubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FjaGVzT3V0cHV0cyB7XG5cdC8qKiBNYXBzIHNvdXJjZSBmaWxlIGZ1bGxQYXRoIC0+IG91dHB1dCBUcmFuc2Zvcm1SZXNwb25zZXMgZm9yIGNsZWFudXAgaW4gd2F0Y2ggbW9kZS4gKi9cblx0cHJvdGVjdGVkIGdldCBvdXRwdXRDYWNoZSgpOiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXMgYXMgeyBfX291dHB1dENhY2hlPzogTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4gfTtcblx0XHRpZiAoc2VsZi5fX291dHB1dENhY2hlID09IG51bGwpIHtcblx0XHRcdHNlbGYuX19vdXRwdXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZi5fX291dHB1dENhY2hlO1xuXHR9XG5cblx0cHJvdGVjdGVkIGNhY2hlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4oKTtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0aWYgKHJlc3BvbnNlLm91dGNvbWUgIT09IFwic3VjY2Vzc1wiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGdyb3VwID0gYnlGaWxlLmdldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoKSA/PyBbXTtcblx0XHRcdGdyb3VwLnB1c2gocmVzcG9uc2UpO1xuXHRcdFx0YnlGaWxlLnNldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoLCBncm91cCk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgW2Z1bGxQYXRoLCBncm91cF0gb2YgYnlGaWxlKSB7XG5cdFx0XHR0aGlzLm91dHB1dENhY2hlLnNldChmdWxsUGF0aCwgZ3JvdXApO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBkZWxldGVDYWNoZWRPdXRwdXRzKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGlmIChvdXRwdXRzID09IG51bGwpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG91dHB1dHMpIHtcblx0XHRcdGlmIChyZXNwb25zZS5vdXRwdXRQYXRoICE9IG51bGwpIHtcblx0XHRcdFx0dm9pZCBpby5kZWxldGVGaWxlKHJlc3BvbnNlLm91dHB1dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLm91dHB1dENhY2hlLmRlbGV0ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDYWNoZXNPdXRwdXRzIiwib3V0cHV0Q2FjaGUiLCJzZWxmIiwiX19vdXRwdXRDYWNoZSIsIk1hcCIsImNhY2hlT3V0cHV0cyIsInJlc3BvbnNlcyIsImJ5RmlsZSIsInJlc3BvbnNlIiwib3V0Y29tZSIsImdyb3VwIiwiZ2V0IiwiZmlsZSIsImZ1bGxQYXRoIiwicHVzaCIsInNldCIsImRlbGV0ZUNhY2hlZE91dHB1dHMiLCJmaWxlUGF0aCIsIm91dHB1dHMiLCJvdXRwdXRQYXRoIiwiaW8iLCJkZWxldGVGaWxlIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdzQkE7OztlQUFBQTs7O29CQUhIO0FBR1osTUFBZUE7SUFDckIsc0ZBQXNGLEdBQ3RGLElBQWNDLGNBQWdEO1FBQzdELE1BQU1DLE9BQU8sSUFBSTtRQUNqQixJQUFJQSxLQUFLQyxhQUFhLElBQUksTUFBTTtZQUMvQkQsS0FBS0MsYUFBYSxHQUFHLElBQUlDO1FBQzFCO1FBQ0EsT0FBT0YsS0FBS0MsYUFBYTtJQUMxQjtJQUVVRSxhQUFhQyxTQUE4QixFQUFRO1FBQzVELE1BQU1DLFNBQVMsSUFBSUg7UUFDbkIsS0FBSyxNQUFNSSxZQUFZRixVQUFXO1lBQ2pDLElBQUlFLFNBQVNDLE9BQU8sS0FBSyxXQUFXO1lBQ3BDLE1BQU1DLFFBQVFILE9BQU9JLEdBQUcsQ0FBQ0gsU0FBU0ksSUFBSSxDQUFDQyxRQUFRLEtBQUssRUFBRTtZQUN0REgsTUFBTUksSUFBSSxDQUFDTjtZQUNYRCxPQUFPUSxHQUFHLENBQUNQLFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxFQUFFSDtRQUNwQztRQUNBLEtBQUssTUFBTSxDQUFDRyxVQUFVSCxNQUFNLElBQUlILE9BQVE7WUFDdkMsSUFBSSxDQUFDTixXQUFXLENBQUNjLEdBQUcsQ0FBQ0YsVUFBVUg7UUFDaEM7SUFDRDtJQUVVTSxvQkFBb0JDLFFBQWdCLEVBQVE7UUFDckQsTUFBTUMsVUFBVSxJQUFJLENBQUNqQixXQUFXLENBQUNVLEdBQUcsQ0FBQ007UUFDckMsSUFBSUMsV0FBVyxNQUFNO1FBQ3JCLEtBQUssTUFBTVYsWUFBWVUsUUFBUztZQUMvQixJQUFJVixTQUFTVyxVQUFVLElBQUksTUFBTTtnQkFDaEMsS0FBS0MsTUFBRSxDQUFDQyxVQUFVLENBQUNiLFNBQVNXLFVBQVU7WUFDdkM7UUFDRDtRQUNBLElBQUksQ0FBQ2xCLFdBQVcsQ0FBQ3FCLE1BQU0sQ0FBQ0w7SUFDekI7QUFDRCJ9
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "IncrementalTransform", {
6
- enumerable: true,
7
- get: function() {
8
- return IncrementalTransform;
9
- }
10
- });
11
- const _rxjs = require("rxjs");
12
- // WeakMap avoids the private-field-in-mixin problem: private class fields (#x)
13
- // are not accessible when methods are copied onto a different class prototype.
14
- const subjects = new WeakMap();
15
- function getSubject(instance) {
16
- let subject = subjects.get(instance);
17
- if (subject == null) {
18
- subject = new _rxjs.Subject();
19
- subjects.set(instance, subject);
20
- }
21
- return subject;
22
- }
23
- class IncrementalTransform {
24
- get incrementalTransform$() {
25
- return getSubject(this).asObservable();
26
- }
27
- watch(workspace) {
28
- workspace.projectFileChanged$.subscribe((evt)=>{
29
- void this.onIncrementalFileEvent(evt).then((responses)=>{
30
- getSubject(this).next(responses);
31
- });
32
- });
33
- }
34
- }
35
-
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG4vLyBXZWFrTWFwIGF2b2lkcyB0aGUgcHJpdmF0ZS1maWVsZC1pbi1taXhpbiBwcm9ibGVtOiBwcml2YXRlIGNsYXNzIGZpZWxkcyAoI3gpXG4vLyBhcmUgbm90IGFjY2Vzc2libGUgd2hlbiBtZXRob2RzIGFyZSBjb3BpZWQgb250byBhIGRpZmZlcmVudCBjbGFzcyBwcm90b3R5cGUuXG5jb25zdCBzdWJqZWN0cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPj4oKTtcblxuZnVuY3Rpb24gZ2V0U3ViamVjdChpbnN0YW5jZTogb2JqZWN0KTogU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdGxldCBzdWJqZWN0ID0gc3ViamVjdHMuZ2V0KGluc3RhbmNlKTtcblx0aWYgKHN1YmplY3QgPT0gbnVsbCkge1xuXHRcdHN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdHN1YmplY3RzLnNldChpbnN0YW5jZSwgc3ViamVjdCk7XG5cdH1cblx0cmV0dXJuIHN1YmplY3Q7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB7XG5cdHB1YmxpYyBnZXQgaW5jcmVtZW50YWxUcmFuc2Zvcm0kKCk6IE9ic2VydmFibGU8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdHJldHVybiBnZXRTdWJqZWN0KHRoaXMpLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0cHVibGljIHdhdGNoKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG5cdFx0d29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKChldnQpID0+IHtcblx0XHRcdHZvaWQgdGhpcy5vbkluY3JlbWVudGFsRmlsZUV2ZW50KGV2dCkudGhlbigocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGdldFN1YmplY3QodGhpcykubmV4dChyZXNwb25zZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIGZvciBldmVyeSB3b3Jrc3BhY2UgZmlsZSBjaGFuZ2UuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW52YWxpZGF0ZVxuXHQgKiBhbnkgaW50ZXJuYWwgY2FjaGVzLCBwZXJmb3JtIHRoZSBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0sIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBmb3IgZGVsZXRpb25zIG9yIHdoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFic3RyYWN0IG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoXG5cdFx0ZXZ0OiBQcm9qZWN0RmlsZUV2ZW50LFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+O1xufVxuIl0sIm5hbWVzIjpbIkluY3JlbWVudGFsVHJhbnNmb3JtIiwic3ViamVjdHMiLCJXZWFrTWFwIiwiZ2V0U3ViamVjdCIsImluc3RhbmNlIiwic3ViamVjdCIsImdldCIsIlN1YmplY3QiLCJzZXQiLCJpbmNyZW1lbnRhbFRyYW5zZm9ybSQiLCJhc09ic2VydmFibGUiLCJ3YXRjaCIsIndvcmtzcGFjZSIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJldnQiLCJvbkluY3JlbWVudGFsRmlsZUV2ZW50IiwidGhlbiIsInJlc3BvbnNlcyIsIm5leHQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBa0JzQkE7OztlQUFBQTs7O3NCQWhCRTtBQUd4QiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLE1BQU1DLFdBQVcsSUFBSUM7QUFFckIsU0FBU0MsV0FBV0MsUUFBZ0I7SUFDbkMsSUFBSUMsVUFBVUosU0FBU0ssR0FBRyxDQUFDRjtJQUMzQixJQUFJQyxXQUFXLE1BQU07UUFDcEJBLFVBQVUsSUFBSUUsYUFBTztRQUNyQk4sU0FBU08sR0FBRyxDQUFDSixVQUFVQztJQUN4QjtJQUNBLE9BQU9BO0FBQ1I7QUFFTyxNQUFlTDtJQUNyQixJQUFXUyx3QkFBeUQ7UUFDbkUsT0FBT04sV0FBVyxJQUFJLEVBQUVPLFlBQVk7SUFDckM7SUFFT0MsTUFBTUMsU0FBb0IsRUFBUTtRQUN4Q0EsVUFBVUMsbUJBQW1CLENBQUNDLFNBQVMsQ0FBQyxDQUFDQztZQUN4QyxLQUFLLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNELEtBQUtFLElBQUksQ0FBQyxDQUFDQztnQkFDM0NmLFdBQVcsSUFBSSxFQUFFZ0IsSUFBSSxDQUFDRDtZQUN2QjtRQUNEO0lBQ0Q7QUFVRCJ9
@@ -1,34 +0,0 @@
1
- import { io } from "@decohere/nexus/io";
2
- export class CachesOutputs {
3
- /** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */ get outputCache() {
4
- const self = this;
5
- if (self.__outputCache == null) {
6
- self.__outputCache = new Map();
7
- }
8
- return self.__outputCache;
9
- }
10
- cacheOutputs(responses) {
11
- const byFile = new Map();
12
- for (const response of responses){
13
- if (response.outcome !== "success") continue;
14
- const group = byFile.get(response.file.fullPath) ?? [];
15
- group.push(response);
16
- byFile.set(response.file.fullPath, group);
17
- }
18
- for (const [fullPath, group] of byFile){
19
- this.outputCache.set(fullPath, group);
20
- }
21
- }
22
- deleteCachedOutputs(filePath) {
23
- const outputs = this.outputCache.get(filePath);
24
- if (outputs == null) return;
25
- for (const response of outputs){
26
- if (response.outputPath != null) {
27
- void io.deleteFile(response.outputPath);
28
- }
29
- }
30
- this.outputCache.delete(filePath);
31
- }
32
- }
33
-
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvY2FjaGVzLW91dHB1dHMubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FjaGVzT3V0cHV0cyB7XG5cdC8qKiBNYXBzIHNvdXJjZSBmaWxlIGZ1bGxQYXRoIC0+IG91dHB1dCBUcmFuc2Zvcm1SZXNwb25zZXMgZm9yIGNsZWFudXAgaW4gd2F0Y2ggbW9kZS4gKi9cblx0cHJvdGVjdGVkIGdldCBvdXRwdXRDYWNoZSgpOiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXMgYXMgeyBfX291dHB1dENhY2hlPzogTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4gfTtcblx0XHRpZiAoc2VsZi5fX291dHB1dENhY2hlID09IG51bGwpIHtcblx0XHRcdHNlbGYuX19vdXRwdXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZi5fX291dHB1dENhY2hlO1xuXHR9XG5cblx0cHJvdGVjdGVkIGNhY2hlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4oKTtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0aWYgKHJlc3BvbnNlLm91dGNvbWUgIT09IFwic3VjY2Vzc1wiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGdyb3VwID0gYnlGaWxlLmdldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoKSA/PyBbXTtcblx0XHRcdGdyb3VwLnB1c2gocmVzcG9uc2UpO1xuXHRcdFx0YnlGaWxlLnNldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoLCBncm91cCk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgW2Z1bGxQYXRoLCBncm91cF0gb2YgYnlGaWxlKSB7XG5cdFx0XHR0aGlzLm91dHB1dENhY2hlLnNldChmdWxsUGF0aCwgZ3JvdXApO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBkZWxldGVDYWNoZWRPdXRwdXRzKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGlmIChvdXRwdXRzID09IG51bGwpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG91dHB1dHMpIHtcblx0XHRcdGlmIChyZXNwb25zZS5vdXRwdXRQYXRoICE9IG51bGwpIHtcblx0XHRcdFx0dm9pZCBpby5kZWxldGVGaWxlKHJlc3BvbnNlLm91dHB1dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLm91dHB1dENhY2hlLmRlbGV0ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJpbyIsIkNhY2hlc091dHB1dHMiLCJvdXRwdXRDYWNoZSIsInNlbGYiLCJfX291dHB1dENhY2hlIiwiTWFwIiwiY2FjaGVPdXRwdXRzIiwicmVzcG9uc2VzIiwiYnlGaWxlIiwicmVzcG9uc2UiLCJvdXRjb21lIiwiZ3JvdXAiLCJnZXQiLCJmaWxlIiwiZnVsbFBhdGgiLCJwdXNoIiwic2V0IiwiZGVsZXRlQ2FjaGVkT3V0cHV0cyIsImZpbGVQYXRoIiwib3V0cHV0cyIsIm91dHB1dFBhdGgiLCJkZWxldGVGaWxlIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxFQUFFLFFBQVEscUJBQXFCO0FBR3hDLE9BQU8sTUFBZUM7SUFDckIsc0ZBQXNGLEdBQ3RGLElBQWNDLGNBQWdEO1FBQzdELE1BQU1DLE9BQU8sSUFBSTtRQUNqQixJQUFJQSxLQUFLQyxhQUFhLElBQUksTUFBTTtZQUMvQkQsS0FBS0MsYUFBYSxHQUFHLElBQUlDO1FBQzFCO1FBQ0EsT0FBT0YsS0FBS0MsYUFBYTtJQUMxQjtJQUVVRSxhQUFhQyxTQUE4QixFQUFRO1FBQzVELE1BQU1DLFNBQVMsSUFBSUg7UUFDbkIsS0FBSyxNQUFNSSxZQUFZRixVQUFXO1lBQ2pDLElBQUlFLFNBQVNDLE9BQU8sS0FBSyxXQUFXO1lBQ3BDLE1BQU1DLFFBQVFILE9BQU9JLEdBQUcsQ0FBQ0gsU0FBU0ksSUFBSSxDQUFDQyxRQUFRLEtBQUssRUFBRTtZQUN0REgsTUFBTUksSUFBSSxDQUFDTjtZQUNYRCxPQUFPUSxHQUFHLENBQUNQLFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxFQUFFSDtRQUNwQztRQUNBLEtBQUssTUFBTSxDQUFDRyxVQUFVSCxNQUFNLElBQUlILE9BQVE7WUFDdkMsSUFBSSxDQUFDTixXQUFXLENBQUNjLEdBQUcsQ0FBQ0YsVUFBVUg7UUFDaEM7SUFDRDtJQUVVTSxvQkFBb0JDLFFBQWdCLEVBQVE7UUFDckQsTUFBTUMsVUFBVSxJQUFJLENBQUNqQixXQUFXLENBQUNVLEdBQUcsQ0FBQ007UUFDckMsSUFBSUMsV0FBVyxNQUFNO1FBQ3JCLEtBQUssTUFBTVYsWUFBWVUsUUFBUztZQUMvQixJQUFJVixTQUFTVyxVQUFVLElBQUksTUFBTTtnQkFDaEMsS0FBS3BCLEdBQUdxQixVQUFVLENBQUNaLFNBQVNXLFVBQVU7WUFDdkM7UUFDRDtRQUNBLElBQUksQ0FBQ2xCLFdBQVcsQ0FBQ29CLE1BQU0sQ0FBQ0o7SUFDekI7QUFDRCJ9
@@ -1,26 +0,0 @@
1
- import { Subject } from "rxjs";
2
- // WeakMap avoids the private-field-in-mixin problem: private class fields (#x)
3
- // are not accessible when methods are copied onto a different class prototype.
4
- const subjects = new WeakMap();
5
- function getSubject(instance) {
6
- let subject = subjects.get(instance);
7
- if (subject == null) {
8
- subject = new Subject();
9
- subjects.set(instance, subject);
10
- }
11
- return subject;
12
- }
13
- export class IncrementalTransform {
14
- get incrementalTransform$() {
15
- return getSubject(this).asObservable();
16
- }
17
- watch(workspace) {
18
- workspace.projectFileChanged$.subscribe((evt)=>{
19
- void this.onIncrementalFileEvent(evt).then((responses)=>{
20
- getSubject(this).next(responses);
21
- });
22
- });
23
- }
24
- }
25
-
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG4vLyBXZWFrTWFwIGF2b2lkcyB0aGUgcHJpdmF0ZS1maWVsZC1pbi1taXhpbiBwcm9ibGVtOiBwcml2YXRlIGNsYXNzIGZpZWxkcyAoI3gpXG4vLyBhcmUgbm90IGFjY2Vzc2libGUgd2hlbiBtZXRob2RzIGFyZSBjb3BpZWQgb250byBhIGRpZmZlcmVudCBjbGFzcyBwcm90b3R5cGUuXG5jb25zdCBzdWJqZWN0cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPj4oKTtcblxuZnVuY3Rpb24gZ2V0U3ViamVjdChpbnN0YW5jZTogb2JqZWN0KTogU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdGxldCBzdWJqZWN0ID0gc3ViamVjdHMuZ2V0KGluc3RhbmNlKTtcblx0aWYgKHN1YmplY3QgPT0gbnVsbCkge1xuXHRcdHN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdHN1YmplY3RzLnNldChpbnN0YW5jZSwgc3ViamVjdCk7XG5cdH1cblx0cmV0dXJuIHN1YmplY3Q7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB7XG5cdHB1YmxpYyBnZXQgaW5jcmVtZW50YWxUcmFuc2Zvcm0kKCk6IE9ic2VydmFibGU8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdHJldHVybiBnZXRTdWJqZWN0KHRoaXMpLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0cHVibGljIHdhdGNoKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG5cdFx0d29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKChldnQpID0+IHtcblx0XHRcdHZvaWQgdGhpcy5vbkluY3JlbWVudGFsRmlsZUV2ZW50KGV2dCkudGhlbigocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGdldFN1YmplY3QodGhpcykubmV4dChyZXNwb25zZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIGZvciBldmVyeSB3b3Jrc3BhY2UgZmlsZSBjaGFuZ2UuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW52YWxpZGF0ZVxuXHQgKiBhbnkgaW50ZXJuYWwgY2FjaGVzLCBwZXJmb3JtIHRoZSBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0sIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBmb3IgZGVsZXRpb25zIG9yIHdoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFic3RyYWN0IG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoXG5cdFx0ZXZ0OiBQcm9qZWN0RmlsZUV2ZW50LFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+O1xufVxuIl0sIm5hbWVzIjpbIlN1YmplY3QiLCJzdWJqZWN0cyIsIldlYWtNYXAiLCJnZXRTdWJqZWN0IiwiaW5zdGFuY2UiLCJzdWJqZWN0IiwiZ2V0Iiwic2V0IiwiSW5jcmVtZW50YWxUcmFuc2Zvcm0iLCJpbmNyZW1lbnRhbFRyYW5zZm9ybSQiLCJhc09ic2VydmFibGUiLCJ3YXRjaCIsIndvcmtzcGFjZSIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJldnQiLCJvbkluY3JlbWVudGFsRmlsZUV2ZW50IiwidGhlbiIsInJlc3BvbnNlcyIsIm5leHQiXSwibWFwcGluZ3MiOiJBQUVBLFNBQVNBLE9BQU8sUUFBUSxPQUFPO0FBRy9CLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsTUFBTUMsV0FBVyxJQUFJQztBQUVyQixTQUFTQyxXQUFXQyxRQUFnQjtJQUNuQyxJQUFJQyxVQUFVSixTQUFTSyxHQUFHLENBQUNGO0lBQzNCLElBQUlDLFdBQVcsTUFBTTtRQUNwQkEsVUFBVSxJQUFJTDtRQUNkQyxTQUFTTSxHQUFHLENBQUNILFVBQVVDO0lBQ3hCO0lBQ0EsT0FBT0E7QUFDUjtBQUVBLE9BQU8sTUFBZUc7SUFDckIsSUFBV0Msd0JBQXlEO1FBQ25FLE9BQU9OLFdBQVcsSUFBSSxFQUFFTyxZQUFZO0lBQ3JDO0lBRU9DLE1BQU1DLFNBQW9CLEVBQVE7UUFDeENBLFVBQVVDLG1CQUFtQixDQUFDQyxTQUFTLENBQUMsQ0FBQ0M7WUFDeEMsS0FBSyxJQUFJLENBQUNDLHNCQUFzQixDQUFDRCxLQUFLRSxJQUFJLENBQUMsQ0FBQ0M7Z0JBQzNDZixXQUFXLElBQUksRUFBRWdCLElBQUksQ0FBQ0Q7WUFDdkI7UUFDRDtJQUNEO0FBVUQifQ==
@@ -1,7 +0,0 @@
1
- import type { TransformResponse } from "../types/transform-response.model.js";
2
- export declare abstract class CachesOutputs {
3
- /** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */
4
- protected get outputCache(): Map<string, TransformResponse[]>;
5
- protected cacheOutputs(responses: TransformResponse[]): void;
6
- protected deleteCachedOutputs(filePath: string): void;
7
- }
@@ -1,13 +0,0 @@
1
- import type { ProjectFileEvent, Workspace } from "@decohere/mesh";
2
- import type { Observable } from "rxjs";
3
- import type { TransformResponse } from "../types/transform-response.model.js";
4
- export declare abstract class IncrementalTransform {
5
- get incrementalTransform$(): Observable<TransformResponse[]>;
6
- watch(workspace: Workspace): void;
7
- /**
8
- * Called for every workspace file change. Implementations should invalidate
9
- * any internal caches, perform the incremental transform, and return the results.
10
- * Return an empty array for deletions or when no output is produced.
11
- */
12
- protected abstract onIncrementalFileEvent(evt: ProjectFileEvent): Promise<TransformResponse[]>;
13
- }