tungsten 0.3.1 → 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/Components.d.ts +2 -1
- package/dist/Components.d.ts.map +1 -1
- package/dist/Components.js +10 -1
- package/dist/DomRegion.js +1 -1
- 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 +6 -0
- package/dist/FrameworkConfig.d.ts.map +1 -1
- package/dist/FunctionComponentStandIn.d.ts +2 -0
- package/dist/FunctionComponentStandIn.d.ts.map +1 -1
- package/dist/FunctionComponentStandIn.js +10 -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 +4 -0
- package/dist/Servers/DevServer.d.ts.map +1 -1
- package/dist/Servers/DevServer.js +116 -13
- 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/devErrorPageAutoRetry.d.ts +4 -0
- package/dist/Servers/devErrorPageAutoRetry.d.ts.map +1 -0
- package/dist/Servers/devErrorPageAutoRetry.js +26 -0
- 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/api/getExport.d.ts.map +1 -1
- package/dist/api/getExport.js +2 -1
- package/dist/babelPlugins/BabelAddDevCacheBust.d.ts +11 -0
- package/dist/babelPlugins/BabelAddDevCacheBust.d.ts.map +1 -0
- package/dist/babelPlugins/BabelAddDevCacheBust.js +68 -0
- 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 +16 -3
- 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 +10 -9
- package/dist/build/createInstanceConfigFile.js +1 -1
- package/dist/build/makeBabelUserDevConfig.d.ts.map +1 -1
- package/dist/build/makeBabelUserDevConfig.js +6 -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 +3 -0
- package/dist/defaultConfig.d.ts.map +1 -1
- package/dist/defaultConfig.js +4 -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/getEnvSchemas.js +2 -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/getComponent.d.ts.map +1 -1
- package/dist/getComponent.js +2 -1
- package/dist/getRoutes.d.ts.map +1 -1
- package/dist/getRoutes.js +2 -1
- package/dist/hmr/applyHmrModule.d.ts +11 -0
- package/dist/hmr/applyHmrModule.d.ts.map +1 -0
- package/dist/hmr/applyHmrModule.js +78 -0
- package/dist/hmr/componentIdentity.d.ts +9 -0
- package/dist/hmr/componentIdentity.d.ts.map +1 -0
- package/dist/hmr/componentIdentity.js +17 -0
- package/dist/hmr/instanceRegistry.d.ts +4 -0
- package/dist/hmr/instanceRegistry.d.ts.map +1 -0
- package/dist/hmr/instanceRegistry.js +6 -0
- package/dist/hmr/liveReloadHub.d.ts +10 -0
- package/dist/hmr/liveReloadHub.d.ts.map +1 -0
- package/dist/{dev → hmr}/liveReloadHub.js +8 -2
- package/dist/hmr/refreshStylesheets.d.ts +2 -0
- package/dist/hmr/refreshStylesheets.d.ts.map +1 -0
- package/dist/hmr/refreshStylesheets.js +26 -0
- 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 +10 -0
- package/dist/hydrate/hydrate.d.ts.map +1 -1
- package/dist/hydrate/hydrate.js +81 -19
- package/dist/hydrate/reconcileHydratedAttributes.d.ts.map +1 -1
- package/dist/hydrate/reconcileHydratedAttributes.js +14 -5
- 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/importDevModuleWithRetry.d.ts +3 -0
- package/dist/importDevModuleWithRetry.d.ts.map +1 -0
- package/dist/importDevModuleWithRetry.js +46 -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 +2 -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 +3 -1
- package/dist/render/processHead.d.ts.map +1 -1
- package/dist/render/processHead.js +53 -6
- 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 +16 -1
- package/dist/update/integrateUpdateVdom.d.ts.map +1 -1
- package/dist/update/integrateUpdateVdom.js +116 -7
- package/dist/warnOnFrameworkChange.d.ts +2 -0
- package/dist/warnOnFrameworkChange.d.ts.map +1 -0
- package/dist/warnOnFrameworkChange.js +27 -0
- package/package.json +18 -16
- 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/_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/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/dev/liveReloadHub.d.ts +0 -6
- package/dist/dev/liveReloadHub.d.ts.map +0 -1
- 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/hydrate/reconcileHydratedAttributes.sxyt.d.ts +0 -2
- package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts.map +0 -1
- package/dist/hydrate/reconcileHydratedAttributes.sxyt.js +0 -173
- 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/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
|
@@ -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,6 +0,0 @@
|
|
|
1
|
-
export type ReloadEventKind = 'js' | 'css';
|
|
2
|
-
type ReloadListener = (kind: ReloadEventKind) => void;
|
|
3
|
-
export declare function onReloadEvent(listener: ReloadListener): () => void;
|
|
4
|
-
export declare function emitReloadEvent(kind: ReloadEventKind): void;
|
|
5
|
-
export {};
|
|
6
|
-
//# sourceMappingURL=liveReloadHub.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"liveReloadHub.d.ts","sourceRoot":"","sources":["../../src/dev/liveReloadHub.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,KAAK,CAAA;AAE1C,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;AAIrD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAGlE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAE3D"}
|
|
@@ -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":"reconcileHydratedAttributes.sxyt.d.ts","sourceRoot":"","sources":["../../src/hydrate/reconcileHydratedAttributes.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { describe } from 'sxy-test-runner';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
|
-
import { Window } from 'happy-dom';
|
|
4
|
-
import { reconcileHydratedAttributes } from "./reconcileHydratedAttributes.js";
|
|
5
|
-
import { $props, $type } from "../contentNodeSymbols.js";
|
|
6
|
-
const window = new Window();
|
|
7
|
-
const node = (type, props) => ({
|
|
8
|
-
[$type]: type,
|
|
9
|
-
[$props]: props
|
|
10
|
-
});
|
|
11
|
-
/** Builds an element from markup the server could have produced. */
|
|
12
|
-
const element = html => {
|
|
13
|
-
const host = window.document.createElement('div');
|
|
14
|
-
host.innerHTML = html;
|
|
15
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
16
|
-
return host.firstElementChild;
|
|
17
|
-
};
|
|
18
|
-
const attributesOf = domNode => Object.fromEntries([...domNode.attributes].map(attribute => [attribute.name, attribute.value]));
|
|
19
|
-
/** Reconciles and returns what changed. */
|
|
20
|
-
const reconcile = (type, props, html) => {
|
|
21
|
-
const domNode = element(html);
|
|
22
|
-
const mismatches = [];
|
|
23
|
-
reconcileHydratedAttributes(node(type, props), domNode, mismatch => mismatches.push(mismatch));
|
|
24
|
-
return {
|
|
25
|
-
domNode,
|
|
26
|
-
mismatches,
|
|
27
|
-
attributes: attributesOf(domNode)
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
describe('reconcileHydratedAttributes()', ({
|
|
31
|
-
it
|
|
32
|
-
}) => {
|
|
33
|
-
it('patches an attribute whose rendered value differs from the markup', () => {
|
|
34
|
-
const {
|
|
35
|
-
attributes,
|
|
36
|
-
mismatches
|
|
37
|
-
} = reconcile('div', {
|
|
38
|
-
style: {
|
|
39
|
-
backgroundColor: '#123456'
|
|
40
|
-
}
|
|
41
|
-
}, '<div style="background-color: #bae3ff;"></div>');
|
|
42
|
-
expect(attributes.style).to.equal('background-color: #123456;');
|
|
43
|
-
expect(mismatches.map(mismatch => mismatch.name)).to.deep.equal(['style']);
|
|
44
|
-
});
|
|
45
|
-
it('leaves a matching attribute untouched and reports nothing', () => {
|
|
46
|
-
const {
|
|
47
|
-
attributes,
|
|
48
|
-
mismatches
|
|
49
|
-
} = reconcile('input', {
|
|
50
|
-
name: 'ref',
|
|
51
|
-
title: 'Reference'
|
|
52
|
-
}, '<input name="ref" title="Reference">');
|
|
53
|
-
expect(attributes).to.deep.equal({
|
|
54
|
-
name: 'ref',
|
|
55
|
-
title: 'Reference'
|
|
56
|
-
});
|
|
57
|
-
expect(mismatches).to.deep.equal([]);
|
|
58
|
-
});
|
|
59
|
-
it('adds an attribute the markup is missing', () => {
|
|
60
|
-
const {
|
|
61
|
-
attributes
|
|
62
|
-
} = reconcile('a', {
|
|
63
|
-
href: '/x',
|
|
64
|
-
title: 't'
|
|
65
|
-
}, '<a href="/x"></a>');
|
|
66
|
-
expect(attributes).to.deep.equal({
|
|
67
|
-
href: '/x',
|
|
68
|
-
title: 't'
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
it('removes an attribute the render no longer produces', () => {
|
|
72
|
-
const {
|
|
73
|
-
attributes,
|
|
74
|
-
mismatches
|
|
75
|
-
} = reconcile('a', {
|
|
76
|
-
href: '/x'
|
|
77
|
-
}, '<a href="/x" title="gone"></a>');
|
|
78
|
-
expect(attributes).to.deep.equal({
|
|
79
|
-
href: '/x'
|
|
80
|
-
});
|
|
81
|
-
expect(mismatches.map(mismatch => mismatch.name)).to.deep.equal(['title']);
|
|
82
|
-
});
|
|
83
|
-
it('treats a true boolean as a present, empty attribute', () => {
|
|
84
|
-
expect(reconcile('button', {
|
|
85
|
-
disabled: true
|
|
86
|
-
}, '<button></button>').attributes).to.deep.equal({
|
|
87
|
-
disabled: ''
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
it('removes an attribute whose rendered value is false, null or undefined', () => {
|
|
91
|
-
expect(reconcile('button', {
|
|
92
|
-
disabled: false
|
|
93
|
-
}, '<button disabled></button>').attributes).to.deep.equal({});
|
|
94
|
-
expect(reconcile('a', {
|
|
95
|
-
href: null
|
|
96
|
-
}, '<a href="/x"></a>').attributes).to.deep.equal({});
|
|
97
|
-
expect(reconcile('a', {
|
|
98
|
-
href: undefined
|
|
99
|
-
}, '<a href="/x"></a>').attributes).to.deep.equal({});
|
|
100
|
-
});
|
|
101
|
-
// The comparison has to apply the same transformation the server used, or
|
|
102
|
-
// every element looks mismatched and the whole document gets rewritten.
|
|
103
|
-
it('applies the server prop transform, so className compares against class', () => {
|
|
104
|
-
const {
|
|
105
|
-
attributes,
|
|
106
|
-
mismatches
|
|
107
|
-
} = reconcile('div', {
|
|
108
|
-
className: 'frame Qtc_frame'
|
|
109
|
-
}, '<div class="frame Qtc_frame"></div>');
|
|
110
|
-
expect(attributes).to.deep.equal({
|
|
111
|
-
class: 'frame Qtc_frame'
|
|
112
|
-
});
|
|
113
|
-
expect(mismatches).to.deep.equal([]);
|
|
114
|
-
});
|
|
115
|
-
it('ignores event handlers rather than writing them as attributes', () => {
|
|
116
|
-
const {
|
|
117
|
-
attributes,
|
|
118
|
-
mismatches
|
|
119
|
-
} = reconcile('input', {
|
|
120
|
-
name: 'a',
|
|
121
|
-
onInput: () => undefined,
|
|
122
|
-
onClick: () => undefined
|
|
123
|
-
}, '<input name="a">');
|
|
124
|
-
expect(attributes).to.deep.equal({
|
|
125
|
-
name: 'a'
|
|
126
|
-
});
|
|
127
|
-
expect(mismatches).to.deep.equal([]);
|
|
128
|
-
});
|
|
129
|
-
it('ignores props that are instructions to Tungsten', () => {
|
|
130
|
-
const {
|
|
131
|
-
attributes,
|
|
132
|
-
mismatches
|
|
133
|
-
} = reconcile('div', {
|
|
134
|
-
__opaque: true,
|
|
135
|
-
dangerouslySetInnerHTML: {
|
|
136
|
-
__html: '<b>x</b>'
|
|
137
|
-
},
|
|
138
|
-
id: 'd'
|
|
139
|
-
}, '<div id="d"></div>');
|
|
140
|
-
expect(attributes).to.deep.equal({
|
|
141
|
-
id: 'd'
|
|
142
|
-
});
|
|
143
|
-
expect(mismatches).to.deep.equal([]);
|
|
144
|
-
});
|
|
145
|
-
it('reports what changed, for a dev-mode warning', () => {
|
|
146
|
-
const {
|
|
147
|
-
mismatches
|
|
148
|
-
} = reconcile('a', {
|
|
149
|
-
href: '/new'
|
|
150
|
-
}, '<a href="/old" title="stale"></a>');
|
|
151
|
-
expect(mismatches).to.deep.include({
|
|
152
|
-
name: 'href',
|
|
153
|
-
expected: '/new',
|
|
154
|
-
actual: '/old'
|
|
155
|
-
});
|
|
156
|
-
expect(mismatches).to.deep.include({
|
|
157
|
-
name: 'title',
|
|
158
|
-
expected: null,
|
|
159
|
-
actual: 'stale'
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
it('clears the checked property when removing a checked attribute', () => {
|
|
163
|
-
const domNode = element('<input type="checkbox" checked>');
|
|
164
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
165
|
-
const checkbox = domNode;
|
|
166
|
-
expect(checkbox.checked).to.equal(true);
|
|
167
|
-
reconcileHydratedAttributes(node('input', {
|
|
168
|
-
type: 'checkbox'
|
|
169
|
-
}), domNode);
|
|
170
|
-
expect(checkbox.checked).to.equal(false);
|
|
171
|
-
expect(domNode.hasAttribute('checked')).to.equal(false);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"innerHtmlFromProps.sxyt.d.ts","sourceRoot":"","sources":["../src/innerHtmlFromProps.sxyt.ts"],"names":[],"mappings":""}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { describe } from 'sxy-test-runner';
|
|
2
|
-
import { expect } from 'chai';
|
|
3
|
-
import { innerHtmlFromProps } from "./innerHtmlFromProps.js";
|
|
4
|
-
import { renderingNodeToHtml } from "./render/renderingTreeToHtml.js";
|
|
5
|
-
import { $props, $type } from "./contentNodeSymbols.js";
|
|
6
|
-
const props = value => value;
|
|
7
|
-
// `found: true` short-circuits the <head> handling, which is all these
|
|
8
|
-
// element-level tests need from HeadData.
|
|
9
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
10
|
-
const noHeadData = {
|
|
11
|
-
found: true
|
|
12
|
-
};
|
|
13
|
-
const renderHtml = (type, nodeProps) => renderingNodeToHtml(
|
|
14
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
15
|
-
{
|
|
16
|
-
[$type]: type,
|
|
17
|
-
[$props]: nodeProps
|
|
18
|
-
}, false, noHeadData, null);
|
|
19
|
-
describe('innerHtmlFromProps()', ({
|
|
20
|
-
it
|
|
21
|
-
}) => {
|
|
22
|
-
it('returns null when the element does not use dangerouslySetInnerHTML', () => {
|
|
23
|
-
expect(innerHtmlFromProps('div', props({
|
|
24
|
-
children: 'hello'
|
|
25
|
-
}), true)).to.equal(null);
|
|
26
|
-
});
|
|
27
|
-
it('returns the raw markup', () => {
|
|
28
|
-
expect(innerHtmlFromProps('div', props({
|
|
29
|
-
dangerouslySetInnerHTML: {
|
|
30
|
-
__html: '<b>hi</b>'
|
|
31
|
-
}
|
|
32
|
-
}), false)).to.equal('<b>hi</b>');
|
|
33
|
-
});
|
|
34
|
-
it('rejects an element carrying both raw markup and children', () => {
|
|
35
|
-
expect(() => innerHtmlFromProps('div', props({
|
|
36
|
-
dangerouslySetInnerHTML: {
|
|
37
|
-
__html: '<b>hi</b>'
|
|
38
|
-
},
|
|
39
|
-
children: 'hello'
|
|
40
|
-
}), true)).to.throw(/both dangerouslySetInnerHTML and children/);
|
|
41
|
-
});
|
|
42
|
-
it('rejects a prop that is not of the form { __html }', () => {
|
|
43
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
44
|
-
const bad = {
|
|
45
|
-
dangerouslySetInnerHTML: '<b>hi</b>'
|
|
46
|
-
};
|
|
47
|
-
expect(() => innerHtmlFromProps('div', bad, false)).to.throw(/{ __html: '...' }/);
|
|
48
|
-
});
|
|
49
|
-
it('rejects a null or undefined __html', () => {
|
|
50
|
-
// eslint-disable-next-line no-type-assertion/no-type-assertion
|
|
51
|
-
const nulled = {
|
|
52
|
-
dangerouslySetInnerHTML: {
|
|
53
|
-
__html: null
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
expect(() => innerHtmlFromProps('div', nulled, false)).to.throw(/__html is null/);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
describe('dangerouslySetInnerHTML rendering', ({
|
|
60
|
-
it
|
|
61
|
-
}) => {
|
|
62
|
-
it('writes the markup into the element unescaped', async () => {
|
|
63
|
-
expect(await renderHtml('div', {
|
|
64
|
-
dangerouslySetInnerHTML: {
|
|
65
|
-
__html: '<p>Bonuses.</p>'
|
|
66
|
-
}
|
|
67
|
-
})).to.equal('<div><p>Bonuses.</p></div>');
|
|
68
|
-
});
|
|
69
|
-
it('does not leak the prop into the markup as an attribute', async () => {
|
|
70
|
-
const html = await renderHtml('div', {
|
|
71
|
-
id: 'tip',
|
|
72
|
-
dangerouslySetInnerHTML: {
|
|
73
|
-
__html: '<b>hi</b>'
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
expect(html).to.not.include('dangerouslySetInnerHTML');
|
|
77
|
-
expect(html).to.not.include('[object Object]');
|
|
78
|
-
expect(html).to.equal('<div id="tip"><b>hi</b></div>');
|
|
79
|
-
});
|
|
80
|
-
it('escapes ordinary children, so the switch is per element', async () => {
|
|
81
|
-
expect(await renderHtml('div', {
|
|
82
|
-
children: '<p>Bonuses.</p>'
|
|
83
|
-
})).to.equal('<div><p>Bonuses.</p></div>');
|
|
84
|
-
});
|
|
85
|
-
it('rejects raw markup on a void element', async () => {
|
|
86
|
-
let thrown = null;
|
|
87
|
-
try {
|
|
88
|
-
await renderHtml('br', {
|
|
89
|
-
dangerouslySetInnerHTML: {
|
|
90
|
-
__html: '<b>hi</b>'
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
} catch (error) {
|
|
94
|
-
thrown = error;
|
|
95
|
-
}
|
|
96
|
-
expect(thrown).to.be.an('error');
|
|
97
|
-
expect(thrown.message).to.include('void type');
|
|
98
|
-
});
|
|
99
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseSelectors.sxyt.d.ts","sourceRoot":"","sources":["../../src/postcssPlugins/parseSelectors.sxyt.ts"],"names":[],"mappings":""}
|