From c8849980bbbfa28f7fd08766da7ba0867a798ecd Mon Sep 17 00:00:00 2001 From: Michael Rawlings Date: Thu, 30 Nov 2023 13:19:35 -0500 Subject: [PATCH] refactor: prepare for renderBody/event interop from tags to class --- .../src/node_modules/@internal/components-entry/index.js | 4 +++- packages/marko/src/runtime/helpers/tags-compat-html.js | 9 ++++++--- packages/runtime/src/html/index.ts | 7 ++++++- packages/runtime/src/html/serializer.ts | 4 ++++ packages/translator/src/visitors/tag/custom-tag.ts | 1 + 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/marko/src/node_modules/@internal/components-entry/index.js b/packages/marko/src/node_modules/@internal/components-entry/index.js index 1076ab248..11df4e26b 100644 --- a/packages/marko/src/node_modules/@internal/components-entry/index.js +++ b/packages/marko/src/node_modules/@internal/components-entry/index.js @@ -1,6 +1,7 @@ "use strict"; var warp10 = require("warp10"); +var w10NOOP = require("warp10/constants").NOOP; var safeJSONRegExp = /<\/|\u2028|\u2029/g; var IGNORE_GLOBAL_TYPES = new Set(["undefined", "function", "symbol"]); var DEFAULT_RUNTIME_ID = "M"; @@ -70,13 +71,14 @@ function addComponentsFromContext(componentsContext, componentsToHydrate) { var customEvents = component.___customEvents; var scope = component.___scope; var bubblingDomEvents = component.___bubblingDomEvents; + var renderBody = input.renderBody; var state; var serializedProps; var undefinedPropNames; if (flags & FLAG_WILL_RERENDER_IN_BROWSER) { - if (typeof input.renderBody === "function") { + if (typeof renderBody === "function" && renderBody.toJSON && renderBody.toJSON() === w10NOOP) { flags |= FLAG_HAS_RENDER_BODY; input.renderBody = undefined; } diff --git a/packages/marko/src/runtime/helpers/tags-compat-html.js b/packages/marko/src/runtime/helpers/tags-compat-html.js index 994c38651..b01540399 100644 --- a/packages/marko/src/runtime/helpers/tags-compat-html.js +++ b/packages/marko/src/runtime/helpers/tags-compat-html.js @@ -16,9 +16,12 @@ const { nextScopeId, } = tagsAPI; -// const w10NOOP = require("warp10/constants").NOOP; +const w10NOOP = require("warp10/constants").NOOP; const RENDER_BODY_TO_JSON = function () { - return { ___isTagsAPI: true }; + // TODO: this should instead return an object that contains getRegistryInfo + // then in the dom-compat, handle that object to lookup the function in the registry + // (we also need to do this for events) + return w10NOOP; }; const isMarko6 = (fn) => !!fn.___isTagsAPI; @@ -32,7 +35,7 @@ export default dynamicTag5.___runtimeCompat = function tagsToVdom( if (tagsRenderer ? isMarko5(tagsRenderer) : isMarko5(renderBody)) return tagsRenderer; - if (renderBody) { + if (!tagsRenderer && renderBody) { renderBody.toJSON = RENDER_BODY_TO_JSON; } diff --git a/packages/runtime/src/html/index.ts b/packages/runtime/src/html/index.ts index ac9ac57ea..4934d8dc0 100644 --- a/packages/runtime/src/html/index.ts +++ b/packages/runtime/src/html/index.ts @@ -30,6 +30,11 @@ export { export { createTemplate } from "./template"; -export { register, makeSerializable, serializedScope } from "./serializer"; +export { + register, + makeSerializable, + serializedScope, + getRegistryInfo, +} from "./serializer"; export { pushContext, popContext, getInContext } from "../common/context"; diff --git a/packages/runtime/src/html/serializer.ts b/packages/runtime/src/html/serializer.ts index bb777d713..6f52c3383 100644 --- a/packages/runtime/src/html/serializer.ts +++ b/packages/runtime/src/html/serializer.ts @@ -39,6 +39,10 @@ export function register( return entry as Serializable; } +export function getRegistryInfo(entry: Serializable) { + return [entry[SYMBOL_REGISTRY_ID], entry[SYMBOL_SCOPE]]; +} + export function makeSerializable( object: T, serialize: (s: Serializer, accessor: string | number) => void diff --git a/packages/translator/src/visitors/tag/custom-tag.ts b/packages/translator/src/visitors/tag/custom-tag.ts index 318616ead..ed7e64c4e 100644 --- a/packages/translator/src/visitors/tag/custom-tag.ts +++ b/packages/translator/src/visitors/tag/custom-tag.ts @@ -69,6 +69,7 @@ export default { if (hasInteractiveChild) { (currentProgramPath.node.extra ?? {}).hasInteractiveChild = true; + // TODO: should check individual inputs to see if they are intersecting with state } }, exit(tag: t.NodePath) {