@nativescript/vite 8.0.0-alpha.3 → 8.0.0-alpha.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -11
- package/configuration/angular.d.ts +34 -1
- package/configuration/angular.js +373 -163
- package/configuration/angular.js.map +1 -1
- package/configuration/base.js +184 -14
- package/configuration/base.js.map +1 -1
- package/configuration/javascript.js +5 -72
- package/configuration/javascript.js.map +1 -1
- package/configuration/solid.js +27 -1
- package/configuration/solid.js.map +1 -1
- package/configuration/typescript.js +5 -75
- package/configuration/typescript.js.map +1 -1
- package/helpers/app-components.d.ts +2 -1
- package/helpers/app-components.js.map +1 -1
- package/helpers/app-css-state.d.ts +8 -0
- package/helpers/app-css-state.js +8 -0
- package/helpers/app-css-state.js.map +1 -0
- package/helpers/bundler-context.d.ts +11 -0
- package/helpers/bundler-context.js +71 -0
- package/helpers/bundler-context.js.map +1 -0
- package/helpers/config-as-json.js +10 -0
- package/helpers/config-as-json.js.map +1 -1
- package/helpers/dev-host.d.ts +341 -0
- package/helpers/dev-host.js +617 -0
- package/helpers/dev-host.js.map +1 -0
- package/helpers/esbuild-platform-resolver.js +4 -1
- package/helpers/esbuild-platform-resolver.js.map +1 -1
- package/helpers/global-defines.d.ts +51 -0
- package/helpers/global-defines.js +77 -0
- package/helpers/global-defines.js.map +1 -1
- package/helpers/hmr-scope.d.ts +26 -0
- package/helpers/hmr-scope.js +67 -0
- package/helpers/hmr-scope.js.map +1 -0
- package/helpers/init.js +0 -18
- package/helpers/init.js.map +1 -1
- package/helpers/logging.d.ts +1 -0
- package/helpers/logging.js +63 -3
- package/helpers/logging.js.map +1 -1
- package/helpers/main-entry.d.ts +2 -1
- package/helpers/main-entry.js +430 -47
- package/helpers/main-entry.js.map +1 -1
- package/helpers/nativeclass-esbuild-plugin.d.ts +2 -1
- package/helpers/nativeclass-esbuild-plugin.js.map +1 -1
- package/helpers/nativeclass-transform.js.map +1 -1
- package/helpers/nativeclass-transformer-plugin.d.ts +9 -2
- package/helpers/nativeclass-transformer-plugin.js +157 -14
- package/helpers/nativeclass-transformer-plugin.js.map +1 -1
- package/helpers/nativescript-package-resolver.js +8 -3
- package/helpers/nativescript-package-resolver.js.map +1 -1
- package/helpers/normalize-id.d.ts +42 -0
- package/helpers/normalize-id.js +60 -0
- package/helpers/normalize-id.js.map +1 -0
- package/helpers/ns-core-url.d.ts +88 -0
- package/helpers/ns-core-url.js +191 -0
- package/helpers/ns-core-url.js.map +1 -0
- package/helpers/package-platform-aliases.js +4 -3
- package/helpers/package-platform-aliases.js.map +1 -1
- package/helpers/platform-types.d.ts +2 -0
- package/helpers/platform-types.js +2 -0
- package/helpers/platform-types.js.map +1 -0
- package/helpers/project.d.ts +35 -0
- package/helpers/project.js +120 -2
- package/helpers/project.js.map +1 -1
- package/helpers/resolver.js +17 -2
- package/helpers/resolver.js.map +1 -1
- package/helpers/ts-config-paths.d.ts +14 -0
- package/helpers/ts-config-paths.js +89 -8
- package/helpers/ts-config-paths.js.map +1 -1
- package/helpers/typescript-check.d.ts +2 -1
- package/helpers/typescript-check.js.map +1 -1
- package/helpers/workers.d.ts +20 -19
- package/helpers/workers.js +624 -4
- package/helpers/workers.js.map +1 -1
- package/hmr/client/css-handler.d.ts +1 -0
- package/hmr/client/css-handler.js +33 -20
- package/hmr/client/css-handler.js.map +1 -1
- package/hmr/client/css-update-overlay.d.ts +18 -0
- package/hmr/client/css-update-overlay.js +27 -0
- package/hmr/client/css-update-overlay.js.map +1 -0
- package/hmr/client/framework-client-strategy.d.ts +73 -0
- package/hmr/client/framework-client-strategy.js +19 -0
- package/hmr/client/framework-client-strategy.js.map +1 -0
- package/hmr/client/hmr-pending-overlay.d.ts +27 -0
- package/hmr/client/hmr-pending-overlay.js +50 -0
- package/hmr/client/hmr-pending-overlay.js.map +1 -0
- package/hmr/client/index.js +459 -164
- package/hmr/client/index.js.map +1 -1
- package/hmr/client/utils.d.ts +6 -1
- package/hmr/client/utils.js +184 -8
- package/hmr/client/utils.js.map +1 -1
- package/hmr/entry-runtime.d.ts +2 -1
- package/hmr/entry-runtime.js +252 -65
- package/hmr/entry-runtime.js.map +1 -1
- package/hmr/frameworks/angular/build/angular-linker.d.ts +12 -0
- package/hmr/frameworks/angular/build/angular-linker.js +109 -0
- package/hmr/frameworks/angular/build/angular-linker.js.map +1 -0
- package/hmr/frameworks/angular/build/inject-component-hmr-registration.d.ts +112 -0
- package/hmr/frameworks/angular/build/inject-component-hmr-registration.js +291 -0
- package/hmr/frameworks/angular/build/inject-component-hmr-registration.js.map +1 -0
- package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.d.ts +75 -0
- package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js +221 -0
- package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js.map +1 -0
- package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.js +1 -170
- package/hmr/frameworks/angular/build/inline-decorator-component-templates.js.map +1 -0
- package/hmr/frameworks/angular/build/js-lexer.d.ts +4 -0
- package/{helpers/angular/synthesize-decorator-ctor-parameters.js → hmr/frameworks/angular/build/js-lexer.js} +22 -96
- package/hmr/frameworks/angular/build/js-lexer.js.map +1 -0
- package/hmr/frameworks/angular/build/shared-linker.d.ts +39 -0
- package/hmr/frameworks/angular/build/shared-linker.js +128 -0
- package/hmr/frameworks/angular/build/shared-linker.js.map +1 -0
- package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js +88 -0
- package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js.map +1 -0
- package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.js +1 -174
- package/hmr/frameworks/angular/build/synthesize-injectable-factories.js.map +1 -0
- package/{helpers/angular → hmr/frameworks/angular/build}/util.d.ts +1 -0
- package/hmr/frameworks/angular/build/util.js +155 -0
- package/hmr/frameworks/angular/build/util.js.map +1 -0
- package/hmr/frameworks/angular/client/index.d.ts +1 -0
- package/hmr/frameworks/angular/client/index.js +778 -20
- package/hmr/frameworks/angular/client/index.js.map +1 -1
- package/hmr/frameworks/angular/client/strategy.d.ts +9 -0
- package/hmr/frameworks/angular/client/strategy.js +19 -0
- package/hmr/frameworks/angular/client/strategy.js.map +1 -0
- package/hmr/frameworks/angular/server/angular-root-component.d.ts +79 -0
- package/hmr/frameworks/angular/server/angular-root-component.js +149 -0
- package/hmr/frameworks/angular/server/angular-root-component.js.map +1 -0
- package/hmr/frameworks/angular/server/linker.js +1 -4
- package/hmr/frameworks/angular/server/linker.js.map +1 -1
- package/hmr/frameworks/angular/server/strategy.js +448 -12
- package/hmr/frameworks/angular/server/strategy.js.map +1 -1
- package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.js +2 -2
- package/hmr/frameworks/angular/server/websocket-angular-entry.js.map +1 -0
- package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.d.ts +17 -11
- package/hmr/frameworks/angular/server/websocket-angular-hot-update.js +336 -0
- package/hmr/frameworks/angular/server/websocket-angular-hot-update.js.map +1 -0
- package/hmr/frameworks/solid/build/solid-jsx-deps.d.ts +15 -0
- package/hmr/frameworks/solid/build/solid-jsx-deps.js +178 -0
- package/hmr/frameworks/solid/build/solid-jsx-deps.js.map +1 -0
- package/hmr/frameworks/solid/server/strategy.js +360 -16
- package/hmr/frameworks/solid/server/strategy.js.map +1 -1
- package/hmr/frameworks/typescript/server/strategy.js +28 -14
- package/hmr/frameworks/typescript/server/strategy.js.map +1 -1
- package/hmr/frameworks/vue/client/index.js +30 -199
- package/hmr/frameworks/vue/client/index.js.map +1 -1
- package/hmr/frameworks/vue/client/strategy.d.ts +7 -0
- package/hmr/frameworks/vue/client/strategy.js +83 -0
- package/hmr/frameworks/vue/client/strategy.js.map +1 -0
- package/hmr/frameworks/vue/client/vue-sfc-update-overlay.d.ts +82 -0
- package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js +133 -0
- package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js.map +1 -0
- package/hmr/frameworks/vue/server/sfc-route-assemble.d.ts +7 -0
- package/hmr/frameworks/vue/server/sfc-route-assemble.js +706 -0
- package/hmr/frameworks/vue/server/sfc-route-assemble.js.map +1 -0
- package/hmr/frameworks/vue/server/sfc-route-meta.d.ts +7 -0
- package/hmr/frameworks/vue/server/sfc-route-meta.js +80 -0
- package/hmr/frameworks/vue/server/sfc-route-meta.js.map +1 -0
- package/hmr/frameworks/vue/server/sfc-route-serve.d.ts +8 -0
- package/hmr/frameworks/vue/server/sfc-route-serve.js +457 -0
- package/hmr/frameworks/vue/server/sfc-route-serve.js.map +1 -0
- package/hmr/frameworks/vue/server/sfc-route-shared.d.ts +19 -0
- package/hmr/frameworks/vue/server/sfc-route-shared.js +14 -0
- package/hmr/frameworks/vue/server/sfc-route-shared.js.map +1 -0
- package/hmr/frameworks/vue/server/strategy.js +244 -0
- package/hmr/frameworks/vue/server/strategy.js.map +1 -1
- package/hmr/frameworks/vue/server/websocket-sfc.d.ts +15 -0
- package/hmr/frameworks/vue/server/websocket-sfc.js +20 -0
- package/hmr/frameworks/vue/server/websocket-sfc.js.map +1 -0
- package/hmr/helpers/ast-normalizer.js +52 -5
- package/hmr/helpers/ast-normalizer.js.map +1 -1
- package/hmr/helpers/cjs-named-exports.d.ts +23 -0
- package/hmr/helpers/cjs-named-exports.js +152 -0
- package/hmr/helpers/cjs-named-exports.js.map +1 -0
- package/hmr/helpers/package-exports.d.ts +16 -0
- package/hmr/helpers/package-exports.js +396 -0
- package/hmr/helpers/package-exports.js.map +1 -0
- package/hmr/server/constants.js +13 -4
- package/hmr/server/constants.js.map +1 -1
- package/hmr/server/core-sanitize.d.ts +90 -7
- package/hmr/server/core-sanitize.js +211 -56
- package/hmr/server/core-sanitize.js.map +1 -1
- package/hmr/server/device-transform-helpers.d.ts +24 -0
- package/hmr/server/device-transform-helpers.js +327 -0
- package/hmr/server/device-transform-helpers.js.map +1 -0
- package/hmr/server/framework-strategy.d.ts +95 -11
- package/hmr/server/hmr-module-graph.d.ts +37 -0
- package/hmr/server/hmr-module-graph.js +214 -0
- package/hmr/server/hmr-module-graph.js.map +1 -0
- package/hmr/server/import-map.d.ts +11 -2
- package/hmr/server/import-map.js +59 -40
- package/hmr/server/import-map.js.map +1 -1
- package/hmr/server/index.js +7 -16
- package/hmr/server/index.js.map +1 -1
- package/hmr/server/ns-core-cjs-shape.d.ts +204 -0
- package/hmr/server/ns-core-cjs-shape.js +271 -0
- package/hmr/server/ns-core-cjs-shape.js.map +1 -0
- package/hmr/server/ns-rt-bridge.d.ts +51 -0
- package/hmr/server/ns-rt-bridge.js +131 -0
- package/hmr/server/ns-rt-bridge.js.map +1 -0
- package/hmr/server/ns-rt-route.d.ts +5 -0
- package/hmr/server/ns-rt-route.js +35 -0
- package/hmr/server/ns-rt-route.js.map +1 -0
- package/hmr/server/perf-instrumentation.d.ts +114 -0
- package/hmr/server/perf-instrumentation.js +195 -0
- package/hmr/server/perf-instrumentation.js.map +1 -0
- package/hmr/server/process-code-for-device.d.ts +15 -0
- package/hmr/server/process-code-for-device.js +654 -0
- package/hmr/server/process-code-for-device.js.map +1 -0
- package/hmr/server/require-guard.d.ts +1 -0
- package/hmr/server/require-guard.js +12 -0
- package/hmr/server/require-guard.js.map +1 -0
- package/hmr/server/rewrite-imports.d.ts +2 -0
- package/hmr/server/rewrite-imports.js +604 -0
- package/hmr/server/rewrite-imports.js.map +1 -0
- package/hmr/server/route-helpers.d.ts +7 -0
- package/hmr/server/route-helpers.js +13 -0
- package/hmr/server/route-helpers.js.map +1 -0
- package/hmr/server/server-origin.d.ts +12 -0
- package/hmr/server/server-origin.js +66 -0
- package/hmr/server/server-origin.js.map +1 -0
- package/hmr/server/shared-transform-request.js +12 -5
- package/hmr/server/shared-transform-request.js.map +1 -1
- package/hmr/server/transform-cache-invalidation.d.ts +11 -0
- package/hmr/server/transform-cache-invalidation.js +84 -0
- package/hmr/server/transform-cache-invalidation.js.map +1 -0
- package/hmr/server/vendor-bare-module-shims.d.ts +4 -0
- package/hmr/server/vendor-bare-module-shims.js +80 -0
- package/hmr/server/vendor-bare-module-shims.js.map +1 -0
- package/hmr/server/vite-plugin.js +60 -42
- package/hmr/server/vite-plugin.js.map +1 -1
- package/hmr/server/websocket-core-bridge.d.ts +41 -6
- package/hmr/server/websocket-core-bridge.js +72 -75
- package/hmr/server/websocket-core-bridge.js.map +1 -1
- package/hmr/server/websocket-css-hot-update.d.ts +33 -0
- package/hmr/server/websocket-css-hot-update.js +65 -0
- package/hmr/server/websocket-css-hot-update.js.map +1 -0
- package/hmr/server/websocket-device-transform.d.ts +3 -0
- package/hmr/server/websocket-device-transform.js +7 -0
- package/hmr/server/websocket-device-transform.js.map +1 -0
- package/hmr/server/websocket-graph-upsert.d.ts +15 -0
- package/hmr/server/websocket-graph-upsert.js +20 -0
- package/hmr/server/websocket-graph-upsert.js.map +1 -1
- package/hmr/server/websocket-hmr-pending.d.ts +37 -0
- package/hmr/server/websocket-hmr-pending.js +55 -0
- package/hmr/server/websocket-hmr-pending.js.map +1 -0
- package/hmr/server/websocket-hot-update.d.ts +77 -0
- package/hmr/server/websocket-hot-update.js +330 -0
- package/hmr/server/websocket-hot-update.js.map +1 -0
- package/hmr/server/websocket-import-map-route.d.ts +15 -0
- package/hmr/server/websocket-import-map-route.js +46 -0
- package/hmr/server/websocket-import-map-route.js.map +1 -0
- package/hmr/server/websocket-module-bindings.js +3 -3
- package/hmr/server/websocket-module-bindings.js.map +1 -1
- package/hmr/server/websocket-module-specifiers.d.ts +66 -2
- package/hmr/server/websocket-module-specifiers.js +202 -19
- package/hmr/server/websocket-module-specifiers.js.map +1 -1
- package/hmr/server/websocket-ns-core.d.ts +21 -0
- package/hmr/server/websocket-ns-core.js +306 -0
- package/hmr/server/websocket-ns-core.js.map +1 -0
- package/hmr/server/websocket-ns-entry.d.ts +21 -0
- package/hmr/server/websocket-ns-entry.js +150 -0
- package/hmr/server/websocket-ns-entry.js.map +1 -0
- package/hmr/server/websocket-ns-m-paths.d.ts +3 -0
- package/hmr/server/websocket-ns-m-paths.js +92 -0
- package/hmr/server/websocket-ns-m-paths.js.map +1 -0
- package/hmr/server/websocket-ns-m-request.d.ts +45 -0
- package/hmr/server/websocket-ns-m-request.js +196 -0
- package/hmr/server/websocket-ns-m-request.js.map +1 -0
- package/hmr/server/websocket-ns-m.d.ts +33 -0
- package/hmr/server/websocket-ns-m.js +748 -0
- package/hmr/server/websocket-ns-m.js.map +1 -0
- package/hmr/server/websocket-served-module-helpers.d.ts +39 -0
- package/hmr/server/websocket-served-module-helpers.js +654 -0
- package/hmr/server/websocket-served-module-helpers.js.map +1 -0
- package/hmr/server/websocket-txn.d.ts +6 -0
- package/hmr/server/websocket-txn.js +39 -0
- package/hmr/server/websocket-txn.js.map +1 -0
- package/hmr/server/websocket-vendor-unifier.d.ts +9 -0
- package/hmr/server/websocket-vendor-unifier.js +46 -0
- package/hmr/server/websocket-vendor-unifier.js.map +1 -0
- package/hmr/server/websocket.d.ts +8 -39
- package/hmr/server/websocket.js +602 -6049
- package/hmr/server/websocket.js.map +1 -1
- package/hmr/shared/ns-globals.d.ts +118 -0
- package/hmr/shared/ns-globals.js +27 -0
- package/hmr/shared/ns-globals.js.map +1 -0
- package/hmr/shared/protocol.d.ts +136 -0
- package/hmr/shared/protocol.js +28 -0
- package/hmr/shared/protocol.js.map +1 -0
- package/hmr/shared/runtime/boot-placeholder-ui.d.ts +69 -0
- package/hmr/shared/runtime/boot-placeholder-ui.js +101 -0
- package/hmr/shared/runtime/boot-placeholder-ui.js.map +1 -0
- package/hmr/shared/runtime/boot-progress.d.ts +40 -0
- package/hmr/shared/runtime/boot-progress.js +128 -0
- package/hmr/shared/runtime/boot-progress.js.map +1 -0
- package/hmr/shared/runtime/boot-timeline.d.ts +18 -0
- package/hmr/shared/runtime/boot-timeline.js +52 -0
- package/hmr/shared/runtime/boot-timeline.js.map +1 -0
- package/hmr/shared/runtime/dev-overlay-snapshots.d.ts +31 -0
- package/hmr/shared/runtime/dev-overlay-snapshots.js +324 -0
- package/hmr/shared/runtime/dev-overlay-snapshots.js.map +1 -0
- package/hmr/shared/runtime/dev-overlay.d.ts +75 -26
- package/hmr/shared/runtime/dev-overlay.js +990 -260
- package/hmr/shared/runtime/dev-overlay.js.map +1 -1
- package/hmr/shared/runtime/module-provenance.js +1 -4
- package/hmr/shared/runtime/module-provenance.js.map +1 -1
- package/hmr/shared/runtime/root-placeholder-view.d.ts +19 -0
- package/hmr/shared/runtime/root-placeholder-view.js +310 -0
- package/hmr/shared/runtime/root-placeholder-view.js.map +1 -0
- package/hmr/shared/runtime/root-placeholder.js +352 -194
- package/hmr/shared/runtime/root-placeholder.js.map +1 -1
- package/hmr/shared/runtime/session-bootstrap.js +164 -1
- package/hmr/shared/runtime/session-bootstrap.js.map +1 -1
- package/hmr/shared/runtime/vendor-bootstrap.js +1 -9
- package/hmr/shared/runtime/vendor-bootstrap.js.map +1 -1
- package/hmr/shared/vendor/manifest-collect.d.ts +4 -0
- package/hmr/shared/vendor/manifest-collect.js +512 -0
- package/hmr/shared/vendor/manifest-collect.js.map +1 -0
- package/hmr/shared/vendor/manifest-loader.d.ts +2 -1
- package/hmr/shared/vendor/manifest-loader.js +3 -2
- package/hmr/shared/vendor/manifest-loader.js.map +1 -1
- package/hmr/shared/vendor/manifest.d.ts +1 -7
- package/hmr/shared/vendor/manifest.js +102 -741
- package/hmr/shared/vendor/manifest.js.map +1 -1
- package/hmr/shared/vendor/vendor-device-shim.d.ts +1 -0
- package/hmr/shared/vendor/vendor-device-shim.js +208 -0
- package/hmr/shared/vendor/vendor-device-shim.js.map +1 -0
- package/hmr/shared/vendor/vendor-esbuild-plugins.d.ts +16 -0
- package/hmr/shared/vendor/vendor-esbuild-plugins.js +203 -0
- package/hmr/shared/vendor/vendor-esbuild-plugins.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +5 -0
- package/index.js.map +1 -1
- package/package.json +55 -11
- package/runtime/core-aliases-early.js +17 -41
- package/runtime/core-aliases-early.js.map +1 -1
- package/helpers/angular/angular-linker.d.ts +0 -13
- package/helpers/angular/angular-linker.js +0 -194
- package/helpers/angular/angular-linker.js.map +0 -1
- package/helpers/angular/inline-decorator-component-templates.js.map +0 -1
- package/helpers/angular/shared-linker.d.ts +0 -11
- package/helpers/angular/shared-linker.js +0 -75
- package/helpers/angular/shared-linker.js.map +0 -1
- package/helpers/angular/synthesize-decorator-ctor-parameters.js.map +0 -1
- package/helpers/angular/synthesize-injectable-factories.js.map +0 -1
- package/helpers/angular/util.js +0 -67
- package/helpers/angular/util.js.map +0 -1
- package/helpers/prelink-angular.d.ts +0 -2
- package/helpers/prelink-angular.js +0 -117
- package/helpers/prelink-angular.js.map +0 -1
- package/hmr/server/websocket-angular-entry.js.map +0 -1
- package/hmr/server/websocket-angular-hot-update.js +0 -239
- package/hmr/server/websocket-angular-hot-update.js.map +0 -1
- /package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.d.ts +0 -0
- /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-decorator-ctor-parameters.d.ts +0 -0
- /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.d.ts +0 -0
- /package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.d.ts +0 -0
|
@@ -0,0 +1,706 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import babelCore from '@babel/core';
|
|
5
|
+
import { setDeviceModuleHeaders } from '../../../server/route-helpers.js';
|
|
6
|
+
import { astExtractImportsAndStripTypes } from '../../../helpers/ast-extract.js';
|
|
7
|
+
import { astNormalizeModuleImportsAndHelpers, astVerifyAndAnnotateDuplicates } from '../../../helpers/ast-normalizer.js';
|
|
8
|
+
import { buildInlineTemplateBlock, extractTemplateRender } from './sfc-transforms.js';
|
|
9
|
+
import { NS_NATIVE_TAGS } from '../../../server/compiler.js';
|
|
10
|
+
import { ensureDestructureCoreImports, ensureGuardPlainDynamicImports, ensureVariableDynamicImportHelper, ensureVersionedRtImports } from '../../../server/websocket-served-module-helpers.js';
|
|
11
|
+
import { processCodeForDevice, rewriteImports } from '../../../server/websocket-device-transform.js';
|
|
12
|
+
import { REQUIRE_GUARD_SNIPPET } from '../../../server/require-guard.js';
|
|
13
|
+
import { getServerOrigin } from '../../../server/server-origin.js';
|
|
14
|
+
import { compileScript, compileTemplate, parse, pluginTransformTypescript } from './sfc-route-shared.js';
|
|
15
|
+
/**
|
|
16
|
+
* Registers `GET /ns/asm` — the deterministic, self-contained SFC assembler module.
|
|
17
|
+
* Extracted verbatim from `websocket-sfc.ts` (pure move, no behavior change).
|
|
18
|
+
*/
|
|
19
|
+
export function registerSfcAsmRoute(server, options) {
|
|
20
|
+
// 5) Deterministic SFC assembler: GET /ns/asm?path=/src/Comp.vue
|
|
21
|
+
// Place BEFORE any broader /ns/sfc* handlers that might accidentally match and delegate.
|
|
22
|
+
server.middlewares.use(async (req, res, next) => {
|
|
23
|
+
const strategy = options.getStrategy();
|
|
24
|
+
try {
|
|
25
|
+
const urlObj = new URL(req.url || '', 'http://localhost');
|
|
26
|
+
if (!urlObj.pathname.startsWith('/ns/asm'))
|
|
27
|
+
return next();
|
|
28
|
+
setDeviceModuleHeaders(res);
|
|
29
|
+
// Optional version segment as first path component after /ns/asm
|
|
30
|
+
const asmBase = '/ns/asm';
|
|
31
|
+
const asmRemainder = urlObj.pathname.slice(asmBase.length) || '';
|
|
32
|
+
let verFromPath = null;
|
|
33
|
+
if (asmRemainder && asmRemainder.startsWith('/')) {
|
|
34
|
+
const p = asmRemainder.split('/');
|
|
35
|
+
if (p.length > 1 && /^[0-9]+$/.test(p[1] || '')) {
|
|
36
|
+
verFromPath = p[1];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
let spec = urlObj.searchParams.get('path') || '';
|
|
40
|
+
const diag = urlObj.searchParams.get('diag') === '1';
|
|
41
|
+
if (!spec) {
|
|
42
|
+
res.statusCode = 400;
|
|
43
|
+
res.end('export {}\n');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (spec.startsWith('@/'))
|
|
47
|
+
spec = options.appVirtualWithSlash + spec.slice(2);
|
|
48
|
+
if (!spec.startsWith('/'))
|
|
49
|
+
spec = '/' + spec;
|
|
50
|
+
const base = spec.replace(/[?#].*$/, '');
|
|
51
|
+
if (diag) {
|
|
52
|
+
const code = `// [sfc-asm] ${base} (diag)\n` + `// vue shim for diag-only instantiation\n` + `var _createElementVNode = globalThis.createElementVNode || globalThis._createElementVNode;\n` + `const __ns_sfc__ = { name: ${JSON.stringify(base.split('/').pop() || 'DiagComp')}, render(){ return _createElementVNode ? _createElementVNode('StackLayout') : (globalThis.createElementVNode ? globalThis.createElementVNode('StackLayout') : {}); } };\nexport default __ns_sfc__;\n`;
|
|
53
|
+
res.statusCode = 200;
|
|
54
|
+
res.end(code);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const projectRoot = server.config?.root || process.cwd();
|
|
58
|
+
// Ensure variant transforms exist so imports resolve (avoid Promise.all short-circuit on single failure)
|
|
59
|
+
const safeTransform = async (cand) => {
|
|
60
|
+
try {
|
|
61
|
+
return await server.transformRequest(cand);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const scriptR = await safeTransform(base + '?vue&type=script');
|
|
68
|
+
const templateR = await safeTransform(base + '?vue&type=template');
|
|
69
|
+
// Warm Vite's transform cache for the full-SFC URL; result is unused (the
|
|
70
|
+
// assembler reads the SFC from disk and compiles it inline below).
|
|
71
|
+
await safeTransform(base + '?vue');
|
|
72
|
+
const origin = getServerOrigin(server);
|
|
73
|
+
const ver = String(verFromPath || options.getGraphVersion() || Date.now());
|
|
74
|
+
const scriptUrl = `${origin}/ns/sfc/${ver}${base}?vue&type=script`;
|
|
75
|
+
const templateCode = templateR?.code || '';
|
|
76
|
+
// INLINE-FIRST assembler: compile SFC source into a self-contained ESM module (enhanced diagnostics)
|
|
77
|
+
try {
|
|
78
|
+
const root = server.config?.root || process.cwd();
|
|
79
|
+
const abs = path.join(root, base.replace(/^\//, ''));
|
|
80
|
+
let sfcSrc = '';
|
|
81
|
+
try {
|
|
82
|
+
sfcSrc = readFileSync(abs, 'utf-8');
|
|
83
|
+
}
|
|
84
|
+
catch { }
|
|
85
|
+
if (sfcSrc) {
|
|
86
|
+
const { descriptor } = parse(sfcSrc, { filename: abs });
|
|
87
|
+
const id = createHash('md5').update(abs).digest('hex').slice(0, 8);
|
|
88
|
+
// 1) Compile script (prefer inlineTemplate for a complete module)
|
|
89
|
+
let compiledScript = '';
|
|
90
|
+
let bindingMetadata = undefined;
|
|
91
|
+
let usedInlineScript = false;
|
|
92
|
+
try {
|
|
93
|
+
// First try inlineTemplate for a holistic, self-contained module with render + hoists
|
|
94
|
+
// Use a strict NativeScript native element detector for inlineTemplate that does NOT treat generic PascalCase as native.
|
|
95
|
+
// This ensures imported components like PageWrapper remain true components and get referenced via bindings.
|
|
96
|
+
const isNSNative = (tag) => NS_NATIVE_TAGS.has(tag);
|
|
97
|
+
const sInline = compileScript(descriptor, {
|
|
98
|
+
id,
|
|
99
|
+
inlineTemplate: true,
|
|
100
|
+
reactivityTransform: false,
|
|
101
|
+
// Pass only strict NS native element predicate; avoid broad PascalCase heuristic here.
|
|
102
|
+
templateOptions: {
|
|
103
|
+
compilerOptions: { isCustomElement: isNSNative },
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
if (/export\s+default/.test(sInline?.content || '')) {
|
|
107
|
+
compiledScript = sInline.content;
|
|
108
|
+
bindingMetadata = sInline?.bindings;
|
|
109
|
+
usedInlineScript = true;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Fallback to standard script (no inline) and attempt separate template compile
|
|
113
|
+
const s = compileScript(descriptor, {
|
|
114
|
+
id,
|
|
115
|
+
inlineTemplate: false,
|
|
116
|
+
reactivityTransform: false,
|
|
117
|
+
});
|
|
118
|
+
compiledScript = s?.content || '';
|
|
119
|
+
bindingMetadata = s?.bindings;
|
|
120
|
+
usedInlineScript = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (eScript) {
|
|
124
|
+
if (options.verbose) {
|
|
125
|
+
console.warn('[sfc-asm][compileScript] failed', base, eScript?.message);
|
|
126
|
+
}
|
|
127
|
+
// Retry without inlineTemplate
|
|
128
|
+
try {
|
|
129
|
+
const s = compileScript(descriptor, {
|
|
130
|
+
id,
|
|
131
|
+
inlineTemplate: false,
|
|
132
|
+
reactivityTransform: false,
|
|
133
|
+
});
|
|
134
|
+
compiledScript = s?.content || '';
|
|
135
|
+
bindingMetadata = s?.bindings;
|
|
136
|
+
usedInlineScript = false;
|
|
137
|
+
}
|
|
138
|
+
catch (eNoInline) {
|
|
139
|
+
if (options.verbose) {
|
|
140
|
+
console.warn('[sfc-asm][compileScript][no-inline-fallback] failed', base, eNoInline?.message);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Final fallback: if script compile yielded nothing, use the variant-transformed script
|
|
145
|
+
if (!compiledScript && scriptR?.code) {
|
|
146
|
+
try {
|
|
147
|
+
compiledScript = scriptR.code;
|
|
148
|
+
}
|
|
149
|
+
catch { }
|
|
150
|
+
}
|
|
151
|
+
// Always use the canonical assembler path; we deliberately avoid the
|
|
152
|
+
// inlineTemplate early-return which can miss render attachment.
|
|
153
|
+
// If we reached here, we are going to assemble canonically. Ensure the script we use does NOT include inlineTemplate render.
|
|
154
|
+
if (usedInlineScript) {
|
|
155
|
+
try {
|
|
156
|
+
const sNoInline = compileScript(descriptor, {
|
|
157
|
+
id,
|
|
158
|
+
inlineTemplate: false,
|
|
159
|
+
reactivityTransform: false,
|
|
160
|
+
});
|
|
161
|
+
compiledScript = sNoInline?.content || compiledScript;
|
|
162
|
+
bindingMetadata = sNoInline?.bindings || bindingMetadata;
|
|
163
|
+
}
|
|
164
|
+
catch (eNoInline) {
|
|
165
|
+
if (options.verbose) {
|
|
166
|
+
console.warn('[sfc-asm][compileScript][no-inline-fallback] failed', base, eNoInline?.message);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// 2) Compile template
|
|
171
|
+
let compiledTplCode = '';
|
|
172
|
+
try {
|
|
173
|
+
const tplSrc = descriptor.template?.content || '';
|
|
174
|
+
if (tplSrc) {
|
|
175
|
+
const ct = compileTemplate({
|
|
176
|
+
source: tplSrc,
|
|
177
|
+
id,
|
|
178
|
+
filename: abs,
|
|
179
|
+
isProd: false,
|
|
180
|
+
ssr: false,
|
|
181
|
+
compilerOptions: {
|
|
182
|
+
bindingMetadata,
|
|
183
|
+
isCustomElement: (tag) => NS_NATIVE_TAGS.has(tag),
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
compiledTplCode = (ct && (ct.code || '')) || '';
|
|
187
|
+
if (ct?.errors?.length && options.verbose) {
|
|
188
|
+
console.warn('[sfc-asm][compileTemplate][errors]', base, ct.errors);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch (eTpl) {
|
|
193
|
+
if (options.verbose) {
|
|
194
|
+
console.warn('[sfc-asm][compileTemplate] failed', base, eTpl?.message);
|
|
195
|
+
}
|
|
196
|
+
// Fallback: use the variant-transformed template code if available
|
|
197
|
+
try {
|
|
198
|
+
if (templateR?.code)
|
|
199
|
+
compiledTplCode = templateR.code;
|
|
200
|
+
}
|
|
201
|
+
catch { }
|
|
202
|
+
}
|
|
203
|
+
// If still no template code, synthesize a minimal render stub so the module is valid
|
|
204
|
+
if (!compiledTplCode) {
|
|
205
|
+
try {
|
|
206
|
+
compiledTplCode = "export function render(){ const _ = (globalThis.createElementVNode||globalThis._createElementVNode); return _? _('StackLayout') : {}; }\n";
|
|
207
|
+
}
|
|
208
|
+
catch { }
|
|
209
|
+
}
|
|
210
|
+
// 3) Sanitize script and rewrite .vue imports to inline assembler
|
|
211
|
+
let scriptBody = compiledScript || '';
|
|
212
|
+
if (scriptBody) {
|
|
213
|
+
// Do NOT strip Vue/nativescript-vue imports; retarget them to the runtime bridge so helpers (e.g., onMounted) are bound.
|
|
214
|
+
// Preserve the import clause and only rewrite the source to '/ns/rt'.
|
|
215
|
+
scriptBody = scriptBody.replace(/(^|\n)\s*import\s+([^;\n]+)\s+from\s+["'](?:vue|nativescript-vue|~\/vendor\.mjs)(?:\/[^"]*)?["'];?/g, (_m, pfx, clause) => `${pfx}import ${clause} from "/ns/rt";`);
|
|
216
|
+
try {
|
|
217
|
+
const importerDir = path.posix.dirname(base);
|
|
218
|
+
scriptBody = scriptBody.replace(/(^|\n)\s*import\s+([^;\n]+)\s+from\s+["']([^"'\n]+\.vue)(?:\?[^"'\n]*)?["'];?/g, (_m, pfx, clause, spec) => {
|
|
219
|
+
let absImp = spec;
|
|
220
|
+
if (spec.startsWith('./') || spec.startsWith('../')) {
|
|
221
|
+
absImp = path.posix.normalize(path.posix.join(importerDir, spec));
|
|
222
|
+
if (!absImp.startsWith('/'))
|
|
223
|
+
absImp = '/' + absImp;
|
|
224
|
+
}
|
|
225
|
+
else if (!spec.startsWith('/')) {
|
|
226
|
+
if (absImp.startsWith('@/'))
|
|
227
|
+
absImp = options.appVirtualWithSlash + absImp.slice(2);
|
|
228
|
+
}
|
|
229
|
+
const asmUrl = `/ns/asm/${ver}?path=${encodeURIComponent(absImp)}&mode=inline`;
|
|
230
|
+
return `${pfx}import ${clause} from ${JSON.stringify(asmUrl)};`;
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch { }
|
|
234
|
+
}
|
|
235
|
+
// 4) Extract render from compiled template and prepare a full inline template block
|
|
236
|
+
let helperBindings = '';
|
|
237
|
+
let renderDecl = '';
|
|
238
|
+
let inlineBlock = undefined;
|
|
239
|
+
let renderOk = false;
|
|
240
|
+
if (compiledTplCode) {
|
|
241
|
+
try {
|
|
242
|
+
// Build a full inline template block to preserve hoists where possible
|
|
243
|
+
inlineBlock = buildInlineTemplateBlock(compiledTplCode) || undefined;
|
|
244
|
+
if (!inlineBlock) {
|
|
245
|
+
const extracted = extractTemplateRender(compiledTplCode);
|
|
246
|
+
helperBindings = extracted.helperBindings;
|
|
247
|
+
renderDecl = extracted.renderDecl;
|
|
248
|
+
inlineBlock = extracted.inlineBlock;
|
|
249
|
+
renderOk = extracted.ok;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
renderOk = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (eExtract) {
|
|
256
|
+
if (options.verbose) {
|
|
257
|
+
console.warn('[sfc-asm][extractTemplateRender] failed', base, eExtract?.message);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Final guard: if no inline render extracted, attempt to import template variant or synthesize a no-op render
|
|
262
|
+
if (!renderOk && !inlineBlock) {
|
|
263
|
+
try {
|
|
264
|
+
const templateUrl = `${origin}/ns/sfc/${ver}${base}?vue&type=template`;
|
|
265
|
+
const importLine = `import * as __template from ${JSON.stringify(templateUrl)};`;
|
|
266
|
+
// Attach only if scriptTransformed produces __ns_sfc__ later
|
|
267
|
+
helperBindings += `\n${importLine}`;
|
|
268
|
+
renderDecl += `\nfunction __ns_getRender(){\n try {\n if (__template && __template.render) return __template.render;\n } catch (_e) {}\n try {\n const _ = globalThis.createElementVNode || globalThis._createElementVNode;\n return _ ? function(){ return _('StackLayout'); } : function(){ return {}; };\n } catch (_e) { return function(){ return {}; }; }\n}\n`;
|
|
269
|
+
renderOk = true;
|
|
270
|
+
}
|
|
271
|
+
catch { }
|
|
272
|
+
}
|
|
273
|
+
// 5) Convert default export to const __ns_sfc__
|
|
274
|
+
let scriptTransformed = scriptBody;
|
|
275
|
+
if (scriptTransformed) {
|
|
276
|
+
scriptTransformed = scriptTransformed.replace(/(^|\n)\s*export\s+default\s+/g, '$1const __ns_sfc__ = ').replace(/(^|\n)\s*export\s*\{[^}]*\}\s*;?\s*/g, '\n/* removed named exports for inline asm */\n');
|
|
277
|
+
// Normalize any prior declaration of __ns_sfc__ to a plain assignment to avoid redeclare
|
|
278
|
+
// Accept a semicolon before the declaration too
|
|
279
|
+
scriptTransformed = scriptTransformed.replace(/(^|[\n;])\s*(?:const|let|var)\s+__ns_sfc__\s*=\s*/g, '$1__ns_sfc__ = ');
|
|
280
|
+
// Ensure a single declaration appears once before first assignment
|
|
281
|
+
if (!/(^|[\n;])\s*(?:const|let|var)\s+__ns_sfc__\b/.test(scriptTransformed)) {
|
|
282
|
+
scriptTransformed = `let __ns_sfc__;\n` + scriptTransformed;
|
|
283
|
+
}
|
|
284
|
+
// Remove stray leading braces (artifact defense)
|
|
285
|
+
scriptTransformed = scriptTransformed.replace(/^\s*\}+(?=\s*[^}])/, (m) => `/* [asm-fix] removed ${m.length} stray leading braces */\n`);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
try {
|
|
289
|
+
const compName = (base.split('/').pop() || 'Component').replace(/\.vue$/i, '') || 'Component';
|
|
290
|
+
scriptTransformed = `import { defineComponent as _defineComponent } from "/ns/rt";\nlet __ns_sfc__;\n__ns_sfc__ = /*@__PURE__*/_defineComponent({ __name: ${JSON.stringify(compName)} });`;
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
scriptTransformed = `import { defineComponent as _defineComponent } from "/ns/rt";\nlet __ns_sfc__;\n__ns_sfc__ = /*@__PURE__*/_defineComponent({});`;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// 6) Emit final inline module with diagnostics comment
|
|
297
|
+
const parts = [];
|
|
298
|
+
parts.push(`// [sfc-asm] ${base} (inline-compiled)`);
|
|
299
|
+
// Deterministic path: always use extracted helperBindings + renderDecl + scriptTransformed (ignore inlineBlock)
|
|
300
|
+
// Emit hoisted template bindings first
|
|
301
|
+
if (helperBindings)
|
|
302
|
+
parts.push(helperBindings);
|
|
303
|
+
// IMPORTANT: place script (with its imports) BEFORE renderDecl so imports never appear inside the render function.
|
|
304
|
+
parts.push(scriptTransformed);
|
|
305
|
+
parts.push(renderDecl);
|
|
306
|
+
parts.push(`try { if (!__ns_sfc__.render) Object.defineProperty(__ns_sfc__, 'render', { configurable: true, enumerable: true, get(){ const r = (typeof __ns_getRender==='function' ? __ns_getRender() : undefined); Object.defineProperty(__ns_sfc__, 'render', { value: r, writable: true, configurable: true, enumerable: true }); return r; }, set(v){ Object.defineProperty(__ns_sfc__, 'render', { value: v, writable: true, configurable: true, enumerable: true }); } }); } catch(_e){}`);
|
|
307
|
+
parts.push(`export function render(){ const f = (typeof __ns_getRender==='function' ? __ns_getRender() : (__ns_sfc__ && __ns_sfc__.render)); return typeof f==='function' ? f.apply(this, arguments) : undefined; }`);
|
|
308
|
+
parts.push(`export default __ns_sfc__`);
|
|
309
|
+
let inlineCode = parts.filter(Boolean).join('\n');
|
|
310
|
+
inlineCode = processCodeForDevice(inlineCode, false, true);
|
|
311
|
+
try {
|
|
312
|
+
inlineCode = ensureDestructureCoreImports(inlineCode);
|
|
313
|
+
}
|
|
314
|
+
catch { }
|
|
315
|
+
// Replace legacy mutation pipeline with canonical assembler for reliability
|
|
316
|
+
{
|
|
317
|
+
// First: strip TypeScript robustly using Babel transform
|
|
318
|
+
try {
|
|
319
|
+
const tsRes = await babelCore.transformAsync(scriptTransformed, {
|
|
320
|
+
plugins: [[pluginTransformTypescript, { allowDeclareFields: true }]],
|
|
321
|
+
ast: false,
|
|
322
|
+
sourceType: 'module',
|
|
323
|
+
configFile: false,
|
|
324
|
+
babelrc: false,
|
|
325
|
+
});
|
|
326
|
+
if (tsRes?.code)
|
|
327
|
+
scriptTransformed = tsRes.code;
|
|
328
|
+
}
|
|
329
|
+
catch (eTs) {
|
|
330
|
+
if (options.verbose) {
|
|
331
|
+
console.warn('[sfc-asm][babel-ts][fail]', base, eTs?.message);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Hoist imports + strip residual TS via AST
|
|
335
|
+
let importLines = [];
|
|
336
|
+
try {
|
|
337
|
+
const astRes = astExtractImportsAndStripTypes(scriptTransformed);
|
|
338
|
+
importLines = astRes.imports;
|
|
339
|
+
scriptTransformed = astRes.body;
|
|
340
|
+
if (astRes.diagnostics.length && options.verbose) {
|
|
341
|
+
console.warn('[sfc-asm][ast]', base, astRes.diagnostics.join('; '));
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (eAst) {
|
|
345
|
+
if (options.verbose) {
|
|
346
|
+
console.warn('[sfc-asm][ast][fail]', base, eAst?.message);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// Ensure renderDecl ends with closing brace ONLY for function declaration forms
|
|
350
|
+
// Avoid appending to const-assignment forms like: const __ns_render = (function(){ ... })();
|
|
351
|
+
if (renderDecl && /(^|\n)\s*(?:export\s+)?function\s+__ns_render\s*\(/.test(renderDecl) && !/\}\s*$/.test(renderDecl)) {
|
|
352
|
+
renderDecl = renderDecl.trimEnd() + '\n}';
|
|
353
|
+
}
|
|
354
|
+
const outParts = [];
|
|
355
|
+
outParts.push(`// [sfc-asm] ${base} (inline-compiled)`);
|
|
356
|
+
outParts.push('// [sfc-asm][canonical]');
|
|
357
|
+
if (importLines.length)
|
|
358
|
+
outParts.push(Array.from(new Set(importLines)).join('\n'));
|
|
359
|
+
// Place component script first so the component object exists before we attach render.
|
|
360
|
+
outParts.push(scriptTransformed);
|
|
361
|
+
// Prefer full template block to guarantee presence of all hoisted constants.
|
|
362
|
+
if (inlineBlock) {
|
|
363
|
+
outParts.push(inlineBlock);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
if (helperBindings)
|
|
367
|
+
outParts.push(helperBindings);
|
|
368
|
+
if (renderDecl && renderDecl.trim())
|
|
369
|
+
outParts.push(renderDecl);
|
|
370
|
+
}
|
|
371
|
+
outParts.push(`try { if (!__ns_sfc__.render) Object.defineProperty(__ns_sfc__, 'render', { configurable: true, enumerable: true, get(){ const r = (typeof __ns_getRender==='function' ? __ns_getRender() : (typeof __ns_render==='function' ? __ns_render : undefined)); Object.defineProperty(__ns_sfc__, 'render', { value: r, writable: true, configurable: true, enumerable: true }); return r; }, set(v){ Object.defineProperty(__ns_sfc__, 'render', { value: v, writable: true, configurable: true, enumerable: true }); } }); } catch(_e){}`);
|
|
372
|
+
// Export named render as a function that resolves lazily
|
|
373
|
+
outParts.push('export function render(){ const f = (typeof __ns_getRender==="function" ? __ns_getRender() : (typeof __ns_render==="function" ? __ns_render : (__ns_sfc__ && __ns_sfc__.render))); return typeof f === "function" ? f.apply(this, arguments) : undefined; }');
|
|
374
|
+
outParts.push('export default __ns_sfc__');
|
|
375
|
+
let inlineCode2 = outParts.filter(Boolean).join('\n');
|
|
376
|
+
inlineCode2 = processCodeForDevice(inlineCode2, false, true);
|
|
377
|
+
try {
|
|
378
|
+
inlineCode2 = ensureDestructureCoreImports(inlineCode2);
|
|
379
|
+
}
|
|
380
|
+
catch { }
|
|
381
|
+
// Hoist any late imports that accidentally landed after render or script assembly
|
|
382
|
+
try {
|
|
383
|
+
const lateImportRe = /^(?!\/\/).*^\s*import\s+[^;]+;?$/gm;
|
|
384
|
+
const allImports = [];
|
|
385
|
+
inlineCode2 = inlineCode2.replace(lateImportRe, (imp) => {
|
|
386
|
+
allImports.push(imp);
|
|
387
|
+
return '';
|
|
388
|
+
});
|
|
389
|
+
if (allImports.length) {
|
|
390
|
+
// Place after helperBindings sentinel
|
|
391
|
+
inlineCode2 = inlineCode2.replace(/(\/\/ \[sfc-asm\]\[canonical\]\n)/, `$1${Array.from(new Set(allImports)).join('\n')}\n/* [asm-fix] re-hoisted ${allImports.length} imports */\n`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
catch { }
|
|
395
|
+
// After hoisting, re-run AST normalization and duplicate-binding verification.
|
|
396
|
+
// This guards against freshly hoisted imports reintroducing identifiers that collide
|
|
397
|
+
// with earlier destructures (e.g., __ns_core_ns_1), which would otherwise surface at device runtime.
|
|
398
|
+
try {
|
|
399
|
+
inlineCode2 = astNormalizeModuleImportsAndHelpers(inlineCode2);
|
|
400
|
+
}
|
|
401
|
+
catch { }
|
|
402
|
+
try {
|
|
403
|
+
inlineCode2 = astVerifyAndAnnotateDuplicates(inlineCode2);
|
|
404
|
+
if (/^\s*\/\/ \[ast-verify\]\[duplicate-bindings\]/m.test(inlineCode2)) {
|
|
405
|
+
const diagnosticLine = (inlineCode2.match(/^\s*\/\/ \[ast-verify\]\[duplicate-bindings\][^\n]*/m) || [])[0] || '// [ast-verify][duplicate-bindings]';
|
|
406
|
+
const brief = diagnosticLine.replace(/^[^:]*:?\s?/, '');
|
|
407
|
+
const escaped = brief.replace(/["\\]/g, '\\$&');
|
|
408
|
+
const thrower = `throw new Error("[nsv-hmr] Duplicate top-level bindings detected post-hoist: ${escaped}");`;
|
|
409
|
+
inlineCode2 = `${thrower}\n` + inlineCode2;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
catch { }
|
|
413
|
+
// Minimal cleanup only (avoid destructive type stripping breaking object literal property defaults)
|
|
414
|
+
try {
|
|
415
|
+
// Heal cases where a TS type strip earlier removed initializer: plain 'default' inside props objects
|
|
416
|
+
// becomes 'default: undefined'. We only match when followed by ',' or '}' or newline to avoid 'export default'.
|
|
417
|
+
inlineCode2 = inlineCode2.replace(/\bdefault\b\s*(?=\}|,|\n)/g, 'default: undefined');
|
|
418
|
+
// Remove obvious leftover angle generic markers
|
|
419
|
+
inlineCode2 = inlineCode2.replace(/<unknown>/g, '');
|
|
420
|
+
// Fix accidental '}=> {' sequences
|
|
421
|
+
inlineCode2 = inlineCode2.replace(/}\s*=>\s*\{/g, '');
|
|
422
|
+
// No-op: removed prior broken normalization. Handlers are fixed in the dedicated passes below.
|
|
423
|
+
}
|
|
424
|
+
catch { }
|
|
425
|
+
// Removed redundant render closure heal that could inject an extra '}' before component script.
|
|
426
|
+
// Rewrite any remaining imports (e.g., relative app paths) to HTTP ESM endpoints
|
|
427
|
+
try {
|
|
428
|
+
inlineCode2 = rewriteImports(inlineCode2, base, options.sfcFileMap, options.depFileMap, projectRoot, !!options.verbose, undefined, getServerOrigin(server));
|
|
429
|
+
}
|
|
430
|
+
catch { }
|
|
431
|
+
// Final TS strip on the whole assembled module (safety net)
|
|
432
|
+
try {
|
|
433
|
+
const tsFinal = await babelCore.transformAsync(inlineCode2, {
|
|
434
|
+
plugins: [[pluginTransformTypescript, { allowDeclareFields: true }]],
|
|
435
|
+
ast: false,
|
|
436
|
+
sourceType: 'module',
|
|
437
|
+
configFile: false,
|
|
438
|
+
babelrc: false,
|
|
439
|
+
});
|
|
440
|
+
if (tsFinal?.code)
|
|
441
|
+
inlineCode2 = tsFinal.code;
|
|
442
|
+
}
|
|
443
|
+
catch { }
|
|
444
|
+
// Heal Vue v-model update handlers that lost the ": else" branch during transforms:
|
|
445
|
+
// "onUpdate:modelValue": _cache[N] || (_cache[N] = $event => _isRef(name) ? name.value = $event)
|
|
446
|
+
// → add else branch to keep syntax valid: : (name = $event)
|
|
447
|
+
try {
|
|
448
|
+
// Fix missing else branch on v-model handlers: support dotted expressions (e.g., $setup.acceptTerms)
|
|
449
|
+
const reMissingElse = /\"onUpdate:modelValue\"\s*:\s*_cache\[(\d+)\]\s*\|\|\s*\(_cache\[\1\]\s*=\s*\$event\s*=>\s*_isRef\(\s*([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\)\s*\?\s*\2\.value\s*=\s*\$event\s*\)/g;
|
|
450
|
+
inlineCode2 = inlineCode2.replace(reMissingElse, (_m, idx, expr) => {
|
|
451
|
+
return `\"onUpdate:modelValue\": _cache[${idx}] || (_cache[${idx}] = $event => (_isRef(${expr}) ? (${expr}.value = $event) : (${expr} = $event)))`;
|
|
452
|
+
});
|
|
453
|
+
// Repair malformed handlers without an arrow (introduced by previous transforms):
|
|
454
|
+
// Convert pattern assigning to $event without an arrow into a proper arrow using the same target expression.
|
|
455
|
+
const reMalformed = /\"onUpdate:modelValue\"\s*:\s*_cache\[(\d+)\]\s*\|\|\s*\(_cache\[\1\]\s*=\s*[^=]*\(\s*([A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*)\s*\)[^=]*=\s*\$event\s*\)\s*\)/g;
|
|
456
|
+
inlineCode2 = inlineCode2.replace(reMalformed, (_m, idx, expr) => {
|
|
457
|
+
return `\"onUpdate:modelValue\": _cache[${idx}] || (_cache[${idx}] = $event => (_isRef(${expr}) ? (${expr}.value = $event) : (${expr} = $event)))`;
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
catch { }
|
|
461
|
+
// Structural heal: ensure balanced braces before the first import statement
|
|
462
|
+
try {
|
|
463
|
+
const idx = inlineCode2.search(/^[\t ]*import\b/m);
|
|
464
|
+
if (idx > 0) {
|
|
465
|
+
const prefix = inlineCode2.slice(0, idx);
|
|
466
|
+
let open = 0, close = 0;
|
|
467
|
+
let inS = false, inD = false, inT = false, inLC = false, inBC = false;
|
|
468
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
469
|
+
const ch = prefix[i], nx = prefix[i + 1];
|
|
470
|
+
if (inLC) {
|
|
471
|
+
if (ch === '\n')
|
|
472
|
+
inLC = false;
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
if (inBC) {
|
|
476
|
+
if (ch === '*' && nx === '/') {
|
|
477
|
+
inBC = false;
|
|
478
|
+
i++;
|
|
479
|
+
}
|
|
480
|
+
continue;
|
|
481
|
+
}
|
|
482
|
+
if (inS) {
|
|
483
|
+
if (ch === '\\') {
|
|
484
|
+
i++;
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (ch === "'")
|
|
488
|
+
inS = false;
|
|
489
|
+
continue;
|
|
490
|
+
}
|
|
491
|
+
if (inD) {
|
|
492
|
+
if (ch === '\\') {
|
|
493
|
+
i++;
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
496
|
+
if (ch === '"')
|
|
497
|
+
inD = false;
|
|
498
|
+
continue;
|
|
499
|
+
}
|
|
500
|
+
if (inT) {
|
|
501
|
+
if (ch === '\\') {
|
|
502
|
+
i++;
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
if (ch === '`')
|
|
506
|
+
inT = false;
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
if (ch === '/' && nx === '/') {
|
|
510
|
+
inLC = true;
|
|
511
|
+
i++;
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
if (ch === '/' && nx === '*') {
|
|
515
|
+
inBC = true;
|
|
516
|
+
i++;
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
if (ch === "'") {
|
|
520
|
+
inS = true;
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
if (ch === '"') {
|
|
524
|
+
inD = true;
|
|
525
|
+
continue;
|
|
526
|
+
}
|
|
527
|
+
if (ch === '`') {
|
|
528
|
+
inT = true;
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
if (ch === '{')
|
|
532
|
+
open++;
|
|
533
|
+
else if (ch === '}')
|
|
534
|
+
close++;
|
|
535
|
+
}
|
|
536
|
+
const missing = open - close;
|
|
537
|
+
if (missing > 0) {
|
|
538
|
+
inlineCode2 = inlineCode2.slice(0, idx) + '}'.repeat(missing) + '\n' + inlineCode2.slice(idx);
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
catch { }
|
|
543
|
+
// Final TS strip on the whole assembled module (safety net)
|
|
544
|
+
try {
|
|
545
|
+
const tsFinal = await babelCore.transformAsync(inlineCode2, {
|
|
546
|
+
plugins: [[pluginTransformTypescript, { allowDeclareFields: true }]],
|
|
547
|
+
ast: false,
|
|
548
|
+
sourceType: 'module',
|
|
549
|
+
configFile: false,
|
|
550
|
+
babelrc: false,
|
|
551
|
+
});
|
|
552
|
+
if (tsFinal?.code)
|
|
553
|
+
inlineCode2 = tsFinal.code;
|
|
554
|
+
}
|
|
555
|
+
catch { }
|
|
556
|
+
inlineCode2 = ensureVariableDynamicImportHelper(inlineCode2);
|
|
557
|
+
inlineCode2 = ensureGuardPlainDynamicImports(inlineCode2);
|
|
558
|
+
inlineCode2 = REQUIRE_GUARD_SNIPPET + inlineCode2;
|
|
559
|
+
// If no render materialized, return a clear error module for deterministic failure
|
|
560
|
+
try {
|
|
561
|
+
const lacksRender = !/__ns_render\b/.test(inlineCode2) && !/__ns_sfc__\.render\s*=/.test(inlineCode2);
|
|
562
|
+
if (lacksRender) {
|
|
563
|
+
const err = `throw new Error(\"[sfc-asm] ${base}: no render generated by assembler\");\nexport default {};`;
|
|
564
|
+
res.statusCode = 200;
|
|
565
|
+
res.end(err);
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
catch { }
|
|
570
|
+
// Cosmetic and parser-friendly: ensure a newline after the canonical banner
|
|
571
|
+
try {
|
|
572
|
+
inlineCode2 = inlineCode2.replace(/(\/\/ \[sfc-asm\]\[canonical\])(?!\n)/, '$1\n');
|
|
573
|
+
}
|
|
574
|
+
catch { }
|
|
575
|
+
// Bust device cache for runtime bridge so helpers are always current for this graph version
|
|
576
|
+
try {
|
|
577
|
+
const origin = getServerOrigin(server);
|
|
578
|
+
inlineCode2 = ensureVersionedRtImports(inlineCode2, origin, Number(ver));
|
|
579
|
+
inlineCode2 = strategy.ensureVersionedImports?.(inlineCode2, origin, Number(ver)) ?? inlineCode2;
|
|
580
|
+
}
|
|
581
|
+
catch { }
|
|
582
|
+
// Normalize imports/helpers via AST to ensure _defineComponent and other helpers are bound once
|
|
583
|
+
try {
|
|
584
|
+
inlineCode2 = astNormalizeModuleImportsAndHelpers(inlineCode2);
|
|
585
|
+
}
|
|
586
|
+
catch { }
|
|
587
|
+
// Guarantee a concrete component object exists before exporting default.
|
|
588
|
+
try {
|
|
589
|
+
// Detect an existing declaration of __ns_sfc__ even if it's appended after a semicolon on the same line
|
|
590
|
+
// e.g., "import ...;let __ns_sfc__;" (no newline). Accept start-of-string, newline, or semicolon as anchors.
|
|
591
|
+
const hasDecl = /(^|[\n;])\s*(?:const|let|var)\s+__ns_sfc__\b/.test(inlineCode2);
|
|
592
|
+
if (!hasDecl) {
|
|
593
|
+
inlineCode2 = inlineCode2.replace(/(\/\/ \[sfc-asm\]\[canonical\]\n)/, `$1let __ns_sfc__ = {};\n`);
|
|
594
|
+
}
|
|
595
|
+
// Heal empty declarations (e.g., "let __ns_sfc__;" → initialize to {}), also when preceded by a semicolon
|
|
596
|
+
inlineCode2 = inlineCode2.replace(/(^|[\n;])\s*let\s+__ns_sfc__\s*;?/g, '$1let __ns_sfc__ = {};');
|
|
597
|
+
inlineCode2 = inlineCode2.replace(/(^|[\n;])\s*var\s+__ns_sfc__\s*;?/g, '$1var __ns_sfc__ = {};');
|
|
598
|
+
}
|
|
599
|
+
catch { }
|
|
600
|
+
if (!/export\s+default\s+__ns_sfc__/.test(inlineCode2) && /__ns_sfc__/.test(inlineCode2))
|
|
601
|
+
inlineCode2 += '\nexport default __ns_sfc__';
|
|
602
|
+
res.statusCode = 200;
|
|
603
|
+
res.end(inlineCode2);
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
catch { }
|
|
609
|
+
// Do not use compiled ?vue or variant fallbacks; assembler must succeed or emit an error
|
|
610
|
+
// Prefer compiling template from source via compiler-sfc; fallback to variant extraction
|
|
611
|
+
let inlineOk = false;
|
|
612
|
+
let helperBindings = '';
|
|
613
|
+
let renderDecl = '';
|
|
614
|
+
let inlineBlock = undefined;
|
|
615
|
+
try {
|
|
616
|
+
const root = server.config?.root || process.cwd();
|
|
617
|
+
const abs = path.join(root, base.replace(/^\//, ''));
|
|
618
|
+
let sfcSrc = '';
|
|
619
|
+
try {
|
|
620
|
+
sfcSrc = readFileSync(abs, 'utf-8');
|
|
621
|
+
}
|
|
622
|
+
catch { }
|
|
623
|
+
if (sfcSrc) {
|
|
624
|
+
const { descriptor } = parse(sfcSrc, { filename: abs });
|
|
625
|
+
const tpl = descriptor.template?.content || '';
|
|
626
|
+
if (tpl) {
|
|
627
|
+
const id = createHash('md5').update(abs).digest('hex').slice(0, 8);
|
|
628
|
+
const ct = compileTemplate({
|
|
629
|
+
source: tpl,
|
|
630
|
+
id,
|
|
631
|
+
filename: abs,
|
|
632
|
+
isProd: false,
|
|
633
|
+
ssr: false,
|
|
634
|
+
compilerOptions: {
|
|
635
|
+
isCustomElement: (tag) => NS_NATIVE_TAGS.has(tag),
|
|
636
|
+
},
|
|
637
|
+
});
|
|
638
|
+
let compiled = (ct && (ct.code || '')) || '';
|
|
639
|
+
if (compiled) {
|
|
640
|
+
// Prefer a full inline template block preserving hoists
|
|
641
|
+
inlineBlock = buildInlineTemplateBlock(compiled) || undefined;
|
|
642
|
+
if (inlineBlock) {
|
|
643
|
+
inlineOk = true;
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
const extracted = extractTemplateRender(compiled);
|
|
647
|
+
inlineOk = extracted.ok;
|
|
648
|
+
helperBindings = extracted.helperBindings;
|
|
649
|
+
renderDecl = extracted.renderDecl;
|
|
650
|
+
inlineBlock = extracted.inlineBlock;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
catch { }
|
|
657
|
+
// If compiler-sfc path didn't succeed, attempt variant extraction once
|
|
658
|
+
if (!inlineOk) {
|
|
659
|
+
const extracted = extractTemplateRender(templateCode);
|
|
660
|
+
inlineOk = extracted.ok;
|
|
661
|
+
helperBindings = extracted.helperBindings;
|
|
662
|
+
renderDecl = extracted.renderDecl;
|
|
663
|
+
inlineBlock = extracted.inlineBlock;
|
|
664
|
+
}
|
|
665
|
+
let asm;
|
|
666
|
+
if (inlineOk) {
|
|
667
|
+
if (inlineBlock && inlineBlock.trim()) {
|
|
668
|
+
asm = [`// [sfc-asm] ${base} (inlined template body)`, `export * from ${JSON.stringify(scriptUrl)};`, `import * as __script from ${JSON.stringify(scriptUrl)};`, inlineBlock, `const __ns_sfc__ = (__script && __script.default) ? __script.default : {};`, `try { if (typeof __ns_render === 'function' && !__ns_sfc__.render) __ns_sfc__.render = __ns_render; } catch {}`, `export default __ns_sfc__;`].join('\n');
|
|
669
|
+
}
|
|
670
|
+
else {
|
|
671
|
+
asm = [`// [sfc-asm] ${base} (inlined template)`, `export * from ${JSON.stringify(scriptUrl)};`, `import * as __script from ${JSON.stringify(scriptUrl)};`, helperBindings, renderDecl, `const __ns_sfc__ = (__script && __script.default) ? __script.default : {};`, `try { if (typeof __ns_render === 'function' && !__ns_sfc__.render) __ns_sfc__.render = __ns_render; } catch {}`, `export default __ns_sfc__;`].filter(Boolean).join('\n');
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
else {
|
|
675
|
+
// Deterministic error path when template extraction failed
|
|
676
|
+
res.statusCode = 500;
|
|
677
|
+
res.end(`throw new Error('[sfc-asm] ${base}: template extraction failed');\nexport default {};`);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
// Run full device processing so helper aliasing and globals are consistent in this path too
|
|
681
|
+
let code = REQUIRE_GUARD_SNIPPET + asm;
|
|
682
|
+
code = processCodeForDevice(code, false, true, /(?:^|\/)node_modules\//.test(base), base);
|
|
683
|
+
code = rewriteImports(code, base, options.sfcFileMap, options.depFileMap, projectRoot, !!options.verbose, undefined, getServerOrigin(server));
|
|
684
|
+
try {
|
|
685
|
+
code = ensureDestructureCoreImports(code);
|
|
686
|
+
}
|
|
687
|
+
catch { }
|
|
688
|
+
code = ensureVariableDynamicImportHelper(code);
|
|
689
|
+
code = ensureGuardPlainDynamicImports(code);
|
|
690
|
+
try {
|
|
691
|
+
const origin = getServerOrigin(server);
|
|
692
|
+
code = ensureVersionedRtImports(code, origin, Number(ver));
|
|
693
|
+
code = strategy.ensureVersionedImports?.(code, origin, Number(ver)) ?? code;
|
|
694
|
+
}
|
|
695
|
+
catch { }
|
|
696
|
+
// Inline-template body path already runs processCodeForDevice (AST + sanitizers); no additional _defineComponent fix needed
|
|
697
|
+
res.statusCode = 200;
|
|
698
|
+
res.end(code);
|
|
699
|
+
}
|
|
700
|
+
catch (e) {
|
|
701
|
+
res.statusCode = 500;
|
|
702
|
+
res.end('export {}\n');
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
//# sourceMappingURL=sfc-route-assemble.js.map
|