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
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
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; }
|
|
2
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
|
-
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); }
|
|
4
|
-
import { expect } from 'chai';
|
|
5
|
-
import { Window } from 'happy-dom';
|
|
6
|
-
import { describe } from 'sxy-test-runner';
|
|
7
|
-
import { TungstenStatefulComponent } from "../../Components.js";
|
|
8
|
-
import { createTestApp } from "../../testing/index.js";
|
|
9
|
-
import { BindableSelect } from "./BindableSelect.js";
|
|
10
|
-
import { jsx as _jsx, jsxs as _jsxs } from "tungsten/jsxRuntime.js";
|
|
11
|
-
const optionTexts = container => [...container.querySelectorAll('option')].map(option => option.textContent);
|
|
12
|
-
describe('BindableSelect', ({
|
|
13
|
-
it
|
|
14
|
-
}) => {
|
|
15
|
-
it('renders children when no options prop is given', async () => {
|
|
16
|
-
const window = new Window();
|
|
17
|
-
const document = window.document;
|
|
18
|
-
class Root extends TungstenStatefulComponent {
|
|
19
|
-
constructor(...args) {
|
|
20
|
-
super(...args);
|
|
21
|
-
_defineProperty(this, "state", {
|
|
22
|
-
choice: 'b'
|
|
23
|
-
});
|
|
24
|
-
_defineProperty(this, "content", () => _jsxs(BindableSelect, {
|
|
25
|
-
bind: [this.state, 'choice'],
|
|
26
|
-
children: [_jsx("option", {
|
|
27
|
-
value: "a",
|
|
28
|
-
children: "A"
|
|
29
|
-
}), _jsx("option", {
|
|
30
|
-
value: "b",
|
|
31
|
-
children: "B"
|
|
32
|
-
})]
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const testApp = await createTestApp(Root, {
|
|
37
|
-
document
|
|
38
|
-
});
|
|
39
|
-
expect(optionTexts(testApp.container)).to.deep.equal(['A', 'B']);
|
|
40
|
-
await testApp.unmount();
|
|
41
|
-
});
|
|
42
|
-
// placeholder must behave exactly as it does on a plain <select>: it reaches the element as an
|
|
43
|
-
// attribute and HTML ignores it. It deliberately does NOT synthesize a placeholder option —
|
|
44
|
-
// that would make BindableSelect diverge from the plain element.
|
|
45
|
-
it('passes placeholder to the element like a plain select, adding no option', async () => {
|
|
46
|
-
const window = new Window();
|
|
47
|
-
const document = window.document;
|
|
48
|
-
class Root extends TungstenStatefulComponent {
|
|
49
|
-
constructor(...args) {
|
|
50
|
-
super(...args);
|
|
51
|
-
_defineProperty(this, "state", {
|
|
52
|
-
choice: ''
|
|
53
|
-
});
|
|
54
|
-
_defineProperty(this, "content", () => _jsxs("main", {
|
|
55
|
-
children: [_jsx(BindableSelect, {
|
|
56
|
-
placeholder: "Pick one",
|
|
57
|
-
options: [{
|
|
58
|
-
value: 'a',
|
|
59
|
-
text: 'A'
|
|
60
|
-
}, {
|
|
61
|
-
value: 'b',
|
|
62
|
-
text: 'B'
|
|
63
|
-
}],
|
|
64
|
-
bind: [this.state, 'choice']
|
|
65
|
-
}), _jsxs("select", {
|
|
66
|
-
placeholder: "Pick one",
|
|
67
|
-
bind: [this.state, 'choice'],
|
|
68
|
-
children: [_jsx("option", {
|
|
69
|
-
value: "a",
|
|
70
|
-
children: "A"
|
|
71
|
-
}), _jsx("option", {
|
|
72
|
-
value: "b",
|
|
73
|
-
children: "B"
|
|
74
|
-
})]
|
|
75
|
-
})]
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const testApp = await createTestApp(Root, {
|
|
80
|
-
document
|
|
81
|
-
});
|
|
82
|
-
const [bindable, plain] = [...testApp.container.querySelectorAll('select')];
|
|
83
|
-
expect(bindable?.getAttribute('placeholder')).to.equal('Pick one');
|
|
84
|
-
expect(bindable?.querySelectorAll('option').length).to.equal(2);
|
|
85
|
-
// parity with the plain element it stands in for
|
|
86
|
-
expect(bindable?.getAttribute('placeholder')).to.equal(plain?.getAttribute('placeholder'));
|
|
87
|
-
expect(bindable?.innerHTML).to.equal(plain?.innerHTML);
|
|
88
|
-
await testApp.unmount();
|
|
89
|
-
});
|
|
90
|
-
// text is ContentNode, not string — existing string call sites are unaffected (widening).
|
|
91
|
-
it('accepts JSX as an option text as well as a plain string', async () => {
|
|
92
|
-
const window = new Window();
|
|
93
|
-
const document = window.document;
|
|
94
|
-
class Root extends TungstenStatefulComponent {
|
|
95
|
-
constructor(...args) {
|
|
96
|
-
super(...args);
|
|
97
|
-
_defineProperty(this, "state", {
|
|
98
|
-
choice: 'a'
|
|
99
|
-
});
|
|
100
|
-
_defineProperty(this, "content", () => _jsx(BindableSelect, {
|
|
101
|
-
options: [{
|
|
102
|
-
value: 'a',
|
|
103
|
-
text: 'Plain'
|
|
104
|
-
}, {
|
|
105
|
-
value: 'b',
|
|
106
|
-
text: _jsx("em", {
|
|
107
|
-
children: "Rich"
|
|
108
|
-
})
|
|
109
|
-
}, {
|
|
110
|
-
value: 'c',
|
|
111
|
-
text: 3
|
|
112
|
-
}],
|
|
113
|
-
bind: [this.state, 'choice']
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
const testApp = await createTestApp(Root, {
|
|
118
|
-
document
|
|
119
|
-
});
|
|
120
|
-
expect(optionTexts(testApp.container)).to.deep.equal(['Plain', 'Rich', '3']);
|
|
121
|
-
expect(testApp.container.querySelector('option em')).not.to.equal(null);
|
|
122
|
-
await testApp.unmount();
|
|
123
|
-
});
|
|
124
|
-
it('renders options then children when both are given', async () => {
|
|
125
|
-
const window = new Window();
|
|
126
|
-
const document = window.document;
|
|
127
|
-
class Root extends TungstenStatefulComponent {
|
|
128
|
-
constructor(...args) {
|
|
129
|
-
super(...args);
|
|
130
|
-
_defineProperty(this, "state", {
|
|
131
|
-
choice: 'a'
|
|
132
|
-
});
|
|
133
|
-
_defineProperty(this, "content", () => _jsx(BindableSelect, {
|
|
134
|
-
options: [{
|
|
135
|
-
value: 'a',
|
|
136
|
-
text: 'A'
|
|
137
|
-
}],
|
|
138
|
-
bind: [this.state, 'choice'],
|
|
139
|
-
children: _jsx("option", {
|
|
140
|
-
value: "z",
|
|
141
|
-
children: "Z"
|
|
142
|
-
})
|
|
143
|
-
}));
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const testApp = await createTestApp(Root, {
|
|
147
|
-
document
|
|
148
|
-
});
|
|
149
|
-
expect(optionTexts(testApp.container)).to.deep.equal(['A', 'Z']);
|
|
150
|
-
await testApp.unmount();
|
|
151
|
-
});
|
|
152
|
-
it('still binds the selected value back to state', async () => {
|
|
153
|
-
const window = new Window();
|
|
154
|
-
const document = window.document;
|
|
155
|
-
class Root extends TungstenStatefulComponent {
|
|
156
|
-
constructor(...args) {
|
|
157
|
-
super(...args);
|
|
158
|
-
_defineProperty(this, "state", {
|
|
159
|
-
choice: 'a'
|
|
160
|
-
});
|
|
161
|
-
_defineProperty(this, "content", () => _jsx(BindableSelect, {
|
|
162
|
-
placeholder: "Pick one",
|
|
163
|
-
options: [{
|
|
164
|
-
value: 'a',
|
|
165
|
-
text: 'A'
|
|
166
|
-
}, {
|
|
167
|
-
value: 'b',
|
|
168
|
-
text: 'B'
|
|
169
|
-
}],
|
|
170
|
-
bind: [this.state, 'choice']
|
|
171
|
-
}));
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
const testApp = await createTestApp(Root, {
|
|
175
|
-
document
|
|
176
|
-
});
|
|
177
|
-
const select = testApp.container.querySelector('select');
|
|
178
|
-
select.value = 'b';
|
|
179
|
-
select.dispatchEvent(new window.Event('input', {
|
|
180
|
-
bubbles: true
|
|
181
|
-
}));
|
|
182
|
-
await testApp.resolved();
|
|
183
|
-
expect(testApp.component.state.choice).to.equal('b');
|
|
184
|
-
await testApp.unmount();
|
|
185
|
-
});
|
|
186
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"injectEnv.sxyt.d.ts","sourceRoot":"","sources":["../../src/env/injectEnv.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { describe } from 'sxy-test-runner';
|
|
2
|
-
import { should as setupShould, expect } from 'chai';
|
|
3
|
-
const should = setupShould(); // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
4
|
-
import { injectEnv } from "./injectEnv.js";
|
|
5
|
-
describe('injectEnv()', ({
|
|
6
|
-
it
|
|
7
|
-
}) => {
|
|
8
|
-
it('should inject key value pairs into process.env', () => {
|
|
9
|
-
delete process.env.foo;
|
|
10
|
-
delete process.env.bar;
|
|
11
|
-
expect(process.env.foo).to.be.undefined;
|
|
12
|
-
expect(process.env.bar).to.be.undefined;
|
|
13
|
-
injectEnv({
|
|
14
|
-
foo: 'FOO',
|
|
15
|
-
bar: 'BAZ'
|
|
16
|
-
});
|
|
17
|
-
expect(process.env.foo).to.equal('FOO');
|
|
18
|
-
expect(process.env.bar).to.equal('BAZ');
|
|
19
|
-
});
|
|
20
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseEnv.sxyt.d.ts","sourceRoot":"","sources":["../../src/env/parseEnv.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// import { describe } from 'sxy-test-runner'
|
|
2
|
-
// import { should as setupShould } from 'chai'
|
|
3
|
-
// const should = setupShould() // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
4
|
-
export {};
|
|
5
|
-
// import { parseEnv } from './parseEnv.js'
|
|
6
|
-
// describe('loadEnv()', ({it}) => {
|
|
7
|
-
// it('should extra a key value pair from some text', () => {
|
|
8
|
-
// const env = parseEnv(' foo = bar ')
|
|
9
|
-
// env.should.deep.equal({ foo: 'bar' })
|
|
10
|
-
// })
|
|
11
|
-
// })
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"findProjectDir.sxyt.d.ts","sourceRoot":"","sources":["../src/findProjectDir.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { describe } from 'sxy-test-runner';
|
|
2
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'fs';
|
|
3
|
-
import { tmpdir } from 'os';
|
|
4
|
-
import { join } from 'path';
|
|
5
|
-
import { findProjectDir } from "./findProjectDir.js";
|
|
6
|
-
// Build a fixture that mirrors zod v4 - a named package containing a sub folder with a
|
|
7
|
-
// nameless marker package.json that only sets the module format and local entry points.
|
|
8
|
-
function makeFixture() {
|
|
9
|
-
const root = mkdtempSync(join(tmpdir(), 'tungsten-find-project-dir-'));
|
|
10
|
-
const packageDir = join(root, 'fake-package');
|
|
11
|
-
const markerDir = join(packageDir, 'v4', 'core');
|
|
12
|
-
mkdirSync(markerDir, {
|
|
13
|
-
recursive: true
|
|
14
|
-
});
|
|
15
|
-
writeFileSync(join(packageDir, 'package.json'), JSON.stringify({
|
|
16
|
-
name: 'fake-package',
|
|
17
|
-
version: '1.2.3',
|
|
18
|
-
type: 'module'
|
|
19
|
-
}));
|
|
20
|
-
writeFileSync(join(markerDir, 'package.json'), JSON.stringify({
|
|
21
|
-
type: 'module',
|
|
22
|
-
main: './index.cjs',
|
|
23
|
-
module: './index.js'
|
|
24
|
-
}));
|
|
25
|
-
writeFileSync(join(markerDir, 'index.js'), '');
|
|
26
|
-
return {
|
|
27
|
-
root,
|
|
28
|
-
packageDir,
|
|
29
|
-
markerDir
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
describe('findProjectDir()', ({
|
|
33
|
-
it
|
|
34
|
-
}) => {
|
|
35
|
-
it(`returns the nearest package.json dir, named or not, by default`, () => {
|
|
36
|
-
const {
|
|
37
|
-
root,
|
|
38
|
-
markerDir
|
|
39
|
-
} = makeFixture();
|
|
40
|
-
try {
|
|
41
|
-
findProjectDir(markerDir).should.equal(markerDir);
|
|
42
|
-
} finally {
|
|
43
|
-
rmSync(root, {
|
|
44
|
-
recursive: true,
|
|
45
|
-
force: true
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
it(`skips nameless package.json files when requireName is set`, () => {
|
|
50
|
-
const {
|
|
51
|
-
root,
|
|
52
|
-
packageDir,
|
|
53
|
-
markerDir
|
|
54
|
-
} = makeFixture();
|
|
55
|
-
try {
|
|
56
|
-
findProjectDir(markerDir, {
|
|
57
|
-
requireName: true
|
|
58
|
-
}).should.equal(packageDir);
|
|
59
|
-
} finally {
|
|
60
|
-
rmSync(root, {
|
|
61
|
-
recursive: true,
|
|
62
|
-
force: true
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
it(`returns the named package dir when it is the nearest one`, () => {
|
|
67
|
-
const {
|
|
68
|
-
root,
|
|
69
|
-
packageDir
|
|
70
|
-
} = makeFixture();
|
|
71
|
-
try {
|
|
72
|
-
findProjectDir(packageDir, {
|
|
73
|
-
requireName: true
|
|
74
|
-
}).should.equal(packageDir);
|
|
75
|
-
} finally {
|
|
76
|
-
rmSync(root, {
|
|
77
|
-
recursive: true,
|
|
78
|
-
force: true
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"applyHmrModule.sxyt.d.ts","sourceRoot":"","sources":["../../src/hmr/applyHmrModule.sxyt.tsx"],"names":[],"mappings":""}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
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; }
|
|
2
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
|
-
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); }
|
|
4
|
-
import { expect } from 'chai';
|
|
5
|
-
import { Window } from 'happy-dom';
|
|
6
|
-
import { describe } from 'sxy-test-runner';
|
|
7
|
-
import { TungstenSimpleComponent } from "../Components.js";
|
|
8
|
-
import { createTestApp } from "../testing/index.js";
|
|
9
|
-
import { WideRenderedContentNodeIsComponent } from "../RenderedContentNode.js";
|
|
10
|
-
import { AnyComponentIsFunctionComponentStandIn } from "../AnyComponent.js";
|
|
11
|
-
import { setCurrentInstance } from "./instanceRegistry.js";
|
|
12
|
-
import { applyHmrModule } from "./applyHmrModule.js";
|
|
13
|
-
import { jsxs as _jsxs, jsx as _jsx } from "tungsten/jsxRuntime.js";
|
|
14
|
-
describe('applyHmrModule()', ({
|
|
15
|
-
it
|
|
16
|
-
}) => {
|
|
17
|
-
it('matches and swaps a live component by name+kind', async () => {
|
|
18
|
-
const window = new Window();
|
|
19
|
-
const document = window.document; // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Document is structurally compatible
|
|
20
|
-
const Greeting = ({
|
|
21
|
-
name
|
|
22
|
-
}) => {
|
|
23
|
-
return _jsxs("div", {
|
|
24
|
-
className: "greeting",
|
|
25
|
-
children: ["Hello ", name]
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
class Root extends TungstenSimpleComponent {
|
|
29
|
-
constructor(...args) {
|
|
30
|
-
super(...args);
|
|
31
|
-
_defineProperty(this, "content", () => _jsx(Greeting, {
|
|
32
|
-
name: "Ada"
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const testApp = await createTestApp(Root, {
|
|
37
|
-
document
|
|
38
|
-
});
|
|
39
|
-
const wrapper = testApp.component.__currentContent;
|
|
40
|
-
if (!WideRenderedContentNodeIsComponent(wrapper) || !AnyComponentIsFunctionComponentStandIn(wrapper.element)) {
|
|
41
|
-
throw new Error('expected the root to directly render a single function component');
|
|
42
|
-
}
|
|
43
|
-
setCurrentInstance(wrapper.element.__instance);
|
|
44
|
-
const NewGreeting = ({
|
|
45
|
-
name
|
|
46
|
-
}) => {
|
|
47
|
-
return _jsxs("div", {
|
|
48
|
-
className: "greeting",
|
|
49
|
-
children: ["Hi there ", name]
|
|
50
|
-
});
|
|
51
|
-
};
|
|
52
|
-
Object.defineProperty(NewGreeting, 'name', {
|
|
53
|
-
value: 'Greeting'
|
|
54
|
-
});
|
|
55
|
-
const result = await applyHmrModule({
|
|
56
|
-
Greeting: NewGreeting
|
|
57
|
-
}, '/test/applyHmrModule-match.tsx');
|
|
58
|
-
expect(result.matched).to.equal(true);
|
|
59
|
-
expect(result.orphaned).to.equal(false);
|
|
60
|
-
await testApp.unmount();
|
|
61
|
-
});
|
|
62
|
-
it('reports orphaned when a still-live component export disappears from the same file', async () => {
|
|
63
|
-
const window = new Window();
|
|
64
|
-
const document = window.document; // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Document is structurally compatible
|
|
65
|
-
const Greeting = ({
|
|
66
|
-
name
|
|
67
|
-
}) => {
|
|
68
|
-
return _jsxs("div", {
|
|
69
|
-
className: "greeting",
|
|
70
|
-
children: ["Hello ", name]
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
class Root extends TungstenSimpleComponent {
|
|
74
|
-
constructor(...args) {
|
|
75
|
-
super(...args);
|
|
76
|
-
_defineProperty(this, "content", () => _jsx(Greeting, {
|
|
77
|
-
name: "Ada"
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
const testApp = await createTestApp(Root, {
|
|
82
|
-
document
|
|
83
|
-
});
|
|
84
|
-
const wrapper = testApp.component.__currentContent;
|
|
85
|
-
if (!WideRenderedContentNodeIsComponent(wrapper) || !AnyComponentIsFunctionComponentStandIn(wrapper.element)) {
|
|
86
|
-
throw new Error('expected the root to directly render a single function component');
|
|
87
|
-
}
|
|
88
|
-
setCurrentInstance(wrapper.element.__instance);
|
|
89
|
-
const file = '/test/applyHmrModule-orphan.tsx';
|
|
90
|
-
// first edit: file still exports Greeting - establishes the "previously exported" baseline
|
|
91
|
-
const NewGreeting = ({
|
|
92
|
-
name
|
|
93
|
-
}) => {
|
|
94
|
-
return _jsxs("div", {
|
|
95
|
-
className: "greeting",
|
|
96
|
-
children: ["Hi there ", name]
|
|
97
|
-
});
|
|
98
|
-
};
|
|
99
|
-
Object.defineProperty(NewGreeting, 'name', {
|
|
100
|
-
value: 'Greeting'
|
|
101
|
-
});
|
|
102
|
-
const firstResult = await applyHmrModule({
|
|
103
|
-
Greeting: NewGreeting
|
|
104
|
-
}, file);
|
|
105
|
-
expect(firstResult.matched).to.equal(true);
|
|
106
|
-
expect(firstResult.orphaned).to.equal(false);
|
|
107
|
-
// second edit to the SAME file: Greeting has been renamed away - the live Greeting
|
|
108
|
-
// instance (now running NewGreeting's code) is still there, but nothing in the fresh
|
|
109
|
-
// module matches it any more
|
|
110
|
-
const Renamed = ({
|
|
111
|
-
name
|
|
112
|
-
}) => {
|
|
113
|
-
return _jsxs("div", {
|
|
114
|
-
className: "greeting",
|
|
115
|
-
children: ["Renamed ", name]
|
|
116
|
-
});
|
|
117
|
-
};
|
|
118
|
-
Object.defineProperty(Renamed, 'name', {
|
|
119
|
-
value: 'Renamed'
|
|
120
|
-
});
|
|
121
|
-
const secondResult = await applyHmrModule({
|
|
122
|
-
Renamed
|
|
123
|
-
}, file);
|
|
124
|
-
expect(secondResult.matched).to.equal(false);
|
|
125
|
-
expect(secondResult.orphaned).to.equal(true);
|
|
126
|
-
await testApp.unmount();
|
|
127
|
-
});
|
|
128
|
-
it('hot-swaps a component moved to a different file, since identity matching is name+kind based, not file-scoped', async () => {
|
|
129
|
-
const window = new Window();
|
|
130
|
-
const document = window.document; // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Document is structurally compatible
|
|
131
|
-
const Greeting = ({
|
|
132
|
-
name
|
|
133
|
-
}) => {
|
|
134
|
-
return _jsxs("div", {
|
|
135
|
-
className: "greeting",
|
|
136
|
-
children: ["Hello ", name]
|
|
137
|
-
});
|
|
138
|
-
};
|
|
139
|
-
class Root extends TungstenSimpleComponent {
|
|
140
|
-
constructor(...args) {
|
|
141
|
-
super(...args);
|
|
142
|
-
_defineProperty(this, "content", () => _jsx(Greeting, {
|
|
143
|
-
name: "Ada"
|
|
144
|
-
}));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
const testApp = await createTestApp(Root, {
|
|
148
|
-
document
|
|
149
|
-
});
|
|
150
|
-
const wrapper = testApp.component.__currentContent;
|
|
151
|
-
if (!WideRenderedContentNodeIsComponent(wrapper) || !AnyComponentIsFunctionComponentStandIn(wrapper.element)) {
|
|
152
|
-
throw new Error('expected the root to directly render a single function component');
|
|
153
|
-
}
|
|
154
|
-
setCurrentInstance(wrapper.element.__instance);
|
|
155
|
-
// simulate a single edit that moves Greeting out of its original file into a brand new
|
|
156
|
-
// one - both calls happen on the FIRST ever edit to each file, so neither has a
|
|
157
|
-
// previously-exported baseline to compare against (previousFileExportIdentities starts
|
|
158
|
-
// empty per file either way)
|
|
159
|
-
const MovedGreeting = ({
|
|
160
|
-
name
|
|
161
|
-
}) => {
|
|
162
|
-
return _jsxs("div", {
|
|
163
|
-
className: "greeting",
|
|
164
|
-
children: ["Moved hello ", name]
|
|
165
|
-
});
|
|
166
|
-
};
|
|
167
|
-
Object.defineProperty(MovedGreeting, 'name', {
|
|
168
|
-
value: 'Greeting'
|
|
169
|
-
});
|
|
170
|
-
const oldFileResult = await applyHmrModule({}, '/test/applyHmrModule-move-old-file.tsx');
|
|
171
|
-
const newFileResult = await applyHmrModule({
|
|
172
|
-
Greeting: MovedGreeting
|
|
173
|
-
}, '/test/applyHmrModule-move-new-file.tsx');
|
|
174
|
-
// the old file's own result correctly sees nothing to do (it's genuinely empty now) and
|
|
175
|
-
// isn't where the swap happens - the new file's result is what should show the match,
|
|
176
|
-
// since applyHmrModule matches by identity across the whole live registry, not per file
|
|
177
|
-
expect(oldFileResult.matched).to.equal(false);
|
|
178
|
-
expect(newFileResult.matched).to.equal(true);
|
|
179
|
-
expect(newFileResult.orphaned).to.equal(false);
|
|
180
|
-
await testApp.unmount();
|
|
181
|
-
});
|
|
182
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instanceRegistry.sxyt.d.ts","sourceRoot":"","sources":["../../src/hmr/instanceRegistry.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { expect } from 'chai';
|
|
2
|
-
import { describe } from 'sxy-test-runner';
|
|
3
|
-
describe('instanceRegistry() - cross module-graph visibility', ({
|
|
4
|
-
it
|
|
5
|
-
}) => {
|
|
6
|
-
it('setCurrentInstance() is visible from a separately-instantiated copy of the module', async () => {
|
|
7
|
-
// In the real dev client, hydrate.tsx (and its call to setCurrentInstance) is baked into
|
|
8
|
-
// the rolled-up, single-file client.js bundle, while applyHmrModule.js (and whatever it
|
|
9
|
-
// imports, including this module) is loaded completely separately - as a plain, unbundled
|
|
10
|
-
// ES module fetched fresh from the package-copy location. Those are two distinct module
|
|
11
|
-
// instantiations of this same source file, each with their own copy of any module-scope
|
|
12
|
-
// state. A cache-busting query string reproduces exactly that split here: Node's ESM
|
|
13
|
-
// loader treats these two specifiers as separate module records, the same way the browser
|
|
14
|
-
// treats the bundle and the package-copy as unrelated.
|
|
15
|
-
const moduleA = await import("./instanceRegistry.js");
|
|
16
|
-
const copySpecifier = './instanceRegistry.js' + '?copy=1';
|
|
17
|
-
const moduleB = await import(copySpecifier);
|
|
18
|
-
const fakeInstance = {
|
|
19
|
-
marker: 'fake-instance-for-test'
|
|
20
|
-
}; // eslint-disable-line no-type-assertion/no-type-assertion, @typescript-eslint/no-explicit-any -- only the identity of this object matters for the test
|
|
21
|
-
moduleA.setCurrentInstance(fakeInstance);
|
|
22
|
-
expect(moduleB.getCurrentInstance()).to.equal(fakeInstance);
|
|
23
|
-
});
|
|
24
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"refreshStylesheets.sxyt.d.ts","sourceRoot":"","sources":["../../src/hmr/refreshStylesheets.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { expect } from 'chai';
|
|
2
|
-
import { Window } from 'happy-dom';
|
|
3
|
-
import { describe } from 'sxy-test-runner';
|
|
4
|
-
import { refreshStylesheets } from "./refreshStylesheets.js";
|
|
5
|
-
describe('refreshStylesheets()', ({
|
|
6
|
-
it
|
|
7
|
-
}) => {
|
|
8
|
-
it('adds the new stylesheet link and waits for it to load before removing the old one', async () => {
|
|
9
|
-
const window = new Window();
|
|
10
|
-
const document = window.document; // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Document is structurally compatible
|
|
11
|
-
const oldLink = document.createElement('link');
|
|
12
|
-
oldLink.rel = 'stylesheet';
|
|
13
|
-
oldLink.href = '/.componentCss/ccss.css';
|
|
14
|
-
document.head.appendChild(oldLink);
|
|
15
|
-
const donePromises = refreshStylesheets(document);
|
|
16
|
-
expect(donePromises).to.have.length(1);
|
|
17
|
-
// give the (synchronous, in this test) DOM mutation a tick to land
|
|
18
|
-
await Promise.resolve();
|
|
19
|
-
const links = document.querySelectorAll('link[rel="stylesheet"]');
|
|
20
|
-
expect(links.length).to.equal(2);
|
|
21
|
-
expect(document.contains(oldLink)).to.equal(true);
|
|
22
|
-
const newLink = [...links].find(link => link !== oldLink); // eslint-disable-line no-type-assertion/no-type-assertion -- narrowed by the length check above
|
|
23
|
-
expect(newLink).to.not.equal(undefined);
|
|
24
|
-
expect(newLink.getAttribute('href')).to.match(/^\/\.componentCss\/ccss\.css\?t=\d+$/);
|
|
25
|
-
// simulate the browser finishing the fetch+parse of the new stylesheet
|
|
26
|
-
newLink.dispatchEvent(new window.Event('load')); // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Event is structurally compatible
|
|
27
|
-
await donePromises[0];
|
|
28
|
-
expect(document.contains(oldLink)).to.equal(false);
|
|
29
|
-
expect(document.querySelectorAll('link[rel="stylesheet"]').length).to.equal(1);
|
|
30
|
-
});
|
|
31
|
-
it('removes the old link even if the new stylesheet fails to load, rather than leaving both forever', async () => {
|
|
32
|
-
const window = new Window();
|
|
33
|
-
const document = window.document; // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Document is structurally compatible
|
|
34
|
-
const oldLink = document.createElement('link');
|
|
35
|
-
oldLink.rel = 'stylesheet';
|
|
36
|
-
oldLink.href = '/.componentCss/ccss.css';
|
|
37
|
-
document.head.appendChild(oldLink);
|
|
38
|
-
const [done] = refreshStylesheets(document);
|
|
39
|
-
await Promise.resolve();
|
|
40
|
-
const newLink = [...document.querySelectorAll('link[rel="stylesheet"]')].find(link => link !== oldLink); // eslint-disable-line no-type-assertion/no-type-assertion -- there are exactly two links at this point, one of them is oldLink
|
|
41
|
-
expect(newLink).to.not.equal(undefined);
|
|
42
|
-
newLink.dispatchEvent(new window.Event('error')); // eslint-disable-line no-type-assertion/no-type-assertion -- happy-dom's Event is structurally compatible
|
|
43
|
-
await done;
|
|
44
|
-
expect(document.contains(oldLink)).to.equal(false);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hydrate.sxyt.d.ts","sourceRoot":"","sources":["../../src/hydrate/hydrate.sxyt.tsx"],"names":[],"mappings":""}
|