@kurot/cli 3.2.1 → 3.3.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 +59 -0
- package/README.md +38 -6
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/clean.d.ts.map +1 -1
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js.map +1 -1
- package/dist/core/components/discover-components.d.ts.map +1 -1
- package/dist/core/components/discover-components.js +27 -0
- package/dist/core/components/discover-components.js.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +6 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/dev-server.d.ts +2 -2
- package/dist/core/dev-server.d.ts.map +1 -1
- package/dist/core/dev-server.js +78 -45
- package/dist/core/dev-server.js.map +1 -1
- package/dist/core/diagnostics/collector.d.ts +9 -0
- package/dist/core/diagnostics/collector.d.ts.map +1 -1
- package/dist/core/diagnostics/collector.js +12 -0
- package/dist/core/diagnostics/collector.js.map +1 -1
- package/dist/core/diagnostics/output.d.ts +1 -1
- package/dist/core/diagnostics/output.d.ts.map +1 -1
- package/dist/core/errors.d.ts +6 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +6 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/kui/codegen.js +63 -0
- package/dist/core/kui/codegen.js.map +1 -1
- package/dist/core/kui/index.d.ts +6 -2
- package/dist/core/kui/index.d.ts.map +1 -1
- package/dist/core/kui/index.js +3 -3
- package/dist/core/kui/index.js.map +1 -1
- package/dist/core/kui/kui-diagnostics.d.ts.map +1 -1
- package/dist/core/kui/kui-diagnostics.js.map +1 -1
- package/dist/core/kui/kui-parser.d.ts +2 -2
- package/dist/core/kui/kui-parser.d.ts.map +1 -1
- package/dist/core/kui/kui-parser.js +42 -3
- package/dist/core/kui/kui-parser.js.map +1 -1
- package/dist/core/kui/registry.d.ts.map +1 -1
- package/dist/core/kui/registry.js +9 -0
- package/dist/core/kui/registry.js.map +1 -1
- package/dist/core/kui/skin-module-builder.js +20 -5
- package/dist/core/kui/skin-module-builder.js.map +1 -1
- package/dist/core/kui/skin-parts-declaration.d.ts.map +1 -1
- package/dist/core/kui/skin-parts-declaration.js +27 -0
- package/dist/core/kui/skin-parts-declaration.js.map +1 -1
- package/dist/core/kui/source-location.d.ts +3 -0
- package/dist/core/kui/source-location.d.ts.map +1 -1
- package/dist/core/kui/source-location.js +3 -0
- package/dist/core/kui/source-location.js.map +1 -1
- package/dist/core/namespace-external-plugin.d.ts.map +1 -1
- package/dist/core/namespace-external-plugin.js +3 -0
- package/dist/core/namespace-external-plugin.js.map +1 -1
- package/dist/core/plugins/clean-output.d.ts.map +1 -1
- package/dist/core/plugins/clean-output.js +3 -0
- package/dist/core/plugins/clean-output.js.map +1 -1
- package/dist/core/plugins/compile-custom-namespaces.d.ts.map +1 -1
- package/dist/core/plugins/compile-custom-namespaces.js +15 -0
- package/dist/core/plugins/compile-custom-namespaces.js.map +1 -1
- package/dist/core/plugins/compile-engine.d.ts.map +1 -1
- package/dist/core/plugins/compile-engine.js +3 -0
- package/dist/core/plugins/compile-engine.js.map +1 -1
- package/dist/core/plugins/compile-kui.d.ts.map +1 -1
- package/dist/core/plugins/compile-kui.js +27 -0
- package/dist/core/plugins/compile-kui.js.map +1 -1
- package/dist/core/plugins/compile-source.d.ts.map +1 -1
- package/dist/core/plugins/compile-source.js +6 -0
- package/dist/core/plugins/compile-source.js.map +1 -1
- package/dist/core/plugins/component-catalog.d.ts.map +1 -1
- package/dist/core/plugins/component-catalog.js +3 -0
- package/dist/core/plugins/component-catalog.js.map +1 -1
- package/dist/core/plugins/copy-assets.d.ts.map +1 -1
- package/dist/core/plugins/copy-assets.js +3 -0
- package/dist/core/plugins/copy-assets.js.map +1 -1
- package/dist/core/plugins/generate-html.d.ts.map +1 -1
- package/dist/core/plugins/generate-html.js +3 -0
- package/dist/core/plugins/generate-html.js.map +1 -1
- package/dist/core/plugins/manifest.d.ts.map +1 -1
- package/dist/core/plugins/manifest.js +3 -0
- package/dist/core/plugins/manifest.js.map +1 -1
- package/dist/core/project.d.ts.map +1 -1
- package/dist/core/project.js +6 -0
- package/dist/core/project.js.map +1 -1
- package/dist/core/resource-asset-sync.d.ts +8 -0
- package/dist/core/resource-asset-sync.d.ts.map +1 -0
- package/dist/core/resource-asset-sync.js +121 -0
- package/dist/core/resource-asset-sync.js.map +1 -0
- package/dist/core/resource-watcher.d.ts +6 -0
- package/dist/core/resource-watcher.d.ts.map +1 -0
- package/dist/core/resource-watcher.js +54 -0
- package/dist/core/resource-watcher.js.map +1 -0
- package/dist/core/template.d.ts.map +1 -1
- package/dist/core/template.js.map +1 -1
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js.map +1 -1
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +18 -0
- package/dist/utils/logger.js.map +1 -1
- package/docs/ai-context.md +25 -4
- package/docs/architecture.md +15 -7
- package/docs/dev-resource-watching.md +88 -0
- package/docs/game-template.md +1 -1
- package/docs/label-text-layout.md +6 -1
- package/package.json +2 -2
- package/templates/game/resource/assets/fonts/OFL.txt +1 -1
package/dist/core/dev-server.js
CHANGED
|
@@ -6,6 +6,9 @@ import { createContext, disposeContext, runPipeline } from './pipeline.js';
|
|
|
6
6
|
import { compileKUI, compileEngine, compileCustomNamespaces, writeComponentCatalog, compileSource, generateHtml, copyAssets, } from './plugins/index.js';
|
|
7
7
|
import { refreshGeneratedNamespaceEntries } from './plugins/compile-custom-namespaces.js';
|
|
8
8
|
import { refreshProjectComponents } from './components/discover-components.js';
|
|
9
|
+
import { createResourceAssetSync } from './resource-asset-sync.js';
|
|
10
|
+
import { watchResourceDirectory } from './resource-watcher.js';
|
|
11
|
+
import { KUI_THEME_OUTPUT_PATH } from './project.js';
|
|
9
12
|
import { logger } from '../utils/logger.js';
|
|
10
13
|
const MIME_TYPES = {
|
|
11
14
|
'.html': 'text/html; charset=utf-8',
|
|
@@ -32,8 +35,8 @@ const MIME_TYPES = {
|
|
|
32
35
|
* Starts a development server.
|
|
33
36
|
*
|
|
34
37
|
* The build pipeline runs once with watch enabled: esbuild rebuilds `main.js`
|
|
35
|
-
* on every source change
|
|
36
|
-
*
|
|
38
|
+
* on every source change. Resource edits synchronize assets; KUI inputs also
|
|
39
|
+
* trigger compilation. Files are served straight from the output directory.
|
|
37
40
|
* The browser is not auto-reloaded — refresh manually to pick up changes.
|
|
38
41
|
*/
|
|
39
42
|
export async function startDevServer(project, options) {
|
|
@@ -59,8 +62,9 @@ export async function startDevServer(project, options) {
|
|
|
59
62
|
throw error;
|
|
60
63
|
}
|
|
61
64
|
const enqueue = createResourceBuildQueue(ctx);
|
|
62
|
-
const
|
|
63
|
-
|
|
65
|
+
const syncAssets = await createResourceAssetSync(project);
|
|
66
|
+
const componentSkinsWatched = watchComponents(project, ctx, options, enqueue, syncAssets);
|
|
67
|
+
watchResources(project, ctx, options, componentSkinsWatched, enqueue, syncAssets);
|
|
64
68
|
const server = startHttpServer(project, options);
|
|
65
69
|
process.on('SIGINT', async () => {
|
|
66
70
|
logger.info('Stopping dev server...');
|
|
@@ -70,72 +74,89 @@ export async function startDevServer(project, options) {
|
|
|
70
74
|
});
|
|
71
75
|
}
|
|
72
76
|
/**
|
|
73
|
-
*
|
|
77
|
+
* Coalesces all resource edits, compiling only when a batch includes KUI inputs.
|
|
74
78
|
*/
|
|
75
|
-
function watchResources(project, ctx, options, componentSkinsWatched, enqueue) {
|
|
76
|
-
if (!project.config.ui)
|
|
77
|
-
return;
|
|
79
|
+
function watchResources(project, ctx, options, componentSkinsWatched, enqueue, syncAssets) {
|
|
78
80
|
let debounce;
|
|
79
|
-
let
|
|
81
|
+
let needsKUI = false;
|
|
82
|
+
let retryKUI = false;
|
|
83
|
+
let closeWatcher;
|
|
80
84
|
try {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
filename !== 'default.res.json' &&
|
|
85
|
-
filename.split(path.sep).join('/') !== 'config/style.json'))
|
|
85
|
+
closeWatcher = watchResourceDirectory(project.resourceDir, filename => {
|
|
86
|
+
const changed = filename ? path.resolve(project.resourceDir, filename) : project.resourceDir;
|
|
87
|
+
if (!isWithin(project.resourceDir, changed))
|
|
86
88
|
return;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
const relative = path.relative(project.resourceDir, changed).split(path.sep).join('/');
|
|
90
|
+
if (relative.endsWith('.kui.xml') && componentSkinsWatched && project.componentConvention) {
|
|
89
91
|
if (isWithin(project.componentConvention.skinDir, changed))
|
|
90
92
|
return;
|
|
91
93
|
}
|
|
94
|
+
if (project.config.ui && path.basename(relative) === path.basename(KUI_THEME_OUTPUT_PATH))
|
|
95
|
+
return;
|
|
96
|
+
needsKUI ||= Boolean(project.config.ui) && (!relative || relative.endsWith('.kui.xml') ||
|
|
97
|
+
relative === 'default.res.json' || relative === 'config/style.json' ||
|
|
98
|
+
isWithin(project.uiSourceDir ?? project.resourceDir, changed) ||
|
|
99
|
+
isWithin(changed, project.uiSourceDir ?? project.resourceDir) || relative === 'config');
|
|
92
100
|
clearTimeout(debounce);
|
|
93
|
-
debounce = setTimeout(() =>
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
101
|
+
debounce = setTimeout(() => {
|
|
102
|
+
const requestedCompile = needsKUI;
|
|
103
|
+
needsKUI = false;
|
|
104
|
+
enqueue(async () => {
|
|
105
|
+
const compile = requestedCompile || retryKUI;
|
|
106
|
+
const startedAt = Date.now();
|
|
107
|
+
options.onEvent?.({ type: 'build-start', reason: compile ? 'kui-change' : 'resource-change' });
|
|
108
|
+
logger.info(compile ? 'Resources changed, recompiling KUI...' : 'Resources changed, synchronizing...');
|
|
109
|
+
try {
|
|
110
|
+
if (compile) {
|
|
111
|
+
await compileKUI().apply(ctx);
|
|
112
|
+
await writeComponentCatalog().apply(ctx);
|
|
113
|
+
}
|
|
114
|
+
await syncAssets();
|
|
115
|
+
retryKUI = false;
|
|
116
|
+
emitDiagnostics(ctx, options);
|
|
117
|
+
options.onEvent?.({
|
|
118
|
+
type: 'build-complete',
|
|
119
|
+
success: true,
|
|
120
|
+
durationMs: Date.now() - startedAt,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
retryKUI ||= compile;
|
|
125
|
+
emitDiagnostics(ctx, options);
|
|
126
|
+
options.onEvent?.({
|
|
127
|
+
type: 'build-complete',
|
|
128
|
+
success: false,
|
|
129
|
+
durationMs: Date.now() - startedAt,
|
|
130
|
+
});
|
|
131
|
+
logger.error(`Resource update failed: ${err instanceof Error ? err.message : err}`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}, 100);
|
|
117
135
|
});
|
|
118
136
|
}
|
|
119
137
|
catch {
|
|
120
|
-
logger.warn('
|
|
138
|
+
logger.warn('Resource watcher unavailable (recursive fs.watch unsupported on this platform).');
|
|
121
139
|
return;
|
|
122
140
|
}
|
|
123
141
|
ctx.disposers.push(() => {
|
|
124
142
|
clearTimeout(debounce);
|
|
125
|
-
|
|
143
|
+
closeWatcher();
|
|
126
144
|
});
|
|
127
145
|
}
|
|
128
146
|
/**
|
|
129
147
|
* Refreshes the component model and dependent artifacts when a reusable
|
|
130
148
|
* component source or skin changes.
|
|
131
149
|
*/
|
|
132
|
-
function watchComponents(project, ctx, options, enqueue) {
|
|
150
|
+
function watchComponents(project, ctx, options, enqueue, syncAssets) {
|
|
133
151
|
const convention = project.componentConvention;
|
|
134
152
|
if (!convention)
|
|
135
153
|
return false;
|
|
136
154
|
let debounce;
|
|
137
155
|
const watchers = [];
|
|
138
156
|
let skinWatcherActive = false;
|
|
157
|
+
/**
|
|
158
|
+
* Coalesces component edits into a queued model and bundle refresh.
|
|
159
|
+
*/
|
|
139
160
|
const schedule = () => {
|
|
140
161
|
clearTimeout(debounce);
|
|
141
162
|
debounce = setTimeout(() => enqueue(async () => {
|
|
@@ -146,7 +167,7 @@ function watchComponents(project, ctx, options, enqueue) {
|
|
|
146
167
|
await refreshGeneratedNamespaceEntries(ctx);
|
|
147
168
|
await compileKUI().apply(ctx);
|
|
148
169
|
await writeComponentCatalog().apply(ctx);
|
|
149
|
-
await
|
|
170
|
+
await syncAssets();
|
|
150
171
|
emitDiagnostics(ctx, options);
|
|
151
172
|
options.onEvent?.({
|
|
152
173
|
type: 'build-complete',
|
|
@@ -192,6 +213,9 @@ function watchComponents(project, ctx, options, enqueue) {
|
|
|
192
213
|
});
|
|
193
214
|
return skinWatcherActive;
|
|
194
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Serializes resource work and skips queued actions after disposal.
|
|
218
|
+
*/
|
|
195
219
|
function createResourceBuildQueue(ctx) {
|
|
196
220
|
let pending = Promise.resolve();
|
|
197
221
|
let disposed = false;
|
|
@@ -206,6 +230,9 @@ function createResourceBuildQueue(ctx) {
|
|
|
206
230
|
});
|
|
207
231
|
};
|
|
208
232
|
}
|
|
233
|
+
/**
|
|
234
|
+
* Checks whether a file or directory belongs to the given subtree.
|
|
235
|
+
*/
|
|
209
236
|
function isWithin(directory, file) {
|
|
210
237
|
const relative = path.relative(directory, file);
|
|
211
238
|
return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
|
|
@@ -219,7 +246,7 @@ function startHttpServer(project, options) {
|
|
|
219
246
|
const filePath = path.join(project.outputDir, url === '/' ? 'index.html' : url);
|
|
220
247
|
try {
|
|
221
248
|
const data = await fs.readFile(filePath);
|
|
222
|
-
res.writeHead(200, { 'Content-Type': mimeType(filePath) });
|
|
249
|
+
res.writeHead(200, { 'Content-Type': mimeType(filePath), 'Cache-Control': 'no-store' });
|
|
223
250
|
res.end(data);
|
|
224
251
|
}
|
|
225
252
|
catch {
|
|
@@ -235,11 +262,17 @@ function startHttpServer(project, options) {
|
|
|
235
262
|
});
|
|
236
263
|
return server;
|
|
237
264
|
}
|
|
265
|
+
/**
|
|
266
|
+
* Forwards collected diagnostics to the dev event consumer.
|
|
267
|
+
*/
|
|
238
268
|
function emitDiagnostics(ctx, options) {
|
|
239
269
|
for (const diagnostic of ctx.diagnostics.all()) {
|
|
240
270
|
options.onEvent?.({ type: 'diagnostic', diagnostic });
|
|
241
271
|
}
|
|
242
272
|
}
|
|
273
|
+
/**
|
|
274
|
+
* Selects the response content type from the file extension.
|
|
275
|
+
*/
|
|
243
276
|
function mimeType(filePath) {
|
|
244
277
|
return MIME_TYPES[path.extname(filePath).toLowerCase()] ?? 'application/octet-stream';
|
|
245
278
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/core/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACN,UAAU,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,UAAU,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAwB5C,MAAM,UAAU,GAA2B;IAC1C,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;CAClB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAyB;IAC/E,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../../src/core/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EACN,UAAU,EACV,aAAa,EACb,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,UAAU,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAwB5C,MAAM,UAAU,GAA2B;IAC1C,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,wBAAwB;IAC/B,MAAM,EAAE,wBAAwB;IAChC,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;CAClB,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAyB;IAC/E,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE9D,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC,GAAG,EAAE;YACtB,UAAU,EAAE;YACZ,aAAa,EAAE;YACf,uBAAuB,EAAE;YACzB,qBAAqB,EAAE;YACvB,aAAa,EAAE;YACf,YAAY,EAAE;YACd,UAAU,EAAE;SACZ,CAAC,CAAC;QACH,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IAClG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;QAClG,MAAM,KAAK,CAAC;IACb,CAAC;IAED,MAAM,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,qBAAqB,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1F,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAElF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACtB,OAAgB,EAChB,GAAiB,EACjB,OAAyB,EACzB,qBAA8B,EAC9B,OAA8C,EAC9C,UAA+B;IAE/B,IAAI,QAAmD,CAAC;IACxD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAwB,CAAC;IAE7B,IAAI,CAAC;QACJ,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE;YACrE,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;YAE7F,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;gBAAE,OAAO;YAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEvF,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAC3F,IAAI,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;oBAAE,OAAO;YACpE,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBAAE,OAAO;YAElG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACrF,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,KAAK,mBAAmB;gBACnE,QAAQ,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC;gBAC7D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;YACzF,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,QAAQ,GAAG,UAAU,CACpB,GAAG,EAAE;gBACJ,MAAM,gBAAgB,GAAG,QAAQ,CAAC;gBAElC,QAAQ,GAAG,KAAK,CAAC;gBACjB,OAAO,CAAC,KAAK,IAAI,EAAE;oBAClB,MAAM,OAAO,GAAG,gBAAgB,IAAI,QAAQ,CAAC;oBAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAE7B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;oBAC/F,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC;oBAEvG,IAAI,CAAC;wBACJ,IAAI,OAAO,EAAE,CAAC;4BACb,MAAM,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;4BAC9B,MAAM,qBAAqB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC1C,CAAC;wBACD,MAAM,UAAU,EAAE,CAAC;wBACnB,QAAQ,GAAG,KAAK,CAAC;wBACjB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;wBAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;4BACjB,IAAI,EAAE,gBAAgB;4BACtB,OAAO,EAAE,IAAI;4BACb,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;yBAClC,CAAC,CAAC;oBACJ,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACd,QAAQ,KAAK,OAAO,CAAC;wBACrB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;wBAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;4BACjB,IAAI,EAAE,gBAAgB;4BACtB,OAAO,EAAE,KAAK;4BACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;yBAClC,CAAC,CAAC;wBACH,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;oBACrF,CAAC;gBACF,CAAC,CAAC,CAAC;YACJ,CAAC,EACD,GAAG,CACH,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC/F,OAAO;IACR,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;QACvB,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,YAAY,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CACvB,OAAgB,EAChB,GAAiB,EACjB,OAAyB,EACzB,OAA8C,EAC9C,UAA+B;IAE/B,MAAM,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAE/C,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAE9B,IAAI,QAAmD,CAAC;IACxD,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B;;OAEG;IACH,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC3B,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,QAAQ,GAAG,UAAU,CACpB,GAAG,EAAE,CACJ,OAAO,CAAC,KAAK,IAAI,EAAE;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAEpE,IAAI,CAAC;gBACJ,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,gCAAgC,CAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,MAAM,qBAAqB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,UAAU,EAAE,CAAC;gBACnB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;oBACjB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBAClC,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;oBACjB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBAClC,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC7F,CAAC;QACF,CAAC,CAAC,EACH,GAAG,CACH,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI;QACxC,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjF,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;KAC7E,EAAE,CAAC;QACZ,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;gBACjF,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,QAAQ,EAAE,CAAC;gBACZ,CAAC;YACF,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACrB,iBAAiB,GAAG,IAAI,CAAC;YAC1B,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7F,CAAC;IACF,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;QACvB,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,GAAiB;IAClD,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;QACvB,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,EAAE;QACf,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,MAAM,MAAM,EAAE,CAAC;YAChB,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,SAAiB,EAAE,IAAY;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAgB,EAAE,OAAyB;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnD,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEhF,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;YACxF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACR,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtB,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;QAChC,MAAM,GAAG,GAAG,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/C,MAAM,CAAC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAiB,EAAE,OAAyB;IACpE,KAAK,MAAM,UAAU,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,QAAgB;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AACvF,CAAC"}
|
|
@@ -5,6 +5,9 @@ import type { Diagnostic, DiagnosticPolicy } from './types.js';
|
|
|
5
5
|
export declare class DiagnosticCollector {
|
|
6
6
|
private readonly _policy;
|
|
7
7
|
private readonly _diagnostics;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a collector using the active diagnostic policy.
|
|
10
|
+
*/
|
|
8
11
|
constructor(_policy: DiagnosticPolicy);
|
|
9
12
|
/**
|
|
10
13
|
* Adds a diagnostic after applying the active policy.
|
|
@@ -22,7 +25,13 @@ export declare class DiagnosticCollector {
|
|
|
22
25
|
* Removes diagnostics whose codes belong to a refreshed build scope.
|
|
23
26
|
*/
|
|
24
27
|
removeByCodes(codes: readonly string[]): void;
|
|
28
|
+
/**
|
|
29
|
+
* Promotes selected warnings to errors under strict policy.
|
|
30
|
+
*/
|
|
25
31
|
private _normalize;
|
|
32
|
+
/**
|
|
33
|
+
* Builds the deduplication key from a diagnostic and its source location.
|
|
34
|
+
*/
|
|
26
35
|
private _key;
|
|
27
36
|
}
|
|
28
37
|
//# sourceMappingURL=collector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,qBAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/collector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,qBAAa,mBAAmB;IAUZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiC;IAI9D;;OAEG;gBACiC,OAAO,EAAE,gBAAgB;IAI7D;;OAEG;IACI,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAS3C;;OAEG;IACI,GAAG,IAAI,SAAS,UAAU,EAAE;IAInC;;OAEG;IACI,SAAS,IAAI,OAAO;IAI3B;;OAEG;IACI,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAWpD;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,IAAI;CAWZ"}
|
|
@@ -7,6 +7,9 @@ export class DiagnosticCollector {
|
|
|
7
7
|
// ── Instance fields ───────────────────────────────────────────────
|
|
8
8
|
_diagnostics = new Map();
|
|
9
9
|
// ── Constructor ───────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Creates a collector using the active diagnostic policy.
|
|
12
|
+
*/
|
|
10
13
|
constructor(_policy) {
|
|
11
14
|
this._policy = _policy;
|
|
12
15
|
}
|
|
@@ -45,12 +48,18 @@ export class DiagnosticCollector {
|
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
// ── Private methods ───────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Promotes selected warnings to errors under strict policy.
|
|
53
|
+
*/
|
|
48
54
|
_normalize(diagnostic) {
|
|
49
55
|
if (!this._policy.strict || diagnostic.severity === 'error' || !isStrictDiagnosticCode(diagnostic.code)) {
|
|
50
56
|
return diagnostic;
|
|
51
57
|
}
|
|
52
58
|
return { ...diagnostic, severity: 'error' };
|
|
53
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Builds the deduplication key from a diagnostic and its source location.
|
|
62
|
+
*/
|
|
54
63
|
_key(diagnostic) {
|
|
55
64
|
const location = diagnostic.location;
|
|
56
65
|
return [
|
|
@@ -63,6 +72,9 @@ export class DiagnosticCollector {
|
|
|
63
72
|
].join('\u0000');
|
|
64
73
|
}
|
|
65
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Orders diagnostics by source location and code.
|
|
77
|
+
*/
|
|
66
78
|
function compareDiagnostics(a, b) {
|
|
67
79
|
const fileOrder = (a.location?.file ?? '').localeCompare(b.location?.file ?? '');
|
|
68
80
|
if (fileOrder !== 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/core/diagnostics/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD;;GAEG;AACH,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../../../src/core/diagnostics/collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ export type DevEvent = {
|
|
|
33
33
|
readonly url: string;
|
|
34
34
|
} | {
|
|
35
35
|
readonly type: 'build-start';
|
|
36
|
-
readonly reason: 'initial' | 'kui-change' | 'source-change';
|
|
36
|
+
readonly reason: 'initial' | 'kui-change' | 'source-change' | 'resource-change';
|
|
37
37
|
} | {
|
|
38
38
|
readonly type: 'diagnostic';
|
|
39
39
|
readonly diagnostic: Diagnostic;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,eAAe,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/core/diagnostics/output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,OAAO,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,iBAAiB,CAAA;CAAE,GACjH;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAChE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAG/F;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CAGjF;AAGD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAG7E;AAGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,QAAQ,GAAG,IAAI,CAE5E"}
|
package/dist/core/errors.d.ts
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class BuildError extends Error {
|
|
6
6
|
readonly cause?: Error | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Creates the named CLI error with its message.
|
|
9
|
+
*/
|
|
7
10
|
constructor(message: string, cause?: Error | undefined);
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
@@ -11,6 +14,9 @@ export declare class BuildError extends Error {
|
|
|
11
14
|
* invalid `stage.scaleMode`).
|
|
12
15
|
*/
|
|
13
16
|
export declare class ConfigError extends Error {
|
|
17
|
+
/**
|
|
18
|
+
* Creates the named CLI error with its message.
|
|
19
|
+
*/
|
|
14
20
|
constructor(message: string);
|
|
15
21
|
}
|
|
16
22
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,UAAW,SAAQ,KAAK;aAOnB,KAAK,CAAC,EAAE,KAAK;IAL9B;;OAEG;gBAEF,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAK9B;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAErC;;OAEG;gBACgB,OAAO,EAAE,MAAM;CAIlC"}
|
package/dist/core/errors.js
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export class BuildError extends Error {
|
|
6
6
|
cause;
|
|
7
|
+
/**
|
|
8
|
+
* Creates the named CLI error with its message.
|
|
9
|
+
*/
|
|
7
10
|
constructor(message, cause) {
|
|
8
11
|
super(message);
|
|
9
12
|
this.cause = cause;
|
|
@@ -15,6 +18,9 @@ export class BuildError extends Error {
|
|
|
15
18
|
* invalid `stage.scaleMode`).
|
|
16
19
|
*/
|
|
17
20
|
export class ConfigError extends Error {
|
|
21
|
+
/**
|
|
22
|
+
* Creates the named CLI error with its message.
|
|
23
|
+
*/
|
|
18
24
|
constructor(message) {
|
|
19
25
|
super(message);
|
|
20
26
|
this.name = 'ConfigError';
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IAOnB;IALjB;;OAEG;IACH,YACC,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAErC;;OAEG;IACH,YAAmB,OAAe;QACjC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC3B,CAAC;CACD"}
|
package/dist/core/kui/codegen.js
CHANGED
|
@@ -22,10 +22,16 @@ class CodeGenerator {
|
|
|
22
22
|
_lines = [];
|
|
23
23
|
_indent = 0;
|
|
24
24
|
// ── Constructor ───────────────────────────────────────────────────
|
|
25
|
+
/**
|
|
26
|
+
* Creates a generator for the resolved Skin IR.
|
|
27
|
+
*/
|
|
25
28
|
constructor(ir) {
|
|
26
29
|
this._ir = ir;
|
|
27
30
|
}
|
|
28
31
|
// ── Public methods ────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Produces the complete ESM Skin factory source.
|
|
34
|
+
*/
|
|
29
35
|
generate() {
|
|
30
36
|
this.emitHeader();
|
|
31
37
|
this.emitImports();
|
|
@@ -33,11 +39,17 @@ class CodeGenerator {
|
|
|
33
39
|
return this._lines.join('\n') + '\n';
|
|
34
40
|
}
|
|
35
41
|
// ── Private methods ───────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Marks the generated source with its originating Skin name.
|
|
44
|
+
*/
|
|
36
45
|
emitHeader() {
|
|
37
46
|
this.line(`// Generated from ${this._ir.className || 'Skin'}.kui.xml`);
|
|
38
47
|
this.line('// @generated — do not edit manually');
|
|
39
48
|
this.line('');
|
|
40
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Groups component and required runtime imports by module.
|
|
52
|
+
*/
|
|
41
53
|
emitImports() {
|
|
42
54
|
const moduleImports = new Map();
|
|
43
55
|
for (const [className, modulePath] of this._ir.imports) {
|
|
@@ -67,6 +79,9 @@ class CodeGenerator {
|
|
|
67
79
|
}
|
|
68
80
|
this.line('');
|
|
69
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Emits the Skin factory, children, properties and states.
|
|
84
|
+
*/
|
|
70
85
|
emitFunction() {
|
|
71
86
|
const funcName = this.factoryName(this._ir.className);
|
|
72
87
|
this.line(`export function ${funcName}() {`);
|
|
@@ -99,6 +114,9 @@ class CodeGenerator {
|
|
|
99
114
|
this._indent--;
|
|
100
115
|
this.line('}');
|
|
101
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Emits nodes recursively and assigns their default child properties.
|
|
119
|
+
*/
|
|
102
120
|
emitNodeDeclarations(nodes) {
|
|
103
121
|
for (const node of nodes) {
|
|
104
122
|
this.emitNodeCreation(node);
|
|
@@ -119,17 +137,26 @@ class CodeGenerator {
|
|
|
119
137
|
}
|
|
120
138
|
}
|
|
121
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Creates a component and exposes named Skin parts.
|
|
142
|
+
*/
|
|
122
143
|
emitNodeCreation(node) {
|
|
123
144
|
this.line(`const ${node.varName} = new ${node.className}();`);
|
|
124
145
|
if (node.id) {
|
|
125
146
|
this.line(`skin[${JSON.stringify(node.id)}] = ${node.varName};`);
|
|
126
147
|
}
|
|
127
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Emits the resolved property assignments for a component.
|
|
151
|
+
*/
|
|
128
152
|
emitNodeProperties(node) {
|
|
129
153
|
for (const prop of node.properties) {
|
|
130
154
|
this.emitPropertyAssignment(node.varName, prop.name, prop.value);
|
|
131
155
|
}
|
|
132
156
|
}
|
|
157
|
+
/**
|
|
158
|
+
* Emits an assignment using the runtime form of percent and literal values.
|
|
159
|
+
*/
|
|
133
160
|
emitPropertyAssignment(target, prop, value) {
|
|
134
161
|
// Handle percent width/height specially
|
|
135
162
|
if (value.type === 'percent') {
|
|
@@ -144,9 +171,15 @@ class CodeGenerator {
|
|
|
144
171
|
}
|
|
145
172
|
this.line(`${target}.${prop} = ${this.propertyValueToJS(prop, value)};`);
|
|
146
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Emits objects assigned through a node property.
|
|
176
|
+
*/
|
|
147
177
|
emitNodePropertyChildren(node) {
|
|
148
178
|
this.emitPropertyChildren(node.varName, node.propertyChildren);
|
|
149
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Creates and assigns objects used as property values.
|
|
182
|
+
*/
|
|
150
183
|
emitPropertyChildren(target, propertyChildren) {
|
|
151
184
|
for (const pc of propertyChildren) {
|
|
152
185
|
for (const child of pc.nodes) {
|
|
@@ -156,6 +189,9 @@ class CodeGenerator {
|
|
|
156
189
|
}
|
|
157
190
|
}
|
|
158
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Assigns the generated state definitions to the Skin.
|
|
194
|
+
*/
|
|
159
195
|
emitStates() {
|
|
160
196
|
if (this._ir.states.length === 0)
|
|
161
197
|
return;
|
|
@@ -165,6 +201,9 @@ class CodeGenerator {
|
|
|
165
201
|
}
|
|
166
202
|
this.line(`skin.states = [${stateLines.join(', ')}];`);
|
|
167
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Formats a state and its optional property overrides.
|
|
206
|
+
*/
|
|
168
207
|
generateStateExpr(state) {
|
|
169
208
|
if (state.overrides.length === 0) {
|
|
170
209
|
return `new State("${state.name}")`;
|
|
@@ -172,9 +211,15 @@ class CodeGenerator {
|
|
|
172
211
|
const overrides = state.overrides.map(o => this.generateOverrideExpr(o)).join(', ');
|
|
173
212
|
return `new State("${state.name}", [${overrides}])`;
|
|
174
213
|
}
|
|
214
|
+
/**
|
|
215
|
+
* Formats a runtime SetProperty state override.
|
|
216
|
+
*/
|
|
175
217
|
generateOverrideExpr(override) {
|
|
176
218
|
return `new SetProperty("${override.targetId}", "${override.name}", ${this.propertyValueToJS(override.name, override.value)})`;
|
|
177
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Formats a resolved property value as JavaScript.
|
|
222
|
+
*/
|
|
178
223
|
valueToJS(value) {
|
|
179
224
|
switch (value.type) {
|
|
180
225
|
case 'literal':
|
|
@@ -183,6 +228,9 @@ class CodeGenerator {
|
|
|
183
228
|
return String(value.value);
|
|
184
229
|
}
|
|
185
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* Converts nine-slice values to runtime rectangles or cleared defaults.
|
|
233
|
+
*/
|
|
186
234
|
propertyValueToJS(prop, value) {
|
|
187
235
|
if (prop === 'scale9Grid' && value.type === 'literal' && value.value === false) {
|
|
188
236
|
return 'undefined';
|
|
@@ -208,6 +256,9 @@ class CodeGenerator {
|
|
|
208
256
|
}
|
|
209
257
|
return this.valueToJS(value);
|
|
210
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Appends a generated line using the current indentation.
|
|
261
|
+
*/
|
|
211
262
|
line(text) {
|
|
212
263
|
if (text === '') {
|
|
213
264
|
this._lines.push('');
|
|
@@ -216,6 +267,9 @@ class CodeGenerator {
|
|
|
216
267
|
this._lines.push('\t'.repeat(this._indent) + text);
|
|
217
268
|
}
|
|
218
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Derives a valid factory name from the Skin class name.
|
|
272
|
+
*/
|
|
219
273
|
factoryName(className) {
|
|
220
274
|
if (!className)
|
|
221
275
|
return 'createSkin';
|
|
@@ -223,10 +277,16 @@ class CodeGenerator {
|
|
|
223
277
|
const base = (parts[parts.length - 1] ?? 'Skin').replace(/[^A-Za-z0-9_$]/g, '_');
|
|
224
278
|
return `create${base}`;
|
|
225
279
|
}
|
|
280
|
+
/**
|
|
281
|
+
* Checks root, state and child properties for a required runtime import.
|
|
282
|
+
*/
|
|
226
283
|
hasPropertyInTree(propertyName) {
|
|
227
284
|
if (this._ir.properties.some(prop => prop.name === propertyName) ||
|
|
228
285
|
this._ir.states.some(state => state.overrides.some(override => override.name === propertyName)))
|
|
229
286
|
return true;
|
|
287
|
+
/**
|
|
288
|
+
* Searches visual and property children recursively for the property.
|
|
289
|
+
*/
|
|
230
290
|
const visit = (nodes) => {
|
|
231
291
|
for (const node of nodes) {
|
|
232
292
|
if (node.properties.some(prop => prop.name === propertyName))
|
|
@@ -240,6 +300,9 @@ class CodeGenerator {
|
|
|
240
300
|
}
|
|
241
301
|
}
|
|
242
302
|
// ── Utility functions ────────────────────────────────────────────────
|
|
303
|
+
/**
|
|
304
|
+
* Serializes a literal property without changing its value type.
|
|
305
|
+
*/
|
|
243
306
|
function literalToJS(value) {
|
|
244
307
|
if (value.value === null)
|
|
245
308
|
return 'null';
|