@sprig-and-prose/sprig 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +22 -129
- package/dist/cli.js.map +1 -1
- package/dist/compiler.d.ts +1 -3
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +30 -63
- package/dist/compiler.js.map +1 -1
- package/dist/diagnostics.d.ts +7 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +69 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/prose.d.ts +1 -1
- package/dist/prose.d.ts.map +1 -1
- package/dist/prose.js +2 -5
- package/dist/prose.js.map +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +11 -12
- package/dist/ui.js.map +1 -1
- package/package.json +4 -7
- package/src/cli.ts +21 -168
- package/src/compiler.ts +40 -76
- package/src/diagnostics.ts +100 -0
- package/src/prose.ts +2 -5
- package/src/ui.ts +9 -12
- package/tests/compile.test.js +44 -17
- package/tests/compile.test.ts +65 -14
- package/tests/init.test.ts +8 -0
- package/tests/root.test.js +1 -1
- package/scripts/switch-deps.js +0 -44
- package/src/scene-compiler.ts +0 -192
- package/src/scene-discovery.ts +0 -51
- package/tests/compile-scene-only.test.js +0 -109
- package/tests/fixtures/scene-only-invalid/.sprig-out/bad.error.txt +0 -2
- package/tests/fixtures/scene-only-invalid/bad.scene.prose +0 -10
- package/tests/fixtures/scene-only-valid/.sprig-emit/AnotherScene.scene.json +0 -15
- package/tests/fixtures/scene-only-valid/.sprig-emit/SimpleScene.scene.json +0 -15
- package/tests/fixtures/scene-only-valid/.sprig-out/AnotherScene.scene.json +0 -15
- package/tests/fixtures/scene-only-valid/.sprig-out/SimpleScene.scene.json +0 -15
- package/tests/fixtures/scene-only-valid/another.scene.prose +0 -3
- package/tests/fixtures/scene-only-valid/simple.scene.prose +0 -3
- package/tests/fixtures/universe-unchanged/.sprig/TestScene.scene.json +0 -15
- package/tests/fixtures/universe-unchanged/custom-out/TestScene.scene.json +0 -15
- package/tests/fixtures/universe-unchanged/scene.scene.prose +0 -3
- package/tests/fixtures/universe-upstream/subdir/.sprig/OneScene.scene.json +0 -15
- package/tests/fixtures/universe-upstream/subdir/one.scene.prose +0 -3
package/dist/prose.js
CHANGED
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import fastGlob from "fast-glob";
|
|
3
3
|
const DEFAULT_EXCLUDES = [".sprig/**", "dist/**", "node_modules/**", ".git/**"];
|
|
4
4
|
/**
|
|
5
|
-
* Loads all .prose files under root
|
|
5
|
+
* Loads all .prose files under root with default excludes
|
|
6
6
|
* @param root - Universe root directory
|
|
7
7
|
* @returns Array of prose file paths, sorted deterministically
|
|
8
8
|
*/
|
|
@@ -10,10 +10,7 @@ export async function loadProseFiles(root) {
|
|
|
10
10
|
const pattern = join(root, "**/*.prose");
|
|
11
11
|
const allFiles = await fastGlob(pattern, {
|
|
12
12
|
absolute: true,
|
|
13
|
-
ignore: [
|
|
14
|
-
...DEFAULT_EXCLUDES.map((exclude) => join(root, exclude)),
|
|
15
|
-
join(root, "**/*.scene.prose"), // Exclude scene files
|
|
16
|
-
],
|
|
13
|
+
ignore: [...DEFAULT_EXCLUDES.map((exclude) => join(root, exclude))],
|
|
17
14
|
});
|
|
18
15
|
// Sort for deterministic ordering
|
|
19
16
|
return allFiles.sort();
|
package/dist/prose.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prose.js","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;QACvC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"prose.js","sourceRoot":"","sources":["../src/prose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;AAEhF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE;QACvC,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;KACpE,CAAC,CAAC;IAEH,kCAAkC;IAClC,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
package/dist/ui.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Starts the UI server with watch mode
|
|
3
3
|
*/
|
|
4
|
-
export declare function startUIServer(universeRoot: string, port?: number
|
|
4
|
+
export declare function startUIServer(universeRoot: string, port?: number): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAuNA;;GAEG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,MAAa,
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAuNA;;GAEG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,MAAa,GAClB,OAAO,CAAC,IAAI,CAAC,CAqHf"}
|
package/dist/ui.js
CHANGED
|
@@ -6,6 +6,7 @@ import { createRequire } from "node:module";
|
|
|
6
6
|
import chokidar from "chokidar";
|
|
7
7
|
import { loadProseFiles } from "./prose.js";
|
|
8
8
|
import { compileUniverse } from "./compiler.js";
|
|
9
|
+
import { printDiagnostics } from "./diagnostics.js";
|
|
9
10
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
11
|
const __dirname = dirname(__filename);
|
|
11
12
|
const require = createRequire(import.meta.url);
|
|
@@ -25,14 +26,14 @@ const mimeTypes = {
|
|
|
25
26
|
".eot": "application/vnd.ms-fontobject",
|
|
26
27
|
};
|
|
27
28
|
/**
|
|
28
|
-
* Resolves the dist directory path for sprig-ui
|
|
29
|
+
* Resolves the dist directory path for sprig-ui
|
|
29
30
|
* Works for both local and global installations
|
|
30
31
|
*/
|
|
31
32
|
function resolveUIDist() {
|
|
32
33
|
try {
|
|
33
34
|
// Use Node's module resolution to find the package location
|
|
34
35
|
// This works for both local (node_modules) and global installations
|
|
35
|
-
const packageJsonPath = require.resolve("@sprig-and-prose/sprig-ui
|
|
36
|
+
const packageJsonPath = require.resolve("@sprig-and-prose/sprig-ui/package.json");
|
|
36
37
|
const packageDir = dirname(packageJsonPath);
|
|
37
38
|
const distPath = join(packageDir, "dist");
|
|
38
39
|
if (existsSync(distPath)) {
|
|
@@ -42,12 +43,12 @@ function resolveUIDist() {
|
|
|
42
43
|
}
|
|
43
44
|
catch (error) {
|
|
44
45
|
// Fallback: try relative to current package (for development)
|
|
45
|
-
const fallbackPath = resolve(__dirname, "../../sprig-ui
|
|
46
|
+
const fallbackPath = resolve(__dirname, "../../sprig-ui/dist");
|
|
46
47
|
if (existsSync(fallbackPath)) {
|
|
47
48
|
return fallbackPath;
|
|
48
49
|
}
|
|
49
50
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
50
|
-
throw new Error(`Could not locate sprig-ui
|
|
51
|
+
throw new Error(`Could not locate sprig-ui dist directory: ${errorMessage}`);
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
let revisionCounter = 0;
|
|
@@ -170,10 +171,10 @@ function createServerHandler(uiDistDir, manifestPath) {
|
|
|
170
171
|
* Rebuilds the manifest and broadcasts SSE event
|
|
171
172
|
* Only broadcasts after successful compile and atomic manifest write
|
|
172
173
|
*/
|
|
173
|
-
async function rebuildManifest(universeRoot, manifestPath
|
|
174
|
+
async function rebuildManifest(universeRoot, manifestPath) {
|
|
174
175
|
try {
|
|
175
176
|
const files = await loadProseFiles(universeRoot);
|
|
176
|
-
const result = await compileUniverse(universeRoot, files, true
|
|
177
|
+
const result = await compileUniverse(universeRoot, files, true);
|
|
177
178
|
// Only broadcast if compilation succeeded (manifest was atomically written)
|
|
178
179
|
if (result.success) {
|
|
179
180
|
broadcastManifestChanged();
|
|
@@ -188,19 +189,17 @@ async function rebuildManifest(universeRoot, manifestPath, legacy) {
|
|
|
188
189
|
/**
|
|
189
190
|
* Starts the UI server with watch mode
|
|
190
191
|
*/
|
|
191
|
-
export async function startUIServer(universeRoot, port = 6336
|
|
192
|
+
export async function startUIServer(universeRoot, port = 6336) {
|
|
192
193
|
const uiDistDir = resolveUIDist();
|
|
193
194
|
const manifestPath = join(universeRoot, ".sprig", "manifest.json");
|
|
194
195
|
// Compile once on startup
|
|
195
196
|
console.log("Compiling universe...");
|
|
196
197
|
const files = await loadProseFiles(universeRoot);
|
|
197
|
-
const result = await compileUniverse(universeRoot, files, true
|
|
198
|
+
const result = await compileUniverse(universeRoot, files, true);
|
|
198
199
|
if (!result.success) {
|
|
199
200
|
const errors = result.diagnostics.filter((d) => d.severity === "error");
|
|
200
201
|
if (errors.length > 0) {
|
|
201
|
-
|
|
202
|
-
console.error(`Error: ${error.message}`);
|
|
203
|
-
}
|
|
202
|
+
printDiagnostics(errors, "Error");
|
|
204
203
|
}
|
|
205
204
|
process.exit(1);
|
|
206
205
|
}
|
|
@@ -251,7 +250,7 @@ export async function startUIServer(universeRoot, port = 6336, legacy = false) {
|
|
|
251
250
|
clearTimeout(rebuildTimeout);
|
|
252
251
|
}
|
|
253
252
|
rebuildTimeout = setTimeout(async () => {
|
|
254
|
-
const success = await rebuildManifest(universeRoot, manifestPath
|
|
253
|
+
const success = await rebuildManifest(universeRoot, manifestPath);
|
|
255
254
|
if (success) {
|
|
256
255
|
// One-line status per rebuild (calm output)
|
|
257
256
|
process.stdout.write("\r✓ Rebuilt\n");
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sprig-and-prose/sprig",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Sprig CLI tool for compiling and serving universes",
|
|
6
6
|
"main": "dist/cli.js",
|
|
@@ -13,17 +13,14 @@
|
|
|
13
13
|
"test": "node --test",
|
|
14
14
|
"format": "biome format . --write",
|
|
15
15
|
"lint": "biome lint .",
|
|
16
|
-
"typecheck": "tsc --noEmit"
|
|
17
|
-
"deps:local": "node scripts/switch-deps.js local && rm package-lock.json && rm -rf node_modules && npm install",
|
|
18
|
-
"deps:published": "node scripts/switch-deps.js published && rm package-lock.json && rm -rf node_modules && npm install"
|
|
16
|
+
"typecheck": "tsc --noEmit"
|
|
19
17
|
},
|
|
20
18
|
"keywords": [],
|
|
21
19
|
"author": "",
|
|
22
20
|
"license": "ISC",
|
|
23
21
|
"dependencies": {
|
|
24
|
-
"@sprig-and-prose/
|
|
25
|
-
"@sprig-and-prose/sprig-
|
|
26
|
-
"@sprig-and-prose/sprig-scenes": "*",
|
|
22
|
+
"@sprig-and-prose/prose-parser": "^0.2.0",
|
|
23
|
+
"@sprig-and-prose/sprig-ui": "^0.1.0",
|
|
27
24
|
"chokidar": "^3.6.0",
|
|
28
25
|
"fast-glob": "^3.3.2"
|
|
29
26
|
},
|
package/src/cli.ts
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import { resolve, join } from "node:path";
|
|
4
4
|
import { existsSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { discoverUniverseRoot } from "./root.js";
|
|
6
|
-
import { discoverSceneFiles } from "./scene-discovery.js";
|
|
7
6
|
import { loadProseFiles } from "./prose.js";
|
|
8
7
|
import { compileUniverse } from "./compiler.js";
|
|
9
|
-
import { compileScenes } from "./scene-compiler.js";
|
|
10
8
|
import { startUIServer } from "./ui.js";
|
|
9
|
+
import { printDiagnostics } from "./diagnostics.js";
|
|
11
10
|
|
|
12
11
|
const commands = ["compile", "validate", "ui", "init"] as const;
|
|
13
12
|
type Command = (typeof commands)[number];
|
|
@@ -24,12 +23,10 @@ function printHelp() {
|
|
|
24
23
|
console.log("Options:");
|
|
25
24
|
console.log(" -p, --port <number> Port to listen on (default: 6336)");
|
|
26
25
|
console.log(" --out <dir> Output directory for manifests (default: .sprig/)");
|
|
27
|
-
console.log(" --legacy Use the legacy parser/graph pipeline");
|
|
28
26
|
console.log("");
|
|
29
27
|
console.log("Root discovery:");
|
|
30
28
|
console.log(" - Walks upward from path (or cwd for 'sprig compile')");
|
|
31
29
|
console.log(" - Finds directory containing universe.prose");
|
|
32
|
-
console.log(" - Scene-only mode: requires --out when no universe.prose");
|
|
33
30
|
}
|
|
34
31
|
|
|
35
32
|
function parseArgs(): {
|
|
@@ -38,7 +35,6 @@ function parseArgs(): {
|
|
|
38
35
|
pathExplicit: boolean;
|
|
39
36
|
port?: number;
|
|
40
37
|
universeName?: string;
|
|
41
|
-
legacy?: boolean;
|
|
42
38
|
out?: string;
|
|
43
39
|
} {
|
|
44
40
|
const args = process.argv.slice(2);
|
|
@@ -67,7 +63,6 @@ function parseArgs(): {
|
|
|
67
63
|
let path = process.cwd();
|
|
68
64
|
let pathExplicit = false;
|
|
69
65
|
let port: number | undefined;
|
|
70
|
-
let legacy = false;
|
|
71
66
|
let out: string | undefined;
|
|
72
67
|
|
|
73
68
|
for (let i = 1; i < args.length; i++) {
|
|
@@ -93,8 +88,6 @@ function parseArgs(): {
|
|
|
93
88
|
}
|
|
94
89
|
out = resolve(outValue);
|
|
95
90
|
i++; // Skip the out value
|
|
96
|
-
} else if (arg === "--legacy") {
|
|
97
|
-
legacy = true;
|
|
98
91
|
} else if (!arg.startsWith("-")) {
|
|
99
92
|
// First non-option argument is the path (in-directory)
|
|
100
93
|
path = resolve(arg);
|
|
@@ -106,113 +99,44 @@ function parseArgs(): {
|
|
|
106
99
|
}
|
|
107
100
|
}
|
|
108
101
|
|
|
109
|
-
return { command, path, pathExplicit, port,
|
|
102
|
+
return { command, path, pathExplicit, port, out };
|
|
110
103
|
}
|
|
111
104
|
|
|
112
105
|
async function handleCompile(
|
|
113
106
|
path: string,
|
|
114
107
|
outDir: string | undefined,
|
|
115
|
-
legacy = false,
|
|
116
108
|
pathExplicit = false,
|
|
117
109
|
): Promise<void> {
|
|
118
110
|
const root = discoverUniverseRoot(path);
|
|
119
111
|
|
|
120
|
-
if (!
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
console.error("No universe.prose found.");
|
|
124
|
-
process.exit(1);
|
|
125
|
-
}
|
|
126
|
-
const outputDir = outDir || join(root, ".sprig");
|
|
127
|
-
await runUniverseCompile(root, outputDir, legacy);
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// sprig compile <in-directory>: path was explicitly provided
|
|
132
|
-
if (root) {
|
|
133
|
-
// Universe found: output to in-directory/.sprig or --out
|
|
134
|
-
const outputDir = outDir || join(path, ".sprig");
|
|
135
|
-
await runUniverseCompile(root, outputDir, legacy);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Universe not found: scene-only gated by --out
|
|
140
|
-
if (!outDir) {
|
|
141
|
-
console.error(`No universe.prose found for ${path}. Provide --out <out-directory> to compile scenes only.`);
|
|
142
|
-
process.exit(1);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const discovery = discoverSceneFiles(path);
|
|
146
|
-
if (!discovery) {
|
|
147
|
-
console.error("No universe.prose found and no *.scene.prose files found in:", path);
|
|
148
|
-
process.exit(1);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
const sceneResult = await compileScenes(discovery.searchRoot, outDir, {
|
|
152
|
-
sceneFiles: discovery.sceneFiles,
|
|
153
|
-
emitManifests: true,
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
const errors = sceneResult.diagnostics.filter((d) => d.severity === "error");
|
|
157
|
-
const warnings = sceneResult.diagnostics.filter((d) => d.severity === "warning");
|
|
158
|
-
|
|
159
|
-
if (!sceneResult.success) {
|
|
160
|
-
if (errors.length > 0) {
|
|
161
|
-
printDiagnostics(errors, "Error");
|
|
162
|
-
}
|
|
112
|
+
if (!root) {
|
|
113
|
+
const target = pathExplicit ? path : process.cwd();
|
|
114
|
+
console.error(`No universe.prose found for ${target}.`);
|
|
163
115
|
process.exit(1);
|
|
164
116
|
}
|
|
165
117
|
|
|
166
|
-
const
|
|
167
|
-
const scenesText = sceneCount === 1 ? "scene" : "scenes";
|
|
168
|
-
console.log(`✓ Compiled ${sceneCount} ${scenesText}`);
|
|
169
|
-
|
|
170
|
-
if (warnings.length > 0) {
|
|
171
|
-
console.log("");
|
|
172
|
-
printDiagnostics(warnings, "Warning");
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
async function runUniverseCompile(
|
|
177
|
-
root: string,
|
|
178
|
-
outputDir: string,
|
|
179
|
-
legacy: boolean,
|
|
180
|
-
): Promise<void> {
|
|
118
|
+
const outputDir = outDir || (pathExplicit ? join(path, ".sprig") : join(root, ".sprig"));
|
|
181
119
|
const files = await loadProseFiles(root);
|
|
182
|
-
const
|
|
120
|
+
const result = await compileUniverse(root, files, true, { outputDir });
|
|
183
121
|
|
|
184
|
-
if (!
|
|
185
|
-
const errors =
|
|
186
|
-
if (errors.length > 0) {
|
|
187
|
-
printDiagnostics(errors, "Error");
|
|
188
|
-
}
|
|
189
|
-
process.exit(1);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const sceneResult = await compileScenes(root, outputDir);
|
|
193
|
-
|
|
194
|
-
const allDiagnostics = [...universeResult.diagnostics, ...sceneResult.diagnostics];
|
|
195
|
-
const errors = allDiagnostics.filter((d) => d.severity === "error");
|
|
196
|
-
const warnings = allDiagnostics.filter((d) => d.severity === "warning");
|
|
197
|
-
|
|
198
|
-
if (!sceneResult.success) {
|
|
122
|
+
if (!result.success) {
|
|
123
|
+
const errors = result.diagnostics.filter((d) => d.severity === "error");
|
|
199
124
|
if (errors.length > 0) {
|
|
200
125
|
printDiagnostics(errors, "Error");
|
|
201
126
|
}
|
|
202
127
|
process.exit(1);
|
|
203
128
|
}
|
|
204
129
|
|
|
205
|
-
|
|
206
|
-
const scenesText = sceneCount === 1 ? "scene" : "scenes";
|
|
207
|
-
console.log(`✓ Compiled 1 universe + ${sceneCount} ${scenesText}`);
|
|
130
|
+
console.log("✓ Compiled 1 universe");
|
|
208
131
|
|
|
132
|
+
const warnings = result.diagnostics.filter((d) => d.severity === "warning");
|
|
209
133
|
if (warnings.length > 0) {
|
|
210
134
|
console.log("");
|
|
211
135
|
printDiagnostics(warnings, "Warning");
|
|
212
136
|
}
|
|
213
137
|
}
|
|
214
138
|
|
|
215
|
-
async function handleValidate(path: string
|
|
139
|
+
async function handleValidate(path: string): Promise<void> {
|
|
216
140
|
const root = discoverUniverseRoot(path);
|
|
217
141
|
if (!root) {
|
|
218
142
|
console.error("Couldn't find universe.prose");
|
|
@@ -222,7 +146,7 @@ async function handleValidate(path: string, legacy = false): Promise<void> {
|
|
|
222
146
|
}
|
|
223
147
|
|
|
224
148
|
const files = await loadProseFiles(root);
|
|
225
|
-
const result = await compileUniverse(root, files, false
|
|
149
|
+
const result = await compileUniverse(root, files, false);
|
|
226
150
|
|
|
227
151
|
if (!result.success) {
|
|
228
152
|
const errors = result.diagnostics.filter((d) => d.severity === "error");
|
|
@@ -238,77 +162,6 @@ async function handleValidate(path: string, legacy = false): Promise<void> {
|
|
|
238
162
|
}
|
|
239
163
|
}
|
|
240
164
|
|
|
241
|
-
type Diagnostic = { severity: string; message: string; source?: unknown };
|
|
242
|
-
|
|
243
|
-
function printDiagnostics(diagnostics: Diagnostic[], label: "Error" | "Warning"): void {
|
|
244
|
-
const grouped = new Map<
|
|
245
|
-
string,
|
|
246
|
-
{ count: number; diagnostic: Diagnostic; diagnosticWithSource: Diagnostic | null }
|
|
247
|
-
>();
|
|
248
|
-
|
|
249
|
-
for (const diag of diagnostics) {
|
|
250
|
-
const key = diag.message;
|
|
251
|
-
const entry =
|
|
252
|
-
grouped.get(key) || { count: 0, diagnostic: diag, diagnosticWithSource: null };
|
|
253
|
-
entry.count += 1;
|
|
254
|
-
if (formatSource(diag.source)) {
|
|
255
|
-
if (!entry.diagnosticWithSource) {
|
|
256
|
-
entry.diagnosticWithSource = diag;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
grouped.set(key, entry);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
const entries = Array.from(grouped.values());
|
|
263
|
-
entries.forEach(({ count, diagnostic, diagnosticWithSource }, index) => {
|
|
264
|
-
const source = formatSource(diagnosticWithSource?.source || diagnostic.source);
|
|
265
|
-
const countText = count > 1 ? ` (and ${count - 1} more)` : "";
|
|
266
|
-
const location = source ? `${source}: ` : "";
|
|
267
|
-
const message = `${label}: ${location}${diagnostic.message}${countText}`;
|
|
268
|
-
console.error(message);
|
|
269
|
-
if (index < entries.length - 1) {
|
|
270
|
-
console.error("");
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function formatSource(source: unknown): string | null {
|
|
276
|
-
if (!source) {
|
|
277
|
-
return null;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
if (typeof source === "string") {
|
|
281
|
-
return source;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
if (typeof source !== "object") {
|
|
285
|
-
return null;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const candidate = source as {
|
|
289
|
-
file?: string;
|
|
290
|
-
line?: number;
|
|
291
|
-
col?: number;
|
|
292
|
-
start?: { line?: number; col?: number };
|
|
293
|
-
source?: { file?: string; start?: { line?: number; col?: number } };
|
|
294
|
-
location?: { file?: string; start?: { line?: number; col?: number } };
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
const span = candidate.source || candidate.location || candidate;
|
|
298
|
-
if (!span.file) {
|
|
299
|
-
return null;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const line = span.start?.line ?? candidate.line;
|
|
303
|
-
const col = span.start?.col ?? candidate.col;
|
|
304
|
-
|
|
305
|
-
if (!line) {
|
|
306
|
-
return span.file;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return `${span.file}:${line}${col ? `:${col}` : ""}`;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
165
|
export async function handleInit(universeName: string, path: string): Promise<void> {
|
|
313
166
|
if (!universeName) {
|
|
314
167
|
console.error("Usage: sprig init <UniverseName>");
|
|
@@ -326,7 +179,7 @@ export async function handleInit(universeName: string, path: string): Promise<vo
|
|
|
326
179
|
try {
|
|
327
180
|
if (!universeProseExists) {
|
|
328
181
|
const universeProseContent = `universe ${universeName} {
|
|
329
|
-
|
|
182
|
+
describe {
|
|
330
183
|
This universe is prose-first.
|
|
331
184
|
|
|
332
185
|
It contains no executable code.
|
|
@@ -359,7 +212,7 @@ This repository contains **no executable code**.
|
|
|
359
212
|
## Learn more
|
|
360
213
|
|
|
361
214
|
- sprig & prose: https://sprig-and-prose.io
|
|
362
|
-
- language reference: https://sprig-and-prose.io/
|
|
215
|
+
- language reference: https://sprig-and-prose.io/docs
|
|
363
216
|
|
|
364
217
|
## Notes
|
|
365
218
|
|
|
@@ -386,7 +239,7 @@ Structure may change. Meaning is preserved.
|
|
|
386
239
|
}
|
|
387
240
|
}
|
|
388
241
|
|
|
389
|
-
async function handleUI(path: string, port?: number
|
|
242
|
+
async function handleUI(path: string, port?: number): Promise<void> {
|
|
390
243
|
const root = discoverUniverseRoot(path);
|
|
391
244
|
if (!root) {
|
|
392
245
|
console.error("Couldn't find universe.prose");
|
|
@@ -395,11 +248,11 @@ async function handleUI(path: string, port?: number, legacy = false): Promise<vo
|
|
|
395
248
|
process.exit(1);
|
|
396
249
|
}
|
|
397
250
|
|
|
398
|
-
await startUIServer(root, port
|
|
251
|
+
await startUIServer(root, port);
|
|
399
252
|
}
|
|
400
253
|
|
|
401
254
|
async function main() {
|
|
402
|
-
const { command, path, pathExplicit, port, universeName,
|
|
255
|
+
const { command, path, pathExplicit, port, universeName, out } = parseArgs();
|
|
403
256
|
|
|
404
257
|
if (!command) {
|
|
405
258
|
printHelp();
|
|
@@ -409,13 +262,13 @@ async function main() {
|
|
|
409
262
|
try {
|
|
410
263
|
switch (command) {
|
|
411
264
|
case "compile":
|
|
412
|
-
await handleCompile(path, out,
|
|
265
|
+
await handleCompile(path, out, pathExplicit);
|
|
413
266
|
break;
|
|
414
267
|
case "validate":
|
|
415
|
-
await handleValidate(path
|
|
268
|
+
await handleValidate(path);
|
|
416
269
|
break;
|
|
417
270
|
case "ui":
|
|
418
|
-
await handleUI(path, port
|
|
271
|
+
await handleUI(path, port);
|
|
419
272
|
break;
|
|
420
273
|
case "init":
|
|
421
274
|
if (!universeName) {
|