@vmz/vmz 0.1.13 → 0.1.15

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 (56) hide show
  1. package/dist/author-input.d.ts +19 -0
  2. package/dist/author-input.js +52 -0
  3. package/dist/build-assemble.js +18 -7
  4. package/dist/cdn-policy.js +5 -4
  5. package/dist/cli.js +106 -38
  6. package/dist/content-addressed-assets.d.ts +23 -2
  7. package/dist/content-addressed-assets.js +178 -32
  8. package/dist/delivery-profile.d.ts +30 -2
  9. package/dist/delivery-profile.js +139 -5
  10. package/dist/dev-session.d.ts +1 -0
  11. package/dist/dev-session.js +269 -65
  12. package/dist/dev-watch-roots.d.ts +80 -0
  13. package/dist/dev-watch-roots.js +245 -0
  14. package/dist/document-build.d.ts +4 -3
  15. package/dist/document-build.js +104 -82
  16. package/dist/document-check.d.ts +24 -5
  17. package/dist/document-check.js +64 -101
  18. package/dist/document-cmd.js +2 -9
  19. package/dist/document-enrich.d.ts +2 -1
  20. package/dist/document-enrich.js +15 -4
  21. package/dist/document-integrate.js +29 -21
  22. package/dist/document-layout-render.d.ts +20 -0
  23. package/dist/document-layout-render.js +87 -0
  24. package/dist/document-routing-config.d.ts +17 -0
  25. package/dist/document-routing-config.js +31 -0
  26. package/dist/document-schema.js +8 -1
  27. package/dist/embedded-packaging.js +2 -1
  28. package/dist/index.d.ts +18 -2
  29. package/dist/index.js +63 -4
  30. package/dist/locale-check.js +81 -183
  31. package/dist/locale-cmd.js +13 -45
  32. package/dist/locale-route-emit.d.ts +4 -1
  33. package/dist/locale-route-emit.js +7 -32
  34. package/dist/locale-router.js +26 -8
  35. package/dist/native-addon.d.ts +9 -0
  36. package/dist/native-addon.js +84 -0
  37. package/dist/pack.js +3 -2
  38. package/dist/pretty-json.d.ts +19 -0
  39. package/dist/pretty-json.js +43 -0
  40. package/dist/production-observability.js +3 -2
  41. package/dist/production-test-pack.js +4 -3
  42. package/dist/public-static-assets.d.ts +24 -0
  43. package/dist/public-static-assets.js +140 -0
  44. package/dist/release-pack.js +5 -18
  45. package/dist/route-path.d.ts +35 -0
  46. package/dist/route-path.js +77 -0
  47. package/dist/server-artifact.js +4 -3
  48. package/dist/site-delivery.js +4 -3
  49. package/dist/site-favicon.d.ts +31 -0
  50. package/dist/site-favicon.js +140 -0
  51. package/dist/static-emit.d.ts +21 -0
  52. package/dist/static-emit.js +134 -97
  53. package/dist/test-cmd.js +2 -1
  54. package/dist/wechat-packaging.d.ts +22 -0
  55. package/dist/wechat-packaging.js +59 -0
  56. package/package.json +13 -14
package/dist/index.d.ts CHANGED
@@ -53,6 +53,14 @@ export declare function handshake(host?: {
53
53
  * @returns {string | null}
54
54
  */
55
55
  export declare function resolveCoreRuntimeDist(): string;
56
+ /** Runtime companions required by dist/vmz-serve-host.mjs relative imports. */
57
+ export declare const SERVE_HOST_RUNTIME_FILES: string[][];
58
+ /**
59
+ * Copy serve-host + registry bootstrap modules from `@vmz/core` into app outDir.
60
+ * @param {string} outDir
61
+ * @param {string} [coreDist]
62
+ */
63
+ export declare function materializeServeHostRuntime(outDir: any, coreDist?: string): void;
56
64
  /**
57
65
  * @typedef {object} WorkspaceOptions
58
66
  * @property {string} root
@@ -84,6 +92,7 @@ export declare function lowerMiniprogramBindingEventJson(rootPath: any): any;
84
92
  export declare function lowerMiniprogramStructureJson(rootPath: any): any;
85
93
  export declare function lowerMiniprogramRouteServerStyleJson(rootPath: any): any;
86
94
  export declare function lowerMiniprogramToolingDeployJson(rootPath: any): any;
95
+ export declare function lowerMiniprogramWechatPackagingJson(rootPath: any): any;
87
96
  export declare function lowerMiniprogramMultiAdapterJson(rootPath: any): any;
88
97
  import { createMiniHost } from './mini-host.js';
89
98
  export { createMiniHost };
@@ -146,6 +155,7 @@ export declare function checkApplicationHostCompositionJson(hostRoot: any, packa
146
155
  */
147
156
  export declare function checkApplicationDevTestDeployJson(hostRoot: any, packageRoots: any, dirtyPaths?: any[]): any;
148
157
  export { createDevSession, listWatchedFiles, srcFingerprint } from './dev-session.js';
158
+ export { coalesceRootBurst, collectDevWatchRoots, mergeDirtySets, localLinkDependencyRoots, watchRootForSourceFile, } from './dev-watch-roots.js';
149
159
  export { findAvailablePort } from './port.js';
150
160
  export { runCli, parseArgs, printHelp, printGlobalHelp, printProjectHelp } from './cli.js';
151
161
  export { findNearestProjectVmz, getInvocationContext, isGlobalAllowedCommand, isUnderNodeModules, resolveThisPackageRoot, resolveVmzBin, gateGlobalProjectCommand, } from './invocation.js';
@@ -156,12 +166,15 @@ export { cmdApplication, runCheck as runApplicationCheck } from './application-c
156
166
  export { cmdArtifact } from './release-cmd.js';
157
167
  export { ARTIFACT_DIFF_SCHEMA, DELIVERY_ARTIFACT_MANIFEST_SCHEMA, RELEASE_ENVELOPE_SCHEMA, ROUTE_REALIZATION_TABLE_SCHEMA, atomicWritePointer, canonicalJson, diffArtifacts, loadReleaseEnvelope, packRelease, publishRelease, readPointer, rollbackRelease, sha256File, sha256Hex, } from './release-pack.js';
158
168
  export { STATIC_DELIVERY_MANIFEST_SCHEMA, emitWebStatic, } from './static-emit.js';
159
- export { CONTENT_ADDRESSED_ASSETS_SCHEMA, emitContentAddressedAssets, resolveAssetByDigest, assertSharedAssetPath, contentAddressedAssetsDigest, } from './content-addressed-assets.js';
169
+ export { CONTENT_ADDRESSED_ASSETS_SCHEMA, emitContentAddressedAssets, resolveAssetByDigest, assertSharedAssetPath, contentAddressedAssetsDigest, rewriteCssImports, rewriteJsEntryRelativeImports, } from './content-addressed-assets.js';
170
+ export { SITE_FAVICON_SCHEMA, emitSiteFavicon, readSiteFaviconHeadHtml, packPngsIntoIco, } from './site-favicon.js';
171
+ export { PUBLIC_STATIC_ASSETS_SCHEMA, emitPublicStaticAssets, } from './public-static-assets.js';
160
172
  export { CDN_POLICY_MANIFEST_SCHEMA, CDN_ADAPTER_PROJECTION_SCHEMA, CACHE_HTML, CACHE_ASSET_IMMUTABLE, CACHE_META, buildCdnPolicyManifest, emitCdnPolicy, projectCdnAdapter, createLocalStaticHandler, listenLocalStaticHost, matchGlob, } from './cdn-policy.js';
161
173
  export { SITE_DELIVERY_CONTRACT_SCHEMA, SITE_DELIVERY_RESOLUTION_SCHEMA, defineSite, normalizeSiteDelivery, normalizeSourceProbe, resolveSiteRelease, probeReleaseDirectory, emitSiteDelivery, } from './site-delivery.js';
162
174
  export { EMBEDDED_RESOURCE_INDEX_SCHEMA, emitEmbeddedPackaging, } from './embedded-packaging.js';
163
175
  export { SERVER_LANG_IDS, SERVER_LANG_ALIASES, SERVER_LANGUAGE_BACKENDS, resolveServerLanguage, assertLangRuntimePair, } from './server-language-backend.js';
164
- export { DELIVERY_PROFILE_AUTHORING_SCHEMA, BUILD_PROFILE_SELECTION_SCHEMA, ASSEMBLIES, SERVER_RUNTIMES, BUILTIN_PROFILES, pickSiteAuthoring, normalizeDeliveryAuthoring, selectBuildProfile, semanticIdsForAssembly, } from './delivery-profile.js';
176
+ export { WECHAT_PACKAGING_SCHEMA, WECHAT_PACKAGING_REL, wechatPackagingFromDelivery, materializeWechatPackaging, } from './wechat-packaging.js';
177
+ export { DELIVERY_PROFILE_AUTHORING_SCHEMA, BUILD_PROFILE_SELECTION_SCHEMA, ASSEMBLIES, SERVER_RUNTIMES, BUILTIN_PROFILES, pickSiteAuthoring, pickDeliveryPackaging, normalizeProfileArtifactName, resolveProfileArtifactDir, normalizeDeliveryAuthoring, selectBuildProfile, semanticIdsForAssembly, } from './delivery-profile.js';
165
178
  export { PACK_MANIFEST_SCHEMA, packFromDeploymentIr, ensureRuntimeCompanions } from './pack.js';
166
179
  export { SERVER_ARTIFACT_SCHEMA, HTTP_CONTRACT_SCHEMA, SERVER_RUNTIME_ADAPTER_SCHEMA, emitServerArtifact, projectServerRuntimeAdapter, } from './server-artifact.js';
167
180
  export { BUILD_PROOF_SCHEMA, ASSEMBLE_MANIFEST_SCHEMA, assembleDelivery, emitBuildProof, } from './build-assemble.js';
@@ -231,6 +244,8 @@ declare const _default: {
231
244
  expectedProtocol: typeof expectedProtocol;
232
245
  resolveNativePath: typeof resolveNativePath;
233
246
  resolveCoreRuntimeDist: typeof resolveCoreRuntimeDist;
247
+ materializeServeHostRuntime: typeof materializeServeHostRuntime;
248
+ SERVE_HOST_RUNTIME_FILES: string[][];
234
249
  loadNative: typeof loadNative;
235
250
  getProtocolVersions: typeof getProtocolVersions;
236
251
  handshake: typeof handshake;
@@ -244,6 +259,7 @@ declare const _default: {
244
259
  lowerMiniprogramStructureJson: typeof lowerMiniprogramStructureJson;
245
260
  lowerMiniprogramRouteServerStyleJson: typeof lowerMiniprogramRouteServerStyleJson;
246
261
  lowerMiniprogramToolingDeployJson: typeof lowerMiniprogramToolingDeployJson;
262
+ lowerMiniprogramWechatPackagingJson: typeof lowerMiniprogramWechatPackagingJson;
247
263
  lowerMiniprogramMultiAdapterJson: typeof lowerMiniprogramMultiAdapterJson;
248
264
  createMiniHost: typeof createMiniHost;
249
265
  queryProfileProtocolCatalog: typeof queryProfileProtocolCatalog;
package/dist/index.js CHANGED
@@ -4,9 +4,10 @@
4
4
  * Coarse-grained only — no transform hooks / per-AST callbacks.
5
5
  */
6
6
  import { createRequire } from 'node:module';
7
- import { existsSync } from 'node:fs';
7
+ import { copyFileSync, existsSync } from 'node:fs';
8
8
  import path from 'node:path';
9
9
  import { fileURLToPath } from 'node:url';
10
+ import { materializeWechatPackaging } from './wechat-packaging.js';
10
11
  export { HOST_PROTOCOL, COMPILER_PROTOCOL, PROGRAM_IR_SCHEMA, PLAN_SCHEMA, PLUGIN_PROTOCOL, DX_PROTOCOL, DX_SYMBOL_SCHEMA, DX_REFERENCE_SCHEMA, DX_EXPLAIN_SCHEMA, DX_WORKSPACE_EDIT_SCHEMA, DX_CODE_ACTION_SCHEMA, DX_AFFECTED_SCHEMA, DX_RENAME_SCHEMA, DX_TEST_SELECTION_SCHEMA, DX_SOURCE_MAP_SCHEMA, DX_SYMBOL_INDEX_SCHEMA, DX_CROSS_SFC_CHECK_SCHEMA, DX_SEMANTIC_TRANSACTION_SCHEMA, DX_CANCEL_SCHEMA, DX_AFFECTED_PREVIEW_SCHEMA, DX_HMR_PLAN_SCHEMA, DX_BUDGET_SCHEMA, DX_TRANSACTION_CHECK_SCHEMA, DX_BOUNDARY_VALIDATOR_SCHEMA, DX_LEAKAGE_SCHEMA, DX_CAPABILITY_TARGET_SCHEMA, DX_DEAD_GRAPH_SCHEMA, DX_DEPLOYMENT_PROOF_CHECK_SCHEMA, DX_TRACE_SCHEMA, DX_CAUSAL_REPLAY_SCHEMA, DX_CAUSAL_REPLAY_CHECK_SCHEMA, APPLICATION_PROTOCOL, APPLICATION_DESCRIPTOR_SCHEMA, APPLICATIONS_CONFIG_SCHEMA, APPLICATION_CATALOG_SCHEMA, APPLICATION_CHECK_SCHEMA, APPLICATION_BASE_SCHEMA, APPLICATION_RELOCATION_SCHEMA, APPLICATION_RELOCATED_SCHEMA, APPLICATION_RELOCATABLE_CHECK_SCHEMA, APPLICATION_ARTIFACT_SCHEMA, APPLICATION_MOUNT_TABLE_SCHEMA, APPLICATION_ARTIFACT_BOUNDARY_SCHEMA, APPLICATION_ISOLATION_SCHEMA, APPLICATION_ISOLATION_CHECK_SCHEMA, APPLICATION_CROSS_LINK_SCHEMA, APPLICATION_HOST_COMPOSITION_SCHEMA, APPLICATION_DEV_SESSIONS_SCHEMA, APPLICATION_AFFECTED_SCHEMA, APPLICATION_PROXY_DISPATCH_SCHEMA, APPLICATION_MOUNTED_TEST_SCHEMA, APPLICATION_DEPLOY_ADAPTER_SCHEMA, APPLICATION_DEV_CHECK_SCHEMA, PROTOCOL_CATALOG_SCHEMA, TEST_PROTOCOL, TEST_MANIFEST_SCHEMA, TEST_REPORT_SCHEMA, protocolCatalog, dxCatalog, testCatalog, applicationCatalog, TARGET_PROTOCOL, TARGET_VIEW_OPS_SCHEMA, TARGET_PLATFORM_PROFILE_SCHEMA, TARGET_MINI_PROGRAM_ARTIFACT_SCHEMA, TARGET_CHECK_SCHEMA, TARGET_DIAG_DOM_LEAK_IN_PLAN, targetCatalog, PROFILE_PROTOCOL, PROFILE_HOST_SCHEMA, PROFILE_DELIVERY_SCHEMA, PROFILE_CHECK_SCHEMA, PROFILE_DIAG_HOST_PROFILE_INVALID, PROFILE_DIAG_RESOLUTION_DIGEST_MISMATCH, PROFILE_DIAG_CORE_ID_OVERRIDE, PROFILE_DIAG_HOST_PROFILE_REF_UNRESOLVED, PROFILE_SURFACE_KINDS, PROFILE_UNIFIED_LIFECYCLE_EVENTS, PROFILE_CORE_ID_PREFIX, PROFILE_SOLVER_CHECK_SCHEMA, PROFILE_HOST_RESOLUTION_MANIFEST_SCHEMA, PROFILE_EXECUTOR_CHECK_SCHEMA, PROFILE_EXECUTOR_SCENARIO_SCHEMA, PROFILE_DIAG_SURFACE_NO_MATCH, PROFILE_DIAG_SURFACE_AMBIGUOUS, PROFILE_DIAG_CAPABILITY_UNRESOLVED, PROFILE_DIAG_CAPABILITY_PERMISSION_UNDECLARED, PROFILE_DIAG_ROUTE_UNREALIZABLE, PROFILE_DIAG_STALE_GENERATION, PROFILE_DIAG_MISSING_ENVELOPE_IDS, PROFILE_DIAG_SURFACE_OWNS_STATE, PROFILE_DIAG_PRIVATE_OBJECT_CROSSING, PROFILE_DIAG_SPLIT_TRANSACTION, PROFILE_DIAG_DISPOSE_NOT_AUTHORITATIVE, PROFILE_DIAG_CANCEL_NOT_PROPAGATED, PROFILE_LIFECYCLE_MAPPING_ENTRY_SCHEMA, PROFILE_LIFECYCLE_MAPPING_TABLE_SCHEMA, PROFILE_RECOVERY_POLICY_SCHEMA, PROFILE_LIFECYCLE_SCENARIO_SCHEMA, PROFILE_LIFECYCLE_RECOVERY_CHECK_SCHEMA, PROFILE_LIFECYCLE_HOST_KINDS, PROFILE_PERSISTENCE_WINDOWS, PROFILE_DIAG_LIFECYCLE_UNPROVEN, PROFILE_DIAG_LIFECYCLE_MAPPING_INCOMPLETE, PROFILE_DIAG_RECOVERY_DUPLICATES_OWNER, PROFILE_DIAG_RECOVERY_ASSUMES_HEAP, PROFILE_DIAG_PERSISTENCE_WINDOW_INVALID, PROFILE_DELIVERY_PACKAGE_CONSTRAINTS_SCHEMA, PROFILE_DELIVERY_SECURITY_POLICY_SCHEMA, PROFILE_DELIVERY_UPDATE_POLICY_SCHEMA, PROFILE_DELIVERY_ARTIFACT_MANIFEST_SCHEMA, PROFILE_DELIVERY_PROOF_MANIFEST_SCHEMA, PROFILE_DELIVERY_PROOF_SCENARIO_SCHEMA, PROFILE_DELIVERY_PROOF_CHECK_SCHEMA, PROFILE_DELIVERY_UPDATE_CHANNELS, PROFILE_DELIVERY_ASSET_STRATEGIES, PROFILE_DIAG_DELIVERY_CONSTRAINT_EXCEEDED, PROFILE_DIAG_HOST_PLAN_VERSION_MISMATCH, PROFILE_DIAG_PROOF_MANIFEST_INCOMPLETE, PROFILE_DIAG_PROOF_COPIES_SEMANTIC_IR, PROFILE_DIAG_UPDATE_WITHOUT_REPROOF, PROFILE_DIAG_SECURITY_POLICY_INSECURE, PROFILE_CONFORMANCE_FIXTURE_SCHEMA, PROFILE_CONFORMANCE_STATE_SNAPSHOT_SCHEMA, PROFILE_CONFORMANCE_TRACE_SCHEMA, PROFILE_CONFORMANCE_HOST_RUN_SCHEMA, PROFILE_CONFORMANCE_SCENARIO_SCHEMA, PROFILE_CONFORMANCE_CHECK_SCHEMA, PROFILE_CONFORMANCE_SURFACE_ROLES, PROFILE_DIAG_STABLE_ID_DIVERGENCE, PROFILE_DIAG_STATE_RESULT_DIVERGENCE, PROFILE_DIAG_TRACE_INVARIANT_BROKEN, PROFILE_DIAG_CONFORMANCE_HOST_INCOMPLETE, PROFILE_DIAG_CONFORMANCE_SURFACE_ROLE_MISMATCH, profileCatalog, NATIVE_HOST_PROTOCOL, NATIVE_HOST_WEBVIEW_DEPLOYMENT_SCHEMA, NATIVE_HOST_CAPABILITY_SCHEMA, NATIVE_HOST_BRIDGE_SCHEMA, NATIVE_HOST_APPLICATION_IDENTITY_SCHEMA, NATIVE_HOST_CHECK_SCHEMA, NATIVE_HOST_DIAG_ARBITRARY_BRIDGE, NATIVE_HOST_SHELL_SCHEMA, NATIVE_HOST_SHELL_CHECK_SCHEMA, NATIVE_HOST_DEEP_LINK_SCHEMA, NATIVE_HOST_LOCAL_BUNDLE_SCHEMA, NATIVE_HOST_DIAG_MISSING_SHELL_HOOK, NATIVE_HOST_DIAG_PLATFORM_SEMANTIC_FORK, NATIVE_HOST_DIAG_REMOTE_ENTRY_DEFAULT, NATIVE_HOST_DIAG_MISSING_ENTRY_ARTIFACT, NATIVE_HOST_REQUIRED_SHELL_HOOKS, NATIVE_HOST_CAPABILITY_CALL_SCHEMA, NATIVE_HOST_BRIDGE_TRACE_SCHEMA, NATIVE_HOST_BRIDGE_STUB_CATALOG_SCHEMA, NATIVE_HOST_BRIDGE_CHECK_SCHEMA, NATIVE_HOST_DIAG_MISSING_NONCE, NATIVE_HOST_DIAG_CALL_NOT_ALLOWLISTED, NATIVE_HOST_FIRST_BATCH_STUB_IDS, NATIVE_HOST_LIFECYCLE_SCHEMA, NATIVE_HOST_LIFECYCLE_CHECK_SCHEMA, NATIVE_HOST_DIAG_BACKGROUND_IS_DESTROY, NATIVE_HOST_DIAG_CRASH_ASSUMES_JS_HEAP, NATIVE_HOST_DIAG_MISSING_LIFECYCLE_EVENT, NATIVE_HOST_REQUIRED_LIFECYCLE_EVENTS, NATIVE_HOST_FULLSTACK_SCHEMA, NATIVE_HOST_FULLSTACK_CHECK_SCHEMA, NATIVE_HOST_DIAG_BRIDGE_BYPASSES_SERVER, NATIVE_HOST_DIAG_REMOTE_WITHOUT_INTEGRITY, NATIVE_HOST_DIAG_MISSING_SERVER_TRANSPORT, NATIVE_HOST_NATIVE_SURFACE_SCHEMA, NATIVE_HOST_NATIVE_SURFACE_CHECK_SCHEMA, NATIVE_HOST_DIAG_SURFACE_IS_CAPABILITY, NATIVE_HOST_DIAG_IMPLICIT_STATE_SHARE, NATIVE_HOST_HIGH_VALUE_SURFACE_KINDS, NATIVE_HOST_MULTI_PLATFORM_SCHEMA, NATIVE_HOST_MULTI_PLATFORM_SHARED_SCHEMA, NATIVE_HOST_MULTI_PLATFORM_CHECK_SCHEMA, NATIVE_HOST_DIAG_MISSING_PLATFORM_ADAPTER, NATIVE_HOST_DIAG_PLATFORM_PRIVATE_SCHEMA, NATIVE_HOST_DIAG_ADAPTER_IS_SEMANTIC_CORE, NATIVE_HOST_REQUIRED_MULTI_PLATFORMS, NATIVE_HOST_MULTI_PLATFORM_ADAPTER_KIND, nativeHostCatalog, LOCALE_PROTOCOL, LOCALE_MANIFEST_SCHEMA, LOCALE_MESSAGE_CATALOG_SCHEMA, LOCALE_MESSAGE_NODE_SCHEMA, LOCALE_CHECK_SCHEMA, LOCALE_TYPED_MODULE_SCHEMA, LOCALE_RENAME_SCHEMA, LOCALE_APPLICATION_CONTEXT_SCHEMA, LOCALE_FORMATTER_CONTEXT_SCHEMA, LOCALE_TRANSITION_SCHEMA, LOCALE_RUNTIME_CHECK_SCHEMA, LOCALE_FALLBACK_RESOLUTION_SCHEMA, FORMATTER_DATA_VERSION, LOCALE_ROUTE_REALIZATION_SCHEMA, LOCALE_PAGE_META_SCHEMA, LOCALE_LINK_RESOLUTION_SCHEMA, LOCALE_ROUTER_CHECK_SCHEMA, LOCALE_DELIVERY_RESOLUTION_SCHEMA, LOCALE_CHUNK_MANIFEST_SCHEMA, LOCALE_NATIVE_PACK_SCHEMA, LOCALE_MINI_PACKAGE_PROOF_SCHEMA, LOCALE_SERVER_ERROR_ENVELOPE_SCHEMA, LOCALE_DELIVERY_CHECK_SCHEMA, LOCALE_EXPLAIN_SCHEMA, LOCALE_DIFF_SCHEMA, LOCALE_EXTRACT_SCHEMA, LOCALE_PSEUDO_SCHEMA, LOCALE_CONFORMANCE_SCHEMA, LOCALE_DIAG_MANIFEST_MISSING, LOCALE_DIAG_ID_INVALID, LOCALE_DIAG_FALLBACK_CYCLE, LOCALE_DIAG_MESSAGE_PARAMETER_MISMATCH, LOCALE_DIAG_MESSAGE_UNUSED, LOCALE_DIAG_FORMATTER_CONTEXT_INCOMPLETE, LOCALE_DIAG_FORMATTER_VERSION_MISMATCH, LOCALE_DIAG_DIGEST_MISMATCH, LOCALE_DIAG_TRANSITION_PARTIAL, LOCALE_DIAG_TRANSITION_UNSUPPORTED, LOCALE_DIAG_TRANSITION_LOAD_FAILED, LOCALE_DIAG_MACHINE_DEFAULT_FORBIDDEN, LOCALE_DIAG_MESSAGE_MIXED_LOCALE, LOCALE_DIAG_STALE_GENERATION, LOCALE_DIAG_ROUTE_COLLISION, LOCALE_DIAG_CANONICAL_MISSING, LOCALE_DIAG_HREFLANG_INCOMPLETE, LOCALE_DIAG_META_LOCALE_MISMATCH, LOCALE_DIAG_LINK_HARDCODED_PATH, LOCALE_DIAG_CACHE_KEY_STEALS_CONTENT, LOCALE_DIAG_PREFIX_OMIT_WITHOUT_REDIRECT, LOCALE_DIAG_DELIVERY_FULL_BUNDLE, LOCALE_DIAG_CHUNK_HASH_MISMATCH, LOCALE_DIAG_NATIVE_PACK_UNSIGNED, LOCALE_DIAG_NATIVE_PACK_HAS_JS, LOCALE_DIAG_NATIVE_PACK_APP_MISMATCH, LOCALE_DIAG_MINI_CROSS_PACKAGE_UNPROVEN, LOCALE_DIAG_SERVER_TRANSLATED_ERROR, LOCALE_DIAG_SERVER_FORMAT_WITHOUT_CONTEXT, LOCALE_DIAG_HOST_MESSAGE_DIVERGENCE, LOCALE_DIAG_MESSAGE_DYNAMIC_ID_UNBOUNDED, LOCALE_DIAG_HARDCODED_TEXT, LOCALE_DIAG_PSEUDO_PRODUCTION_FORBIDDEN, LOCALE_DIAG_CONFORMANCE_DIVERGENCE, LOCALE_DIAG_EXPLAIN_UNKNOWN, LOCALE_VIRTUAL_MODULE_PREFIX, localeCatalog, } from '@vmz/protocol';
11
12
  import { HOST_PROTOCOL, COMPILER_PROTOCOL, PROGRAM_IR_SCHEMA, PLUGIN_PROTOCOL, DX_PROTOCOL, DX_SYMBOL_SCHEMA, DX_REFERENCE_SCHEMA, DX_EXPLAIN_SCHEMA, DX_WORKSPACE_EDIT_SCHEMA, DX_CODE_ACTION_SCHEMA, DX_AFFECTED_SCHEMA, DX_RENAME_SCHEMA, DX_TEST_SELECTION_SCHEMA, DX_SOURCE_MAP_SCHEMA, DX_SYMBOL_INDEX_SCHEMA, DX_CROSS_SFC_CHECK_SCHEMA, DX_SEMANTIC_TRANSACTION_SCHEMA, DX_CANCEL_SCHEMA, DX_AFFECTED_PREVIEW_SCHEMA, DX_HMR_PLAN_SCHEMA, DX_BUDGET_SCHEMA, DX_TRANSACTION_CHECK_SCHEMA, DX_BOUNDARY_VALIDATOR_SCHEMA, DX_LEAKAGE_SCHEMA, DX_CAPABILITY_TARGET_SCHEMA, DX_DEAD_GRAPH_SCHEMA, DX_DEPLOYMENT_PROOF_CHECK_SCHEMA, DX_TRACE_SCHEMA, DX_CAUSAL_REPLAY_SCHEMA, DX_CAUSAL_REPLAY_CHECK_SCHEMA, APPLICATION_PROTOCOL, APPLICATION_DESCRIPTOR_SCHEMA, APPLICATIONS_CONFIG_SCHEMA, APPLICATION_CATALOG_SCHEMA, APPLICATION_CHECK_SCHEMA, APPLICATION_BASE_SCHEMA, APPLICATION_RELOCATION_SCHEMA, APPLICATION_RELOCATED_SCHEMA, APPLICATION_RELOCATABLE_CHECK_SCHEMA, APPLICATION_ARTIFACT_SCHEMA, APPLICATION_MOUNT_TABLE_SCHEMA, APPLICATION_ARTIFACT_BOUNDARY_SCHEMA, APPLICATION_ISOLATION_SCHEMA, APPLICATION_ISOLATION_CHECK_SCHEMA, APPLICATION_CROSS_LINK_SCHEMA, APPLICATION_HOST_COMPOSITION_SCHEMA, APPLICATION_DEV_SESSIONS_SCHEMA, APPLICATION_AFFECTED_SCHEMA, APPLICATION_PROXY_DISPATCH_SCHEMA, APPLICATION_MOUNTED_TEST_SCHEMA, APPLICATION_DEPLOY_ADAPTER_SCHEMA, APPLICATION_DEV_CHECK_SCHEMA, PROTOCOL_CATALOG_SCHEMA, TARGET_PROTOCOL, TARGET_VIEW_OPS_SCHEMA, TARGET_PLATFORM_PROFILE_SCHEMA, TARGET_MINI_PROGRAM_ARTIFACT_SCHEMA, TARGET_CHECK_SCHEMA, targetCatalog, PROFILE_PROTOCOL, PROFILE_HOST_SCHEMA, PROFILE_DELIVERY_SCHEMA, PROFILE_CHECK_SCHEMA, PROFILE_DIAG_HOST_PROFILE_INVALID, PROFILE_DIAG_RESOLUTION_DIGEST_MISMATCH, PROFILE_DIAG_CORE_ID_OVERRIDE, PROFILE_DIAG_HOST_PROFILE_REF_UNRESOLVED, PROFILE_SURFACE_KINDS, PROFILE_UNIFIED_LIFECYCLE_EVENTS, PROFILE_CORE_ID_PREFIX, PROFILE_SOLVER_CHECK_SCHEMA, PROFILE_HOST_RESOLUTION_MANIFEST_SCHEMA, PROFILE_EXECUTOR_CHECK_SCHEMA, PROFILE_EXECUTOR_SCENARIO_SCHEMA, PROFILE_DIAG_SURFACE_NO_MATCH, PROFILE_DIAG_SURFACE_AMBIGUOUS, PROFILE_DIAG_CAPABILITY_UNRESOLVED, PROFILE_DIAG_CAPABILITY_PERMISSION_UNDECLARED, PROFILE_DIAG_ROUTE_UNREALIZABLE, PROFILE_DIAG_STALE_GENERATION, PROFILE_DIAG_MISSING_ENVELOPE_IDS, PROFILE_DIAG_SURFACE_OWNS_STATE, PROFILE_DIAG_PRIVATE_OBJECT_CROSSING, PROFILE_DIAG_SPLIT_TRANSACTION, PROFILE_DIAG_DISPOSE_NOT_AUTHORITATIVE, PROFILE_DIAG_CANCEL_NOT_PROPAGATED, PROFILE_LIFECYCLE_SCENARIO_SCHEMA, PROFILE_LIFECYCLE_RECOVERY_CHECK_SCHEMA, PROFILE_LIFECYCLE_HOST_KINDS, PROFILE_PERSISTENCE_WINDOWS, PROFILE_DIAG_LIFECYCLE_UNPROVEN, PROFILE_DIAG_LIFECYCLE_MAPPING_INCOMPLETE, PROFILE_DIAG_RECOVERY_DUPLICATES_OWNER, PROFILE_DIAG_RECOVERY_ASSUMES_HEAP, PROFILE_DIAG_PERSISTENCE_WINDOW_INVALID, PROFILE_DELIVERY_PACKAGE_CONSTRAINTS_SCHEMA, PROFILE_DELIVERY_SECURITY_POLICY_SCHEMA, PROFILE_DELIVERY_UPDATE_POLICY_SCHEMA, PROFILE_DELIVERY_ARTIFACT_MANIFEST_SCHEMA, PROFILE_DELIVERY_PROOF_MANIFEST_SCHEMA, PROFILE_DELIVERY_PROOF_SCENARIO_SCHEMA, PROFILE_DELIVERY_PROOF_CHECK_SCHEMA, PROFILE_DELIVERY_UPDATE_CHANNELS, PROFILE_DELIVERY_ASSET_STRATEGIES, PROFILE_DIAG_DELIVERY_CONSTRAINT_EXCEEDED, PROFILE_DIAG_HOST_PLAN_VERSION_MISMATCH, PROFILE_DIAG_PROOF_MANIFEST_INCOMPLETE, PROFILE_DIAG_PROOF_COPIES_SEMANTIC_IR, PROFILE_DIAG_UPDATE_WITHOUT_REPROOF, PROFILE_DIAG_SECURITY_POLICY_INSECURE, PROFILE_CONFORMANCE_FIXTURE_SCHEMA, PROFILE_CONFORMANCE_STATE_SNAPSHOT_SCHEMA, PROFILE_CONFORMANCE_TRACE_SCHEMA, PROFILE_CONFORMANCE_HOST_RUN_SCHEMA, PROFILE_CONFORMANCE_SCENARIO_SCHEMA, PROFILE_CONFORMANCE_CHECK_SCHEMA, PROFILE_CONFORMANCE_SURFACE_ROLES, PROFILE_DIAG_STABLE_ID_DIVERGENCE, PROFILE_DIAG_STATE_RESULT_DIVERGENCE, PROFILE_DIAG_TRACE_INVARIANT_BROKEN, PROFILE_DIAG_CONFORMANCE_HOST_INCOMPLETE, PROFILE_DIAG_CONFORMANCE_SURFACE_ROLE_MISMATCH, profileCatalog, NATIVE_HOST_PROTOCOL, NATIVE_HOST_WEBVIEW_DEPLOYMENT_SCHEMA, NATIVE_HOST_CAPABILITY_SCHEMA, NATIVE_HOST_BRIDGE_SCHEMA, NATIVE_HOST_APPLICATION_IDENTITY_SCHEMA, NATIVE_HOST_CHECK_SCHEMA, NATIVE_HOST_DIAG_ARBITRARY_BRIDGE, NATIVE_HOST_SHELL_SCHEMA, NATIVE_HOST_SHELL_CHECK_SCHEMA, NATIVE_HOST_DEEP_LINK_SCHEMA, NATIVE_HOST_LOCAL_BUNDLE_SCHEMA, NATIVE_HOST_DIAG_MISSING_SHELL_HOOK, NATIVE_HOST_DIAG_PLATFORM_SEMANTIC_FORK, NATIVE_HOST_DIAG_REMOTE_ENTRY_DEFAULT, NATIVE_HOST_DIAG_MISSING_ENTRY_ARTIFACT, NATIVE_HOST_REQUIRED_SHELL_HOOKS, NATIVE_HOST_CAPABILITY_CALL_SCHEMA, NATIVE_HOST_BRIDGE_TRACE_SCHEMA, NATIVE_HOST_BRIDGE_STUB_CATALOG_SCHEMA, NATIVE_HOST_BRIDGE_CHECK_SCHEMA, NATIVE_HOST_DIAG_MISSING_NONCE, NATIVE_HOST_DIAG_CALL_NOT_ALLOWLISTED, NATIVE_HOST_FIRST_BATCH_STUB_IDS, NATIVE_HOST_LIFECYCLE_SCHEMA, NATIVE_HOST_LIFECYCLE_CHECK_SCHEMA, NATIVE_HOST_DIAG_BACKGROUND_IS_DESTROY, NATIVE_HOST_DIAG_CRASH_ASSUMES_JS_HEAP, NATIVE_HOST_DIAG_MISSING_LIFECYCLE_EVENT, NATIVE_HOST_REQUIRED_LIFECYCLE_EVENTS, NATIVE_HOST_FULLSTACK_SCHEMA, NATIVE_HOST_FULLSTACK_CHECK_SCHEMA, NATIVE_HOST_DIAG_BRIDGE_BYPASSES_SERVER, NATIVE_HOST_DIAG_REMOTE_WITHOUT_INTEGRITY, NATIVE_HOST_DIAG_MISSING_SERVER_TRANSPORT, NATIVE_HOST_NATIVE_SURFACE_SCHEMA, NATIVE_HOST_NATIVE_SURFACE_CHECK_SCHEMA, NATIVE_HOST_DIAG_SURFACE_IS_CAPABILITY, NATIVE_HOST_DIAG_IMPLICIT_STATE_SHARE, NATIVE_HOST_HIGH_VALUE_SURFACE_KINDS, NATIVE_HOST_MULTI_PLATFORM_SCHEMA, NATIVE_HOST_MULTI_PLATFORM_SHARED_SCHEMA, NATIVE_HOST_MULTI_PLATFORM_CHECK_SCHEMA, NATIVE_HOST_DIAG_MISSING_PLATFORM_ADAPTER, NATIVE_HOST_DIAG_PLATFORM_PRIVATE_SCHEMA, NATIVE_HOST_DIAG_ADAPTER_IS_SEMANTIC_CORE, NATIVE_HOST_REQUIRED_MULTI_PLATFORMS, NATIVE_HOST_MULTI_PLATFORM_ADAPTER_KIND, nativeHostCatalog, localeCatalog, } from '@vmz/protocol';
12
13
  const require = createRequire(import.meta.url);
@@ -143,6 +144,33 @@ export function resolveCoreRuntimeDist() {
143
144
  return nested;
144
145
  return null;
145
146
  }
147
+ /** Runtime companions required by dist/vmz-serve-host.mjs relative imports. */
148
+ export const SERVE_HOST_RUNTIME_FILES = [
149
+ ['serve-host.mjs', 'vmz-serve-host.mjs'],
150
+ ['native-addon.js', 'native-addon.js'],
151
+ ['list-client-components.js', 'list-client-components.js'],
152
+ ['deployment-registry.js', 'deployment-registry.js'],
153
+ ['render-host.js', 'render-host.js'],
154
+ ['route-layout-chain.js', 'route-layout-chain.js'],
155
+ ];
156
+ /**
157
+ * Copy serve-host + registry bootstrap modules from `@vmz/core` into app outDir.
158
+ * @param {string} outDir
159
+ * @param {string} [coreDist]
160
+ */
161
+ export function materializeServeHostRuntime(outDir, coreDist = resolveCoreRuntimeDist()) {
162
+ if (!coreDist) {
163
+ throw new Error('materializeServeHostRuntime: @vmz/core dist not found');
164
+ }
165
+ for (const [srcName, outName] of SERVE_HOST_RUNTIME_FILES) {
166
+ const src = path.join(coreDist, srcName);
167
+ const dst = path.join(outDir, outName);
168
+ if (!existsSync(src)) {
169
+ throw new Error(`materializeServeHostRuntime: missing ${src}`);
170
+ }
171
+ copyFileSync(src, dst);
172
+ }
173
+ }
146
174
  /**
147
175
  * @typedef {object} WorkspaceOptions
148
176
  * @property {string} root
@@ -158,7 +186,7 @@ export function createWorkspace(options) {
158
186
  const native = loadNative();
159
187
  const protocol = options.protocol ?? expectedProtocol();
160
188
  const runtimeDist = options.runtimeDist ?? resolveCoreRuntimeDist() ?? undefined;
161
- return native.JsWorkspace.create({
189
+ const ws = native.JsWorkspace.create({
162
190
  root: options.root,
163
191
  outDir: options.outDir,
164
192
  runtimeDist,
@@ -169,6 +197,25 @@ export function createWorkspace(options) {
169
197
  pluginProtocol: protocol.pluginProtocol,
170
198
  },
171
199
  });
200
+ const pack = ws.lowerMiniprogramWechatPackaging.bind(ws);
201
+ const wrappedPack = () => {
202
+ materializeWechatPackaging(options.root);
203
+ return pack();
204
+ };
205
+ try {
206
+ ws.lowerMiniprogramWechatPackaging = wrappedPack;
207
+ return ws;
208
+ }
209
+ catch {
210
+ return new Proxy(ws, {
211
+ get(target, prop, receiver) {
212
+ if (prop === 'lowerMiniprogramWechatPackaging')
213
+ return wrappedPack;
214
+ const value = Reflect.get(target, prop, receiver);
215
+ return typeof value === 'function' ? value.bind(target) : value;
216
+ },
217
+ });
218
+ }
172
219
  }
173
220
  /**
174
221
  * frozen application composition protocol catalog.
@@ -216,6 +263,11 @@ export function lowerMiniprogramToolingDeployJson(rootPath) {
216
263
  const native = loadNative();
217
264
  return native.lowerMiniprogramToolingDeployJson(rootPath);
218
265
  }
266
+ export function lowerMiniprogramWechatPackagingJson(rootPath) {
267
+ const native = loadNative();
268
+ materializeWechatPackaging(rootPath);
269
+ return native.lowerMiniprogramWechatPackagingJson(rootPath);
270
+ }
219
271
  export function lowerMiniprogramMultiAdapterJson(rootPath) {
220
272
  const native = loadNative();
221
273
  return native.lowerMiniprogramMultiAdapterJson(rootPath);
@@ -344,6 +396,7 @@ export function checkApplicationDevTestDeployJson(hostRoot, packageRoots, dirtyP
344
396
  return native.checkApplicationDevTestDeployJson(hostRoot, packageRoots, dirtyPaths);
345
397
  }
346
398
  export { createDevSession, listWatchedFiles, srcFingerprint } from './dev-session.js';
399
+ export { coalesceRootBurst, collectDevWatchRoots, mergeDirtySets, localLinkDependencyRoots, watchRootForSourceFile, } from './dev-watch-roots.js';
347
400
  export { findAvailablePort } from './port.js';
348
401
  export { runCli, parseArgs, printHelp, printGlobalHelp, printProjectHelp } from './cli.js';
349
402
  export { findNearestProjectVmz, getInvocationContext, isGlobalAllowedCommand, isUnderNodeModules, resolveThisPackageRoot, resolveVmzBin, gateGlobalProjectCommand, } from './invocation.js';
@@ -356,12 +409,15 @@ export { ARTIFACT_DIFF_SCHEMA, DELIVERY_ARTIFACT_MANIFEST_SCHEMA, RELEASE_ENVELO
356
409
  // APPLICATION_ARTIFACT_SCHEMA lives in @vmz/protocol (already re-exported above);
357
410
  // release-pack keeps a local constant for envelope writes — do not dual-export the name.
358
411
  export { STATIC_DELIVERY_MANIFEST_SCHEMA, emitWebStatic, } from './static-emit.js';
359
- export { CONTENT_ADDRESSED_ASSETS_SCHEMA, emitContentAddressedAssets, resolveAssetByDigest, assertSharedAssetPath, contentAddressedAssetsDigest, } from './content-addressed-assets.js';
412
+ export { CONTENT_ADDRESSED_ASSETS_SCHEMA, emitContentAddressedAssets, resolveAssetByDigest, assertSharedAssetPath, contentAddressedAssetsDigest, rewriteCssImports, rewriteJsEntryRelativeImports, } from './content-addressed-assets.js';
413
+ export { SITE_FAVICON_SCHEMA, emitSiteFavicon, readSiteFaviconHeadHtml, packPngsIntoIco, } from './site-favicon.js';
414
+ export { PUBLIC_STATIC_ASSETS_SCHEMA, emitPublicStaticAssets, } from './public-static-assets.js';
360
415
  export { CDN_POLICY_MANIFEST_SCHEMA, CDN_ADAPTER_PROJECTION_SCHEMA, CACHE_HTML, CACHE_ASSET_IMMUTABLE, CACHE_META, buildCdnPolicyManifest, emitCdnPolicy, projectCdnAdapter, createLocalStaticHandler, listenLocalStaticHost, matchGlob, } from './cdn-policy.js';
361
416
  export { SITE_DELIVERY_CONTRACT_SCHEMA, SITE_DELIVERY_RESOLUTION_SCHEMA, defineSite, normalizeSiteDelivery, normalizeSourceProbe, resolveSiteRelease, probeReleaseDirectory, emitSiteDelivery, } from './site-delivery.js';
362
417
  export { EMBEDDED_RESOURCE_INDEX_SCHEMA, emitEmbeddedPackaging, } from './embedded-packaging.js';
363
418
  export { SERVER_LANG_IDS, SERVER_LANG_ALIASES, SERVER_LANGUAGE_BACKENDS, resolveServerLanguage, assertLangRuntimePair, } from './server-language-backend.js';
364
- export { DELIVERY_PROFILE_AUTHORING_SCHEMA, BUILD_PROFILE_SELECTION_SCHEMA, ASSEMBLIES, SERVER_RUNTIMES, BUILTIN_PROFILES, pickSiteAuthoring, normalizeDeliveryAuthoring, selectBuildProfile, semanticIdsForAssembly, } from './delivery-profile.js';
419
+ export { WECHAT_PACKAGING_SCHEMA, WECHAT_PACKAGING_REL, wechatPackagingFromDelivery, materializeWechatPackaging, } from './wechat-packaging.js';
420
+ export { DELIVERY_PROFILE_AUTHORING_SCHEMA, BUILD_PROFILE_SELECTION_SCHEMA, ASSEMBLIES, SERVER_RUNTIMES, BUILTIN_PROFILES, pickSiteAuthoring, pickDeliveryPackaging, normalizeProfileArtifactName, resolveProfileArtifactDir, normalizeDeliveryAuthoring, selectBuildProfile, semanticIdsForAssembly, } from './delivery-profile.js';
365
421
  export { PACK_MANIFEST_SCHEMA, packFromDeploymentIr, ensureRuntimeCompanions } from './pack.js';
366
422
  export { SERVER_ARTIFACT_SCHEMA, HTTP_CONTRACT_SCHEMA, SERVER_RUNTIME_ADAPTER_SCHEMA, emitServerArtifact, projectServerRuntimeAdapter, } from './server-artifact.js';
367
423
  export { BUILD_PROOF_SCHEMA, ASSEMBLE_MANIFEST_SCHEMA, assembleDelivery, emitBuildProof, } from './build-assemble.js';
@@ -431,6 +487,8 @@ export default {
431
487
  expectedProtocol,
432
488
  resolveNativePath,
433
489
  resolveCoreRuntimeDist,
490
+ materializeServeHostRuntime,
491
+ SERVE_HOST_RUNTIME_FILES,
434
492
  loadNative,
435
493
  getProtocolVersions,
436
494
  handshake,
@@ -444,6 +502,7 @@ export default {
444
502
  lowerMiniprogramStructureJson,
445
503
  lowerMiniprogramRouteServerStyleJson,
446
504
  lowerMiniprogramToolingDeployJson,
505
+ lowerMiniprogramWechatPackagingJson,
447
506
  lowerMiniprogramMultiAdapterJson,
448
507
  createMiniHost,
449
508
  queryProfileProtocolCatalog,
@@ -6,8 +6,10 @@
6
6
  */
7
7
  import fs from 'node:fs';
8
8
  import path from 'node:path';
9
- import JSON5 from 'json5';
10
- import { DIAG_CATALOG_CONFLICT, DIAG_CATALOG_PARSE, DIAG_DEFAULT_MISSING, DIAG_DIR_MISSING, DIAG_DIR_ORPHAN, DIAG_FALLBACK_CYCLE, DIAG_FALLBACK_UNKNOWN, DIAG_ID_COLLISION, DIAG_ID_INVALID, DIAG_LAYOUT_ILLEGAL, DIAG_MANIFEST_MISSING, DIAG_MESSAGE_ARRAY_FORBIDDEN, DIAG_MESSAGE_HTML_FORBIDDEN, DIAG_MESSAGE_MISSING_DEFAULT, DIAG_MESSAGE_PARAMETER_MISMATCH, DIAG_MESSAGE_SYNTAX_INVALID, DIAG_MESSAGE_UNUSED, LOCALE_CHECK_SCHEMA, LOCALE_ID_RE, LOCALE_MANIFEST_SCHEMA, LOCALE_RESERVED_TOP, LOCALE_TYPED_MODULE_SCHEMA, LOCALE_VIRTUAL_MODULE_PREFIX, MESSAGE_CATALOG_SCHEMA, MESSAGE_NODE_SCHEMA, } from './locale-schema.js';
9
+ import { loadLocalePlan, mapPlanDiagnostics, parseAuthorInput } from './author-input.js';
10
+ import { DIAG_CATALOG_CONFLICT, DIAG_CATALOG_PARSE, DIAG_DIR_MISSING, DIAG_DIR_ORPHAN, DIAG_ID_INVALID, DIAG_LAYOUT_ILLEGAL, DIAG_MANIFEST_MISSING, DIAG_MESSAGE_ARRAY_FORBIDDEN, DIAG_MESSAGE_HTML_FORBIDDEN, DIAG_MESSAGE_MISSING_DEFAULT, DIAG_MESSAGE_MISSING_VARIANT, DIAG_MESSAGE_PARAMETER_MISMATCH, DIAG_MESSAGE_SYNTAX_INVALID, DIAG_MESSAGE_UNUSED, LOCALE_CHECK_SCHEMA, LOCALE_ID_RE, LOCALE_MANIFEST_SCHEMA, LOCALE_RESERVED_TOP, LOCALE_TYPED_MODULE_SCHEMA, LOCALE_VIRTUAL_MODULE_PREFIX, MESSAGE_CATALOG_SCHEMA, MESSAGE_NODE_SCHEMA, } from './locale-schema.js';
11
+ import { requireNativeAddon } from './native-addon.js';
12
+ import { writePrettyJsonFile } from './pretty-json.js';
11
13
  /**
12
14
  * @param {string} literal
13
15
  */
@@ -246,124 +248,57 @@ export function checkLocales(opts) {
246
248
  const localesRoot = path.join(projectRoot, 'locales');
247
249
  /** @type {Array<{ code: string, severity: string, message: string, path?: string }>} */
248
250
  const diagnostics = [];
249
- const manifestPathJson5 = path.join(localesRoot, 'locales.json5');
250
- const manifestPathJson = path.join(localesRoot, 'locales.json');
251
- const manifestPath = fs.existsSync(manifestPathJson5) ? manifestPathJson5 : fs.existsSync(manifestPathJson) ? manifestPathJson : null;
252
- if (!fs.existsSync(localesRoot) || !manifestPath) {
253
- // Discipline nudge: i18n is first-class — missing policy is never silent.
254
- // Soft for now (warning); production profiles may elevate to error later.
255
- diagnostics.push({
256
- code: DIAG_MANIFEST_MISSING,
257
- severity: 'warning',
258
- message: 'locales/locales.json5 missing — declare LocaleId policy under /locales (native i18n, not an afterthought)',
259
- path: 'locales/locales.json5',
260
- });
261
- return emptyReport(projectRoot, diagnostics);
262
- }
263
- /** @type {any} */
264
- let rawManifest = null;
265
- try {
266
- rawManifest = JSON5.parse(fs.readFileSync(manifestPath, 'utf8'));
267
- }
268
- catch (e) {
269
- diagnostics.push({
270
- code: DIAG_CATALOG_PARSE,
271
- severity: 'error',
272
- message: `locales.json5 parse failed: ${e.message || e}`,
273
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
274
- });
251
+ const plan = loadLocalePlan(projectRoot);
252
+ diagnostics.push(...mapPlanDiagnostics(plan.diagnostics));
253
+ const missingManifest = (plan.diagnostics || []).some((d) => d.code === DIAG_MANIFEST_MISSING);
254
+ if (missingManifest || !plan.locales?.length) {
275
255
  return emptyReport(projectRoot, diagnostics);
276
256
  }
277
- const localeEntries = Array.isArray(rawManifest.locales) ? rawManifest.locales : [];
257
+ const localeEntries = plan.locales || [];
278
258
  /** @type {string[]} */
279
- const orderedIds = [];
259
+ const orderedIds = localeEntries.map((e) => e.id);
280
260
  /** @type {Set<string>} */
281
- const seen = new Set();
282
- for (const entry of localeEntries) {
283
- const id = String(entry?.id || '');
284
- const v = validateLocaleId(id);
285
- if (!v.ok) {
286
- diagnostics.push({
287
- code: DIAG_ID_INVALID,
288
- severity: 'error',
289
- message: v.message,
290
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
291
- });
292
- continue;
293
- }
294
- if (seen.has(id)) {
295
- diagnostics.push({
296
- code: DIAG_ID_COLLISION,
297
- severity: 'error',
298
- message: `duplicate LocaleId ${id} in locales[]`,
299
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
300
- });
301
- continue;
302
- }
303
- seen.add(id);
304
- orderedIds.push(id);
305
- }
306
- const defaultLocale = String(rawManifest.defaultLocale || '');
307
- if (!defaultLocale || !seen.has(defaultLocale)) {
308
- diagnostics.push({
309
- code: DIAG_DEFAULT_MISSING,
310
- severity: 'error',
311
- message: `defaultLocale ${JSON.stringify(defaultLocale)} missing from locales[]`,
312
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
313
- });
314
- }
315
- const fallback = rawManifest.fallback && typeof rawManifest.fallback === 'object' ? rawManifest.fallback : {};
316
- const fb = findFallbackCycles(fallback, seen);
317
- for (const u of fb.unknown) {
318
- diagnostics.push({
319
- code: DIAG_FALLBACK_UNKNOWN,
320
- severity: 'error',
321
- message: `fallback references unknown LocaleId: ${u}`,
322
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
323
- });
324
- }
325
- for (const c of fb.cycles) {
326
- diagnostics.push({
327
- code: DIAG_FALLBACK_CYCLE,
328
- severity: 'error',
329
- message: `fallback cycle: ${c}`,
330
- path: path.relative(projectRoot, manifestPath).replace(/\\/g, '/'),
331
- });
332
- }
261
+ const seen = new Set(orderedIds);
262
+ const defaultLocale = String(plan.defaultLocale || '');
263
+ const fallback = plan.fallback && typeof plan.fallback === 'object' ? plan.fallback : {};
264
+ const missingPolicy = plan.missing || 'error';
265
+ const routing = plan.routing || { strategy: 'prefix', defaultPrefix: 'include' };
333
266
  /** @type {string[]} */
334
267
  const diskLocales = [];
335
- for (const ent of fs.readdirSync(localesRoot, { withFileTypes: true })) {
336
- if (LOCALE_RESERVED_TOP.has(ent.name))
337
- continue;
338
- if (ent.isFile()) {
339
- diagnostics.push({
340
- code: DIAG_LAYOUT_ILLEGAL,
341
- severity: 'error',
342
- message: `illegal top-level file under /locales: ${ent.name} (only locales.json5 + LocaleId dirs)`,
343
- path: `locales/${ent.name}`,
344
- });
345
- continue;
346
- }
347
- if (!ent.isDirectory())
348
- continue;
349
- const v = validateLocaleId(ent.name);
350
- if (!v.ok) {
351
- diagnostics.push({
352
- code: DIAG_ID_INVALID,
353
- severity: 'error',
354
- message: `directory ${ent.name}: ${v.message}`,
355
- path: `locales/${ent.name}`,
356
- });
357
- continue;
358
- }
359
- diskLocales.push(ent.name);
360
- if (!seen.has(ent.name)) {
361
- diagnostics.push({
362
- code: DIAG_DIR_ORPHAN,
363
- severity: 'error',
364
- message: `locale directory ${ent.name} not listed in locales.json5 locales[]`,
365
- path: `locales/${ent.name}`,
366
- });
268
+ if (fs.existsSync(localesRoot)) {
269
+ for (const ent of fs.readdirSync(localesRoot, { withFileTypes: true })) {
270
+ if (LOCALE_RESERVED_TOP.has(ent.name))
271
+ continue;
272
+ if (ent.isFile()) {
273
+ diagnostics.push({
274
+ code: DIAG_LAYOUT_ILLEGAL,
275
+ severity: 'error',
276
+ message: `illegal top-level file under /locales: ${ent.name} (only locales.json5 + LocaleId dirs)`,
277
+ path: `locales/${ent.name}`,
278
+ });
279
+ continue;
280
+ }
281
+ if (!ent.isDirectory())
282
+ continue;
283
+ const v = validateLocaleId(ent.name);
284
+ if (!v.ok) {
285
+ diagnostics.push({
286
+ code: DIAG_ID_INVALID,
287
+ severity: 'error',
288
+ message: `directory ${ent.name}: ${v.message}`,
289
+ path: `locales/${ent.name}`,
290
+ });
291
+ continue;
292
+ }
293
+ diskLocales.push(ent.name);
294
+ if (!seen.has(ent.name)) {
295
+ diagnostics.push({
296
+ code: DIAG_DIR_ORPHAN,
297
+ severity: 'error',
298
+ message: `locale directory ${ent.name} not listed in locales.json5 locales[]`,
299
+ path: `locales/${ent.name}`,
300
+ });
301
+ }
367
302
  }
368
303
  }
369
304
  for (const id of orderedIds) {
@@ -402,7 +337,7 @@ export function checkLocales(opts) {
402
337
  });
403
338
  return;
404
339
  }
405
- parsed = JSON5.parse(text);
340
+ parsed = parseAuthorInput(text);
406
341
  }
407
342
  catch (e) {
408
343
  diagnostics.push({
@@ -446,7 +381,6 @@ export function checkLocales(opts) {
446
381
  }
447
382
  });
448
383
  }
449
- // Default locale must define every MessageId; param contracts must match across variants.
450
384
  for (const node of messages.values()) {
451
385
  if (defaultLocale && !node.variants[defaultLocale]) {
452
386
  diagnostics.push({
@@ -475,7 +409,7 @@ export function checkLocales(opts) {
475
409
  if (!node.variants[loc] && loc !== defaultLocale) {
476
410
  const edges = fallback[loc] || [];
477
411
  const canFallback = edges.some((e) => node.variants[e]);
478
- if (!canFallback && rawManifest.missing !== 'warn') {
412
+ if (!canFallback && missingPolicy !== 'warn') {
479
413
  diagnostics.push({
480
414
  code: DIAG_MESSAGE_MISSING_VARIANT,
481
415
  severity: 'error',
@@ -486,7 +420,6 @@ export function checkLocales(opts) {
486
420
  }
487
421
  }
488
422
  }
489
- // scan source for #locales/* imports / message references.
490
423
  const used = scanLocaleUsages(projectRoot);
491
424
  /** @type {any[]} */
492
425
  const typedModules = [];
@@ -557,12 +490,12 @@ export function checkLocales(opts) {
557
490
  localesRoot: path.relative(projectRoot, localesRoot).replace(/\\/g, '/') || 'locales',
558
491
  manifest: {
559
492
  schema: LOCALE_MANIFEST_SCHEMA,
560
- schemaVersion: rawManifest.schemaVersion ?? 1,
493
+ schemaVersion: 1,
561
494
  defaultLocale,
562
495
  locales: localeEntries,
563
496
  fallback,
564
- routing: rawManifest.routing || { strategy: 'prefix', defaultPrefix: 'include' },
565
- missing: rawManifest.missing || 'error',
497
+ routing,
498
+ missing: missingPolicy,
566
499
  },
567
500
  catalogIds: catalogIds.sort(),
568
501
  messageCatalog: {
@@ -668,25 +601,19 @@ export function emitLocaleTypedModules(report, outDir) {
668
601
  fs.mkdirSync(outDir, { recursive: true });
669
602
  /** @type {string[]} */
670
603
  const written = [];
604
+ const native = requireNativeAddon();
605
+ if (typeof native.generateLocaleTypedModule !== 'function') {
606
+ throw new Error('vmz native addon missing generateLocaleTypedModule — rebuild with `pnpm napi:build`');
607
+ }
671
608
  for (const mod of report.typedModules || []) {
672
- const lines = [
673
- `/** Generated LocalizedText module — ${mod.module} (vmz.locale.typed_module.v0) */`,
674
- `export type LocalizedText = string & { readonly __brand: 'LocalizedText' };`,
675
- '',
676
- ];
677
- for (const exp of mod.exports) {
678
- if (!exp.params.length) {
679
- lines.push(`export declare function ${exp.exportName}(): LocalizedText;`);
680
- }
681
- else {
682
- const args = exp.params.map((p) => `${p.name}: ${p.kind === 'plural' || p.kind === 'number' ? 'number' : 'string'}`).join('; ');
683
- lines.push(`export declare function ${exp.exportName}(args: { ${args} }): LocalizedText;`);
684
- }
685
- }
686
- lines.push('');
609
+ const exports = (mod.exports || []).map((exp) => ({
610
+ exportName: exp.exportName,
611
+ params: (exp.params || []).map((p) => ({ name: p.name, kind: p.kind || 'string' })),
612
+ }));
613
+ const text = native.generateLocaleTypedModule(mod.module, exports);
687
614
  const file = path.join(outDir, `${mod.catalogId}.d.ts`);
688
615
  fs.mkdirSync(path.dirname(file), { recursive: true });
689
- fs.writeFileSync(file, lines.join('\n'), 'utf8');
616
+ fs.writeFileSync(file, text, 'utf8');
690
617
  written.push(file);
691
618
  }
692
619
  const index = {
@@ -694,7 +621,7 @@ export function emitLocaleTypedModules(report, outDir) {
694
621
  modules: (report.typedModules || []).map((m) => m.module),
695
622
  outDir,
696
623
  };
697
- fs.writeFileSync(path.join(outDir, 'index.json'), `${JSON.stringify(index, null, 2)}\n`, 'utf8');
624
+ writePrettyJsonFile(path.join(outDir, 'index.json'), index);
698
625
  return written;
699
626
  }
700
627
  /**
@@ -724,59 +651,30 @@ export function emitLocaleRuntimeModules(projectRoot, distDir) {
724
651
  const localesOut = path.join(distDir, 'locales');
725
652
  fs.mkdirSync(localesOut, { recursive: true });
726
653
  for (const mod of report.typedModules || []) {
727
- const lines = [
728
- `/** Generated ${mod.module} — runtime LocalizedText (defaultLocale=${defaultLocale}) */`,
729
- `const __vmzDefaultLocale = ${JSON.stringify(defaultLocale)};`,
730
- `function __vmzLocaleId() {`,
731
- ` if (typeof globalThis !== "undefined" && globalThis.__vmzLocaleIdHint) {`,
732
- ` return String(globalThis.__vmzLocaleIdHint);`,
733
- ` }`,
734
- ` if (typeof document !== "undefined") {`,
735
- ` const d = document.documentElement?.getAttribute("data-locale");`,
736
- ` if (d) return d;`,
737
- ` const lang = document.documentElement?.lang;`,
738
- ` if (lang === "en" || lang === "en-US" || lang === "en-us") return "en-us";`,
739
- ` if (lang === "zh" || lang === "zh-CN" || lang === "zh-Hans" || lang === "zh-hans") return "zh-hans";`,
740
- ` }`,
741
- ` try {`,
742
- ` const stored = localStorage.getItem("vmz.locale");`,
743
- ` if (stored) return stored;`,
744
- ` } catch {}`,
745
- ` return __vmzDefaultLocale;`,
746
- `}`,
747
- `function __vmzFormat(template, args) {`,
748
- ` if (!args) return String(template ?? "");`,
749
- ` return String(template ?? "").replace(/\\{(\\w+)(?:,\\s*\\w+)?\\}/g, (m, name) =>`,
750
- ` Object.prototype.hasOwnProperty.call(args, name) ? String(args[name]) : m`,
751
- ` );`,
752
- `}`,
753
- `function __vmzPick(variants, args) {`,
754
- ` const id = __vmzLocaleId();`,
755
- ` const template = variants[id] ?? variants[__vmzDefaultLocale] ?? "";`,
756
- ` return __vmzFormat(template, args);`,
757
- `}`,
758
- '',
759
- ];
654
+ const exports = [];
760
655
  for (const exp of mod.exports || []) {
761
656
  const node = byId.get(exp.messageId);
762
- const variants = {};
657
+ /** @type {string[][]} */
658
+ const variants = [];
763
659
  if (node?.variants) {
764
660
  for (const [loc, v] of Object.entries(node.variants)) {
765
- variants[loc] = v.template;
661
+ variants.push([loc, v.template]);
766
662
  }
767
663
  }
768
- const lit = JSON.stringify(variants);
769
- if ((exp.params || []).length) {
770
- lines.push(`export function ${exp.exportName}(args) { return __vmzPick(${lit}, args); }`);
771
- }
772
- else {
773
- lines.push(`export function ${exp.exportName}() { return __vmzPick(${lit}); }`);
774
- }
664
+ exports.push({
665
+ exportName: exp.exportName,
666
+ variants,
667
+ hasParams: (exp.params || []).length > 0,
668
+ });
775
669
  }
776
- lines.push('');
670
+ const native = requireNativeAddon();
671
+ if (typeof native.generateLocaleRuntimeModule !== 'function') {
672
+ throw new Error('vmz native addon missing generateLocaleRuntimeModule — rebuild with `pnpm napi:build`');
673
+ }
674
+ const code = native.generateLocaleRuntimeModule(defaultLocale, exports);
777
675
  const file = path.join(localesOut, `${mod.catalogId}.js`);
778
676
  fs.mkdirSync(path.dirname(file), { recursive: true });
779
- fs.writeFileSync(file, lines.join('\n'), 'utf8');
677
+ fs.writeFileSync(file, code, 'utf8');
780
678
  written.push(file);
781
679
  }
782
680
  rewriteLocaleImportsInDist(distDir);
@@ -790,7 +688,7 @@ function rewriteLocaleImportsInDist(distDir) {
790
688
  const files = [];
791
689
  walkDistJs(distDir, (file) => files.push(file));
792
690
  for (const file of files) {
793
- let text = fs.readFileSync(file, 'utf8');
691
+ const text = fs.readFileSync(file, 'utf8');
794
692
  if (!text.includes('#locales/'))
795
693
  continue;
796
694
  const fromDir = path.dirname(file);