@mgvdev/nestkit-core 0.1.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 (54) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/bundler.d.ts +11 -0
  3. package/dist/bundler.d.ts.map +1 -0
  4. package/dist/bundler.js +2 -0
  5. package/dist/bundler.js.map +1 -0
  6. package/dist/compiler.d.ts +67 -0
  7. package/dist/compiler.d.ts.map +1 -0
  8. package/dist/compiler.js +2 -0
  9. package/dist/compiler.js.map +1 -0
  10. package/dist/config.d.ts +10 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +56 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/dev-output.d.ts +20 -0
  15. package/dist/dev-output.d.ts.map +1 -0
  16. package/dist/dev-output.js +158 -0
  17. package/dist/dev-output.js.map +1 -0
  18. package/dist/dev.d.ts +37 -0
  19. package/dist/dev.d.ts.map +1 -0
  20. package/dist/dev.js +210 -0
  21. package/dist/dev.js.map +1 -0
  22. package/dist/graph.d.ts +31 -0
  23. package/dist/graph.d.ts.map +1 -0
  24. package/dist/graph.js +128 -0
  25. package/dist/graph.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +13 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/logger.d.ts +7 -0
  31. package/dist/logger.d.ts.map +1 -0
  32. package/dist/logger.js +9 -0
  33. package/dist/logger.js.map +1 -0
  34. package/dist/orchestrator.d.ts +26 -0
  35. package/dist/orchestrator.d.ts.map +1 -0
  36. package/dist/orchestrator.js +77 -0
  37. package/dist/orchestrator.js.map +1 -0
  38. package/dist/project.d.ts +8 -0
  39. package/dist/project.d.ts.map +1 -0
  40. package/dist/project.js +52 -0
  41. package/dist/project.js.map +1 -0
  42. package/dist/tsconfig.d.ts +18 -0
  43. package/dist/tsconfig.d.ts.map +1 -0
  44. package/dist/tsconfig.js +121 -0
  45. package/dist/tsconfig.js.map +1 -0
  46. package/dist/types.d.ts +82 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/workspace.d.ts +21 -0
  51. package/dist/workspace.d.ts.map +1 -0
  52. package/dist/workspace.js +109 -0
  53. package/dist/workspace.js.map +1 -0
  54. package/package.json +40 -0
package/dist/dev.js ADDED
@@ -0,0 +1,210 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { watch as chokidarWatch } from 'chokidar';
3
+ import { createOutput } from './dev-output.js';
4
+ import { resolveProjectName, selectWithDeps, topoSort } from './graph.js';
5
+ import { c, logger, ms } from './logger.js';
6
+ import { buildProject, loadWorkspaceGraph } from './orchestrator.js';
7
+ function debounce(fn, delayMs) {
8
+ let timer = null;
9
+ return () => {
10
+ if (timer)
11
+ clearTimeout(timer);
12
+ timer = setTimeout(fn, delayMs);
13
+ };
14
+ }
15
+ const isRunnable = (p) => p.type === 'app' || p.type === 'app-frontend';
16
+ /**
17
+ * Resolve the runnable dev targets from a request. `all` selects every managed
18
+ * app + app-frontend; otherwise each ref is resolved and must be runnable.
19
+ * Throws on unknown, unmanaged, or non-runnable (lib) targets.
20
+ */
21
+ export function resolveDevTargets(graph, opts) {
22
+ const requested = opts.all
23
+ ? [...graph.nodes.values()].filter((p) => p.managed && isRunnable(p)).map((p) => p.name)
24
+ : [...(opts.targets ?? []), ...(opts.target ? [opts.target] : [])].map((t) => resolveProjectName(graph, t));
25
+ const runnables = [];
26
+ const seen = new Set();
27
+ for (const name of requested) {
28
+ if (seen.has(name))
29
+ continue;
30
+ seen.add(name);
31
+ const p = graph.nodes.get(name);
32
+ if (!p.managed)
33
+ throw new Error(`Project "${name}" has no nestkit.json`);
34
+ if (!isRunnable(p)) {
35
+ throw new Error(`Project "${name}" is a ${p.type ?? 'unknown'} — libs aren't runnable; add it to an app instead.`);
36
+ }
37
+ runnables.push(p);
38
+ }
39
+ if (runnables.length === 0)
40
+ throw new Error('No dev targets. Pass project name(s) or --all.');
41
+ return runnables;
42
+ }
43
+ /** Short, unique labels for runners (unscoped name; full name on collision). */
44
+ function makeLabels(runnables) {
45
+ const counts = new Map();
46
+ for (const r of runnables) {
47
+ const base = r.name.split('/').pop();
48
+ counts.set(base, (counts.get(base) ?? 0) + 1);
49
+ }
50
+ const labels = new Map();
51
+ for (const r of runnables) {
52
+ const base = r.name.split('/').pop();
53
+ labels.set(r.name, (counts.get(base) ?? 0) > 1 ? r.name : base);
54
+ }
55
+ return labels;
56
+ }
57
+ /**
58
+ * Run one or more projects in dev mode in parallel: build the union of their
59
+ * local-dep closures, start a process per runnable target with labeled output,
60
+ * and watch every source dir to rebuild + restart the affected targets.
61
+ */
62
+ export async function dev(opts) {
63
+ const { graph } = loadWorkspaceGraph(opts.root);
64
+ const runnables = resolveDevTargets(graph, opts);
65
+ const labelOf = makeLabels(runnables);
66
+ // Union of every target's local-dep closure, plus which targets each project feeds.
67
+ const watched = new Map();
68
+ const dependents = new Map();
69
+ for (const r of runnables) {
70
+ for (const n of selectWithDeps(graph, [r.name])) {
71
+ const p = graph.nodes.get(n);
72
+ if (!p.managed)
73
+ continue;
74
+ watched.set(n, p);
75
+ (dependents.get(n) ?? dependents.set(n, []).get(n)).push(r.name);
76
+ }
77
+ }
78
+ const sink = createOutput(runnables.map((r) => labelOf.get(r.name)), opts.tui ?? false);
79
+ // Build the whole union once, in dependency order.
80
+ const { order } = topoSort(graph);
81
+ const buildList = order.filter((n) => watched.has(n)).map((n) => watched.get(n));
82
+ logger.start(`Building ${buildList.length} project(s) for dev...`);
83
+ for (const p of buildList) {
84
+ const r = await buildProject(p, opts.root, opts.env, true);
85
+ logger.success(`${c.bold(p.name)} ${c.dim(`(${p.type})`)} in ${ms(r.durationMs)}`);
86
+ }
87
+ const runners = new Map();
88
+ for (const r of runnables) {
89
+ const runner = createRunner(r, labelOf.get(r.name), opts, sink);
90
+ runners.set(r.name, runner);
91
+ runner.start();
92
+ }
93
+ const rebuild = async (p) => {
94
+ const t0 = performance.now();
95
+ try {
96
+ await buildProject(p, opts.root, opts.env, true);
97
+ for (const rname of dependents.get(p.name) ?? []) {
98
+ const runner = runners.get(rname);
99
+ if (!runner)
100
+ continue;
101
+ runner.note(`${p.name} changed — restarting (${ms(performance.now() - t0)})`);
102
+ runner.restart();
103
+ if (opts.typecheck !== false)
104
+ runner.typecheckBackground();
105
+ }
106
+ }
107
+ catch (err) {
108
+ logger.error(`Rebuild of ${p.name} failed: ${err.message}`);
109
+ }
110
+ };
111
+ const watchers = [];
112
+ for (const p of watched.values()) {
113
+ const trigger = debounce(() => void rebuild(p), 120);
114
+ const w = chokidarWatch(p.sourceDir, { ignoreInitial: true, ignored: /(^|[/\\])\../ });
115
+ w.on('all', trigger);
116
+ watchers.push(w);
117
+ }
118
+ logger.box(`nestkit dev — ${runnables.length} process(es), watching ${watched.size} project(s). Ctrl+C to stop.`);
119
+ return {
120
+ async stop() {
121
+ await Promise.all(watchers.map((w) => w.close()));
122
+ await Promise.all([...runners.values()].map((r) => r.stop()));
123
+ sink.close();
124
+ },
125
+ };
126
+ }
127
+ /** Manages one runnable target's process (app child process or frontend dev server). */
128
+ function createRunner(target, label, opts, sink) {
129
+ let child = null;
130
+ let frontend = null;
131
+ let typechecking = false;
132
+ const startApp = () => {
133
+ if (!target.entryOut)
134
+ throw new Error(`App "${target.name}" has no entry output`);
135
+ child = spawn(process.execPath, [target.entryOut], {
136
+ cwd: target.dir,
137
+ stdio: ['inherit', 'pipe', 'pipe'],
138
+ env: process.env,
139
+ });
140
+ child.stdout?.on('data', (d) => sink.write(label, 'out', d.toString()));
141
+ child.stderr?.on('data', (d) => sink.write(label, 'err', d.toString()));
142
+ child.on('exit', (code, signal) => {
143
+ if (code !== null && code !== 0 && !signal) {
144
+ sink.write(label, 'err', `exited with code ${code}`);
145
+ }
146
+ });
147
+ };
148
+ const stopApp = () => new Promise((resolve) => {
149
+ if (!child)
150
+ return resolve();
151
+ const proc = child;
152
+ child = null;
153
+ const timeout = setTimeout(() => proc.kill('SIGKILL'), 3000);
154
+ proc.once('exit', () => {
155
+ clearTimeout(timeout);
156
+ resolve();
157
+ });
158
+ proc.kill('SIGTERM');
159
+ });
160
+ return {
161
+ start() {
162
+ if (target.type === 'app-frontend') {
163
+ const adapter = opts.env.getFrontendAdapter(target.adapter ?? 'vite');
164
+ void adapter
165
+ .serve({
166
+ project: target,
167
+ root: opts.root,
168
+ watch: true,
169
+ emit: (chunk, stream) => sink.write(label, stream, chunk),
170
+ })
171
+ .then((s) => {
172
+ frontend = s;
173
+ if (s.url)
174
+ sink.note(label, `serving at ${s.url}`);
175
+ });
176
+ return;
177
+ }
178
+ startApp();
179
+ },
180
+ restart() {
181
+ if (target.type === 'app-frontend')
182
+ return; // Vite has its own HMR.
183
+ void stopApp().then(startApp);
184
+ },
185
+ async stop() {
186
+ await stopApp();
187
+ if (frontend)
188
+ await frontend.close();
189
+ },
190
+ note(line) {
191
+ sink.note(label, line);
192
+ },
193
+ typecheckBackground() {
194
+ if (typechecking)
195
+ return;
196
+ typechecking = true;
197
+ void opts.env
198
+ .getTypeChecker()
199
+ .check([target], opts.root)
200
+ .then((r) => {
201
+ if (!r.ok)
202
+ sink.note(label, `typecheck: ${r.diagnostics.length} error(s)`);
203
+ })
204
+ .finally(() => {
205
+ typechecking = false;
206
+ });
207
+ },
208
+ };
209
+ }
210
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Project } from './types.js';
2
+ export interface ProjectGraph {
3
+ /** Project name -> Project. */
4
+ nodes: Map<string, Project>;
5
+ /** Project name -> names of its local dependencies (edges point at deps). */
6
+ edges: Map<string, string[]>;
7
+ }
8
+ export declare class CycleError extends Error {
9
+ readonly cycle: string[];
10
+ constructor(cycle: string[]);
11
+ }
12
+ /** Build a project graph from resolved projects. Edges are local deps only. */
13
+ export declare function buildGraph(projects: Project[]): ProjectGraph;
14
+ /**
15
+ * Topologically sort the graph so that dependencies come before dependents.
16
+ * Groups nodes into levels; nodes in the same level are independent and may
17
+ * build in parallel. Throws CycleError on cycles.
18
+ */
19
+ export declare function topoSort(graph: ProjectGraph): {
20
+ order: string[];
21
+ levels: string[][];
22
+ };
23
+ /**
24
+ * Resolve a user-supplied project reference to a graph node name.
25
+ * Accepts the exact package name, the unscoped name (`api` for `@ex/api`),
26
+ * or the package directory basename. Throws if nothing (or more than one) matches.
27
+ */
28
+ export declare function resolveProjectName(graph: ProjectGraph, input: string): string;
29
+ /** Return the dependency closure of `targets` (targets + all transitive local deps). */
30
+ export declare function selectWithDeps(graph: ProjectGraph, targets: string[]): Set<string>;
31
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC7B;AAED,qBAAa,UAAW,SAAQ,KAAK;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE;gBAAf,KAAK,EAAE,MAAM,EAAE;CAIrC;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,YAAY,CAW5D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAA;CAAE,CAsCrF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU7E;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAYlF"}
package/dist/graph.js ADDED
@@ -0,0 +1,128 @@
1
+ import { basename } from 'node:path';
2
+ export class CycleError extends Error {
3
+ cycle;
4
+ constructor(cycle) {
5
+ super(`Dependency cycle detected: ${cycle.join(' -> ')}`);
6
+ this.cycle = cycle;
7
+ this.name = 'CycleError';
8
+ }
9
+ }
10
+ /** Build a project graph from resolved projects. Edges are local deps only. */
11
+ export function buildGraph(projects) {
12
+ const nodes = new Map(projects.map((p) => [p.name, p]));
13
+ const edges = new Map();
14
+ for (const p of projects) {
15
+ // Keep only deps that are actually present as nodes.
16
+ edges.set(p.name, p.localDeps.filter((d) => nodes.has(d)));
17
+ }
18
+ return { nodes, edges };
19
+ }
20
+ /**
21
+ * Topologically sort the graph so that dependencies come before dependents.
22
+ * Groups nodes into levels; nodes in the same level are independent and may
23
+ * build in parallel. Throws CycleError on cycles.
24
+ */
25
+ export function topoSort(graph) {
26
+ const indegree = new Map();
27
+ const dependents = new Map();
28
+ for (const name of graph.nodes.keys()) {
29
+ indegree.set(name, 0);
30
+ dependents.set(name, []);
31
+ }
32
+ for (const [name, deps] of graph.edges) {
33
+ indegree.set(name, deps.length);
34
+ for (const dep of deps)
35
+ dependents.get(dep)?.push(name);
36
+ }
37
+ const order = [];
38
+ const levels = [];
39
+ let frontier = [...indegree.entries()]
40
+ .filter(([, d]) => d === 0)
41
+ .map(([n]) => n)
42
+ .sort();
43
+ while (frontier.length > 0) {
44
+ levels.push(frontier);
45
+ const next = [];
46
+ for (const name of frontier) {
47
+ order.push(name);
48
+ for (const dep of dependents.get(name) ?? []) {
49
+ const d = (indegree.get(dep) ?? 0) - 1;
50
+ indegree.set(dep, d);
51
+ if (d === 0)
52
+ next.push(dep);
53
+ }
54
+ }
55
+ frontier = next.sort();
56
+ }
57
+ if (order.length !== graph.nodes.size) {
58
+ const remaining = [...graph.nodes.keys()].filter((n) => !order.includes(n));
59
+ throw new CycleError(findCycle(graph, remaining));
60
+ }
61
+ return { order, levels };
62
+ }
63
+ /**
64
+ * Resolve a user-supplied project reference to a graph node name.
65
+ * Accepts the exact package name, the unscoped name (`api` for `@ex/api`),
66
+ * or the package directory basename. Throws if nothing (or more than one) matches.
67
+ */
68
+ export function resolveProjectName(graph, input) {
69
+ if (graph.nodes.has(input))
70
+ return input;
71
+ const byUnscoped = [...graph.nodes.keys()].filter((n) => n.split('/').pop() === input);
72
+ if (byUnscoped.length === 1)
73
+ return byUnscoped[0];
74
+ const byDir = [...graph.nodes.values()].filter((p) => basename(p.dir) === input);
75
+ if (byDir.length === 1)
76
+ return byDir[0].name;
77
+ if (byUnscoped.length > 1 || byDir.length > 1) {
78
+ throw new Error(`Ambiguous project reference "${input}" — use the full package name.`);
79
+ }
80
+ throw new Error(`Unknown project: ${input}`);
81
+ }
82
+ /** Return the dependency closure of `targets` (targets + all transitive local deps). */
83
+ export function selectWithDeps(graph, targets) {
84
+ const selected = new Set();
85
+ const visit = (name) => {
86
+ if (selected.has(name))
87
+ return;
88
+ selected.add(name);
89
+ for (const dep of graph.edges.get(name) ?? [])
90
+ visit(dep);
91
+ };
92
+ for (const t of targets) {
93
+ if (!graph.nodes.has(t))
94
+ throw new Error(`Unknown project: ${t}`);
95
+ visit(t);
96
+ }
97
+ return selected;
98
+ }
99
+ /** Depth-first search to surface a concrete cycle for error messages. */
100
+ function findCycle(graph, candidates) {
101
+ const stack = [];
102
+ const onStack = new Set();
103
+ const visited = new Set();
104
+ const dfs = (name) => {
105
+ if (onStack.has(name))
106
+ return [...stack.slice(stack.indexOf(name)), name];
107
+ if (visited.has(name))
108
+ return null;
109
+ visited.add(name);
110
+ onStack.add(name);
111
+ stack.push(name);
112
+ for (const dep of graph.edges.get(name) ?? []) {
113
+ const found = dfs(dep);
114
+ if (found)
115
+ return found;
116
+ }
117
+ stack.pop();
118
+ onStack.delete(name);
119
+ return null;
120
+ };
121
+ for (const c of candidates) {
122
+ const found = dfs(c);
123
+ if (found)
124
+ return found;
125
+ }
126
+ return candidates;
127
+ }
128
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export * from './types.js';
2
+ export * from './config.js';
3
+ export * from './workspace.js';
4
+ export * from './project.js';
5
+ export * from './graph.js';
6
+ export * from './tsconfig.js';
7
+ export * from './compiler.js';
8
+ export * from './bundler.js';
9
+ export * from './orchestrator.js';
10
+ export * from './dev.js';
11
+ export * from './dev-output.js';
12
+ export { logger, c, ms } from './logger.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export * from './types.js';
2
+ export * from './config.js';
3
+ export * from './workspace.js';
4
+ export * from './project.js';
5
+ export * from './graph.js';
6
+ export * from './tsconfig.js';
7
+ export * from './compiler.js';
8
+ export * from './bundler.js';
9
+ export * from './orchestrator.js';
10
+ export * from './dev.js';
11
+ export * from './dev-output.js';
12
+ export { logger, c, ms } from './logger.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare const logger: import("consola").ConsolaInstance;
2
+ export declare const c: import("picocolors/types.js").Colors & {
3
+ createColors: (enabled?: boolean) => import("picocolors/types.js").Colors;
4
+ };
5
+ /** Format a duration in ms as a short human string. */
6
+ export declare function ms(duration: number): string;
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,MAAM,mCAA6B,CAAA;AAEhD,eAAO,MAAM,CAAC;0BAFgB,CAAC;CAEZ,CAAA;AAEnB,uDAAuD;AACvD,wBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3C"}
package/dist/logger.js ADDED
@@ -0,0 +1,9 @@
1
+ import { consola } from 'consola';
2
+ import pc from 'picocolors';
3
+ export const logger = consola.withTag('nestkit');
4
+ export const c = pc;
5
+ /** Format a duration in ms as a short human string. */
6
+ export function ms(duration) {
7
+ return duration < 1000 ? `${Math.round(duration)}ms` : `${(duration / 1000).toFixed(2)}s`;
8
+ }
9
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAEhD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;AAEnB,uDAAuD;AACvD,MAAM,UAAU,EAAE,CAAC,QAAgB;IACjC,OAAO,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;AAC3F,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { BuildEnv, BuildResult } from './compiler.js';
2
+ import { type ProjectGraph } from './graph.js';
3
+ import type { Project, Workspace } from './types.js';
4
+ export interface LoadedWorkspace {
5
+ workspace: Workspace;
6
+ projects: Project[];
7
+ graph: ProjectGraph;
8
+ }
9
+ /** Discover the workspace and build its project graph. */
10
+ export declare function loadWorkspaceGraph(root: string): LoadedWorkspace;
11
+ export interface BuildOptions {
12
+ root: string;
13
+ /** Explicit project targets. Ignored when `all` is true. */
14
+ targets?: string[];
15
+ all?: boolean;
16
+ env: BuildEnv;
17
+ }
18
+ /** Build the requested projects (plus their local-dep closure) in graph order. */
19
+ export declare function buildWorkspace(opts: BuildOptions): Promise<void>;
20
+ /** Build a single project through the right adapter. */
21
+ export declare function buildProject(project: Project, root: string, env: BuildEnv, watch: boolean): Promise<BuildResult>;
22
+ /** Run a whole-graph type check. */
23
+ export declare function typecheckWorkspace(root: string, env: BuildEnv): Promise<boolean>;
24
+ /** Remove build outputs (outDir + tsbuildinfo) for managed projects. */
25
+ export declare function cleanWorkspace(root: string, targets?: string[]): Promise<void>;
26
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,EACL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAA;AAGnB,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGpD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,YAAY,CAAA;CACpB;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAKhE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,QAAQ,CAAA;CACd;AAED,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;AAED,wDAAwD;AACxD,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,oCAAoC;AACpC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAStF;AAED,wEAAwE;AACxE,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpF"}
@@ -0,0 +1,77 @@
1
+ import { rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { buildGraph, resolveProjectName, selectWithDeps, topoSort, } from './graph.js';
4
+ import { c, logger, ms } from './logger.js';
5
+ import { resolveProjects } from './project.js';
6
+ import { discoverWorkspace } from './workspace.js';
7
+ /** Discover the workspace and build its project graph. */
8
+ export function loadWorkspaceGraph(root) {
9
+ const workspace = discoverWorkspace(root);
10
+ const projects = resolveProjects(workspace);
11
+ const graph = buildGraph(projects);
12
+ return { workspace, projects, graph };
13
+ }
14
+ /** Build the requested projects (plus their local-dep closure) in graph order. */
15
+ export async function buildWorkspace(opts) {
16
+ const { graph } = loadWorkspaceGraph(opts.root);
17
+ const { levels } = topoSort(graph);
18
+ const selected = opts.all
19
+ ? new Set(graph.nodes.keys())
20
+ : selectWithDeps(graph, (opts.targets ?? []).map((t) => resolveProjectName(graph, t)));
21
+ const managedSelected = [...selected].filter((n) => graph.nodes.get(n)?.managed);
22
+ if (managedSelected.length === 0) {
23
+ logger.warn('No managed nestkit projects selected (missing nestkit.json?).');
24
+ return;
25
+ }
26
+ const start = performance.now();
27
+ for (const level of levels) {
28
+ const batch = level.filter((n) => selected.has(n) && graph.nodes.get(n)?.managed);
29
+ await Promise.all(batch.map(async (name) => {
30
+ const project = graph.nodes.get(name);
31
+ const result = await buildProject(project, opts.root, opts.env, false);
32
+ logger.success(`${c.bold(name)} ${c.dim(`(${project.type})`)} built in ${ms(result.durationMs)}`);
33
+ }));
34
+ }
35
+ logger.info(`Done in ${ms(performance.now() - start)}`);
36
+ }
37
+ /** Build a single project through the right adapter. */
38
+ export async function buildProject(project, root, env, watch) {
39
+ const ctx = { project, root, watch };
40
+ if (project.type === 'app-frontend') {
41
+ const adapter = env.getFrontendAdapter(project.adapter ?? 'vite');
42
+ return adapter.build(ctx);
43
+ }
44
+ const compiler = env.getCompiler(project.compiler);
45
+ const result = await compiler.build(ctx);
46
+ // Libraries additionally emit declaration files for consumers (skipped in dev).
47
+ if (project.type === 'lib' && !watch) {
48
+ await env.getDtsBuilder().emitDts(project, root);
49
+ }
50
+ return result;
51
+ }
52
+ /** Run a whole-graph type check. */
53
+ export async function typecheckWorkspace(root, env) {
54
+ const { projects } = loadWorkspaceGraph(root);
55
+ // Frontend projects (Vite, etc.) run their own type checking; tsc covers apps and libs.
56
+ const managed = projects.filter((p) => p.managed && p.type !== 'app-frontend');
57
+ const result = await env.getTypeChecker().check(managed, root);
58
+ if (result.output.trim())
59
+ logger.log(result.output.trimEnd());
60
+ if (result.ok)
61
+ logger.success('Typecheck passed');
62
+ else
63
+ logger.error(`Typecheck failed (${result.diagnostics.length} error(s))`);
64
+ return result.ok;
65
+ }
66
+ /** Remove build outputs (outDir + tsbuildinfo) for managed projects. */
67
+ export async function cleanWorkspace(root, targets) {
68
+ const { projects, graph } = loadWorkspaceGraph(root);
69
+ const set = targets && targets.length > 0 ? new Set(targets.map((t) => resolveProjectName(graph, t))) : null;
70
+ const toClean = projects.filter((p) => p.managed && (!set || set.has(p.name)));
71
+ await Promise.all(toClean.map(async (p) => {
72
+ await rm(p.outDir, { recursive: true, force: true });
73
+ await rm(join(p.dir, 'tsconfig.tsbuildinfo'), { force: true });
74
+ logger.info(`Cleaned ${c.bold(p.name)}`);
75
+ }));
76
+ }
77
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { PackageJson, Project, Workspace, WorkspacePackage } from './types.js';
2
+ /** All dependency names declared by a package (prod + dev + peer). */
3
+ export declare function allDependencyNames(pkg: PackageJson): string[];
4
+ /** Resolve a discovered package into a Project, applying nestkit.json defaults. */
5
+ export declare function resolveProject(pkg: WorkspacePackage, localNames: Set<string>): Project;
6
+ /** Resolve every package in a workspace into a Project. */
7
+ export declare function resolveProjects(workspace: Workspace): Project[];
8
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEjG,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAM7D;AAQD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAmCtF;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,EAAE,CAG/D"}