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.
Files changed (278) hide show
  1. package/dist/.build-complete +1 -0
  2. package/dist/Framework.d.ts +2 -0
  3. package/dist/Framework.d.ts.map +1 -1
  4. package/dist/Framework.js +68 -57
  5. package/dist/FrameworkConfig.d.ts +2 -0
  6. package/dist/FrameworkConfig.d.ts.map +1 -1
  7. package/dist/Instance/Instance.d.ts.map +1 -1
  8. package/dist/Instance/Instance.js +18 -1
  9. package/dist/Instance/InstanceConfig.d.ts +1 -0
  10. package/dist/Instance/InstanceConfig.d.ts.map +1 -1
  11. package/dist/PopMessage.type.d.ts +6 -0
  12. package/dist/PopMessage.type.d.ts.map +1 -0
  13. package/dist/PopMessage.type.js +1 -0
  14. package/dist/Servers/DevServer.d.ts +2 -0
  15. package/dist/Servers/DevServer.d.ts.map +1 -1
  16. package/dist/Servers/DevServer.js +84 -8
  17. package/dist/Servers/MatchedRouteInfo.d.ts +1 -1
  18. package/dist/Servers/MatchedRouteInfo.d.ts.map +1 -1
  19. package/dist/Servers/ProdServer.d.ts +1 -0
  20. package/dist/Servers/ProdServer.d.ts.map +1 -1
  21. package/dist/Servers/ProdServer.js +79 -5
  22. package/dist/Servers/hono/DevServerHono.js +25 -29
  23. package/dist/Servers/hono/ProdServerHono.js +49 -142
  24. package/dist/Servers/hono/TungstenServerHono.d.ts +1 -1
  25. package/dist/Servers/hono/TungstenServerHono.d.ts.map +1 -1
  26. package/dist/Servers/hono/TungstenServerHono.js +12 -29
  27. package/dist/Servers/routing.d.ts.map +1 -1
  28. package/dist/Servers/routing.js +10 -6
  29. package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts +0 -3
  30. package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts.map +1 -1
  31. package/dist/Servers/tungstenCorePrivateEnvSchema.js +3 -3
  32. package/dist/Servers/tungstenCorePublicEnvSchema.d.ts +8 -0
  33. package/dist/Servers/tungstenCorePublicEnvSchema.d.ts.map +1 -0
  34. package/dist/Servers/tungstenCorePublicEnvSchema.js +14 -0
  35. package/dist/Store/InternalStoreSchema.d.ts +2 -0
  36. package/dist/Store/InternalStoreSchema.d.ts.map +1 -1
  37. package/dist/Store/InternalStoreSchema.js +1 -0
  38. package/dist/api/Request.d.ts +1 -1
  39. package/dist/api/Request.d.ts.map +1 -1
  40. package/dist/api/Response.d.ts +1 -1
  41. package/dist/api/Response.d.ts.map +1 -1
  42. package/dist/babelPlugins/BabelTypes.d.ts +2 -2
  43. package/dist/babelPlugins/BabelTypes.d.ts.map +1 -1
  44. package/dist/babelPlugins/BabelTypes.js +0 -1
  45. package/dist/bin/commands/build.d.ts.map +1 -1
  46. package/dist/bin/commands/build.js +3 -0
  47. package/dist/bin/commands/dev.d.ts.map +1 -1
  48. package/dist/bin/commands/dev.js +15 -4
  49. package/dist/bin/commands/devmon.d.ts +2 -0
  50. package/dist/bin/commands/devmon.d.ts.map +1 -0
  51. package/dist/bin/commands/devmon.js +66 -0
  52. package/dist/bin/index.d.ts.map +1 -1
  53. package/dist/bin/index.js +6 -0
  54. package/dist/booleanAttributeValue.d.ts +21 -0
  55. package/dist/booleanAttributeValue.d.ts.map +1 -0
  56. package/dist/booleanAttributeValue.js +23 -0
  57. package/dist/build/compileJavascript.js +1 -1
  58. package/dist/build/compileUserApp.d.ts +2 -1
  59. package/dist/build/compileUserApp.d.ts.map +1 -1
  60. package/dist/build/compileUserApp.js +8 -7
  61. package/dist/build/createInstanceConfigFile.js +1 -1
  62. package/dist/compat/types.d.ts +1 -1
  63. package/dist/compat/types.d.ts.map +1 -1
  64. package/dist/components/PopMessages.d.ts +12 -0
  65. package/dist/components/PopMessages.d.ts.map +1 -0
  66. package/dist/components/PopMessages.js +45 -0
  67. package/dist/defaultConfig.d.ts +1 -0
  68. package/dist/defaultConfig.d.ts.map +1 -1
  69. package/dist/defaultConfig.js +2 -1
  70. package/dist/env/Interfaces.d.ts +2 -1
  71. package/dist/env/Interfaces.d.ts.map +1 -1
  72. package/dist/env/getEnvSchemas.d.ts +1 -1
  73. package/dist/env/getEnvSchemas.d.ts.map +1 -1
  74. package/dist/env/publicEnv.d.ts.map +1 -1
  75. package/dist/env/publicEnv.js +4 -1
  76. package/dist/frameworkConfigSchema.d.ts +4 -0
  77. package/dist/frameworkConfigSchema.d.ts.map +1 -1
  78. package/dist/frameworkConfigSchema.js +2 -1
  79. package/dist/hooks/index.d.ts +1 -0
  80. package/dist/hooks/index.d.ts.map +1 -1
  81. package/dist/hooks/index.js +1 -0
  82. package/dist/hooks/useInstance.d.ts +3 -0
  83. package/dist/hooks/useInstance.d.ts.map +1 -0
  84. package/dist/hooks/useInstance.js +4 -0
  85. package/dist/hydrate/hydrate.d.ts +6 -4
  86. package/dist/hydrate/hydrate.d.ts.map +1 -1
  87. package/dist/hydrate/hydrate.js +51 -13
  88. package/dist/hydrate/reconcileHydratedAttributes.d.ts.map +1 -1
  89. package/dist/hydrate/reconcileHydratedAttributes.js +4 -3
  90. package/dist/hydrate/renderHydrationMismatchBanner.d.ts +7 -0
  91. package/dist/hydrate/renderHydrationMismatchBanner.d.ts.map +1 -0
  92. package/dist/hydrate/renderHydrationMismatchBanner.js +69 -0
  93. package/dist/indexInner.d.ts +8 -0
  94. package/dist/indexInner.d.ts.map +1 -1
  95. package/dist/indexInner.js +7 -1
  96. package/dist/makeInstanceConfigFromFrameworkConfig.d.ts.map +1 -1
  97. package/dist/makeInstanceConfigFromFrameworkConfig.js +2 -1
  98. package/dist/pop.d.ts +10 -0
  99. package/dist/pop.d.ts.map +1 -0
  100. package/dist/pop.js +49 -0
  101. package/dist/rawHtml/filterContentNode.d.ts +20 -0
  102. package/dist/rawHtml/filterContentNode.d.ts.map +1 -0
  103. package/dist/rawHtml/filterContentNode.js +96 -0
  104. package/dist/rawHtml/parseHtml.d.ts +14 -0
  105. package/dist/rawHtml/parseHtml.d.ts.map +1 -1
  106. package/dist/rawHtml/parseHtml.js +4 -4
  107. package/dist/rawHtml/sanitizeHtml.d.ts +17 -0
  108. package/dist/rawHtml/sanitizeHtml.d.ts.map +1 -0
  109. package/dist/rawHtml/sanitizeHtml.js +19 -0
  110. package/dist/render/HeadData.d.ts +1 -0
  111. package/dist/render/HeadData.d.ts.map +1 -1
  112. package/dist/render/contentNodeToHtml.d.ts +18 -0
  113. package/dist/render/contentNodeToHtml.d.ts.map +1 -0
  114. package/dist/render/contentNodeToHtml.js +66 -0
  115. package/dist/render/contentToHtml.d.ts.map +1 -1
  116. package/dist/render/contentToHtml.js +2 -1
  117. package/dist/render/processHead.d.ts.map +1 -1
  118. package/dist/render/processHead.js +8 -2
  119. package/dist/render/renderingTreeToHtml.d.ts.map +1 -1
  120. package/dist/render/renderingTreeToHtml.js +8 -1
  121. package/dist/routing/ErrorRouteType.d.ts +6 -0
  122. package/dist/routing/ErrorRouteType.d.ts.map +1 -0
  123. package/dist/routing/ErrorRouteType.js +1 -0
  124. package/dist/routing/RouteTypes.d.ts +2 -1
  125. package/dist/routing/RouteTypes.d.ts.map +1 -1
  126. package/dist/routing/Routes.d.ts +5 -0
  127. package/dist/routing/Routes.d.ts.map +1 -1
  128. package/dist/routing/TungstenErrorInfo.d.ts +6 -0
  129. package/dist/routing/TungstenErrorInfo.d.ts.map +1 -0
  130. package/dist/routing/TungstenErrorInfo.js +6 -0
  131. package/dist/style/styleContentSxy.js +21 -0
  132. package/dist/testing/hydrateTestApp.d.ts +38 -0
  133. package/dist/testing/hydrateTestApp.d.ts.map +1 -0
  134. package/dist/testing/hydrateTestApp.js +242 -0
  135. package/dist/testing/index.d.ts +4 -3
  136. package/dist/testing/index.d.ts.map +1 -1
  137. package/dist/testing/index.js +16 -2
  138. package/dist/timeProfiler.d.ts +6 -0
  139. package/dist/timeProfiler.d.ts.map +1 -0
  140. package/dist/timeProfiler.js +31 -0
  141. package/dist/update/integrateUpdateVdom.d.ts +11 -0
  142. package/dist/update/integrateUpdateVdom.d.ts.map +1 -1
  143. package/dist/update/integrateUpdateVdom.js +9 -3
  144. package/dist/warnOnFrameworkChange.d.ts.map +1 -1
  145. package/dist/warnOnFrameworkChange.js +8 -8
  146. package/package.json +18 -16
  147. package/dist/FunctionComponentStandIn.sxyt.d.ts +0 -2
  148. package/dist/FunctionComponentStandIn.sxyt.d.ts.map +0 -1
  149. package/dist/FunctionComponentStandIn.sxyt.js +0 -52
  150. package/dist/Instance/gotoRedirect.sxyt.d.ts +0 -2
  151. package/dist/Instance/gotoRedirect.sxyt.d.ts.map +0 -1
  152. package/dist/Instance/gotoRedirect.sxyt.js +0 -148
  153. package/dist/Instance/runTrackedWork.sxyt.d.ts +0 -2
  154. package/dist/Instance/runTrackedWork.sxyt.d.ts.map +0 -1
  155. package/dist/Instance/runTrackedWork.sxyt.js +0 -35
  156. package/dist/Servers/devErrorPageAutoRetry.sxyt.d.ts +0 -2
  157. package/dist/Servers/devErrorPageAutoRetry.sxyt.d.ts.map +0 -1
  158. package/dist/Servers/devErrorPageAutoRetry.sxyt.js +0 -117
  159. package/dist/_client/cjsHelpers.sxyt.d.ts +0 -2
  160. package/dist/_client/cjsHelpers.sxyt.d.ts.map +0 -1
  161. package/dist/_client/cjsHelpers.sxyt.js +0 -45
  162. package/dist/auth/passwordHashing.sxyt.d.ts +0 -2
  163. package/dist/auth/passwordHashing.sxyt.d.ts.map +0 -1
  164. package/dist/auth/passwordHashing.sxyt.js +0 -46
  165. package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts +0 -2
  166. package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts.map +0 -1
  167. package/dist/auth/ref/checkPasswordResetToken.sxyt.js +0 -40
  168. package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts +0 -2
  169. package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts.map +0 -1
  170. package/dist/auth/ref/createPasswordResetToken.sxyt.js +0 -10
  171. package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.d.ts +0 -2
  172. package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.d.ts.map +0 -1
  173. package/dist/babelPlugins/BabelAddDevCacheBust.sxyt.js +0 -138
  174. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts +0 -2
  175. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts.map +0 -1
  176. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.js +0 -108
  177. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts +0 -2
  178. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts.map +0 -1
  179. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.js +0 -104
  180. package/dist/bin/commands/compile.sxyt.d.ts +0 -2
  181. package/dist/bin/commands/compile.sxyt.d.ts.map +0 -1
  182. package/dist/bin/commands/compile.sxyt.js +0 -255
  183. package/dist/build/modifySassImports.sxyt.d.ts +0 -2
  184. package/dist/build/modifySassImports.sxyt.d.ts.map +0 -1
  185. package/dist/build/modifySassImports.sxyt.js +0 -55
  186. package/dist/build/sassImportParser.sxyt.d.ts +0 -2
  187. package/dist/build/sassImportParser.sxyt.d.ts.map +0 -1
  188. package/dist/build/sassImportParser.sxyt.js +0 -110
  189. package/dist/build/scssImportParserChatgpt.sxyt.d.ts +0 -2
  190. package/dist/build/scssImportParserChatgpt.sxyt.d.ts.map +0 -1
  191. package/dist/build/scssImportParserChatgpt.sxyt.js +0 -120
  192. package/dist/clone.sxyt.d.ts +0 -2
  193. package/dist/clone.sxyt.d.ts.map +0 -1
  194. package/dist/clone.sxyt.js +0 -24
  195. package/dist/componentProxyHandlers.sxyt.d.ts +0 -2
  196. package/dist/componentProxyHandlers.sxyt.d.ts.map +0 -1
  197. package/dist/componentProxyHandlers.sxyt.js +0 -130
  198. package/dist/components/RawHtml.sxyt.d.ts +0 -2
  199. package/dist/components/RawHtml.sxyt.d.ts.map +0 -1
  200. package/dist/components/RawHtml.sxyt.js +0 -104
  201. package/dist/components/bindable/BindableSelect.sxyt.d.ts +0 -2
  202. package/dist/components/bindable/BindableSelect.sxyt.d.ts.map +0 -1
  203. package/dist/components/bindable/BindableSelect.sxyt.js +0 -186
  204. package/dist/env/injectEnv.sxyt.d.ts +0 -2
  205. package/dist/env/injectEnv.sxyt.d.ts.map +0 -1
  206. package/dist/env/injectEnv.sxyt.js +0 -20
  207. package/dist/env/parseEnv.sxyt.d.ts +0 -2
  208. package/dist/env/parseEnv.sxyt.d.ts.map +0 -1
  209. package/dist/env/parseEnv.sxyt.js +0 -11
  210. package/dist/findProjectDir.sxyt.d.ts +0 -2
  211. package/dist/findProjectDir.sxyt.d.ts.map +0 -1
  212. package/dist/findProjectDir.sxyt.js +0 -82
  213. package/dist/hmr/applyHmrModule.sxyt.d.ts +0 -2
  214. package/dist/hmr/applyHmrModule.sxyt.d.ts.map +0 -1
  215. package/dist/hmr/applyHmrModule.sxyt.js +0 -182
  216. package/dist/hmr/instanceRegistry.sxyt.d.ts +0 -2
  217. package/dist/hmr/instanceRegistry.sxyt.d.ts.map +0 -1
  218. package/dist/hmr/instanceRegistry.sxyt.js +0 -24
  219. package/dist/hmr/refreshStylesheets.sxyt.d.ts +0 -2
  220. package/dist/hmr/refreshStylesheets.sxyt.d.ts.map +0 -1
  221. package/dist/hmr/refreshStylesheets.sxyt.js +0 -46
  222. package/dist/hydrate/hydrate.sxyt.d.ts +0 -2
  223. package/dist/hydrate/hydrate.sxyt.d.ts.map +0 -1
  224. package/dist/hydrate/hydrate.sxyt.js +0 -302
  225. package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts +0 -2
  226. package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts.map +0 -1
  227. package/dist/hydrate/reconcileHydratedAttributes.sxyt.js +0 -190
  228. package/dist/importDevModuleWithRetry.sxyt.d.ts +0 -2
  229. package/dist/importDevModuleWithRetry.sxyt.d.ts.map +0 -1
  230. package/dist/importDevModuleWithRetry.sxyt.js +0 -104
  231. package/dist/innerHtmlFromProps.sxyt.d.ts +0 -2
  232. package/dist/innerHtmlFromProps.sxyt.d.ts.map +0 -1
  233. package/dist/innerHtmlFromProps.sxyt.js +0 -99
  234. package/dist/postcssPlugins/parseSelectors.sxyt.d.ts +0 -2
  235. package/dist/postcssPlugins/parseSelectors.sxyt.d.ts.map +0 -1
  236. package/dist/postcssPlugins/parseSelectors.sxyt.js +0 -62
  237. package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts +0 -2
  238. package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts.map +0 -1
  239. package/dist/postcssPlugins/parseSelectorsRich.sxyt.js +0 -155
  240. package/dist/rawHtml/parseHtml.sxyt.d.ts +0 -2
  241. package/dist/rawHtml/parseHtml.sxyt.d.ts.map +0 -1
  242. package/dist/rawHtml/parseHtml.sxyt.js +0 -239
  243. package/dist/render/getFunctionBodyAsString.sxyt.d.ts +0 -2
  244. package/dist/render/getFunctionBodyAsString.sxyt.d.ts.map +0 -1
  245. package/dist/render/getFunctionBodyAsString.sxyt.js +0 -37
  246. package/dist/render/processHead.sxyt.d.ts +0 -2
  247. package/dist/render/processHead.sxyt.d.ts.map +0 -1
  248. package/dist/render/processHead.sxyt.js +0 -93
  249. package/dist/render/processProps.sxyt.d.ts +0 -2
  250. package/dist/render/processProps.sxyt.d.ts.map +0 -1
  251. package/dist/render/processProps.sxyt.js +0 -90
  252. package/dist/routing/compareRequestToRegex.sxyt.d.ts +0 -2
  253. package/dist/routing/compareRequestToRegex.sxyt.d.ts.map +0 -1
  254. package/dist/routing/compareRequestToRegex.sxyt.js +0 -65
  255. package/dist/routing/getPathPriority.sxyt.d.ts +0 -2
  256. package/dist/routing/getPathPriority.sxyt.d.ts.map +0 -1
  257. package/dist/routing/getPathPriority.sxyt.js +0 -24
  258. package/dist/routing/matchPath.sxyt.d.ts +0 -2
  259. package/dist/routing/matchPath.sxyt.d.ts.map +0 -1
  260. package/dist/routing/matchPath.sxyt.js +0 -41
  261. package/dist/routing/patternToRegex.sxyt.d.ts +0 -2
  262. package/dist/routing/patternToRegex.sxyt.d.ts.map +0 -1
  263. package/dist/routing/patternToRegex.sxyt.js +0 -69
  264. package/dist/routing/splitRequest.sxyt.d.ts +0 -2
  265. package/dist/routing/splitRequest.sxyt.d.ts.map +0 -1
  266. package/dist/routing/splitRequest.sxyt.js +0 -47
  267. package/dist/style/jssToCss.sxyt.d.ts +0 -2
  268. package/dist/style/jssToCss.sxyt.d.ts.map +0 -1
  269. package/dist/style/jssToCss.sxyt.js +0 -17
  270. package/dist/testing/createTestApp.sxyt.d.ts +0 -2
  271. package/dist/testing/createTestApp.sxyt.d.ts.map +0 -1
  272. package/dist/testing/createTestApp.sxyt.js +0 -470
  273. package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts +0 -2
  274. package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts.map +0 -1
  275. package/dist/testing/ensureTestEnvLoaded.sxyt.js +0 -20
  276. package/dist/update/hotSwap.sxyt.d.ts +0 -2
  277. package/dist/update/hotSwap.sxyt.d.ts.map +0 -1
  278. package/dist/update/hotSwap.sxyt.js +0 -252
@@ -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>&lt;p&gt;Bonuses.&lt;/p&gt;</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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parseSelectors.sxyt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseSelectors.sxyt.d.ts","sourceRoot":"","sources":["../../src/postcssPlugins/parseSelectors.sxyt.ts"],"names":[],"mappings":""}
@@ -1,62 +0,0 @@
1
- import { describe } from 'sxy-test-runner';
2
- import { parseSelectors } from "./parseSelectors.js";
3
- describe('parseSelectors()', ({
4
- it
5
- }) => {
6
- const input = 'html';
7
- it(`parses out a tag selector from '${input}'`, () => {
8
- const selectors = parseSelectors(input);
9
- selectors.should.deep.equal(['html']);
10
- });
11
- const input2 = 'html body';
12
- it(`parses out two tag selectors from '${input2}'`, () => {
13
- const selectors = parseSelectors(input2);
14
- selectors.should.deep.equal(['html', 'body']);
15
- });
16
- const input3 = '.foo';
17
- it(`parses out a class selector from '${input3}'`, () => {
18
- const selectors = parseSelectors(input3);
19
- selectors.should.deep.equal(['.foo']);
20
- });
21
- const input4 = ' .foo ';
22
- it(`parses out a class selector with whitespace from '${input4}'`, () => {
23
- const selectors = parseSelectors(input4);
24
- selectors.should.deep.equal(['.foo']);
25
- });
26
- const input5 = '.foo .bar';
27
- it(`parses out a two class selectors from '${input5}'`, () => {
28
- const selectors = parseSelectors(input5);
29
- selectors.should.deep.equal(['.foo', '.bar']);
30
- });
31
- const input6 = 'html.bar';
32
- it(`parses out connected tag and class '${input6}'`, () => {
33
- const selectors = parseSelectors(input6);
34
- selectors.should.deep.equal(['html', '.bar']);
35
- });
36
- const input7 = '.foo.bar';
37
- it(`parses out connected classes '${input7}'`, () => {
38
- const selectors = parseSelectors(input7);
39
- selectors.should.deep.equal(['.foo', '.bar']);
40
- });
41
- const input8 = 'html#foo.bar';
42
- it(`parses out connected tag, id and class '${input8}'`, () => {
43
- const selectors = parseSelectors(input8);
44
- selectors.should.deep.equal(['html', '#foo', '.bar']);
45
- });
46
- const input9 = 'html[lang="en"]';
47
- it(`parses out tag with attribute selector from '${input9}'`, () => {
48
- const selectors = parseSelectors(input9);
49
- selectors.should.deep.equal(['html', '[lang="en"]']);
50
- });
51
- const input10 = ':i(div)';
52
- it(`parses out :i pseudo '${input10}'`, () => {
53
- const selectors = parseSelectors(input10);
54
- selectors.should.deep.equal([':i(div)']);
55
- });
56
- const input11 = 'html :i(div)';
57
- it(`parses out tag then :i pseudo '${input11}'`, () => {
58
- const selectors = parseSelectors(input11);
59
- //console.log('selectors', selectors)
60
- selectors.should.deep.equal(['html', ':i(div)']);
61
- });
62
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parseSelectorsRich.sxyt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseSelectorsRich.sxyt.d.ts","sourceRoot":"","sources":["../../src/postcssPlugins/parseSelectorsRich.sxyt.ts"],"names":[],"mappings":""}
@@ -1,155 +0,0 @@
1
- import { describe } from 'sxy-test-runner';
2
- import { parseSelectorsRich } from "./parseSelectorsRich.js";
3
- function tagSelector(tag) {
4
- return {
5
- type: 'tag',
6
- content: tag,
7
- valid: true
8
- };
9
- }
10
- function idSelector(id) {
11
- return {
12
- type: 'id',
13
- content: id,
14
- valid: true
15
- };
16
- }
17
- function classSelector(className) {
18
- return {
19
- type: 'class',
20
- content: className,
21
- valid: true
22
- };
23
- }
24
- function pseudoSelector(pesudo) {
25
- return {
26
- type: 'pseudo-class',
27
- content: pesudo,
28
- valid: true
29
- };
30
- }
31
- function pseudoElementSelector(pseudoElement) {
32
- return {
33
- type: 'pseudo-element',
34
- content: pseudoElement,
35
- valid: true
36
- };
37
- }
38
- function attributeSelector(attribute) {
39
- return {
40
- type: 'attribute',
41
- content: attribute,
42
- valid: true
43
- };
44
- }
45
- function whitespace() {
46
- return {
47
- type: 'whitespace',
48
- content: ' ',
49
- valid: true
50
- };
51
- }
52
- describe('parseSelectorsRich()', ({
53
- it
54
- }) => {
55
- const input = 'html';
56
- it(`parses out a tag selector from '${input}'`, () => {
57
- const selectors = parseSelectorsRich(input);
58
- selectors.should.deep.equal([tagSelector('html')]);
59
- });
60
- const input2 = 'html body';
61
- it(`parses out two tag selectors from '${input2}'`, () => {
62
- const selectors = parseSelectorsRich(input2);
63
- // console.log('selectors', selectors)
64
- // console.log('expected', [
65
- // tagSelector('html'),
66
- // tagSelector('body')
67
- // ])
68
- selectors.should.deep.equal([tagSelector('html'), whitespace(), tagSelector('body')]);
69
- });
70
- const input3 = '.foo';
71
- it(`parses out a class selector from '${input3}'`, () => {
72
- const selectors = parseSelectorsRich(input3);
73
- selectors.should.deep.equal([classSelector('.foo')]);
74
- });
75
- const input4 = ' .foo ';
76
- it(`parses out a class selector with whitespace from '${input4}'`, () => {
77
- const selectors = parseSelectorsRich(input4);
78
- selectors.should.deep.equal([whitespace(), classSelector('.foo'), whitespace()]);
79
- });
80
- const input5 = '.foo .bar';
81
- it(`parses out a two class selectors from '${input5}'`, () => {
82
- const selectors = parseSelectorsRich(input5);
83
- selectors.should.deep.equal([classSelector('.foo'), whitespace(), classSelector('.bar')]);
84
- });
85
- const input6 = 'html.bar';
86
- it(`parses out connected tag and class '${input6}'`, () => {
87
- const selectors = parseSelectorsRich(input6);
88
- selectors.should.deep.equal([tagSelector('html'), classSelector('.bar')]);
89
- });
90
- const input7 = '.foo.bar';
91
- it(`parses out connected classes '${input7}'`, () => {
92
- const selectors = parseSelectorsRich(input7);
93
- selectors.should.deep.equal([classSelector('.foo'), classSelector('.bar')]);
94
- });
95
- const input8 = 'html#foo.bar';
96
- it(`parses out connected tag, id and class '${input8}'`, () => {
97
- const selectors = parseSelectorsRich(input8);
98
- selectors.should.deep.equal([tagSelector('html'), idSelector('#foo'), classSelector('.bar')]);
99
- });
100
- const input9 = 'html[lang="en"]';
101
- it(`parses out tag with attribute selector from '${input9}'`, () => {
102
- const selectors = parseSelectorsRich(input9);
103
- // console.log(JSON.stringify(selectors))
104
- // console.log(JSON.stringify([
105
- // tagSelector('html'),
106
- // attributeSelector('[lang="en"]')
107
- // ]))
108
- selectors.should.deep.equal([tagSelector('html'), attributeSelector('[lang="en"]')]);
109
- });
110
- const input10 = 'html[lang="en"]';
111
- it(`parses out tag with attribute selector from '${input10}'`, () => {
112
- const selectors = parseSelectorsRich(input10);
113
- // console.log(JSON.stringify(selectors))
114
- // console.log(JSON.stringify([
115
- // tagSelector('html'),
116
- // attributeSelector('[lang="en"]')
117
- // ]))
118
- selectors.should.deep.equal([tagSelector('html'), attributeSelector('[lang="en"]')]);
119
- });
120
- const input11 = 'a:hover';
121
- it(`parses out :hover pseudo on an anchor in '${input11}'`, () => {
122
- const selectors = parseSelectorsRich(input11);
123
- // console.log(JSON.stringify(selectors))
124
- // console.log(JSON.stringify([
125
- // tagSelector('a'),
126
- // pseudoSelector(':hover')
127
- // ]))
128
- selectors.should.deep.equal([tagSelector('a'), pseudoSelector(':hover')]);
129
- });
130
- const input12 = ':i(div)';
131
- it(`parses out :i pseudo '${input12}'`, () => {
132
- const selectors = parseSelectorsRich(input12);
133
- selectors.should.deep.equal([pseudoSelector(':i(div)')]);
134
- });
135
- const input13 = 'html :i(div)';
136
- it(`parses out tag then :i pseudo '${input13}'`, () => {
137
- const selectors = parseSelectorsRich(input13);
138
- selectors.should.deep.equal([tagSelector('html'), whitespace(), pseudoSelector(':i(div)')]);
139
- });
140
- const input14 = 'summary::before';
141
- it(`parses out a pseudo-element from '${input14}'`, () => {
142
- const selectors = parseSelectorsRich(input14);
143
- selectors.should.deep.equal([tagSelector('summary'), pseudoElementSelector('::before')]);
144
- });
145
- const input15 = 'summary::-webkit-details-marker';
146
- it(`parses out a vendor prefixed pseudo-element from '${input15}'`, () => {
147
- const selectors = parseSelectorsRich(input15);
148
- selectors.should.deep.equal([tagSelector('summary'), pseudoElementSelector('::-webkit-details-marker')]);
149
- });
150
- const input16 = 'input:-moz-focusring';
151
- it(`parses out a vendor prefixed pseudo-class from '${input16}'`, () => {
152
- const selectors = parseSelectorsRich(input16);
153
- selectors.should.deep.equal([tagSelector('input'), pseudoSelector(':-moz-focusring')]);
154
- });
155
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parseHtml.sxyt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseHtml.sxyt.d.ts","sourceRoot":"","sources":["../../src/rawHtml/parseHtml.sxyt.ts"],"names":[],"mappings":""}
@@ -1,239 +0,0 @@
1
- import { describe } from 'sxy-test-runner';
2
- import { expect } from 'chai';
3
- import { parseHtml } from "./parseHtml.js";
4
- import { safeHtmlAllowList } from "./safeHtmlAllowList.js";
5
- import { decodeHtmlEntities } from "./decodeHtmlEntities.js";
6
- import { tokenizeHtml } from "./tokenizeHtml.js";
7
- import { renderingNodeToHtml } from "../render/renderingTreeToHtml.js";
8
- import { $props, $type } from "../contentNodeSymbols.js";
9
- // `found: true` short-circuits the <head> handling these tests do not need.
10
- // eslint-disable-next-line no-type-assertion/no-type-assertion
11
- const noHeadData = {
12
- found: true
13
- };
14
- // Renders a parsed tree back to markup. The renderer takes a RenderingNode,
15
- // which for plain HTML content is structurally what parseHtml returns.
16
- const render = async content => renderingNodeToHtml(
17
- // eslint-disable-next-line no-type-assertion/no-type-assertion
18
- content, false, noHeadData, null);
19
- const roundTrip = html => render(parseHtml(html));
20
- describe('decodeHtmlEntities()', ({
21
- it
22
- }) => {
23
- it('decodes named, decimal and hex references', () => {
24
- expect(decodeHtmlEntities('&pound;100 &amp; more')).to.equal('£100 & more');
25
- expect(decodeHtmlEntities('&#65;&#66;')).to.equal('AB');
26
- expect(decodeHtmlEntities('&#x41;&#X42;')).to.equal('AB');
27
- });
28
- it('leaves unknown and malformed references exactly as written', () => {
29
- expect(decodeHtmlEntities('&notareal; &amp')).to.equal('&notareal; &amp');
30
- expect(decodeHtmlEntities('a & b')).to.equal('a & b');
31
- });
32
- it('does not throw on out-of-range numeric references', () => {
33
- expect(decodeHtmlEntities('&#xFFFFFFFF;')).to.equal('&#xFFFFFFFF;');
34
- expect(decodeHtmlEntities('&#0;')).to.equal('&#0;');
35
- expect(decodeHtmlEntities('&#xD800;')).to.equal('&#xD800;');
36
- });
37
- });
38
- describe('tokenizeHtml()', ({
39
- it
40
- }) => {
41
- it('reads attributes in every quoting style', () => {
42
- const [token] = tokenizeHtml('<a href="/x" title=\'y\' data-n=3 hidden>');
43
- expect(token?.kind).to.equal('open');
44
- expect(token?.kind === 'open' && token.attributes).to.deep.equal({
45
- href: '/x',
46
- title: 'y',
47
- 'data-n': '3',
48
- hidden: true
49
- });
50
- });
51
- it('drops comments and doctypes', () => {
52
- expect(tokenizeHtml('<!doctype html><!-- hi --><b>x</b>').map(token => token.kind)).to.deep.equal(['open', 'text', 'close']);
53
- });
54
- it('treats a bare < as text', () => {
55
- expect(tokenizeHtml('5 < 6 and 7 > 2')).to.deep.equal([{
56
- kind: 'text',
57
- text: '5 < 6 and 7 > 2'
58
- }]);
59
- });
60
- it('takes script content as literal text, not markup', () => {
61
- expect(tokenizeHtml('<script>if (a<b) x()</script>').map(token => token.kind)).to.deep.equal(['open', 'text', 'close']);
62
- });
63
- // scanning for the first > would cut this tag short and build a tree the
64
- // browser disagrees with
65
- it('does not end a tag at a > inside a quoted attribute value', () => {
66
- const [token] = tokenizeHtml('<a title="a > b" href="/x">');
67
- expect(token?.kind === 'open' && token.attributes).to.deep.equal({
68
- title: 'a > b',
69
- href: '/x'
70
- });
71
- });
72
- });
73
- describe('parseHtml()', ({
74
- it
75
- }) => {
76
- it('returns null for empty and non-string input', () => {
77
- expect(parseHtml('')).to.equal(null);
78
- // eslint-disable-next-line no-type-assertion/no-type-assertion
79
- expect(parseHtml(undefined)).to.equal(null);
80
- });
81
- it('builds an element tree with decoded text', async () => {
82
- const content = parseHtml('<p>Bonus &pound;100</p>');
83
- // eslint-disable-next-line no-type-assertion/no-type-assertion
84
- const node = content;
85
- expect(node[$type]).to.equal('p');
86
- expect(node[$props].children).to.equal('Bonus £100');
87
- });
88
- it('maps class to className and style to css, which the renderer expects', async () => {
89
- expect(await roundTrip('<p class="a b" style="color: red">x</p>')).to.equal('<p class="a b" style="color: red">x</p>');
90
- });
91
- it('keeps sibling paragraphs as siblings rather than nesting them', async () => {
92
- expect(await roundTrip('<p>one</p><p>two</p>')).to.equal('<p>one</p><p>two</p>');
93
- });
94
- // The rule that broke the dashboard: a browser closes an open <p> at the
95
- // next block-level start tag, so the parser must too, or the tree and the
96
- // DOM disagree and hydration walks off the end.
97
- it('applies the implied end tag that closes a p at a block element', async () => {
98
- expect(await roundTrip('<p>one<div>two</div>')).to.equal('<p>one</p><div>two</div>');
99
- });
100
- it('closes list items and table cells implicitly', async () => {
101
- expect(await roundTrip('<ul><li>a<li>b</ul>')).to.equal('<ul><li>a</li><li>b</li></ul>');
102
- expect(await roundTrip('<table><tbody><tr><td>a<td>b</tbody></table>')).to.equal('<table><tbody><tr><td>a</td><td>b</td></tr></tbody></table>');
103
- });
104
- // Parsers disagree over whether whitespace survives inside a table, so the
105
- // markup carries none — the tree and the DOM then agree either way.
106
- it('drops whitespace between table tags', async () => {
107
- expect(await roundTrip('<table>\n<tbody>\n<tr><td>a</td></tr>\n</tbody>\n</table>')).to.equal('<table><tbody><tr><td>a</td></tr></tbody></table>');
108
- });
109
- it('foster-parents real text out to just before the table', async () => {
110
- expect(await roundTrip('<table><tbody>stray<tr><td>a</td></tr></tbody></table>')).to.equal('stray<table><tbody><tr><td>a</td></tr></tbody></table>');
111
- });
112
- it('leaves stray text alone in lists and selects, which do not relocate it', async () => {
113
- expect(await roundTrip('<ul>loose<li>a</li></ul>')).to.equal('<ul>loose<li>a</li></ul>');
114
- });
115
- it('handles void and self-closing elements', async () => {
116
- expect(await roundTrip('<p>a<br>b<img src="/x" />c</p>')).to.equal('<p>a<br />b<img src="/x" />c</p>');
117
- });
118
- });
119
- describe('parseHtml() resilience', ({
120
- it
121
- }) => {
122
- // "Safe" here means it always produces something renderable, whatever it
123
- // is handed. None of these may throw.
124
- const malformed = ['<p>unclosed', '</p>stray end tag', '<p><b>crossed</p></b>', '<<>><p>x</p>', '<p class="unterminated>x</p>', '<!-- never closed', '<p', '<>', '<p><p><p><p>deep', '&&&;&#;&#x;', '<div><span></div></span>', '<TABLE><TR><TD>caps</TD></TR></TABLE>'];
125
- for (const html of malformed) {
126
- it(`does not throw on ${JSON.stringify(html)}`, async () => {
127
- const content = parseHtml(html);
128
- const rendered = await render(content);
129
- expect(rendered).to.be.a('string');
130
- });
131
- }
132
- it('keeps the text of an unclosed element', async () => {
133
- expect(await roundTrip('<p>unclosed')).to.equal('<p>unclosed</p>');
134
- });
135
- it('ignores a stray end tag but keeps its text', async () => {
136
- expect(await roundTrip('</p>after')).to.equal('after');
137
- });
138
- });
139
- describe('parseHtml() sanitizing', ({
140
- it
141
- }) => {
142
- it('drops script elements together with their contents', async () => {
143
- expect(await roundTrip('<p>a</p><script>alert(1)</script><p>b</p>')).to.equal('<p>a</p><p>b</p>');
144
- });
145
- it('drops on* handler attributes', async () => {
146
- expect(await roundTrip('<p onclick="alert(1)" onerror="x()" title="keep">a</p>')).to.equal('<p title="keep">a</p>');
147
- });
148
- it('drops javascript: urls, including obfuscated ones', async () => {
149
- expect(await roundTrip('<a href="javascript:alert(1)">x</a>')).to.equal('<a>x</a>');
150
- expect(await roundTrip('<a href=" JaVaScRiPt:alert(1)">x</a>')).to.equal('<a>x</a>');
151
- // browsers ignore control characters inside the scheme, so this runs
152
- expect(await roundTrip('<a href="java\tscript:alert(1)">x</a>')).to.equal('<a>x</a>');
153
- expect(await roundTrip('<a href="vbscript:x">x</a>')).to.equal('<a>x</a>');
154
- expect(await roundTrip('<a href="/safe">x</a>')).to.equal('<a href="/safe">x</a>');
155
- expect(await roundTrip('<a href="https://x.test/">x</a>')).to.equal('<a href="https://x.test/">x</a>');
156
- });
157
- it('bars data: urls from navigation but allows them as image sources', async () => {
158
- expect(await roundTrip('<a href="data:text/html,hello">x</a>')).to.equal('<a>x</a>');
159
- expect(await roundTrip('<img src="data:image/png;base64,AAAA" />')).to.equal('<img src="data:image/png;base64,AAAA" />');
160
- });
161
- it('keeps handler attributes out even when sanitizing is off', async () => {
162
- // Tungsten reads on* props as event listeners, so a string there is a
163
- // hydration fault, not just a security question.
164
- const content = parseHtml('<p onclick="alert(1)">a</p>', {
165
- sanitize: false
166
- });
167
- expect(await render(content)).to.equal('<p>a</p>');
168
- });
169
- it('keeps scripts when sanitizing is turned off', async () => {
170
- const content = parseHtml('<div><script>x()</script></div>', {
171
- sanitize: false
172
- });
173
- expect(await render(content)).to.equal('<div><script>x()</script></div>');
174
- });
175
- });
176
- describe('parseHtml() allow lists', ({
177
- it
178
- }) => {
179
- const withList = (html, allowList) => render(parseHtml(html, {
180
- allowList
181
- }));
182
- const onlyEmphasis = {
183
- tags: ['p', 'em'],
184
- attributes: []
185
- };
186
- it('keeps listed tags and unwraps unlisted ones, preserving their text', async () => {
187
- expect(await withList('<p>keep <em>this</em> and <b>that</b></p>', onlyEmphasis)).to.equal('<p>keep <em>this</em> and that</p>');
188
- });
189
- it('unwraps an unlisted element without losing its listed descendants', async () => {
190
- expect(await withList('<div><p>inner</p></div>', onlyEmphasis)).to.equal('<p>inner</p>');
191
- });
192
- it('drops program-text elements entirely rather than unwrapping them', async () => {
193
- // unwrapping <style> would put its CSS on the page as visible text
194
- expect(await withList('<p>a</p><style>p { color: red }</style>', onlyEmphasis)).to.equal('<p>a</p>');
195
- });
196
- it('keeps only listed attributes', async () => {
197
- const list = {
198
- tags: ['p'],
199
- attributes: ['title']
200
- };
201
- expect(await withList('<p title="t" id="i" data-x="1">a</p>', list)).to.equal('<p title="t">a</p>');
202
- });
203
- it('applies per-tag attributes only to their own tag', async () => {
204
- const list = {
205
- tags: ['a', 'p'],
206
- attributes: [],
207
- tagAttributes: {
208
- a: ['href']
209
- }
210
- };
211
- expect(await withList('<a href="/x">link</a><p href="/y">para</p>', list)).to.equal('<a href="/x">link</a><p>para</p>');
212
- });
213
- });
214
- describe('safeHtmlAllowList', ({
215
- it
216
- }) => {
217
- const safely = html => render(parseHtml(html, {
218
- allowList: safeHtmlAllowList
219
- }));
220
- it('keeps ordinary authored rich text intact', async () => {
221
- const html = '<h2>Title</h2><p>Some <strong>bold</strong> and <em>italic</em>.</p>' + '<ul><li>one</li><li>two</li></ul>';
222
- expect(await safely(html)).to.equal(html);
223
- });
224
- it('keeps tables with their layout attributes', async () => {
225
- const html = '<table><tbody><tr><th align="left">H</th><td colspan="2">C</td></tr></tbody></table>';
226
- expect(await safely(html)).to.equal(html);
227
- });
228
- it('keeps links and images with their own attributes', async () => {
229
- expect(await safely('<a href="/x" target="_blank" rel="noopener">go</a>')).to.equal('<a href="/x" target="_blank" rel="noopener">go</a>');
230
- expect(await safely('<img src="/a.png" alt="a" width="10" />')).to.equal('<img src="/a.png" alt="a" width="10" />');
231
- });
232
- it('strips style attributes, which can disguise the page without any script', async () => {
233
- expect(await safely('<p style="position:fixed;top:0">a</p>')).to.equal('<p>a</p>');
234
- });
235
- it('removes embedding and form elements but keeps their text', async () => {
236
- expect(await safely('<iframe src="//evil"></iframe><p>a</p>')).to.equal('<p>a</p>');
237
- expect(await safely('<form><p>a</p></form>')).to.equal('<p>a</p>');
238
- });
239
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=getFunctionBodyAsString.sxyt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getFunctionBodyAsString.sxyt.d.ts","sourceRoot":"","sources":["../../src/render/getFunctionBodyAsString.sxyt.ts"],"names":[],"mappings":""}
@@ -1,37 +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
- import { getFunctionBodyAsString } from "./getFunctionBodyAsString.js";
5
- describe('getFunctionBodyAsString()', ({
6
- it
7
- }) => {
8
- it('should return the function body of a conventional function as a string', () => {
9
- const func = function () {
10
- return 'Hello World';
11
- };
12
- const body = getFunctionBodyAsString(func);
13
- //console.log('body', body)
14
- body.should.equal('return \'Hello World\';');
15
- });
16
- it('should handle multi line conventional functions', () => {
17
- const func = function () {
18
- return 'Hello World';
19
- };
20
- const body = getFunctionBodyAsString(func);
21
- //console.log('body', body)
22
- body.should.equal('return \'Hello World\';');
23
- });
24
- it('should return the function body of a braceless arrow function as a string', () => {
25
- const func = () => 'Hello World';
26
- const body = getFunctionBodyAsString(func);
27
- //console.log('body', body)
28
- body.should.equal('return \'Hello World\';');
29
- });
30
- it('should handle multi line braceless arrow functions', () => {
31
- const func = () => 'Hello' + ' World';
32
- const body = getFunctionBodyAsString(func);
33
- //console.log('body', body)
34
- body.should.equal('return \'Hello\' + \' World\';');
35
- //body.should.equal('return \'Hello\'\n+ \' World\';')
36
- });
37
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=processHead.sxyt.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processHead.sxyt.d.ts","sourceRoot":"","sources":["../../src/render/processHead.sxyt.ts"],"names":[],"mappings":""}