@zlooks.cn/cli 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/command/index.js +59 -2
  2. package/dist/command/index.js.map +1 -1
  3. package/dist/operations.d.ts +2 -0
  4. package/dist/operations.d.ts.map +1 -1
  5. package/dist/operations.js +8 -10
  6. package/dist/operations.js.map +1 -1
  7. package/dist/prompt.d.ts +4 -0
  8. package/dist/prompt.d.ts.map +1 -1
  9. package/dist/prompt.js +7 -1
  10. package/dist/prompt.js.map +1 -1
  11. package/dist/service-catalog.d.ts +1 -1
  12. package/dist/service-catalog.d.ts.map +1 -1
  13. package/dist/service-catalog.js +1 -0
  14. package/dist/service-catalog.js.map +1 -1
  15. package/dist/theme-authoring.d.ts +36 -0
  16. package/dist/theme-authoring.d.ts.map +1 -0
  17. package/dist/theme-authoring.js +491 -0
  18. package/dist/theme-authoring.js.map +1 -0
  19. package/package.json +10 -4
  20. package/templates/blog-theme/README.md +26 -0
  21. package/templates/blog-theme/_gitignore +5 -0
  22. package/templates/blog-theme/hile-rsc.json +22 -0
  23. package/templates/blog-theme/package.json +64 -0
  24. package/templates/blog-theme/pnpm-workspace.yaml +5 -0
  25. package/templates/blog-theme/src/command/index.ts +11 -0
  26. package/templates/blog-theme/src/identity.ts +7 -0
  27. package/templates/blog-theme/src/plugin/archive-filter.tsx +62 -0
  28. package/templates/blog-theme/src/plugin/blog-frame.tsx +91 -0
  29. package/templates/blog-theme/src/plugin/blog-interactions.tsx +236 -0
  30. package/templates/blog-theme/src/plugin/page.tsx +174 -0
  31. package/templates/blog-theme/src/plugin/styles.d.ts +1 -0
  32. package/templates/blog-theme/src/plugin/theme.css +59 -0
  33. package/templates/blog-theme/src/services/blog-theme.boot.ts +17 -0
  34. package/templates/blog-theme/test/interactions.test.tsx.template +177 -0
  35. package/templates/blog-theme/test/pages.test.tsx.template +125 -0
  36. package/templates/blog-theme/test/shell.test.tsx.template +102 -0
  37. package/templates/blog-theme/test/theme-contract.test.ts.template +43 -0
  38. package/templates/blog-theme/tsconfig.json +16 -0
  39. package/templates/blog-theme/tsconfig.runtime.json +17 -0
  40. package/templates/blog-theme/vitest.config.ts +8 -0
@@ -0,0 +1,491 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { readdir, readFile, rename, rm, stat, writeFile, mkdir, mkdtemp } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { basename, dirname, isAbsolute, join, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { satisfies, valid as validSemver } from 'semver';
7
+ import { parse as parseYaml } from 'yaml';
8
+ import { parseZlooksPackageManifest } from './package-manifest.js';
9
+ const THEME_ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
10
+ const THIRD_PARTY_THEME_PACKAGE_PATTERN = /^zlooks-theme-[a-z][a-z0-9]*(?:-[a-z0-9]+)*-server$/;
11
+ const REQUIRED_ROUTES = [
12
+ '/',
13
+ '/posts/[slug]',
14
+ '/archives',
15
+ '/pages/[slug]',
16
+ '/categories/[slug]',
17
+ '/tags/[slug]',
18
+ '/friends',
19
+ ];
20
+ const REQUIRED_FILES = [
21
+ 'package.json',
22
+ 'pnpm-workspace.yaml',
23
+ 'hile-rsc.json',
24
+ 'tsconfig.json',
25
+ 'tsconfig.runtime.json',
26
+ 'src/command/index.ts',
27
+ 'src/identity.ts',
28
+ 'src/services/blog-theme.boot.ts',
29
+ 'src/plugin/page.tsx',
30
+ 'src/plugin/blog-frame.tsx',
31
+ 'src/plugin/blog-interactions.tsx',
32
+ 'src/plugin/theme.css',
33
+ 'test/theme-contract.test.ts',
34
+ ];
35
+ const LOCAL_GATES = [
36
+ ['install', '--frozen-lockfile=false'],
37
+ ['run', 'test'],
38
+ ['run', 'typecheck'],
39
+ ['run', 'build'],
40
+ ['run', 'verify:rsc'],
41
+ ];
42
+ export async function createBlogThemeScaffold(options) {
43
+ const themeId = parseThemeId(options.themeId);
44
+ const displayName = parseRequiredText(options.displayName, 'displayName', 100);
45
+ const description = parseRequiredText(options.description ?? `${displayName} Zlooks 博客主题`, 'description', 500);
46
+ const destination = resolve(options.destination);
47
+ const packageName = `zlooks-theme-${themeId}-server`;
48
+ await assertDestinationAbsent(destination);
49
+ const temporary = join(dirname(destination), `.${basename(destination)}.tmp-${randomUUID()}`);
50
+ await mkdir(temporary, { recursive: false });
51
+ try {
52
+ await copyTemplate(new URL('../templates/blog-theme/', import.meta.url), temporary, {
53
+ '__THEME_ID__': themeId,
54
+ '__PACKAGE_NAME__': packageName,
55
+ '__DISPLAY_NAME_JSON__': JSON.stringify(displayName),
56
+ '__DESCRIPTION_JSON__': JSON.stringify(description),
57
+ ...await themeSdkVersions(),
58
+ });
59
+ await rename(temporary, destination);
60
+ }
61
+ catch (error) {
62
+ await rm(temporary, { recursive: true, force: true });
63
+ throw error;
64
+ }
65
+ return Object.freeze({ destination, packageName, themeId });
66
+ }
67
+ export async function verifyBlogThemeProject(options, runtime) {
68
+ const root = resolve(options.root);
69
+ const checks = await inspectBlogThemeProject(root);
70
+ if (checks.some((check) => !check.ok)) {
71
+ return Object.freeze({ ok: false, stage: 'PRECHECK', checks });
72
+ }
73
+ const executed = [...checks];
74
+ for (const args of LOCAL_GATES) {
75
+ const id = `command.${args.slice(1).join('.') || args[0]}`;
76
+ const result = await runtime.run('pnpm', args, { cwd: root });
77
+ executed.push(Object.freeze({
78
+ id,
79
+ ok: result.exitCode === 0,
80
+ detail: result.exitCode === 0 ? `pnpm ${args.join(' ')} passed` : boundedOutput(result.output),
81
+ }));
82
+ if (result.exitCode !== 0) {
83
+ return Object.freeze({ ok: false, stage: 'SCAFFOLDED', checks: executed });
84
+ }
85
+ if (args[0] === 'install') {
86
+ const compatible = await inspectInstalledThemePeers(root);
87
+ executed.push(compatible);
88
+ if (!compatible.ok)
89
+ return Object.freeze({ ok: false, stage: 'SCAFFOLDED', checks: executed });
90
+ }
91
+ }
92
+ const finalChecks = [
93
+ ...await inspectBlogThemeProject(root),
94
+ await inspectInstalledThemePeers(root),
95
+ ].map((check) => ({ ...check, id: `final.${check.id}` }));
96
+ executed.push(...finalChecks);
97
+ if (finalChecks.some((check) => !check.ok))
98
+ return Object.freeze({ ok: false, stage: 'SCAFFOLDED', checks: executed });
99
+ const artifact = await inspectProducedArtifact(root, runtime);
100
+ executed.push(artifact);
101
+ if (!artifact.ok)
102
+ return Object.freeze({ ok: false, stage: 'SCAFFOLDED', checks: executed });
103
+ const packed = await inspectPackedTheme(root, runtime);
104
+ executed.push(packed);
105
+ if (!packed.ok)
106
+ return Object.freeze({ ok: false, stage: 'SCAFFOLDED', checks: executed });
107
+ return Object.freeze({ ok: true, stage: 'LOCAL_VERIFIED', checks: executed });
108
+ }
109
+ export async function inspectInstalledThemePeers(root) {
110
+ try {
111
+ const readInstalled = async (name) => JSON.parse(await readFile(join(root, 'node_modules', name, 'package.json'), 'utf8'));
112
+ const ui = await readInstalled('@zlooks.cn/ui');
113
+ const theme = await readInstalled('@zlooks.cn/blog-theme');
114
+ const requirements = {
115
+ antd: ui.peerDependencies?.antd,
116
+ react: ui.peerDependencies?.react,
117
+ 'react-dom': ui.peerDependencies?.['react-dom'],
118
+ 'react-server-dom-webpack': ui.peerDependencies?.react,
119
+ '@hile/rsc': theme.dependencies?.['@hile/rsc'],
120
+ };
121
+ for (const [name, range] of Object.entries(requirements)) {
122
+ if (!range)
123
+ throw new Error(`Installed SDK is missing its ${name} compatibility contract`);
124
+ const installed = await readInstalled(name);
125
+ if (!satisfies(installed.version, range)) {
126
+ const prefix = name === 'antd' ? '--save-exact' : '--save-prefix=^';
127
+ throw new Error(`${name}@${installed.version} does not satisfy the SDK contract ${range}. Resolve a compatible version with pnpm add ${prefix} ${name}@${range}, preserve pnpm-lock.yaml, and rerun verification.`);
128
+ }
129
+ }
130
+ return { id: 'installed.compatible', ok: true, detail: 'Installed Ant Design, React and Hile versions match SDK compatibility contracts' };
131
+ }
132
+ catch (error) {
133
+ return { id: 'installed.compatible', ok: false, detail: boundedOutput(error instanceof Error ? error.message : String(error)) };
134
+ }
135
+ }
136
+ async function inspectProducedArtifact(root, runtime) {
137
+ try {
138
+ const result = await runtime.run('pnpm', ['exec', 'hile-rsc', 'verify'], { cwd: root });
139
+ const verified = JSON.parse(result.output);
140
+ if (result.exitCode !== 0 || verified.valid !== true || verified.pluginId !== 'blog')
141
+ throw new Error('Direct Hile RSC verification did not confirm a valid Blog artifact');
142
+ const builds = await readdir(join(root, '.hile-rsc'), { withFileTypes: true });
143
+ if (builds.length !== 1 || !builds[0].isDirectory() || builds[0].name.startsWith('.'))
144
+ throw new Error('.hile-rsc must contain exactly one production build and no development state');
145
+ const prefix = `.hile-rsc/${builds[0].name}`;
146
+ const manifest = JSON.parse(await readFile(join(root, prefix, 'plugin.json'), 'utf8'));
147
+ if (!REQUIRED_ROUTES.every((path) => manifest.routes?.some((route) => route.path === path)))
148
+ throw new Error('The compiled artifact is missing required Blog routes');
149
+ return { id: 'artifact.verified', ok: true, detail: 'Direct Hile verification confirms one immutable Blog build with all seven routes' };
150
+ }
151
+ catch (error) {
152
+ return { id: 'artifact.verified', ok: false, detail: boundedOutput(error instanceof Error ? error.message : String(error)) };
153
+ }
154
+ }
155
+ async function inspectPackedTheme(root, runtime) {
156
+ const destination = await mkdtemp(join(tmpdir(), 'zlooks-theme-pack-'));
157
+ try {
158
+ const result = await runtime.run('npm', ['pack', '--ignore-scripts', '--json', '--pack-destination', destination], { cwd: root });
159
+ if (result.exitCode !== 0)
160
+ throw new Error(result.output || 'npm pack failed');
161
+ const output = JSON.parse(result.output);
162
+ if (output.length !== 1 || basename(output[0].filename) !== output[0].filename)
163
+ throw new Error('npm pack returned an invalid tarball');
164
+ const tarball = await stat(join(destination, output[0].filename));
165
+ if (!tarball.isFile() || tarball.size === 0)
166
+ throw new Error('npm pack produced no tarball');
167
+ const packed = new Set(output[0].files.map(({ path }) => path));
168
+ const manifest = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
169
+ const expected = ['package.json', ...Object.values(manifest.bin), ...await regularFiles(root, '.hile-rsc'), ...await regularFiles(root, 'dist')];
170
+ if (!expected.some((path) => path.endsWith('.boot.js')))
171
+ throw new Error('The compiled service has no boot file');
172
+ const missing = expected.filter((path) => !packed.has(path.replace(/^\.\//, '')));
173
+ if (missing.length)
174
+ throw new Error(`Tarball is missing build files: ${missing.join(', ')}`);
175
+ const unexpected = [...packed].filter((path) => !path.startsWith('dist/') && !path.startsWith('.hile-rsc/') && !/^(?:package\.json|readme(?:\.[^/]*)?|licen[cs]e(?:\.[^/]*)?)$/i.test(path));
176
+ if (unexpected.length)
177
+ throw new Error(`Tarball contains non-runtime files: ${unexpected.join(', ')}`);
178
+ return { id: 'package.packed', ok: true, detail: `Real npm tarball contains all ${expected.length} required metadata and build files; test archive removed` };
179
+ }
180
+ catch (error) {
181
+ return { id: 'package.packed', ok: false, detail: boundedOutput(error instanceof Error ? error.message : String(error)) };
182
+ }
183
+ finally {
184
+ await rm(destination, { recursive: true, force: true });
185
+ }
186
+ }
187
+ async function regularFiles(root, directory) {
188
+ const files = [];
189
+ for (const entry of await readdir(join(root, directory), { withFileTypes: true })) {
190
+ const path = `${directory}/${entry.name}`;
191
+ if (entry.isDirectory())
192
+ files.push(...await regularFiles(root, path));
193
+ else if (entry.isFile())
194
+ files.push(path);
195
+ else
196
+ throw new Error(`Build output must contain regular files only: ${path}`);
197
+ }
198
+ return files;
199
+ }
200
+ export async function inspectBlogThemeProject(root) {
201
+ const files = new Map();
202
+ const fileChecks = await Promise.all(REQUIRED_FILES.map(async (path) => {
203
+ try {
204
+ const content = await readFile(join(root, path), 'utf8');
205
+ files.set(path, content);
206
+ return { id: `file.${path}`, ok: content.length > 0, detail: `${path} is present` };
207
+ }
208
+ catch {
209
+ return { id: `file.${path}`, ok: false, detail: `${path} is missing` };
210
+ }
211
+ }));
212
+ const checks = [...fileChecks];
213
+ checks.push(validateManifest(files.get('package.json')));
214
+ checks.push(validateWorkspace(files.get('pnpm-workspace.yaml')));
215
+ checks.push(validateRoutes(files.get('hile-rsc.json')));
216
+ let source = '';
217
+ try {
218
+ const sourcePaths = (await regularFiles(root, 'src')).filter((path) => /\.[cm]?[jt]sx?$/.test(path));
219
+ source = (await Promise.all(sourcePaths.map((path) => readFile(join(root, path), 'utf8')))).join('\n');
220
+ checks.push({ id: 'source.inspectable', ok: true, detail: `Inspected all ${sourcePaths.length} production source files` });
221
+ }
222
+ catch (error) {
223
+ checks.push({ id: 'source.inspectable', ok: false, detail: error instanceof Error ? error.message : String(error) });
224
+ }
225
+ checks.push(markerCheck('runtime.sdk', source, [
226
+ 'defineBlogTheme',
227
+ 'createBlogThemeBootService',
228
+ 'createServiceBackedBlogThemeDataLoader',
229
+ ]));
230
+ checks.push(markerCheck('routes.exports', files.get('src/plugin/page.tsx') ?? '', [
231
+ 'BlogHomePage',
232
+ 'BlogPostPage',
233
+ 'BlogArchivePage',
234
+ 'BlogSinglePagePage',
235
+ 'BlogCategoryPage',
236
+ 'BlogTagPage',
237
+ 'BlogFriendLinksPage',
238
+ ]));
239
+ checks.push(markerCheck('interactions.complete', files.get('src/plugin/blog-interactions.tsx') ?? '', [
240
+ 'searchPosts',
241
+ 'likePost',
242
+ 'unlikePost',
243
+ 'listComments',
244
+ 'createComment',
245
+ ]));
246
+ const unsafeAntdClientImport = /import\s*\{[^}]*\b(?:App|Button)\b[^}]*\}\s*from\s*['"]antd['"]/s.test(source);
247
+ checks.push(markerCheck('ui.shell-complete', source, [
248
+ 'ZlooksShellProvider', 'ZlooksSiteConfigProvider', 'ZlooksUserAccess',
249
+ 'useZlooksNavigation', 'useZlooksTheme', 'setMode', 'onLogout', 'legal.registrations', 'legal.copyright',
250
+ ]));
251
+ checks.push(Object.freeze({
252
+ id: 'ui.rsc-compatible',
253
+ ok: source.includes('@zlooks.cn/ui/button') && !unsafeAntdClientImport,
254
+ detail: source.includes('@zlooks.cn/ui/button') && !unsafeAntdClientImport
255
+ ? 'Buttons use the Hile-compatible shared UI boundary'
256
+ : 'Import ZlooksButton from @zlooks.cn/ui/button and use @zlooks.cn/ui/app instead of importing App or Button from the Ant Design root barrel',
257
+ }));
258
+ checks.push(Object.freeze({
259
+ id: 'markdown.safe',
260
+ ok: !source.includes('dangerouslySetInnerHTML') && source.includes('react-markdown'),
261
+ detail: !source.includes('dangerouslySetInnerHTML') && source.includes('react-markdown')
262
+ ? 'Markdown uses a structured renderer without raw HTML injection'
263
+ : 'Use react-markdown and remove dangerouslySetInnerHTML',
264
+ }));
265
+ checks.push(Object.freeze({
266
+ id: 'styles.bound',
267
+ ok: (files.get('src/plugin/blog-frame.tsx') ?? '').includes("./theme.css"),
268
+ detail: 'The Client Boundary must import ./theme.css',
269
+ }));
270
+ return Object.freeze(checks);
271
+ }
272
+ function validateManifest(source) {
273
+ try {
274
+ const raw = JSON.parse(source ?? '');
275
+ const parsed = parseZlooksPackageManifest(raw);
276
+ if (!THIRD_PARTY_THEME_PACKAGE_PATTERN.test(parsed.name) || parsed.name.startsWith('@zlooks.cn/')) {
277
+ throw new Error('Third-party themes must use zlooks-theme-<themeId>-server without the @zlooks.cn scope');
278
+ }
279
+ if (parsed.kind !== 'theme')
280
+ throw new Error('zlooks.kind must be theme');
281
+ const expectedThemeId = parsed.name.slice('zlooks-theme-'.length, -'-server'.length);
282
+ if (raw.zlooks?.themeId !== expectedThemeId) {
283
+ throw new Error(`zlooks.themeId must be ${expectedThemeId} so package and runtime identity match`);
284
+ }
285
+ if (raw.private !== false)
286
+ throw new Error('Third-party theme package must set private=false');
287
+ if (!Array.isArray(raw.files) || !raw.files.includes('dist') || !raw.files.includes('.hile-rsc')) {
288
+ throw new Error('files must publish dist and .hile-rsc');
289
+ }
290
+ if (!Array.isArray(raw.zlooks?.nodeConditions) || !raw.zlooks.nodeConditions.includes('react-server')) {
291
+ throw new Error('zlooks.nodeConditions must include react-server');
292
+ }
293
+ const scripts = requireRecord(raw.scripts, 'scripts');
294
+ for (const script of ['test', 'typecheck', 'build', 'verify:rsc']) {
295
+ if (typeof scripts[script] !== 'string' || scripts[script].trim().length === 0) {
296
+ throw new Error(`package.json must define ${script}`);
297
+ }
298
+ }
299
+ const runtimeScripts = {
300
+ dev: 'NODE_OPTIONS=--conditions=react-server hile start --dev --env-file ~/.zlooks.cn/.env',
301
+ start: 'NODE_OPTIONS=--conditions=react-server hile start --env-file ~/.zlooks.cn/.env',
302
+ };
303
+ for (const [script, expected] of Object.entries(runtimeScripts)) {
304
+ if (scripts[script] !== expected) {
305
+ throw new Error(`${script} must load the canonical ~/.zlooks.cn/.env through Hile`);
306
+ }
307
+ }
308
+ for (const [section, dependencies] of [
309
+ ['dependencies', raw.dependencies],
310
+ ['devDependencies', raw.devDependencies],
311
+ ['peerDependencies', raw.peerDependencies],
312
+ ['optionalDependencies', raw.optionalDependencies],
313
+ ]) {
314
+ if (dependencies === undefined)
315
+ continue;
316
+ for (const [name, version] of Object.entries(requireRecord(dependencies, section))) {
317
+ const valid = typeof version === 'string' && (name === 'antd'
318
+ ? validSemver(version) !== null
319
+ : version.startsWith('^') && validSemver(version.slice(1)) !== null);
320
+ if (!valid) {
321
+ throw new Error(`${section}.${name} must use a caret npm version such as ^1.0.0, except antd must use an exact version; workspace:, file:, link:, tags, and paths are forbidden`);
322
+ }
323
+ }
324
+ }
325
+ assertPortableResolutionConfig(raw.pnpm, 'pnpm');
326
+ assertPortableResolutionConfig(raw.overrides, 'overrides');
327
+ assertPortableResolutionConfig(raw.resolutions, 'resolutions');
328
+ return Object.freeze({ id: 'manifest.deployable', ok: true, detail: `${parsed.name} is a deployable third-party theme` });
329
+ }
330
+ catch (error) {
331
+ return Object.freeze({
332
+ id: 'manifest.deployable',
333
+ ok: false,
334
+ detail: error instanceof Error ? error.message : String(error),
335
+ });
336
+ }
337
+ }
338
+ function validateWorkspace(source) {
339
+ try {
340
+ const parsed = requireRecord(parseYaml(source ?? ''), 'pnpm-workspace.yaml');
341
+ for (const field of ['overrides', 'catalog', 'catalogs', 'packageExtensions', 'patchedDependencies']) {
342
+ assertPortableResolutionConfig(parsed[field], field);
343
+ }
344
+ const packages = parsed.packages;
345
+ const allowBuilds = requireRecord(parsed.allowBuilds, 'allowBuilds');
346
+ const ok = Array.isArray(packages)
347
+ && packages.length === 1
348
+ && packages[0] === '.'
349
+ && allowBuilds.esbuild === true;
350
+ return Object.freeze({
351
+ id: 'workspace.installable',
352
+ ok,
353
+ detail: ok
354
+ ? 'Standalone pnpm workspace permits the required esbuild install script'
355
+ : 'pnpm-workspace.yaml must contain packages: [.] and allowBuilds.esbuild: true',
356
+ });
357
+ }
358
+ catch (error) {
359
+ return Object.freeze({
360
+ id: 'workspace.installable',
361
+ ok: false,
362
+ detail: error instanceof Error ? error.message : String(error),
363
+ });
364
+ }
365
+ }
366
+ function assertPortableResolutionConfig(value, field) {
367
+ if (typeof value === 'string') {
368
+ const specifier = value.trim();
369
+ if (/^(?:workspace:|file:|link:|portal:|patch:|\.\.?[\\/]|~[\\/]|[a-z]:[\\/])/i.test(specifier) || isAbsolute(specifier)) {
370
+ throw new Error(`${field} contains a non-portable local dependency; use published npm packages, not workspace:, file:, link:, or filesystem paths`);
371
+ }
372
+ }
373
+ else if (value && typeof value === 'object') {
374
+ for (const [key, child] of Object.entries(value))
375
+ assertPortableResolutionConfig(child, `${field}.${key}`);
376
+ }
377
+ }
378
+ function validateRoutes(source) {
379
+ try {
380
+ const parsed = JSON.parse(source ?? '');
381
+ const paths = Array.isArray(parsed.routes) ? parsed.routes.map(({ path }) => path) : [];
382
+ const ok = parsed.pluginId === 'blog'
383
+ && REQUIRED_ROUTES.every((path) => paths.includes(path))
384
+ && Array.isArray(parsed.styles)
385
+ && parsed.styles.includes('@zlooks.cn/ui/antd.css');
386
+ return Object.freeze({
387
+ id: 'routes.complete',
388
+ ok,
389
+ detail: ok ? 'All seven Blog routes and the shared Ant Design stylesheet are declared' : 'hile-rsc.json must declare pluginId blog, all seven routes, and @zlooks.cn/ui/antd.css',
390
+ });
391
+ }
392
+ catch {
393
+ return Object.freeze({ id: 'routes.complete', ok: false, detail: 'hile-rsc.json is invalid or missing' });
394
+ }
395
+ }
396
+ function markerCheck(id, source, markers) {
397
+ const missing = markers.filter((marker) => !source.includes(marker));
398
+ return Object.freeze({
399
+ id,
400
+ ok: missing.length === 0,
401
+ detail: missing.length === 0 ? `${id} is complete` : `Missing: ${missing.join(', ')}`,
402
+ });
403
+ }
404
+ async function assertDestinationAbsent(destination) {
405
+ try {
406
+ await stat(destination);
407
+ }
408
+ catch (error) {
409
+ if (isNodeError(error) && error.code === 'ENOENT')
410
+ return;
411
+ throw error;
412
+ }
413
+ throw new Error(`Destination is not empty or already exists: ${destination}`);
414
+ }
415
+ async function copyTemplate(sourceUrl, destination, replacements) {
416
+ const entries = await readdir(sourceUrl, { withFileTypes: true });
417
+ for (const entry of entries) {
418
+ const source = new URL(entry.name, sourceUrl);
419
+ const scaffoldName = entry.name.endsWith('.template') ? entry.name.slice(0, -'.template'.length) : entry.name;
420
+ const name = scaffoldName === '_gitignore' ? '.gitignore' : scaffoldName;
421
+ const target = join(destination, name);
422
+ if (entry.isDirectory()) {
423
+ await mkdir(target);
424
+ await copyTemplate(new URL(`${entry.name}/`, sourceUrl), target, replacements);
425
+ continue;
426
+ }
427
+ if (!entry.isFile())
428
+ throw new Error(`Unsupported scaffold entry: ${entry.name}`);
429
+ const content = (await readFile(source, 'utf8')).replace(/__[A-Z_]+__/g, (placeholder) => replacements[placeholder] ?? placeholder);
430
+ await writeFile(target, content, { encoding: 'utf8', flag: 'wx' });
431
+ }
432
+ }
433
+ async function themeSdkVersions() {
434
+ const packages = {
435
+ '__BLOG_SCHEMA_VERSION__': '@zlooks.cn/blog-schema',
436
+ '__BLOG_THEME_VERSION__': '@zlooks.cn/blog-theme',
437
+ '__GLOBAL_CONFIG_VERSION__': '@zlooks.cn/global-config-shared',
438
+ '__SERVICE_COMMAND_VERSION__': '@zlooks.cn/service-command',
439
+ '__UI_VERSION__': '@zlooks.cn/ui',
440
+ };
441
+ const versions = await Promise.all(Object.entries(packages).map(async ([placeholder, name]) => {
442
+ // Resolve metadata without evaluating React, Hile services, or SDK runtime code.
443
+ let directory = dirname(fileURLToPath(import.meta.resolve(name)));
444
+ for (let depth = 0; depth < 8; depth += 1) {
445
+ let manifest = {};
446
+ try {
447
+ manifest = JSON.parse(await readFile(join(directory, 'package.json'), 'utf8'));
448
+ }
449
+ catch (error) {
450
+ if (!isNodeError(error) || error.code !== 'ENOENT')
451
+ throw error;
452
+ }
453
+ if (manifest.name === name && manifest.version && validSemver(manifest.version))
454
+ return [placeholder, manifest.version];
455
+ const parent = dirname(directory);
456
+ if (parent === directory)
457
+ break;
458
+ directory = parent;
459
+ }
460
+ throw new Error(`Cannot resolve the installed theme SDK version: ${name}. Reinstall the matching Zlooks CLI release.`);
461
+ }));
462
+ return Object.fromEntries(versions);
463
+ }
464
+ function parseThemeId(value) {
465
+ const parsed = value.trim();
466
+ if (!THEME_ID_PATTERN.test(parsed) || parsed.length > 50) {
467
+ throw new Error('themeId must be lowercase kebab-case, start with a letter, and contain at most 50 characters');
468
+ }
469
+ return parsed;
470
+ }
471
+ function parseRequiredText(value, field, maxLength) {
472
+ const parsed = value.trim();
473
+ if (parsed.length === 0 || parsed.length > maxLength) {
474
+ throw new Error(`${field} must contain 1-${maxLength} characters`);
475
+ }
476
+ return parsed;
477
+ }
478
+ function boundedOutput(value) {
479
+ const normalized = value.trim();
480
+ return normalized.length <= 2_000 ? normalized : `${normalized.slice(0, 500)}\n… output truncated …\n${normalized.slice(-1_450)}`;
481
+ }
482
+ function isNodeError(error) {
483
+ return error instanceof Error && 'code' in error;
484
+ }
485
+ function requireRecord(value, field) {
486
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
487
+ throw new Error(`${field} must be an object`);
488
+ }
489
+ return value;
490
+ }
491
+ //# sourceMappingURL=theme-authoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-authoring.js","sourceRoot":"","sources":["../src/theme-authoring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAC3D,MAAM,iCAAiC,GAAG,qDAAqD,CAAC;AAChG,MAAM,eAAe,GAAG;IACtB,GAAG;IACH,eAAe;IACf,WAAW;IACX,eAAe;IACf,oBAAoB;IACpB,cAAc;IACd,UAAU;CACF,CAAC;AACX,MAAM,cAAc,GAAG;IACrB,cAAc;IACd,qBAAqB;IACrB,eAAe;IACf,eAAe;IACf,uBAAuB;IACvB,sBAAsB;IACtB,iBAAiB;IACjB,iCAAiC;IACjC,qBAAqB;IACrB,2BAA2B;IAC3B,kCAAkC;IAClC,sBAAsB;IACtB,6BAA6B;CACrB,CAAC;AACX,MAAM,WAAW,GAAG;IAClB,CAAC,SAAS,EAAE,yBAAyB,CAAC;IACtC,CAAC,KAAK,EAAE,MAAM,CAAC;IACf,CAAC,KAAK,EAAE,WAAW,CAAC;IACpB,CAAC,KAAK,EAAE,OAAO,CAAC;IAChB,CAAC,KAAK,EAAE,YAAY,CAAC;CACb,CAAC;AAmCX,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAuC;IAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,iBAAiB,CACnC,OAAO,CAAC,WAAW,IAAI,GAAG,WAAW,cAAc,EACnD,aAAa,EACb,GAAG,CACJ,CAAC;IACF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,gBAAgB,OAAO,SAAS,CAAC;IACrD,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE;YAClF,cAAc,EAAE,OAAO;YACvB,kBAAkB,EAAE,WAAW;YAC/B,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YACpD,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YACnD,GAAG,MAAM,gBAAgB,EAAE;SAC5B,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAkC,EAClC,OAAqC;IAErC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,EAAE;YACF,EAAE,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC;YACzB,MAAM,EAAE,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;SAC/F,CAAC,CAAC,CAAC;QACJ,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC,IAAI,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG;QAClB,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC;QACtC,MAAM,0BAA0B,CAAC,IAAI,CAAC;KACvC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IAC9B,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9D,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY;IAC3D,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEhI,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,EAAE,CAAC,gBAAgB,EAAE,IAAI;YAC/B,KAAK,EAAE,EAAE,CAAC,gBAAgB,EAAE,KAAK;YACjC,WAAW,EAAE,EAAE,CAAC,gBAAgB,EAAE,CAAC,WAAW,CAAC;YAC/C,0BAA0B,EAAE,EAAE,CAAC,gBAAgB,EAAE,KAAK;YACtD,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC;SAC/C,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,yBAAyB,CAAC,CAAC;YAC3F,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,OAAO,sCAAsC,KAAK,gDAAgD,MAAM,IAAI,IAAI,IAAI,KAAK,oDAAoD,CAAC,CAAC;YACtN,CAAC;QACH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iFAAiF,EAAE,CAAC;IAC7I,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAClI,CAAC;AACH,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,IAAY,EAAE,OAAqC;IACxF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAA2C,CAAC;QACrF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QAC5K,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QACzL,MAAM,MAAM,GAAG,aAAa,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAoC,CAAC;QAC1H,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QACtK,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,kFAAkF,EAAE,CAAC;IAC3I,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC/H,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAqC;IACnF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAClI,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAsD,CAAC;QAC9F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1I,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAoC,CAAC;QACnH,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACjJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAClH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,IAAI,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,gEAAgE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7L,IAAI,UAAU,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iCAAiC,QAAQ,CAAC,MAAM,0DAA0D,EAAE,CAAC;IAChK,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC5H,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,SAAiB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;aAClE,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACrC,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAY;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC;QACtF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,aAAa,EAAE,CAAC;QACzE,CAAC;IACH,CAAC,CAAC,CAAC,CAAC;IAEJ,MAAM,MAAM,GAAiC,CAAC,GAAG,UAAU,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAExD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACrG,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,WAAW,CAAC,MAAM,0BAA0B,EAAE,CAAC,CAAC;IAC7H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE;QAC7C,iBAAiB;QACjB,4BAA4B;QAC5B,wCAAwC;KACzC,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,EAAE,EAAE;QAChF,cAAc;QACd,cAAc;QACd,iBAAiB;QACjB,oBAAoB;QACpB,kBAAkB;QAClB,aAAa;QACb,qBAAqB;KACtB,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,uBAAuB,EAAE,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,IAAI,EAAE,EAAE;QACpG,aAAa;QACb,UAAU;QACV,YAAY;QACZ,cAAc;QACd,eAAe;KAChB,CAAC,CAAC,CAAC;IACJ,MAAM,sBAAsB,GAAG,kEAAkE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/G,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,MAAM,EAAE;QACnD,qBAAqB,EAAE,0BAA0B,EAAE,kBAAkB;QACrE,qBAAqB,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,qBAAqB,EAAE,iBAAiB;KACzG,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACxB,EAAE,EAAE,mBAAmB;QACvB,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB;QACtE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB;YACxE,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,4IAA4I;KACjJ,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACxB,EAAE,EAAE,eAAe;QACnB,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACpF,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACtF,CAAC,CAAC,gEAAgE;YAClE,CAAC,CAAC,uDAAuD;KAC5D,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACxB,EAAE,EAAE,cAAc;QAClB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1E,MAAM,EAAE,6CAA6C;KACtD,CAAC,CAAC,CAAC;IACJ,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA0B;IAClD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAalC,CAAC;QACF,MAAM,MAAM,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClG,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrF,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,0BAA0B,eAAe,wCAAwC,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACjG,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACtG,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACtD,KAAK,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YAClE,IAAI,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QACD,MAAM,cAAc,GAAG;YACrB,GAAG,EAAE,sFAAsF;YAC3F,KAAK,EAAE,gFAAgF;SAC/E,CAAC;QACX,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;QACD,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI;YACpC,CAAC,cAAc,EAAE,GAAG,CAAC,YAAY,CAAC;YAClC,CAAC,iBAAiB,EAAE,GAAG,CAAC,eAAe,CAAC;YACxC,CAAC,kBAAkB,EAAE,GAAG,CAAC,gBAAgB,CAAC;YAC1C,CAAC,sBAAsB,EAAE,GAAG,CAAC,oBAAoB,CAAC;SAC1C,EAAE,CAAC;YACX,IAAI,YAAY,KAAK,SAAS;gBAAE,SAAS;YACzC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;gBACnF,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,MAAM;oBAC3D,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,IAAI;oBAC/B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;gBACvE,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,8IAA8I,CAAC,CAAC;gBACpL,CAAC;YACH,CAAC;QACH,CAAC;QACD,8BAA8B,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjD,8BAA8B,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,8BAA8B,CAAC,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,oCAAoC,EAAE,CAAC,CAAC;IAC5H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,qBAAqB;YACzB,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA0B;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC;YACrG,8BAA8B,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;eAC7B,QAAQ,CAAC,MAAM,KAAK,CAAC;eACrB,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG;eACnB,WAAW,CAAC,OAAO,KAAK,IAAI,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,uBAAuB;YAC3B,EAAE;YACF,MAAM,EAAE,EAAE;gBACR,CAAC,CAAC,uEAAuE;gBACzE,CAAC,CAAC,8EAA8E;SACnF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,uBAAuB;YAC3B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CAAC,KAAc,EAAE,KAAa;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,2EAA2E,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACzH,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0HAA0H,CAAC,CAAC;QACtJ,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,8BAA8B,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAA0B;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAIrC,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,KAAK,MAAM;eAChC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;eACrD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;eAC5B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,EAAE,EAAE,iBAAiB;YACrB,EAAE;YACF,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,yEAAyE,CAAC,CAAC,CAAC,wFAAwF;SAClL,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qCAAqC,EAAE,CAAC,CAAC;IAC5G,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,MAAc,EAAE,OAA0B;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE;QACF,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACtF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,WAAmB;IACxD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,WAAW,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,SAAc,EACd,WAAmB,EACnB,YAA8C;IAE9C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9G,MAAM,IAAI,GAAG,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACpB,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;QACpI,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG;QACf,yBAAyB,EAAE,wBAAwB;QACnD,wBAAwB,EAAE,uBAAuB;QACjD,2BAA2B,EAAE,iCAAiC;QAC9D,6BAA6B,EAAE,4BAA4B;QAC3D,gBAAgB,EAAE,eAAe;KAClC,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5F,iFAAiF;QACjF,IAAI,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,QAAQ,GAAwC,EAAE,CAAC;YACvD,IAAI,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAAC,CAAC;YACvF,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAAC,CAAC;YAClF,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAU,CAAC;YACjI,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM;YAChC,SAAS,GAAG,MAAM,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,8CAA8C,CAAC,CAAC;IACzH,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,8FAA8F,CAAC,CAAC;IAClH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa,EAAE,SAAiB;IACxE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,SAAS,aAAa,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,2BAA2B,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;AACpI,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zlooks.cn/cli",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,7 +13,8 @@
13
13
  }
14
14
  },
15
15
  "files": [
16
- "dist"
16
+ "dist",
17
+ "templates"
17
18
  ],
18
19
  "engines": {
19
20
  "node": ">=24.0.0"
@@ -29,10 +30,15 @@
29
30
  "@hile/ioredis": "4.0.1",
30
31
  "@hile/typeorm": "4.0.1",
31
32
  "@inquirer/prompts": "8.7.0",
33
+ "@zlooks.cn/blog-schema": "1.0.0",
34
+ "@zlooks.cn/blog-theme": "1.0.3",
35
+ "@zlooks.cn/global-config-shared": "1.0.0",
32
36
  "@zlooks.cn/infrastructure": "1.0.0",
33
- "@zlooks.cn/legacy-import": "1.0.2",
37
+ "@zlooks.cn/legacy-import": "1.0.3",
34
38
  "@zlooks.cn/public-host-contract": "1.0.0",
35
39
  "@zlooks.cn/registry-config": "1.0.0",
40
+ "@zlooks.cn/service-command": "1.0.0",
41
+ "@zlooks.cn/ui": "1.0.2",
36
42
  "commander": "15.0.0",
37
43
  "ioredis": "5.11.1",
38
44
  "pg": "8.23.0",
@@ -48,5 +54,5 @@
48
54
  "typescript": "7.0.2",
49
55
  "vitest": "4.1.11"
50
56
  },
51
- "gitHead": "19d023777e5b12872d5315e048da1a851db5e93d"
57
+ "gitHead": "b118899f7646d3cb4e82563f0d32f68238bb38d0"
52
58
  }
@@ -0,0 +1,26 @@
1
+ # __DISPLAY_NAME_JSON__
2
+
3
+ 这是由 `zlooks theme create` 生成的 Blog RSC 主题起点。模板不是最终成品:请按用户要求设计视觉与布局,同时保留七条 Blog 路由、Hile 运行时、SEO、搜索、点赞、评论读取与提交,以及安全的 Markdown 渲染。
4
+
5
+ ## 开发
6
+
7
+ 1. 运行 `zlooks setup`,确认机器级 `~/.zlooks.cn/.env` 已包含 Registry 地址。
8
+ 2. 运行 `pnpm install`。
9
+ 3. 运行 `zlooks theme verify . --json`,依次完成结构、安装、测试、类型、构建、RSC 产物和真实 tarball 检查。结果必须为 `ok=true`、`stage=LOCAL_VERIFIED`。
10
+ 4. 运行 `pnpm run start`,使用已验证的生产构建,通过统一 Gateway 访问主题;本服务不会开放独立公共 HTTP 端口。
11
+
12
+ 只有用户明确使用配套开发模式 Gateway 时才使用 `pnpm run dev`。开发模式 React Flight 不能发送给生产模式 Gateway;`localhost` 地址不表示 Gateway 是开发模式。修改后重新执行完整验证,再重启生产主题进程。
13
+
14
+ 主题包名 `__PACKAGE_NAME__` 属于第三方命名空间,不要改成官方保留的 `@zlooks.cn/*`。
15
+ `antd` 使用与 UI SDK 匹配的精确版本,其余依赖声明使用 `^版本号`。保留由 pnpm 生成的锁文件;更新依赖后必须重新执行完整验证,尤其是 React/Hile/Ant Design 的实际安装版本兼容性。
16
+ 按钮与主题化反馈分别使用 `@zlooks.cn/ui/button` 和 `@zlooks.cn/ui/app`,不要绕回 Ant Design 的不兼容 directive barrel。
17
+
18
+ 公共壳层包含 `ZlooksUserAccess` 的登录方式、账户菜单、确认退出与不可用态;`useZlooksTheme` 驱动浅色、深色、自动三态;主导航消费 Host 初始投影并与 Blog 页面去重;备案和版权消费站点配置。不要用静态按钮替换共享组件、复制认证逻辑,或另建主题偏好存储。`test/shell.test.tsx` 使用真实 UI 组件验证这些接线;真实登录和内容交互属于另行约定的可选验收。
19
+
20
+ ## 验证边界
21
+
22
+ `test/theme-contract.test.ts` 检查路由、唯一 boot 和源码边界;`test/pages.test.tsx` 使用真实 SDK ViewModel 检查七类页面、SEO 和空状态;`test/interactions.test.tsx` 用交互测试检查搜索、点赞、评论和筛选。视觉调整可以更新展示断言,但必须保留功能断言。所有测试都参与类型检查。
23
+
24
+ 用户仅询问制作方法时,说明步骤和 SDK 边界即可,无须实际创建项目或执行验收。实际制作依次完成 `PRECHECK`、`SCAFFOLDED`、`DESIGNED`、`LOCAL_VERIFIED`,再启动生产构建,通过 Blog MCP 的主题目录和状态确认健康实例,记录 `RUNTIME_VERIFIED` 后即可报告主题制作完成。`LOCAL_VERIFIED` 本身不是运行证明。
25
+
26
+ `FUNCTION_VERIFIED` 是按用户要求追加的真实内容验收,单独记录覆盖范围。默认不验证登录后的行为,也不为制作主题创建账号或文章;缺少登录态、测试内容、写操作授权或浏览器条件不阻塞主题制作。切换主题、发布、点赞或评论等操作仍须明确授权。未执行的检查必须如实标注,制作完成不等于所有真实内容行为已经验收。
@@ -0,0 +1,5 @@
1
+ node_modules/
2
+ dist/
3
+ .hile-rsc/
4
+ .env
5
+ pnpm-debug.log*
@@ -0,0 +1,22 @@
1
+ {
2
+ "pluginId": "blog",
3
+ "cwd": ".",
4
+ "entry": "src/plugin/page.tsx",
5
+ "styles": ["@zlooks.cn/ui/antd.css"],
6
+ "routes": [
7
+ { "path": "/", "entry": "BlogHomePage" },
8
+ { "path": "/posts/[slug]", "entry": "BlogPostPage" },
9
+ { "path": "/archives", "entry": "BlogArchivePage" },
10
+ { "path": "/pages/[slug]", "entry": "BlogSinglePagePage" },
11
+ { "path": "/categories/[slug]", "entry": "BlogCategoryPage" },
12
+ { "path": "/tags/[slug]", "entry": "BlogTagPage" },
13
+ { "path": "/friends", "entry": "BlogFriendLinksPage" }
14
+ ],
15
+ "metadata": {
16
+ "displayName": __DISPLAY_NAME_JSON__,
17
+ "description": __DESCRIPTION_JSON__,
18
+ "navigation": [
19
+ { "id": "blog", "label": "博客", "path": "/", "order": 100 }
20
+ ]
21
+ }
22
+ }