tungsten 0.3.2 → 0.3.3
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/dist/.build-complete +1 -0
- package/dist/Framework.d.ts +2 -0
- package/dist/Framework.d.ts.map +1 -1
- package/dist/Framework.js +68 -57
- package/dist/FrameworkConfig.d.ts +2 -0
- package/dist/FrameworkConfig.d.ts.map +1 -1
- package/dist/Instance/Instance.d.ts.map +1 -1
- package/dist/Instance/Instance.js +18 -1
- package/dist/Instance/InstanceConfig.d.ts +1 -0
- package/dist/Instance/InstanceConfig.d.ts.map +1 -1
- package/dist/PopMessage.type.d.ts +6 -0
- package/dist/PopMessage.type.d.ts.map +1 -0
- package/dist/PopMessage.type.js +1 -0
- package/dist/Servers/DevServer.d.ts +2 -0
- package/dist/Servers/DevServer.d.ts.map +1 -1
- package/dist/Servers/DevServer.js +84 -8
- package/dist/Servers/MatchedRouteInfo.d.ts +1 -1
- package/dist/Servers/MatchedRouteInfo.d.ts.map +1 -1
- package/dist/Servers/ProdServer.d.ts +1 -0
- package/dist/Servers/ProdServer.d.ts.map +1 -1
- package/dist/Servers/ProdServer.js +79 -5
- package/dist/Servers/hono/DevServerHono.js +25 -29
- package/dist/Servers/hono/ProdServerHono.js +49 -142
- package/dist/Servers/hono/TungstenServerHono.d.ts +1 -1
- package/dist/Servers/hono/TungstenServerHono.d.ts.map +1 -1
- package/dist/Servers/hono/TungstenServerHono.js +12 -29
- package/dist/Servers/routing.d.ts.map +1 -1
- package/dist/Servers/routing.js +10 -6
- package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts +0 -3
- package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts.map +1 -1
- package/dist/Servers/tungstenCorePrivateEnvSchema.js +3 -3
- package/dist/Servers/tungstenCorePublicEnvSchema.d.ts +8 -0
- package/dist/Servers/tungstenCorePublicEnvSchema.d.ts.map +1 -0
- package/dist/Servers/tungstenCorePublicEnvSchema.js +14 -0
- package/dist/Store/InternalStoreSchema.d.ts +2 -0
- package/dist/Store/InternalStoreSchema.d.ts.map +1 -1
- package/dist/Store/InternalStoreSchema.js +1 -0
- package/dist/api/Request.d.ts +1 -1
- package/dist/api/Request.d.ts.map +1 -1
- package/dist/api/Response.d.ts +1 -1
- package/dist/api/Response.d.ts.map +1 -1
- package/dist/babelPlugins/BabelTypes.d.ts +2 -2
- package/dist/babelPlugins/BabelTypes.d.ts.map +1 -1
- package/dist/babelPlugins/BabelTypes.js +0 -1
- package/dist/bin/commands/build.d.ts.map +1 -1
- package/dist/bin/commands/build.js +3 -0
- package/dist/bin/commands/dev.d.ts.map +1 -1
- package/dist/bin/commands/dev.js +15 -4
- package/dist/bin/commands/devmon.d.ts +2 -0
- package/dist/bin/commands/devmon.d.ts.map +1 -0
- package/dist/bin/commands/devmon.js +66 -0
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +6 -0
- package/dist/booleanAttributeValue.d.ts +21 -0
- package/dist/booleanAttributeValue.d.ts.map +1 -0
- package/dist/booleanAttributeValue.js +23 -0
- package/dist/build/compileJavascript.js +1 -1
- package/dist/build/compileUserApp.d.ts +2 -1
- package/dist/build/compileUserApp.d.ts.map +1 -1
- package/dist/build/compileUserApp.js +8 -7
- package/dist/build/createInstanceConfigFile.js +1 -1
- package/dist/compat/types.d.ts +1 -1
- package/dist/compat/types.d.ts.map +1 -1
- package/dist/components/PopMessages.d.ts +12 -0
- package/dist/components/PopMessages.d.ts.map +1 -0
- package/dist/components/PopMessages.js +45 -0
- package/dist/defaultConfig.d.ts +1 -0
- package/dist/defaultConfig.d.ts.map +1 -1
- package/dist/defaultConfig.js +2 -1
- package/dist/env/Interfaces.d.ts +2 -1
- package/dist/env/Interfaces.d.ts.map +1 -1
- package/dist/env/getEnvSchemas.d.ts +1 -1
- package/dist/env/getEnvSchemas.d.ts.map +1 -1
- package/dist/env/publicEnv.d.ts.map +1 -1
- package/dist/env/publicEnv.js +4 -1
- package/dist/frameworkConfigSchema.d.ts +4 -0
- package/dist/frameworkConfigSchema.d.ts.map +1 -1
- package/dist/frameworkConfigSchema.js +2 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useInstance.d.ts +3 -0
- package/dist/hooks/useInstance.d.ts.map +1 -0
- package/dist/hooks/useInstance.js +4 -0
- package/dist/hydrate/hydrate.d.ts +6 -4
- package/dist/hydrate/hydrate.d.ts.map +1 -1
- package/dist/hydrate/hydrate.js +51 -13
- package/dist/hydrate/reconcileHydratedAttributes.d.ts.map +1 -1
- package/dist/hydrate/reconcileHydratedAttributes.js +4 -3
- package/dist/hydrate/renderHydrationMismatchBanner.d.ts +7 -0
- package/dist/hydrate/renderHydrationMismatchBanner.d.ts.map +1 -0
- package/dist/hydrate/renderHydrationMismatchBanner.js +69 -0
- package/dist/indexInner.d.ts +8 -0
- package/dist/indexInner.d.ts.map +1 -1
- package/dist/indexInner.js +7 -1
- package/dist/makeInstanceConfigFromFrameworkConfig.d.ts.map +1 -1
- package/dist/makeInstanceConfigFromFrameworkConfig.js +2 -1
- package/dist/pop.d.ts +10 -0
- package/dist/pop.d.ts.map +1 -0
- package/dist/pop.js +49 -0
- package/dist/rawHtml/filterContentNode.d.ts +20 -0
- package/dist/rawHtml/filterContentNode.d.ts.map +1 -0
- package/dist/rawHtml/filterContentNode.js +96 -0
- package/dist/rawHtml/parseHtml.d.ts +14 -0
- package/dist/rawHtml/parseHtml.d.ts.map +1 -1
- package/dist/rawHtml/parseHtml.js +4 -4
- package/dist/rawHtml/sanitizeHtml.d.ts +17 -0
- package/dist/rawHtml/sanitizeHtml.d.ts.map +1 -0
- package/dist/rawHtml/sanitizeHtml.js +19 -0
- package/dist/render/HeadData.d.ts +1 -0
- package/dist/render/HeadData.d.ts.map +1 -1
- package/dist/render/contentNodeToHtml.d.ts +18 -0
- package/dist/render/contentNodeToHtml.d.ts.map +1 -0
- package/dist/render/contentNodeToHtml.js +66 -0
- package/dist/render/contentToHtml.d.ts.map +1 -1
- package/dist/render/contentToHtml.js +2 -1
- package/dist/render/processHead.d.ts.map +1 -1
- package/dist/render/processHead.js +8 -2
- package/dist/render/renderingTreeToHtml.d.ts.map +1 -1
- package/dist/render/renderingTreeToHtml.js +8 -1
- package/dist/routing/ErrorRouteType.d.ts +6 -0
- package/dist/routing/ErrorRouteType.d.ts.map +1 -0
- package/dist/routing/ErrorRouteType.js +1 -0
- package/dist/routing/RouteTypes.d.ts +2 -1
- package/dist/routing/RouteTypes.d.ts.map +1 -1
- package/dist/routing/Routes.d.ts +5 -0
- package/dist/routing/Routes.d.ts.map +1 -1
- package/dist/routing/TungstenErrorInfo.d.ts +6 -0
- package/dist/routing/TungstenErrorInfo.d.ts.map +1 -0
- package/dist/routing/TungstenErrorInfo.js +6 -0
- package/dist/style/styleContentSxy.js +21 -0
- package/dist/testing/hydrateTestApp.d.ts +38 -0
- package/dist/testing/hydrateTestApp.d.ts.map +1 -0
- package/dist/testing/hydrateTestApp.js +242 -0
- package/dist/testing/index.d.ts +4 -3
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +16 -2
- package/dist/timeProfiler.d.ts +6 -0
- package/dist/timeProfiler.d.ts.map +1 -0
- package/dist/timeProfiler.js +31 -0
- package/dist/update/integrateUpdateVdom.d.ts +11 -0
- package/dist/update/integrateUpdateVdom.d.ts.map +1 -1
- package/dist/update/integrateUpdateVdom.js +9 -3
- package/dist/warnOnFrameworkChange.d.ts.map +1 -1
- package/dist/warnOnFrameworkChange.js +8 -8
- package/package.json +18 -16
- package/dist/FunctionComponentStandIn.sxyt.d.ts +0 -2
- package/dist/FunctionComponentStandIn.sxyt.d.ts.map +0 -1
- package/dist/FunctionComponentStandIn.sxyt.js +0 -52
- package/dist/Instance/gotoRedirect.sxyt.d.ts +0 -2
- package/dist/Instance/gotoRedirect.sxyt.d.ts.map +0 -1
- package/dist/Instance/gotoRedirect.sxyt.js +0 -148
- package/dist/Instance/runTrackedWork.sxyt.d.ts +0 -2
- package/dist/Instance/runTrackedWork.sxyt.d.ts.map +0 -1
- package/dist/Instance/runTrackedWork.sxyt.js +0 -35
- package/dist/Servers/devErrorPageAutoRetry.sxyt.d.ts +0 -2
- package/dist/Servers/devErrorPageAutoRetry.sxyt.d.ts.map +0 -1
- package/dist/Servers/devErrorPageAutoRetry.sxyt.js +0 -117
- package/dist/_client/cjsHelpers.sxyt.d.ts +0 -2
- package/dist/_client/cjsHelpers.sxyt.d.ts.map +0 -1
- package/dist/_client/cjsHelpers.sxyt.js +0 -45
- package/dist/auth/passwordHashing.sxyt.d.ts +0 -2
- package/dist/auth/passwordHashing.sxyt.d.ts.map +0 -1
- package/dist/auth/passwordHashing.sxyt.js +0 -46
- package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts +0 -2
- package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts.map +0 -1
- package/dist/auth/ref/checkPasswordResetToken.sxyt.js +0 -40
- package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts +0 -2
- package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts.map +0 -1
- package/dist/auth/ref/createPasswordResetToken.sxyt.js +0 -10
- package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.d.ts +0 -2
- package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.d.ts.map +0 -1
- package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.js +0 -138
- package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts +0 -2
- package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts.map +0 -1
- package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.js +0 -108
- package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts +0 -2
- package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts.map +0 -1
- package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.js +0 -104
- package/dist/bin/commands/compile.sxyt.d.ts +0 -2
- package/dist/bin/commands/compile.sxyt.d.ts.map +0 -1
- package/dist/bin/commands/compile.sxyt.js +0 -255
- package/dist/build/modifySassImports.sxyt.d.ts +0 -2
- package/dist/build/modifySassImports.sxyt.d.ts.map +0 -1
- package/dist/build/modifySassImports.sxyt.js +0 -55
- package/dist/build/sassImportParser.sxyt.d.ts +0 -2
- package/dist/build/sassImportParser.sxyt.d.ts.map +0 -1
- package/dist/build/sassImportParser.sxyt.js +0 -110
- package/dist/build/scssImportParserChatgpt.sxyt.d.ts +0 -2
- package/dist/build/scssImportParserChatgpt.sxyt.d.ts.map +0 -1
- package/dist/build/scssImportParserChatgpt.sxyt.js +0 -120
- package/dist/clone.sxyt.d.ts +0 -2
- package/dist/clone.sxyt.d.ts.map +0 -1
- package/dist/clone.sxyt.js +0 -24
- package/dist/componentProxyHandlers.sxyt.d.ts +0 -2
- package/dist/componentProxyHandlers.sxyt.d.ts.map +0 -1
- package/dist/componentProxyHandlers.sxyt.js +0 -130
- package/dist/components/RawHtml.sxyt.d.ts +0 -2
- package/dist/components/RawHtml.sxyt.d.ts.map +0 -1
- package/dist/components/RawHtml.sxyt.js +0 -104
- package/dist/components/bindable/BindableSelect.sxyt.d.ts +0 -2
- package/dist/components/bindable/BindableSelect.sxyt.d.ts.map +0 -1
- package/dist/components/bindable/BindableSelect.sxyt.js +0 -186
- package/dist/env/injectEnv.sxyt.d.ts +0 -2
- package/dist/env/injectEnv.sxyt.d.ts.map +0 -1
- package/dist/env/injectEnv.sxyt.js +0 -20
- package/dist/env/parseEnv.sxyt.d.ts +0 -2
- package/dist/env/parseEnv.sxyt.d.ts.map +0 -1
- package/dist/env/parseEnv.sxyt.js +0 -11
- package/dist/findProjectDir.sxyt.d.ts +0 -2
- package/dist/findProjectDir.sxyt.d.ts.map +0 -1
- package/dist/findProjectDir.sxyt.js +0 -82
- package/dist/hmr/applyHmrModule.sxyt.d.ts +0 -2
- package/dist/hmr/applyHmrModule.sxyt.d.ts.map +0 -1
- package/dist/hmr/applyHmrModule.sxyt.js +0 -182
- package/dist/hmr/instanceRegistry.sxyt.d.ts +0 -2
- package/dist/hmr/instanceRegistry.sxyt.d.ts.map +0 -1
- package/dist/hmr/instanceRegistry.sxyt.js +0 -24
- package/dist/hmr/refreshStylesheets.sxyt.d.ts +0 -2
- package/dist/hmr/refreshStylesheets.sxyt.d.ts.map +0 -1
- package/dist/hmr/refreshStylesheets.sxyt.js +0 -46
- package/dist/hydrate/hydrate.sxyt.d.ts +0 -2
- package/dist/hydrate/hydrate.sxyt.d.ts.map +0 -1
- package/dist/hydrate/hydrate.sxyt.js +0 -302
- package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts +0 -2
- package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts.map +0 -1
- package/dist/hydrate/reconcileHydratedAttributes.sxyt.js +0 -190
- package/dist/importDevModuleWithRetry.sxyt.d.ts +0 -2
- package/dist/importDevModuleWithRetry.sxyt.d.ts.map +0 -1
- package/dist/importDevModuleWithRetry.sxyt.js +0 -104
- package/dist/innerHtmlFromProps.sxyt.d.ts +0 -2
- package/dist/innerHtmlFromProps.sxyt.d.ts.map +0 -1
- package/dist/innerHtmlFromProps.sxyt.js +0 -99
- package/dist/postcssPlugins/parseSelectors.sxyt.d.ts +0 -2
- package/dist/postcssPlugins/parseSelectors.sxyt.d.ts.map +0 -1
- package/dist/postcssPlugins/parseSelectors.sxyt.js +0 -62
- package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts +0 -2
- package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts.map +0 -1
- package/dist/postcssPlugins/parseSelectorsRich.sxyt.js +0 -155
- package/dist/rawHtml/parseHtml.sxyt.d.ts +0 -2
- package/dist/rawHtml/parseHtml.sxyt.d.ts.map +0 -1
- package/dist/rawHtml/parseHtml.sxyt.js +0 -239
- package/dist/render/getFunctionBodyAsString.sxyt.d.ts +0 -2
- package/dist/render/getFunctionBodyAsString.sxyt.d.ts.map +0 -1
- package/dist/render/getFunctionBodyAsString.sxyt.js +0 -37
- package/dist/render/processHead.sxyt.d.ts +0 -2
- package/dist/render/processHead.sxyt.d.ts.map +0 -1
- package/dist/render/processHead.sxyt.js +0 -93
- package/dist/render/processProps.sxyt.d.ts +0 -2
- package/dist/render/processProps.sxyt.d.ts.map +0 -1
- package/dist/render/processProps.sxyt.js +0 -90
- package/dist/routing/compareRequestToRegex.sxyt.d.ts +0 -2
- package/dist/routing/compareRequestToRegex.sxyt.d.ts.map +0 -1
- package/dist/routing/compareRequestToRegex.sxyt.js +0 -65
- package/dist/routing/getPathPriority.sxyt.d.ts +0 -2
- package/dist/routing/getPathPriority.sxyt.d.ts.map +0 -1
- package/dist/routing/getPathPriority.sxyt.js +0 -24
- package/dist/routing/matchPath.sxyt.d.ts +0 -2
- package/dist/routing/matchPath.sxyt.d.ts.map +0 -1
- package/dist/routing/matchPath.sxyt.js +0 -41
- package/dist/routing/patternToRegex.sxyt.d.ts +0 -2
- package/dist/routing/patternToRegex.sxyt.d.ts.map +0 -1
- package/dist/routing/patternToRegex.sxyt.js +0 -69
- package/dist/routing/splitRequest.sxyt.d.ts +0 -2
- package/dist/routing/splitRequest.sxyt.d.ts.map +0 -1
- package/dist/routing/splitRequest.sxyt.js +0 -47
- package/dist/style/jssToCss.sxyt.d.ts +0 -2
- package/dist/style/jssToCss.sxyt.d.ts.map +0 -1
- package/dist/style/jssToCss.sxyt.js +0 -17
- package/dist/testing/createTestApp.sxyt.d.ts +0 -2
- package/dist/testing/createTestApp.sxyt.d.ts.map +0 -1
- package/dist/testing/createTestApp.sxyt.js +0 -470
- package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts +0 -2
- package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts.map +0 -1
- package/dist/testing/ensureTestEnvLoaded.sxyt.js +0 -20
- package/dist/update/hotSwap.sxyt.d.ts +0 -2
- package/dist/update/hotSwap.sxyt.d.ts.map +0 -1
- package/dist/update/hotSwap.sxyt.js +0 -252
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
2
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
3
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
4
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
6
|
+
function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
7
|
+
function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
|
|
8
|
+
function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
|
|
9
|
+
import { $props, $type } from "../contentNodeSymbols.js";
|
|
10
|
+
import { Instance } from "../Instance/Instance.js";
|
|
11
|
+
import { hydrateRootComponent } from "../hydrate/hydrate.js";
|
|
12
|
+
import { contentTreeToRenderingTree } from "../render/contentTreeToRenderingTree.js";
|
|
13
|
+
import { renderingNodeToHtml } from "../render/renderingTreeToHtml.js";
|
|
14
|
+
import { initStores } from "../Servers/initStores.js";
|
|
15
|
+
import { deleteNodeIfRendered } from "../update/integrateUpdateVdom.js";
|
|
16
|
+
import { UpdateScheduler } from "../update/UpdateScheduler.js";
|
|
17
|
+
import { DomPointer } from "../DomPointer.js";
|
|
18
|
+
import { ensureTestEnvLoaded } from "./ensureTestEnvLoaded.js";
|
|
19
|
+
// hydrate.tsx references several DOM globals directly (Node.COMMENT_NODE, `instanceof Text`, the
|
|
20
|
+
// bare `document`) the way real browser code always can - happy-dom only puts these on its own
|
|
21
|
+
// Window, not on Node.js's global scope. Every hand-written hydration test before this harness
|
|
22
|
+
// bridged them manually; a caller of hydrateTestApp() shouldn't need to know that hydrate() was
|
|
23
|
+
// written assuming a real browser to begin with.
|
|
24
|
+
function bridgeHappyDomGlobals(document) {
|
|
25
|
+
const window = document.defaultView;
|
|
26
|
+
if (window === null) return;
|
|
27
|
+
const globals = globalThis; // eslint-disable-line no-type-assertion/no-type-assertion -- bridging happy-dom's globals onto the global scope
|
|
28
|
+
globals.Node = window.Node;
|
|
29
|
+
globals.Text = window.Text;
|
|
30
|
+
globals.Comment = window.Comment;
|
|
31
|
+
globals.Element = window.Element;
|
|
32
|
+
globals.HTMLElement = window.HTMLElement;
|
|
33
|
+
globals.Document = window.Document;
|
|
34
|
+
globals.document = document;
|
|
35
|
+
globals.window = window;
|
|
36
|
+
}
|
|
37
|
+
var _instance = /*#__PURE__*/new WeakMap();
|
|
38
|
+
var _scheduler = /*#__PURE__*/new WeakMap();
|
|
39
|
+
var _ownsContainer = /*#__PURE__*/new WeakMap();
|
|
40
|
+
var _unmounted = /*#__PURE__*/new WeakMap();
|
|
41
|
+
class HydrateTestAppImplementation {
|
|
42
|
+
constructor(document, container, component, instance, scheduler, ownsContainer, html, mismatches) {
|
|
43
|
+
_defineProperty(this, "document", void 0);
|
|
44
|
+
_defineProperty(this, "container", void 0);
|
|
45
|
+
_defineProperty(this, "component", void 0);
|
|
46
|
+
_defineProperty(this, "html", void 0);
|
|
47
|
+
_defineProperty(this, "mismatches", void 0);
|
|
48
|
+
_classPrivateFieldInitSpec(this, _instance, void 0);
|
|
49
|
+
_classPrivateFieldInitSpec(this, _scheduler, void 0);
|
|
50
|
+
_classPrivateFieldInitSpec(this, _ownsContainer, void 0);
|
|
51
|
+
_classPrivateFieldInitSpec(this, _unmounted, false);
|
|
52
|
+
_defineProperty(this, "resolved", async () => {
|
|
53
|
+
await _classPrivateFieldGet(_scheduler, this).resolved();
|
|
54
|
+
});
|
|
55
|
+
_defineProperty(this, "setProps", async props => {
|
|
56
|
+
if (_classPrivateFieldGet(_unmounted, this)) throw new Error('Cannot set props on an unmounted Tungsten HydrateTestApp.');
|
|
57
|
+
this.component.props = props;
|
|
58
|
+
_classPrivateFieldGet(_instance, this).queueUpdate(this.component);
|
|
59
|
+
await this.resolved();
|
|
60
|
+
});
|
|
61
|
+
_defineProperty(this, "unmount", async () => {
|
|
62
|
+
if (_classPrivateFieldGet(_unmounted, this)) return;
|
|
63
|
+
_classPrivateFieldSet(_unmounted, this, true);
|
|
64
|
+
_classPrivateFieldGet(_scheduler, this).cancelPending();
|
|
65
|
+
let cleanupError;
|
|
66
|
+
try {
|
|
67
|
+
this.component.__delete();
|
|
68
|
+
deleteNodeIfRendered(this.component.__currentContent);
|
|
69
|
+
this.component.__deleted();
|
|
70
|
+
_classPrivateFieldGet(_instance, this).disposeRegisteredComponents();
|
|
71
|
+
await _classPrivateFieldGet(_scheduler, this).resolved();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
cleanupError = error;
|
|
74
|
+
try {
|
|
75
|
+
_classPrivateFieldGet(_instance, this).disposeRegisteredComponents();
|
|
76
|
+
} catch {
|
|
77
|
+
// Preserve the first cleanup failure.
|
|
78
|
+
}
|
|
79
|
+
} finally {
|
|
80
|
+
_classPrivateFieldGet(_scheduler, this).dispose();
|
|
81
|
+
if (_classPrivateFieldGet(_ownsContainer, this)) this.container.remove();else while (this.container.firstChild !== null) this.container.removeChild(this.container.firstChild);
|
|
82
|
+
}
|
|
83
|
+
if (cleanupError !== undefined) throw cleanupError;
|
|
84
|
+
});
|
|
85
|
+
this.document = document;
|
|
86
|
+
this.container = container;
|
|
87
|
+
this.component = component;
|
|
88
|
+
_classPrivateFieldSet(_instance, this, instance);
|
|
89
|
+
_classPrivateFieldSet(_scheduler, this, scheduler);
|
|
90
|
+
_classPrivateFieldSet(_ownsContainer, this, ownsContainer);
|
|
91
|
+
this.html = html;
|
|
92
|
+
this.mismatches = mismatches;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The hydration round trip createTestApp() deliberately doesn't cover: render a component to
|
|
97
|
+
* HTML the way a real server would, parse it with a real HTML parser, hydrate a fresh client
|
|
98
|
+
* instance against the result, and hand back the live, hydrated component - still fully usable
|
|
99
|
+
* via setProps()/resolved(), exactly like createTestApp()'s result.
|
|
100
|
+
*
|
|
101
|
+
* By default `props` renders on both sides, so a passing test proves an ordinary page hydrates
|
|
102
|
+
* clean (`mismatches` empty). Pass `serverProps` to diverge the two passes on purpose and assert
|
|
103
|
+
* on the resulting `mismatches` - the case a one-off "does the reconciler still agree with real
|
|
104
|
+
* served pages" script never could, because nothing fed it markup that didn't already match.
|
|
105
|
+
*
|
|
106
|
+
* A structural mismatch (a different tag, a different number of children) is not something
|
|
107
|
+
* reconcileHydratedAttributes() can fix - hydrateRootComponent() throws, exactly as the real
|
|
108
|
+
* client hydrator does, so a caller reproducing that class of bug should assert on the rejection.
|
|
109
|
+
*/
|
|
110
|
+
export async function hydrateTestApp(RootComponent, ...args) {
|
|
111
|
+
await ensureTestEnvLoaded();
|
|
112
|
+
const options = args[0]; // eslint-disable-line no-type-assertion/no-type-assertion
|
|
113
|
+
const suppliedDocument = options?.document ?? globalThis.document; // eslint-disable-line no-type-assertion/no-type-assertion
|
|
114
|
+
if (suppliedDocument === undefined) {
|
|
115
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-condition
|
|
116
|
+
throw new Error('hydrateTestApp() requires options.document when no global document is available.');
|
|
117
|
+
}
|
|
118
|
+
const document = suppliedDocument;
|
|
119
|
+
const ownsContainer = options?.container === undefined;
|
|
120
|
+
const container = options?.container ?? document.createElement('div');
|
|
121
|
+
if (container.ownerDocument !== document) {
|
|
122
|
+
throw new Error('The HydrateTestApp container must belong to options.document.');
|
|
123
|
+
}
|
|
124
|
+
if (container.childNodes.length > 0) {
|
|
125
|
+
throw new Error('The HydrateTestApp container must be empty before hydrating.');
|
|
126
|
+
}
|
|
127
|
+
if (ownsContainer) {
|
|
128
|
+
if (document.body === null) {
|
|
129
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-condition
|
|
130
|
+
throw new Error('The supplied document must have a body element.');
|
|
131
|
+
}
|
|
132
|
+
document.body.appendChild(container);
|
|
133
|
+
}
|
|
134
|
+
const clientProps = options?.props ?? {}; // eslint-disable-line no-type-assertion/no-type-assertion
|
|
135
|
+
const serverProps = options?.serverProps ?? clientProps;
|
|
136
|
+
const location = options?.location ?? '/';
|
|
137
|
+
const globalData = options?.globalData ?? {}; // eslint-disable-line no-type-assertion/no-type-assertion
|
|
138
|
+
const matchedRouteInfo = {
|
|
139
|
+
key: null,
|
|
140
|
+
params: options?.routeParams ?? {},
|
|
141
|
+
content: null,
|
|
142
|
+
...(options !== undefined && 'routeData' in options ? {
|
|
143
|
+
data: options.routeData
|
|
144
|
+
} : {})
|
|
145
|
+
};
|
|
146
|
+
const instanceConfig = {
|
|
147
|
+
prod: false,
|
|
148
|
+
useRootComponent: true,
|
|
149
|
+
clientSideNav: false,
|
|
150
|
+
siteBasePath: '/',
|
|
151
|
+
staticSite: false,
|
|
152
|
+
csr: options?.csr ?? false
|
|
153
|
+
};
|
|
154
|
+
const emptyRoutes = {}; // eslint-disable-line no-type-assertion/no-type-assertion -- not exercised by hydration tests
|
|
155
|
+
// eslint-disable-next-line no-type-assertion/no-type-assertion -- rootToHtml.ts builds a root content node the same way
|
|
156
|
+
const componentNode = {
|
|
157
|
+
[$type]: RootComponent,
|
|
158
|
+
[$props]: serverProps
|
|
159
|
+
};
|
|
160
|
+
// Server pass: a throwaway Instance whose only job is producing the HTML a real server would
|
|
161
|
+
// have sent for `serverProps`. Never returned, never touched again once `html` is captured.
|
|
162
|
+
const ssrScheduler = new UpdateScheduler();
|
|
163
|
+
let html;
|
|
164
|
+
try {
|
|
165
|
+
const {
|
|
166
|
+
internalStore,
|
|
167
|
+
stores,
|
|
168
|
+
storeSubscriptions
|
|
169
|
+
} = initStores(location, null, globalData, matchedRouteInfo);
|
|
170
|
+
const ssrInstance = new Instance(location, instanceConfig, null, emptyRoutes, emptyRoutes,
|
|
171
|
+
// eslint-disable-line no-type-assertion/no-type-assertion
|
|
172
|
+
internalStore, stores, storeSubscriptions, globalData, matchedRouteInfo, {
|
|
173
|
+
document,
|
|
174
|
+
window: document.defaultView,
|
|
175
|
+
scheduler: ssrScheduler,
|
|
176
|
+
navigation: false
|
|
177
|
+
});
|
|
178
|
+
for (const override of options?.stores ?? []) {
|
|
179
|
+
const store = override.registration.getStore(ssrInstance.stores);
|
|
180
|
+
await override.initialize(store);
|
|
181
|
+
}
|
|
182
|
+
const renderingTree = await contentTreeToRenderingTree(componentNode, null, ssrInstance, false);
|
|
183
|
+
const headData = {
|
|
184
|
+
found: false,
|
|
185
|
+
instance: ssrInstance,
|
|
186
|
+
clientImportAliases: {},
|
|
187
|
+
importAliases: {},
|
|
188
|
+
compilationLocation: '',
|
|
189
|
+
dev: false,
|
|
190
|
+
tungstenPublicEnv: undefined,
|
|
191
|
+
siteBasePath: '',
|
|
192
|
+
hmr: true,
|
|
193
|
+
csr: instanceConfig.csr
|
|
194
|
+
};
|
|
195
|
+
html = await renderingNodeToHtml(renderingTree, false, headData, null);
|
|
196
|
+
} finally {
|
|
197
|
+
ssrScheduler.dispose();
|
|
198
|
+
}
|
|
199
|
+
// A real HTML parser - the same algorithm a browser runs before hydrate() ever sees the page
|
|
200
|
+
// - not a comparison against the string above, so browser parsing quirks (an auto-closed <p>,
|
|
201
|
+
// an inserted <tbody>) surface exactly as they would in production.
|
|
202
|
+
container.innerHTML = html;
|
|
203
|
+
bridgeHappyDomGlobals(document);
|
|
204
|
+
const scheduler = new UpdateScheduler();
|
|
205
|
+
const {
|
|
206
|
+
internalStore,
|
|
207
|
+
stores,
|
|
208
|
+
storeSubscriptions
|
|
209
|
+
} = initStores(location, null, globalData, matchedRouteInfo);
|
|
210
|
+
const runtimeContext = {
|
|
211
|
+
document,
|
|
212
|
+
window: document.defaultView,
|
|
213
|
+
scheduler,
|
|
214
|
+
navigation: false
|
|
215
|
+
};
|
|
216
|
+
const instance = new Instance(location, instanceConfig, null, emptyRoutes, emptyRoutes,
|
|
217
|
+
// eslint-disable-line no-type-assertion/no-type-assertion
|
|
218
|
+
internalStore, stores, storeSubscriptions, globalData, matchedRouteInfo, runtimeContext);
|
|
219
|
+
try {
|
|
220
|
+
for (const override of options?.stores ?? []) {
|
|
221
|
+
const store = override.registration.getStore(instance.stores);
|
|
222
|
+
await override.initialize(store);
|
|
223
|
+
}
|
|
224
|
+
const meta = {
|
|
225
|
+
insideForm: false,
|
|
226
|
+
mismatches: []
|
|
227
|
+
};
|
|
228
|
+
const domPointer = new DomPointer(container, 0);
|
|
229
|
+
const component = await hydrateRootComponent(instance, RootComponent, domPointer, meta, clientProps, options?.routeParams, options?.routeData);
|
|
230
|
+
return new HydrateTestAppImplementation(document, container, component, instance, scheduler, ownsContainer, html, meta.mismatches);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
try {
|
|
233
|
+
instance.disposeRegisteredComponents();
|
|
234
|
+
} catch {
|
|
235
|
+
// Preserve the mount failure.
|
|
236
|
+
}
|
|
237
|
+
scheduler.dispose();
|
|
238
|
+
while (container.firstChild !== null) container.removeChild(container.firstChild);
|
|
239
|
+
if (ownsContainer) container.remove();
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { TungstenBaseComponent, TungstenBaseComponentType } from '../Components.jsx';
|
|
1
|
+
import type { ConstructPackage, TungstenBaseComponent, TungstenBaseComponentType, TungstenComponentPropsBase } from '../Components.jsx';
|
|
2
2
|
export { ensureTestEnvLoaded, testEnvVariableName } from './ensureTestEnvLoaded.js';
|
|
3
|
+
export { hydrateTestApp, type HydrateTestApp, type HydrateTestAppOptions } from './hydrateTestApp.js';
|
|
3
4
|
import type { TrueStore } from '../Store/makeStore.js';
|
|
4
5
|
export type ComponentProps<ComponentType extends TungstenBaseComponentType<any, any>> = InstanceType<ComponentType>['props'];
|
|
5
6
|
export type TestStoreRegistration<Schema extends object> = {
|
|
@@ -29,8 +30,8 @@ export type TestApp<Component extends TungstenBaseComponent> = {
|
|
|
29
30
|
setProps(props: Component['props']): Promise<void>;
|
|
30
31
|
unmount(): Promise<void>;
|
|
31
32
|
};
|
|
32
|
-
type CreateTestAppArgs<Props extends object> = object extends Props ? [options?: TestAppOptions<Props>] : keyof Props extends never ? [options?: TestAppOptions<Props>] : [options: TestAppOptions<Props> & {
|
|
33
|
+
export type CreateTestAppArgs<Props extends object> = object extends Props ? [options?: TestAppOptions<Props>] : keyof Props extends never ? [options?: TestAppOptions<Props>] : [options: TestAppOptions<Props> & {
|
|
33
34
|
props: Props;
|
|
34
35
|
}];
|
|
35
|
-
export declare function createTestApp<
|
|
36
|
+
export declare function createTestApp<Props extends TungstenComponentPropsBase, Component extends TungstenBaseComponent<any, any>, RouteData = undefined>(RootComponent: new (pkg: ConstructPackage<NoInfer<Props>, RouteData>) => Component, ...args: CreateTestAppArgs<Props>): Promise<TestApp<Component>>;
|
|
36
37
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,qBAAqB,EACrB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { Instance } from "../Instance/Instance.js";
|
|
|
10
10
|
import { initStores } from "../Servers/initStores.js";
|
|
11
11
|
import { ensureTestEnvLoaded } from "./ensureTestEnvLoaded.js";
|
|
12
12
|
export { ensureTestEnvLoaded, testEnvVariableName } from "./ensureTestEnvLoaded.js";
|
|
13
|
+
export { hydrateTestApp } from "./hydrateTestApp.js";
|
|
13
14
|
import { createTungstenRootComponent, deleteTungstenRoot } from "../update/integrateUpdateVdom.js";
|
|
14
15
|
import { UpdateScheduler } from "../update/UpdateScheduler.js";
|
|
15
16
|
export function testStore(registration, initialize) {
|
|
@@ -73,7 +74,19 @@ class TestAppImplementation {
|
|
|
73
74
|
_classPrivateFieldSet(_ownsContainer, this, ownsContainer);
|
|
74
75
|
}
|
|
75
76
|
}
|
|
76
|
-
export async function createTestApp(
|
|
77
|
+
export async function createTestApp(
|
|
78
|
+
// NoInfer applies to Props only inside the constructor parameter, not to
|
|
79
|
+
// RootComponent as a whole - so Props is inferred from `props` alone
|
|
80
|
+
// (a generic component's own type parameters can then be inferred from a
|
|
81
|
+
// typed props value, the same way `const x: TungstenBaseComponentType<
|
|
82
|
+
// BoundProps<Form, 'value'>> = BoundValue` already type-checks), while
|
|
83
|
+
// Component is still inferred from the constructor's return type, so
|
|
84
|
+
// `.component` on the result keeps the concrete class (state, methods),
|
|
85
|
+
// not the erased TungstenBaseComponent base. Without the NoInfer, Props
|
|
86
|
+
// is inferred from RootComponent first - a bare class reference with no
|
|
87
|
+
// type arguments - so a generic component's own parameters collapse to
|
|
88
|
+
// their constraints before `props` is ever considered.
|
|
89
|
+
RootComponent, ...args) {
|
|
77
90
|
await ensureTestEnvLoaded();
|
|
78
91
|
const options = args[0];
|
|
79
92
|
const suppliedDocument = options?.document ?? globalThis.document;
|
|
@@ -124,7 +137,8 @@ export async function createTestApp(RootComponent, ...args) {
|
|
|
124
137
|
useRootComponent: true,
|
|
125
138
|
clientSideNav: false,
|
|
126
139
|
siteBasePath: '/',
|
|
127
|
-
staticSite: false
|
|
140
|
+
staticSite: false,
|
|
141
|
+
csr: false
|
|
128
142
|
};
|
|
129
143
|
const emptyRoutes = {};
|
|
130
144
|
const instance = new Instance(location, instanceConfig, null, emptyRoutes, emptyRoutes, internalStore, stores, storeSubscriptions, globalData, matchedRouteInfo, runtimeContext);
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type TimeProfiler = {
|
|
2
|
+
timeProfile: <T>(name: string, task: () => T) => T;
|
|
3
|
+
timeProfileAsync: <T>(name: string, task: () => T | Promise<T>) => Promise<T>;
|
|
4
|
+
};
|
|
5
|
+
export declare function createTimeProfiler(profiling?: boolean): TimeProfiler;
|
|
6
|
+
//# sourceMappingURL=timeProfiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeProfiler.d.ts","sourceRoot":"","sources":["../src/timeProfiler.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,YAAY,GAAG;IACvB,WAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAClD,gBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAChF,CAAA;AAMD,wBAAgB,kBAAkB,CAAC,SAAS,UAAO,GAAG,YAAY,CAqBjE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Same shape as sxy-test-runner's createTimeProfiler (node_modules/sxy-test-runner/dist/packages/timeProfiler.js) -
|
|
2
|
+
// a disabled profiler just runs the task, so callers never need to branch on whether profiling
|
|
3
|
+
// is on. Framework.ts holds one instance per run (default disabled); tungsten dev/build enable
|
|
4
|
+
// it via --profile and wrap their own top-level phases with it too.
|
|
5
|
+
import chalk from 'chalk-extensions';
|
|
6
|
+
import { cliOut } from "./cliOutput.js";
|
|
7
|
+
function report(name, ms) {
|
|
8
|
+
cliOut(chalk.yellow`${name}` + ' - ' + chalk.orange`${ms.toLocaleString()}ms`);
|
|
9
|
+
}
|
|
10
|
+
export function createTimeProfiler(profiling = true) {
|
|
11
|
+
if (!profiling) {
|
|
12
|
+
return {
|
|
13
|
+
timeProfile: (_name, task) => task(),
|
|
14
|
+
timeProfileAsync: async (_name, task) => task()
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
timeProfile(name, task) {
|
|
19
|
+
const start = Date.now();
|
|
20
|
+
const result = task();
|
|
21
|
+
report(name, Date.now() - start);
|
|
22
|
+
return result;
|
|
23
|
+
},
|
|
24
|
+
async timeProfileAsync(name, task) {
|
|
25
|
+
const start = Date.now();
|
|
26
|
+
const result = await task();
|
|
27
|
+
report(name, Date.now() - start);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DomRegion } from '../DomRegion.js';
|
|
1
2
|
import { DomPointer } from '../DomPointer.js';
|
|
2
3
|
import { ContentNode, ContentNodeHtml, ContentNodeComponentAny } from '../ContentNode.js';
|
|
3
4
|
import { Instance } from '../Instance/Instance.js';
|
|
@@ -14,6 +15,16 @@ export type TungstenHTMLElement = HTMLElement & {
|
|
|
14
15
|
[key: string]: unknown;
|
|
15
16
|
};
|
|
16
17
|
export declare function integrateElementUpdateVdom(element: AnyComponent, newContent: ContentNode): Promise<UpdateResult>;
|
|
18
|
+
export type ApplyUpdateArgs = {
|
|
19
|
+
tungstenElement: AnyComponent;
|
|
20
|
+
instance: Instance;
|
|
21
|
+
newNode: ContentNode;
|
|
22
|
+
oldNode: RenderedContentNode | $ContentNull;
|
|
23
|
+
domRegion: DomRegion | null;
|
|
24
|
+
domPointer: DomPointer;
|
|
25
|
+
parentNode: ContentNode;
|
|
26
|
+
};
|
|
27
|
+
export declare function applyUpdate({ tungstenElement, instance, newNode, oldNode, domRegion, domPointer, parentNode }: ApplyUpdateArgs): Promise<RenderedContentNode>;
|
|
17
28
|
export declare function deleteNodeIfRendered(node: $ContentNull | RenderedContentNode): void;
|
|
18
29
|
export declare function processHtmlNode(node: ContentNodeHtml, parentNode: ContentNode): void;
|
|
19
30
|
type CreateTungstenComponentArgs = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrateUpdateVdom.d.ts","sourceRoot":"","sources":["../../src/update/integrateUpdateVdom.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integrateUpdateVdom.d.ts","sourceRoot":"","sources":["../../src/update/integrateUpdateVdom.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ import { setCurrentComponent } from 'tungsten/hooks/setCurrentComponent.js';
|
|
|
23
23
|
import { clearCurrentComponent } from 'tungsten/hooks/clearCurrentComponent.js';
|
|
24
24
|
import { isDev } from "../isDev.js";
|
|
25
25
|
import { $original } from "../componentProxyHandlers.js";
|
|
26
|
+
import { booleanAttributeValue } from "../booleanAttributeValue.js";
|
|
26
27
|
function debug(...texts) {
|
|
27
28
|
//console.log(...texts)
|
|
28
29
|
//console.log(getStackTrace().split('\n')[2])
|
|
@@ -118,7 +119,9 @@ function getKeyedOldChildren(array) {
|
|
|
118
119
|
}
|
|
119
120
|
return keyedChildren;
|
|
120
121
|
}
|
|
121
|
-
|
|
122
|
+
// oldNode: $contentNull reconciles as a pure create (falls through to createNode()) - used by
|
|
123
|
+
// hydrate.tsx's CSR branch for <body>.
|
|
124
|
+
export async function applyUpdate({
|
|
122
125
|
tungstenElement,
|
|
123
126
|
instance,
|
|
124
127
|
newNode,
|
|
@@ -849,7 +852,8 @@ function addAttributes(tungstenElement, instance, node, domNode) {
|
|
|
849
852
|
//console.log('add attr', key, attributes[key])
|
|
850
853
|
if (typeof attributes[key] === 'boolean') {
|
|
851
854
|
//console.log('bool attr', attributes[key])
|
|
852
|
-
|
|
855
|
+
const attrValue = booleanAttributeValue(key, attributes[key]);
|
|
856
|
+
if (attrValue !== null) domNode.setAttribute(key, attrValue);
|
|
853
857
|
} else if (attributes[key] !== undefined && attributes[key] !== null) {
|
|
854
858
|
//console.log('string attr', String(attributes[key]))
|
|
855
859
|
domNode.setAttribute(key, String(attributes[key]));
|
|
@@ -913,7 +917,8 @@ function updateAttributes(tungstenElement, instance, node, oldNode, domNodeHTMLE
|
|
|
913
917
|
domNode.value = String(newAttributes[key]);
|
|
914
918
|
} else {
|
|
915
919
|
if (typeof newAttributes[key] === 'boolean') {
|
|
916
|
-
|
|
920
|
+
const attrValue = booleanAttributeValue(key, newAttributes[key]);
|
|
921
|
+
if (attrValue !== null) domNode.setAttribute(key, attrValue);else removeAttribute(domNode, key);
|
|
917
922
|
} else if (newAttributes[key] === undefined || newAttributes[key] === null) {
|
|
918
923
|
removeAttribute(domNode, key);
|
|
919
924
|
} else {
|
|
@@ -1004,6 +1009,7 @@ function processAttributes(node) {
|
|
|
1004
1009
|
} else {
|
|
1005
1010
|
attributes.style = attributes.css;
|
|
1006
1011
|
}
|
|
1012
|
+
delete attributes.css;
|
|
1007
1013
|
}
|
|
1008
1014
|
return attributes;
|
|
1009
1015
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warnOnFrameworkChange.d.ts","sourceRoot":"","sources":["../src/warnOnFrameworkChange.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"warnOnFrameworkChange.d.ts","sourceRoot":"","sources":["../src/warnOnFrameworkChange.ts"],"names":[],"mappings":"AAcA,wBAAgB,qBAAqB,IAAI,IAAI,CAc5C"}
|
|
@@ -6,11 +6,15 @@ import { cliWarn } from "./cliOutput.js";
|
|
|
6
6
|
// cache can't be invalidated at runtime, so an already-running dev server can't pick up a
|
|
7
7
|
// change to the tungsten package itself (e.g. a linked/workspace copy being rebuilt) without a
|
|
8
8
|
// full process restart - this just tells the developer that's needed, rather than attempting it.
|
|
9
|
+
//
|
|
10
|
+
// Watches a single marker file (dist/.build-complete) rather than all of dist - tungsten's own
|
|
11
|
+
// build scripts touch it as their last step (see scripts/writeBuildMarker.mjs), so one file
|
|
12
|
+
// covers every file a build could have changed without chokidar scanning the whole tree. Watch
|
|
13
|
+
// mode (build-babel --watch) does not yet write it on each cycle, only the one-shot builds do.
|
|
9
14
|
export function warnOnFrameworkChange() {
|
|
10
15
|
const frameworkDistDir = join(getFrameworkDir(), 'dist');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const watcher = chokidar.watch(frameworkDistDir, {
|
|
16
|
+
const buildMarkerPath = join(frameworkDistDir, '.build-complete');
|
|
17
|
+
const watcher = chokidar.watch(buildMarkerPath, {
|
|
14
18
|
ignoreInitial: true,
|
|
15
19
|
awaitWriteFinish: {
|
|
16
20
|
stabilityThreshold: 200,
|
|
@@ -18,10 +22,6 @@ export function warnOnFrameworkChange() {
|
|
|
18
22
|
}
|
|
19
23
|
});
|
|
20
24
|
watcher.on('all', () => {
|
|
21
|
-
|
|
22
|
-
debounceTimer = setTimeout(() => {
|
|
23
|
-
debounceTimer = null;
|
|
24
|
-
cliWarn(`tungsten framework files changed (${frameworkDistDir}) - restart the dev server` + ` to pick up the change.`);
|
|
25
|
-
}, 300);
|
|
25
|
+
cliWarn(`tungsten framework files changed (${frameworkDistDir}) - restart the dev server` + ` to pick up the change.`);
|
|
26
26
|
});
|
|
27
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tungsten",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"files": [
|
|
19
19
|
"dist",
|
|
20
|
+
"!dist/**/*.sxyt.*",
|
|
20
21
|
"types",
|
|
21
22
|
"sxy-loader.config.js",
|
|
22
23
|
"readme.md"
|
|
@@ -28,7 +29,7 @@
|
|
|
28
29
|
"@babel/cli": "^7.28.6",
|
|
29
30
|
"@babel/core": "^7.29.0",
|
|
30
31
|
"@babel/parser": "^7.29.2",
|
|
31
|
-
"@babel/plugin-syntax-import-assertions": "^7.
|
|
32
|
+
"@babel/plugin-syntax-import-assertions": "^7.29.7",
|
|
32
33
|
"@babel/plugin-transform-class-properties": "^7.28.6",
|
|
33
34
|
"@babel/preset-react": "^7.28.5",
|
|
34
35
|
"@hono/node-server": "^1.19.11",
|
|
@@ -37,11 +38,11 @@
|
|
|
37
38
|
"@rollup/plugin-json": "^6.1.0",
|
|
38
39
|
"@rollup/plugin-node-resolve": "^14.1.0",
|
|
39
40
|
"@rollup/plugin-terser": "^1.0.0",
|
|
40
|
-
"arktype": "^2.2.
|
|
41
|
+
"arktype": "^2.2.3",
|
|
41
42
|
"babel-plugin-css-to-js": "^0.0.4",
|
|
42
43
|
"babel-plugin-sxy-module-resolver": "^4.1.9",
|
|
43
44
|
"babel-plugin-sxy-transform-cjs-to-esm": "^0.2.6",
|
|
44
|
-
"bcryptjs": "^
|
|
45
|
+
"bcryptjs": "^3.0.3",
|
|
45
46
|
"chalk": "^5.6.2",
|
|
46
47
|
"chalk-extensions": "^2.0.24",
|
|
47
48
|
"chokidar": "^3.6.0",
|
|
@@ -56,29 +57,29 @@
|
|
|
56
57
|
"find-package-json": "^1.2.0",
|
|
57
58
|
"fs-extra": "^10.1.0",
|
|
58
59
|
"globby": "^13.2.2",
|
|
59
|
-
"hono": "^4.12.
|
|
60
|
-
"import-meta-resolve": "^
|
|
60
|
+
"hono": "^4.12.32",
|
|
61
|
+
"import-meta-resolve": "^4.2.0",
|
|
61
62
|
"ini": "^4.1.3",
|
|
62
63
|
"lodash.clonedeep": "^4.5.0",
|
|
63
64
|
"npm-run-all": "^4.1.5",
|
|
64
65
|
"open": "^8.4.2",
|
|
65
|
-
"path-to-regexp": "^
|
|
66
|
-
"postcss": "^8.5.
|
|
66
|
+
"path-to-regexp": "^8.4.2",
|
|
67
|
+
"postcss": "^8.5.24",
|
|
67
68
|
"precinct": "^12.2.0",
|
|
68
69
|
"react-router": "^6.30.3",
|
|
69
70
|
"require-resolve-hook": "^1.1.0",
|
|
70
71
|
"rollup": "^2.80.0",
|
|
71
72
|
"rollup-plugin-gzip": "^3.1.2",
|
|
72
|
-
"sass": "^1.
|
|
73
|
+
"sass": "^1.102.0",
|
|
73
74
|
"serialize-javascript": "^6.0.2",
|
|
74
75
|
"slash": "^4.0.0",
|
|
75
76
|
"sxy-dependency-tree": "^8.1.11",
|
|
76
77
|
"sxy-filing-cabinet": "^3.4.2",
|
|
77
|
-
"sxy-lib": "^3.0.
|
|
78
|
+
"sxy-lib": "^3.0.5",
|
|
78
79
|
"sxy-lib-object-copy": "^2.0.5",
|
|
79
80
|
"sxy-loader": "^3.1.0",
|
|
80
81
|
"sxy-package-investigator": "^1.0.0",
|
|
81
|
-
"zod": "^4.3
|
|
82
|
+
"zod": "^4.4.3"
|
|
82
83
|
},
|
|
83
84
|
"devDependencies": {
|
|
84
85
|
"@babel/generator": "^7.29.1",
|
|
@@ -86,7 +87,6 @@
|
|
|
86
87
|
"@types/babel-types": "^7.0.16",
|
|
87
88
|
"@types/babel__core": "^7.20.5",
|
|
88
89
|
"@types/babel__generator": "^7.27.0",
|
|
89
|
-
"@types/bcryptjs": "^2.4.6",
|
|
90
90
|
"@types/chai": "^4.3.20",
|
|
91
91
|
"@types/cookie-parser": "^1.4.10",
|
|
92
92
|
"@types/express": "^4.17.25",
|
|
@@ -110,11 +110,11 @@
|
|
|
110
110
|
"eslint-import-resolver-typescript": "^2.7.1",
|
|
111
111
|
"eslint-plugin-import": "^2.32.0",
|
|
112
112
|
"eslint-plugin-no-type-assertion": "^1.3.0",
|
|
113
|
-
"happy-dom": "^20.
|
|
113
|
+
"happy-dom": "^20.11.1",
|
|
114
114
|
"prop-types": "^15.8.1",
|
|
115
115
|
"rimraf": "^5.0.10",
|
|
116
116
|
"rollup-plugin-visualizer": "^5.14.0",
|
|
117
|
-
"sxy-test-runner": "^2.
|
|
117
|
+
"sxy-test-runner": "^2.3.12",
|
|
118
118
|
"sxy-types": "^1.0.23",
|
|
119
119
|
"typescript": "^6.0.3"
|
|
120
120
|
},
|
|
@@ -136,13 +136,15 @@
|
|
|
136
136
|
"build": "run-s -c clean build-prep build-watch",
|
|
137
137
|
"clean": "rimraf intermed dist",
|
|
138
138
|
"build-once": "rimraf intermed dist && pnpm build-ts-once && pnpm build-babel-once",
|
|
139
|
+
"build-once-nd": "rimraf intermed dist.building && pnpm build-ts-once && pnpm build-babel-staged && node scripts/syncDist.mjs && node scripts/writeBuildMarker.mjs",
|
|
139
140
|
"build-quick": "pnpm build-watch",
|
|
140
141
|
"build-prep": "pnpm build-ts-once",
|
|
141
142
|
"build-watch": "run-p build-ts build-babel",
|
|
142
143
|
"build-ts": "tsc --watch",
|
|
143
144
|
"build-ts-once": "tsc",
|
|
144
|
-
"build-babel": "
|
|
145
|
-
"build-babel-once": "babel intermed --out-dir dist --ignore \"**/*.cjs\" --copy-files --config-file ./babel.framework.config.js",
|
|
145
|
+
"build-babel": "node scripts/watchBabelAndMark.mjs",
|
|
146
|
+
"build-babel-once": "babel intermed --out-dir dist --ignore \"**/*.cjs\" --copy-files --config-file ./babel.framework.config.js && node scripts/writeBuildMarker.mjs",
|
|
147
|
+
"build-babel-staged": "babel intermed --out-dir dist.building --ignore \"**/*.cjs\" --copy-files --config-file ./babel.framework.config.js",
|
|
146
148
|
"test": "sxy-test-runner",
|
|
147
149
|
"test-once": "sxy-test-runner once"
|
|
148
150
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FunctionComponentStandIn.sxyt.d.ts","sourceRoot":"","sources":["../src/FunctionComponentStandIn.sxyt.ts"],"names":[],"mappings":""}
|