@kurot/cli 1.0.2 → 1.1.1
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 +53 -1
- package/LICENSE +21 -0
- package/README.md +41 -11
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +49 -10
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +19 -5
- package/dist/commands/dev.js.map +1 -1
- package/dist/core/dev-server.d.ts +9 -0
- package/dist/core/dev-server.d.ts.map +1 -1
- package/dist/core/dev-server.js +40 -16
- package/dist/core/dev-server.js.map +1 -1
- package/dist/core/diagnostics/codes.d.ts +21 -0
- package/dist/core/diagnostics/codes.d.ts.map +1 -0
- package/dist/core/diagnostics/codes.js +25 -0
- package/dist/core/diagnostics/codes.js.map +1 -0
- package/dist/core/diagnostics/collector.d.ts +28 -0
- package/dist/core/diagnostics/collector.d.ts.map +1 -0
- package/dist/core/diagnostics/collector.js +78 -0
- package/dist/core/diagnostics/collector.js.map +1 -0
- package/dist/core/diagnostics/index.d.ts +7 -0
- package/dist/core/diagnostics/index.d.ts.map +1 -0
- package/dist/core/diagnostics/index.js +4 -0
- package/dist/core/diagnostics/index.js.map +1 -0
- package/dist/core/diagnostics/output.d.ts +30 -0
- package/dist/core/diagnostics/output.d.ts.map +1 -0
- package/dist/core/diagnostics/output.js +15 -0
- package/dist/core/diagnostics/output.js.map +1 -0
- package/dist/core/diagnostics/types.d.ts +30 -0
- package/dist/core/diagnostics/types.d.ts.map +1 -0
- package/dist/core/diagnostics/types.js +2 -0
- package/dist/core/diagnostics/types.js.map +1 -0
- package/dist/core/exml/ast.d.ts +9 -1
- package/dist/core/exml/ast.d.ts.map +1 -1
- package/dist/core/exml/exml-diagnostics.d.ts +7 -0
- package/dist/core/exml/exml-diagnostics.d.ts.map +1 -0
- package/dist/core/exml/exml-diagnostics.js +26 -0
- package/dist/core/exml/exml-diagnostics.js.map +1 -0
- package/dist/core/exml/exml-parser.d.ts.map +1 -1
- package/dist/core/exml/exml-parser.js +1 -1
- package/dist/core/exml/exml-parser.js.map +1 -1
- package/dist/core/exml/index.d.ts +5 -3
- package/dist/core/exml/index.d.ts.map +1 -1
- package/dist/core/exml/index.js +2 -1
- package/dist/core/exml/index.js.map +1 -1
- package/dist/core/exml/registry.d.ts +7 -0
- package/dist/core/exml/registry.d.ts.map +1 -1
- package/dist/core/exml/registry.js +41 -0
- package/dist/core/exml/registry.js.map +1 -1
- package/dist/core/exml/skin-module-builder.d.ts +21 -0
- package/dist/core/exml/skin-module-builder.d.ts.map +1 -0
- package/dist/core/exml/skin-module-builder.js +103 -0
- package/dist/core/exml/skin-module-builder.js.map +1 -0
- package/dist/core/exml/source-location.d.ts +25 -0
- package/dist/core/exml/source-location.d.ts.map +1 -0
- package/dist/core/exml/source-location.js +52 -0
- package/dist/core/exml/source-location.js.map +1 -0
- package/dist/core/exml/xml-parser.d.ts +15 -0
- package/dist/core/exml/xml-parser.d.ts.map +1 -1
- package/dist/core/exml/xml-parser.js +13 -7
- package/dist/core/exml/xml-parser.js.map +1 -1
- package/dist/core/pipeline.d.ts +11 -1
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +9 -0
- package/dist/core/pipeline.js.map +1 -1
- package/dist/core/plugins/compile-exml.d.ts.map +1 -1
- package/dist/core/plugins/compile-exml.js +101 -88
- package/dist/core/plugins/compile-exml.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +14 -5
- package/dist/utils/logger.js.map +1 -1
- package/package.json +18 -8
- package/templates/empty/src/Main.ts +6 -6
- package/templates/empty/tsconfig.json +3 -0
- package/templates/game/kurot.config.ts +3 -0
- package/templates/game/src/AssetAdapter.ts +25 -0
- package/templates/game/src/LifecycleHandler.ts +39 -0
- package/templates/game/src/Main.ts +85 -78
- package/templates/game/src/Preloader.ts +112 -0
- package/templates/game/src/game-components.ts +6 -0
- package/templates/game/template/web/logo.png +0 -0
- package/templates/game/tsconfig.json +3 -0
- package/templates/game/src/LoadingUI.ts +0 -27
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as esbuild from 'esbuild';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { ensureDir } from '../../utils/fs.js';
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
7
|
+
import { DIAGNOSTIC_CODES } from '../diagnostics/index.js';
|
|
8
|
+
import { BuildError } from '../errors.js';
|
|
9
|
+
import { createUnresolvedTagDiagnostics } from './exml-diagnostics.js';
|
|
10
|
+
import { generateCode, parseToIR } from './index.js';
|
|
11
|
+
/**
|
|
12
|
+
* Builds and atomically installs the ESM bundle for a set of EXML skins.
|
|
13
|
+
*/
|
|
14
|
+
export async function buildSkinsModule(ctx, skins) {
|
|
15
|
+
const temporaryRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'kurot-skins-'));
|
|
16
|
+
try {
|
|
17
|
+
const modules = await Promise.all(skins.map(skin => generateSkinModule(ctx, skin)));
|
|
18
|
+
if (modules.some(module => module === undefined) || ctx.diagnostics.hasErrors()) {
|
|
19
|
+
throw new BuildError('EXML compilation failed.');
|
|
20
|
+
}
|
|
21
|
+
const sources = modules.filter((module) => module !== undefined);
|
|
22
|
+
const stubDir = path.join(temporaryRoot, 'stubs');
|
|
23
|
+
const bundleDir = path.join(temporaryRoot, 'bundle');
|
|
24
|
+
await Promise.all([ensureDir(stubDir), ensureDir(bundleDir)]);
|
|
25
|
+
await Promise.all(sources.map((source, index) => fs.writeFile(path.join(stubDir, `skin${index}.ts`), source)));
|
|
26
|
+
await fs.writeFile(path.join(stubDir, 'index.ts'), createIndex(skins) + '\n');
|
|
27
|
+
const outputName = await bundleSkins(ctx, stubDir, bundleDir);
|
|
28
|
+
await installBundle(bundleDir, outputName, path.join(ctx.project.outputDir, 'js'));
|
|
29
|
+
return outputName;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
await fs.rm(temporaryRoot, { recursive: true, force: true });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function generateSkinModule(ctx, skin) {
|
|
36
|
+
try {
|
|
37
|
+
const namespaces = ctx.project.customNamespaces.map(ns => ({ prefix: ns.prefix, specifier: ns.specifier }));
|
|
38
|
+
const ir = parseToIR(skin.file.contents, skin.className, namespaces);
|
|
39
|
+
const diagnostics = createUnresolvedTagDiagnostics(skin.file.relPath, skin.file.contents, ir.unresolvedTags);
|
|
40
|
+
for (const diagnostic of diagnostics) {
|
|
41
|
+
ctx.diagnostics.report(diagnostic);
|
|
42
|
+
logger.warn(`${diagnostic.location?.file}: ${diagnostic.message}`);
|
|
43
|
+
}
|
|
44
|
+
return generateCode(ir, { format: 'esm' });
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
const diagnostic = {
|
|
49
|
+
code: DIAGNOSTIC_CODES.EXML_COMPILE_FAILED,
|
|
50
|
+
severity: 'error',
|
|
51
|
+
message: `EXML compile failed: ${message}`,
|
|
52
|
+
location: { file: skin.file.relPath },
|
|
53
|
+
};
|
|
54
|
+
ctx.diagnostics.report(diagnostic);
|
|
55
|
+
logger.error(`${skin.file.relPath}: ${diagnostic.message}`);
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function createIndex(skins) {
|
|
60
|
+
return skins
|
|
61
|
+
.map((skin, index) => {
|
|
62
|
+
const functionName = factoryName(skin.className);
|
|
63
|
+
return (`import { ${functionName} as s${index} } from './skin${index}.js';\n` +
|
|
64
|
+
`globalThis[${JSON.stringify(skin.className)}] = s${index};`);
|
|
65
|
+
})
|
|
66
|
+
.join('\n\n');
|
|
67
|
+
}
|
|
68
|
+
async function bundleSkins(ctx, stubDir, bundleDir) {
|
|
69
|
+
const { project } = ctx;
|
|
70
|
+
const isRelease = project.mode === 'release';
|
|
71
|
+
const engineExternal = project.enginePackages.length > 0 ? project.enginePackages : ['@kurot/ui', '@kurot/core'];
|
|
72
|
+
const result = await esbuild.build({
|
|
73
|
+
entryPoints: [path.join(stubDir, 'index.ts')],
|
|
74
|
+
outdir: bundleDir,
|
|
75
|
+
entryNames: isRelease ? 'default.thm.min_[hash]' : 'default.thm',
|
|
76
|
+
bundle: true,
|
|
77
|
+
format: 'esm',
|
|
78
|
+
platform: 'browser',
|
|
79
|
+
target: 'es2022',
|
|
80
|
+
minify: isRelease,
|
|
81
|
+
metafile: true,
|
|
82
|
+
logLevel: 'warning',
|
|
83
|
+
external: [...engineExternal, ...project.customNamespaces.map(ns => ns.specifier)],
|
|
84
|
+
});
|
|
85
|
+
const output = Object.keys(result.metafile.outputs).find(file => file.endsWith('.js'));
|
|
86
|
+
return path.basename(output ?? 'default.thm.js');
|
|
87
|
+
}
|
|
88
|
+
async function installBundle(bundleDir, outputName, destinationDir) {
|
|
89
|
+
await ensureDir(destinationDir);
|
|
90
|
+
const stagingDir = await fs.mkdtemp(path.join(destinationDir, '.kurot-skins-'));
|
|
91
|
+
try {
|
|
92
|
+
const stagedFile = path.join(stagingDir, outputName);
|
|
93
|
+
await fs.copyFile(path.join(bundleDir, outputName), stagedFile);
|
|
94
|
+
await fs.rename(stagedFile, path.join(destinationDir, outputName));
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
await fs.rm(stagingDir, { recursive: true, force: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function factoryName(className) {
|
|
101
|
+
return `create${className.split('.').pop()}`;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=skin-module-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skin-module-builder.js","sourceRoot":"","sources":["../../../src/core/exml/skin-module-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-based source coordinates for a UTF-16 offset.
|
|
3
|
+
*/
|
|
4
|
+
export interface SourcePosition {
|
|
5
|
+
readonly line: number;
|
|
6
|
+
readonly column: number;
|
|
7
|
+
readonly offset: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Maps source offsets to one-based lines and UTF-16 code-unit columns.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SourceLocator {
|
|
13
|
+
private readonly _lineStarts;
|
|
14
|
+
private readonly _sourceLength;
|
|
15
|
+
constructor(source: string);
|
|
16
|
+
/**
|
|
17
|
+
* Returns the one-based line and column for a source offset.
|
|
18
|
+
*/
|
|
19
|
+
locate(offset: number): SourcePosition;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a reusable locator for a source string.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createSourceLocator(source: string): SourceLocator;
|
|
25
|
+
//# sourceMappingURL=source-location.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-location.d.ts","sourceRoot":"","sources":["../../../src/core/exml/source-location.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,aAAa;IAGzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAIpB,MAAM,EAAE,MAAM;IAajC;;OAEG;IACI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;CAuB7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAEjE"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps source offsets to one-based lines and UTF-16 code-unit columns.
|
|
3
|
+
*/
|
|
4
|
+
export class SourceLocator {
|
|
5
|
+
// ── Instance fields ───────────────────────────────────────────────
|
|
6
|
+
_lineStarts;
|
|
7
|
+
_sourceLength;
|
|
8
|
+
// ── Constructor ───────────────────────────────────────────────────
|
|
9
|
+
constructor(source) {
|
|
10
|
+
this._sourceLength = source.length;
|
|
11
|
+
const lineStarts = [0];
|
|
12
|
+
for (let i = 0; i < source.length; i++) {
|
|
13
|
+
if (source.charCodeAt(i) === 10) {
|
|
14
|
+
lineStarts.push(i + 1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
this._lineStarts = lineStarts;
|
|
18
|
+
}
|
|
19
|
+
// ── Public methods ────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Returns the one-based line and column for a source offset.
|
|
22
|
+
*/
|
|
23
|
+
locate(offset) {
|
|
24
|
+
if (!Number.isInteger(offset) || offset < 0 || offset > this._sourceLength) {
|
|
25
|
+
throw new RangeError(`Source offset must be an integer from 0 to ${this._sourceLength}, got ${offset}`);
|
|
26
|
+
}
|
|
27
|
+
let low = 0;
|
|
28
|
+
let high = this._lineStarts.length - 1;
|
|
29
|
+
while (low <= high) {
|
|
30
|
+
const middle = Math.floor((low + high) / 2);
|
|
31
|
+
if (this._lineStarts[middle] <= offset) {
|
|
32
|
+
low = middle + 1;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
high = middle - 1;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const lineIndex = Math.max(0, high);
|
|
39
|
+
return {
|
|
40
|
+
line: lineIndex + 1,
|
|
41
|
+
column: offset - this._lineStarts[lineIndex] + 1,
|
|
42
|
+
offset,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Creates a reusable locator for a source string.
|
|
48
|
+
*/
|
|
49
|
+
export function createSourceLocator(source) {
|
|
50
|
+
return new SourceLocator(source);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=source-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-location.js","sourceRoot":"","sources":["../../../src/core/exml/source-location.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,OAAO,aAAa;IACzB,qEAAqE;IAEpD,WAAW,CAAoB;IAC/B,aAAa,CAAS;IAEvC,qEAAqE;IAErE,YAAmB,MAAc;QAChC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACjC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,qEAAqE;IAErE;;OAEG;IACI,MAAM,CAAC,MAAc;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5E,MAAM,IAAI,UAAU,CAAC,8CAA8C,IAAI,CAAC,aAAa,SAAS,MAAM,EAAE,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACxC,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACP,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO;YACN,IAAI,EAAE,SAAS,GAAG,CAAC;YACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC;YAChD,MAAM;SACN,CAAC;IACH,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IACjD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -13,11 +13,22 @@
|
|
|
13
13
|
* - DTD / ENTITY declarations
|
|
14
14
|
* - Namespaced attribute prefixes (we only care about the local name)
|
|
15
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Half-open offsets covering a parsed XML node or attribute.
|
|
18
|
+
*/
|
|
19
|
+
export interface SourceRange {
|
|
20
|
+
readonly start: number;
|
|
21
|
+
readonly end: number;
|
|
22
|
+
}
|
|
16
23
|
export interface XNode {
|
|
17
24
|
/**
|
|
18
25
|
* Node type.
|
|
19
26
|
*/
|
|
20
27
|
readonly type: 'element' | 'text';
|
|
28
|
+
/**
|
|
29
|
+
* Half-open source range containing the complete node syntax.
|
|
30
|
+
*/
|
|
31
|
+
readonly range: SourceRange;
|
|
21
32
|
}
|
|
22
33
|
export interface XText extends XNode {
|
|
23
34
|
readonly type: 'text';
|
|
@@ -35,6 +46,10 @@ export interface XAttribute {
|
|
|
35
46
|
* Attribute value (unescaped).
|
|
36
47
|
*/
|
|
37
48
|
readonly value: string;
|
|
49
|
+
/**
|
|
50
|
+
* Half-open source range containing the complete attribute assignment.
|
|
51
|
+
*/
|
|
52
|
+
readonly range: SourceRange;
|
|
38
53
|
}
|
|
39
54
|
export interface XElement extends XNode {
|
|
40
55
|
readonly type: 'element';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../../src/core/exml/xml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,KAAK;IACrB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"xml-parser.d.ts","sourceRoot":"","sources":["../../../src/core/exml/xml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,KAAK;IACrB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,KAAM,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,QAAS,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC3B;AAQD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,QAAQ,EAAE,CAErE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,KAAK,EAAE,GAAG,MAAM,CAKjE;AAID;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAQjD"}
|
|
@@ -73,7 +73,7 @@ class _Parser {
|
|
|
73
73
|
}
|
|
74
74
|
// CDATA
|
|
75
75
|
if (this.src.startsWith('<![CDATA[', this.pos)) {
|
|
76
|
-
nodes.push(
|
|
76
|
+
nodes.push(this.readCDATA());
|
|
77
77
|
continue;
|
|
78
78
|
}
|
|
79
79
|
// Processing instruction <?...?>
|
|
@@ -115,7 +115,7 @@ class _Parser {
|
|
|
115
115
|
// Self-closing />
|
|
116
116
|
if (this.src.startsWith('/>', this.pos)) {
|
|
117
117
|
this.pos += 2;
|
|
118
|
-
return { type: 'element', name: tagName, attributes: attrs, children: [] };
|
|
118
|
+
return { type: 'element', name: tagName, attributes: attrs, children: [], range: { start, end: this.pos } };
|
|
119
119
|
}
|
|
120
120
|
// Open tag end >
|
|
121
121
|
if (this.src[this.pos] === '>') {
|
|
@@ -125,8 +125,13 @@ class _Parser {
|
|
|
125
125
|
// Attribute
|
|
126
126
|
const am = this.src.slice(this.pos).match(RX_ATTR);
|
|
127
127
|
if (am) {
|
|
128
|
-
|
|
128
|
+
const attributeStart = this.pos;
|
|
129
129
|
this.pos += am[0].length;
|
|
130
|
+
attrs.push({
|
|
131
|
+
name: am[1],
|
|
132
|
+
value: am[2] ?? am[3],
|
|
133
|
+
range: { start: attributeStart, end: this.pos },
|
|
134
|
+
});
|
|
130
135
|
}
|
|
131
136
|
else {
|
|
132
137
|
// Unexpected character — skip
|
|
@@ -146,15 +151,16 @@ class _Parser {
|
|
|
146
151
|
else {
|
|
147
152
|
throw new Error(`EXML: missing closing tag </${tagName}>`);
|
|
148
153
|
}
|
|
149
|
-
return { type: 'element', name: tagName, attributes: attrs, children };
|
|
154
|
+
return { type: 'element', name: tagName, attributes: attrs, children, range: { start, end: this.pos } };
|
|
150
155
|
}
|
|
151
156
|
// ── Text ──────────────────────────────────────────────────────────
|
|
152
157
|
readText() {
|
|
158
|
+
const start = this.pos;
|
|
153
159
|
let text = '';
|
|
154
160
|
while (this.pos < this.src.length && this.src[this.pos] !== '<') {
|
|
155
161
|
text += this.src[this.pos++];
|
|
156
162
|
}
|
|
157
|
-
return { type: 'text', text: unescapeXML(text) };
|
|
163
|
+
return { type: 'text', text: unescapeXML(text), range: { start, end: this.pos } };
|
|
158
164
|
}
|
|
159
165
|
// ── CDATA ─────────────────────────────────────────────────────────
|
|
160
166
|
readCDATA() {
|
|
@@ -163,11 +169,11 @@ class _Parser {
|
|
|
163
169
|
const end = this.src.indexOf(']]>', this.pos);
|
|
164
170
|
if (end === -1) {
|
|
165
171
|
this.pos = this.src.length;
|
|
166
|
-
return this.src.slice(start);
|
|
172
|
+
return { type: 'text', text: this.src.slice(start), range: { start, end: this.pos } };
|
|
167
173
|
}
|
|
168
174
|
const content = this.src.slice(this.pos, end);
|
|
169
175
|
this.pos = end + 3;
|
|
170
|
-
return content;
|
|
176
|
+
return { type: 'text', text: content, range: { start, end: this.pos } };
|
|
171
177
|
}
|
|
172
178
|
// ── Skip helpers ──────────────────────────────────────────────────
|
|
173
179
|
skipComment() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../src/core/exml/xml-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../src/core/exml/xml-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/core/pipeline.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DiagnosticCollector } from './diagnostics/index.js';
|
|
1
2
|
import type { Project } from './project.js';
|
|
2
3
|
/**
|
|
3
4
|
* Shared state threaded through every build plugin.
|
|
@@ -11,6 +12,14 @@ export interface BuildContext {
|
|
|
11
12
|
readonly sourcemap: boolean;
|
|
12
13
|
readonly analyze: boolean;
|
|
13
14
|
readonly watch: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Whether strict policy promotes selected warnings to errors.
|
|
17
|
+
*/
|
|
18
|
+
readonly strict: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Diagnostics reported by build plugins.
|
|
21
|
+
*/
|
|
22
|
+
readonly diagnostics: DiagnosticCollector;
|
|
14
23
|
/**
|
|
15
24
|
* Artifacts produced during the build, populated incrementally by plugins.
|
|
16
25
|
*/
|
|
@@ -63,11 +72,12 @@ export declare function createContext(project: Project, options?: {
|
|
|
63
72
|
sourcemap?: boolean;
|
|
64
73
|
analyze?: boolean;
|
|
65
74
|
watch?: boolean;
|
|
75
|
+
strict?: boolean;
|
|
66
76
|
}): BuildContext;
|
|
67
77
|
/**
|
|
68
78
|
* Runs plugins in order, logging each step.
|
|
69
79
|
*/
|
|
70
|
-
export declare function runPipeline(ctx: BuildContext, plugins: BuildPlugin[]): Promise<void>;
|
|
80
|
+
export declare function runPipeline(ctx: BuildContext, plugins: readonly BuildPlugin[]): Promise<void>;
|
|
71
81
|
/**
|
|
72
82
|
* Invokes every registered disposer, ignoring individual failures.
|
|
73
83
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE;QACjB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;WAEG;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B;;;;;;;;;;;;;;WAcG;QACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IACF;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE;QACjB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;WAEG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB;;WAEG;QACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B;;;;;;;;;;;;;;WAcG;QACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC,CAAC;IACF;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACzF,YAAY,CAYd;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASnG;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE"}
|
package/dist/core/pipeline.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
import { logger } from '../utils/logger.js';
|
|
2
|
+
import { DiagnosticCollector } from './diagnostics/index.js';
|
|
3
|
+
import { BuildError } from './errors.js';
|
|
2
4
|
/**
|
|
3
5
|
* Creates a fresh build context for a project.
|
|
4
6
|
*/
|
|
5
7
|
export function createContext(project, options = {}) {
|
|
8
|
+
const strict = options.strict ?? project.mode === 'release';
|
|
6
9
|
return {
|
|
7
10
|
project,
|
|
8
11
|
sourcemap: options.sourcemap ?? false,
|
|
9
12
|
analyze: options.analyze ?? false,
|
|
10
13
|
watch: options.watch ?? false,
|
|
14
|
+
strict,
|
|
15
|
+
diagnostics: new DiagnosticCollector({ strict }),
|
|
11
16
|
outputs: { engine: {}, namespaceModules: new Map() },
|
|
12
17
|
disposers: [],
|
|
13
18
|
};
|
|
@@ -19,6 +24,10 @@ export async function runPipeline(ctx, plugins) {
|
|
|
19
24
|
for (const plugin of plugins) {
|
|
20
25
|
logger.step(plugin.name);
|
|
21
26
|
await plugin.apply(ctx);
|
|
27
|
+
if (ctx.diagnostics.hasErrors()) {
|
|
28
|
+
const count = ctx.diagnostics.all().filter(diagnostic => diagnostic.severity === 'error').length;
|
|
29
|
+
throw new BuildError(`Build stopped after '${plugin.name}' with ${count} error diagnostic(s).`);
|
|
30
|
+
}
|
|
22
31
|
}
|
|
23
32
|
}
|
|
24
33
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsEzC;;GAEG;AACH,MAAM,UAAU,aAAa,CAC5B,OAAgB,EAChB,UAAyF,EAAE;IAE3F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;IAC5D,OAAO;QACN,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;QACrC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;QACjC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;QAC7B,MAAM;QACN,WAAW,EAAE,IAAI,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;QAChD,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,GAAG,EAAE,EAAE;QACpD,SAAS,EAAE,EAAE;KACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAiB,EAAE,OAA+B;IACnF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;YACjG,MAAM,IAAI,UAAU,CAAC,wBAAwB,MAAM,CAAC,IAAI,UAAU,KAAK,uBAAuB,CAAC,CAAC;QACjG,CAAC;IACF,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAiB;IACrD,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-exml.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/compile-exml.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"compile-exml.d.ts","sourceRoot":"","sources":["../../../src/core/plugins/compile-exml.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAgBhE;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,IAAI,WAAW,CA2CzC"}
|