@norith/glimmer-ssr 1.0.0

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/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # API Usage
2
+
3
+ ```js
4
+ import { setComponentTemplate } from '@glimmer/core';
5
+ import component from '@glimmer/component';
6
+ import { renderToString } from '@glimmer/ssr';
7
+
8
+ import { templateFactory } from '@glimmer/opcode-compiler';
9
+ import { precompile } from '@glimmer/compiler';
10
+
11
+ let GlimmerComponent = component.default;
12
+
13
+ class PageComponent extends GlimmerComponent {}
14
+
15
+ let template = `
16
+ {{#let "hello" "world" as |hello world|}}<p>{{hello}} {{world}}</p>{{/let}}
17
+ `;
18
+
19
+ setComponentTemplate(
20
+ templateFactory(JSON.parse(precompile(template, { strictMode: true }))),
21
+ PageComponent
22
+ );
23
+
24
+ // Print <p>hello world</p> to console:
25
+ console.log(await renderToString(PageComponent, {
26
+ owner: {
27
+ services: {}
28
+ },
29
+ }));
30
+ ```
@@ -0,0 +1 @@
1
+ export { renderToString, renderToStream, RenderOptions } from './src/render';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderToStream = exports.renderToString = void 0;
4
+ var render_1 = require("./src/render");
5
+ Object.defineProperty(exports, "renderToString", { enumerable: true, get: function () { return render_1.renderToString; } });
6
+ Object.defineProperty(exports, "renderToStream", { enumerable: true, get: function () { return render_1.renderToStream; } });
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQTZFO0FBQXBFLHdHQUFBLGNBQWMsT0FBQTtBQUFFLHdHQUFBLGNBQWMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IHJlbmRlclRvU3RyaW5nLCByZW5kZXJUb1N0cmVhbSwgUmVuZGVyT3B0aW9ucyB9IGZyb20gJy4vc3JjL3JlbmRlcic7XG4iXX0=
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { ComponentDefinition } from '@norith/glimmer-core';
3
+ import { Dict } from '@glimmer/interfaces';
4
+ import HTMLSerializer from '@simple-dom/serializer';
5
+ export interface RenderOptions {
6
+ args?: Dict<unknown>;
7
+ serializer?: HTMLSerializer;
8
+ owner?: object;
9
+ rehydrate?: boolean;
10
+ }
11
+ export declare function renderToString(ComponentClass: ComponentDefinition, options?: RenderOptions): Promise<string>;
12
+ export declare function renderToStream(stream: NodeJS.WritableStream, ComponentClass: ComponentDefinition, options?: RenderOptions): void;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderToStream = exports.renderToString = void 0;
7
+ const glimmer_core_1 = require("@norith/glimmer-core");
8
+ const document_1 = __importDefault(require("@simple-dom/document"));
9
+ const serializer_1 = __importDefault(require("@simple-dom/serializer"));
10
+ const void_map_1 = __importDefault(require("@simple-dom/void-map"));
11
+ const stream_1 = require("stream");
12
+ const url_1 = require("url");
13
+ const glimmer_core_2 = require("@norith/glimmer-core");
14
+ const node_1 = require("@glimmer/node");
15
+ const runtime_1 = require("@glimmer/runtime");
16
+ /**
17
+ * Server-side environment that can be used to configure the glimmer-vm to work
18
+ * on the server side.
19
+ *
20
+ * @internal
21
+ */
22
+ class ServerEnvDelegate extends glimmer_core_2.BaseEnvDelegate {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.isInteractive = false;
26
+ }
27
+ protocolForURL(url) {
28
+ const urlObject = url_1.parse(url);
29
+ return (urlObject && urlObject.protocol) || 'https';
30
+ }
31
+ }
32
+ const defaultSerializer = new serializer_1.default(void_map_1.default);
33
+ function renderToString(ComponentClass, options) {
34
+ return new Promise((resolve, reject) => {
35
+ const stream = new stream_1.PassThrough();
36
+ let html = '';
37
+ stream.on('data', (str) => (html += str));
38
+ stream.on('end', () => resolve(html));
39
+ stream.on('error', (err) => reject(err));
40
+ renderToStream(stream, ComponentClass, options);
41
+ });
42
+ }
43
+ exports.renderToString = renderToString;
44
+ function renderToStream(stream, ComponentClass, options = {}) {
45
+ const document = document_1.default();
46
+ const element = document.body;
47
+ const appendOperations = new node_1.NodeDOMTreeConstruction(document);
48
+ // TODO: Remove in Glimmer VM 0.48, it's not necessary
49
+ const updateOperations = new runtime_1.DOMChanges(document);
50
+ const { env, iterator } = glimmer_core_1.getTemplateIterator(ComponentClass, element, { appendOperations, updateOperations }, new ServerEnvDelegate(), options.args, options.owner, options.rehydrate ? node_1.serializeBuilder : runtime_1.clientBuilder);
51
+ runtime_1.renderSync(env, iterator);
52
+ const serializer = options.serializer || defaultSerializer;
53
+ stream.write(serializer.serializeChildren(element));
54
+ stream.end();
55
+ }
56
+ exports.renderToStream = renderToStream;
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvc3NyL3NyYy9yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdURBQWdGO0FBRWhGLG9FQUFzRDtBQUN0RCx3RUFBb0Q7QUFDcEQsb0VBQTJDO0FBQzNDLG1DQUFxQztBQUNyQyw2QkFBNEI7QUFDNUIsdURBQXVEO0FBQ3ZELHdDQUEwRTtBQUMxRSw4Q0FBeUU7QUFFekU7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLDhCQUFlO0lBQS9DOztRQUNFLGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBTXhCLENBQUM7SUFKQyxjQUFjLENBQUMsR0FBVztRQUN4QixNQUFNLFNBQVMsR0FBRyxXQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxDQUFDO0lBQ3RELENBQUM7Q0FDRjtBQVNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxvQkFBYyxDQUFDLGtCQUFPLENBQUMsQ0FBQztBQUV0RCxTQUFnQixjQUFjLENBQzVCLGNBQW1DLEVBQ25DLE9BQXVCO0lBRXZCLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQkFBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWRELHdDQWNDO0FBRUQsU0FBZ0IsY0FBYyxDQUM1QixNQUE2QixFQUM3QixjQUFtQyxFQUNuQyxVQUF5QixFQUFFO0lBRTNCLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixFQUFFLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztJQUM5QixNQUFNLGdCQUFnQixHQUFHLElBQUksOEJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFL0Qsc0RBQXNEO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxvQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsa0NBQW1CLENBQzNDLGNBQWMsRUFDZCxPQUFPLEVBQ1AsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxFQUN0QyxJQUFJLGlCQUFpQixFQUFFLEVBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQ1osT0FBTyxDQUFDLEtBQUssRUFDYixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyx1QkFBZ0IsQ0FBQyxDQUFDLENBQUMsdUJBQWEsQ0FDckQsQ0FBQztJQUNGLG9CQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTFCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQUM7SUFFM0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDZixDQUFDO0FBM0JELHdDQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudERlZmluaXRpb24sIGdldFRlbXBsYXRlSXRlcmF0b3IgfSBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29yZSc7XG5pbXBvcnQgeyBEaWN0IH0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgY3JlYXRlSFRNTERvY3VtZW50IGZyb20gJ0BzaW1wbGUtZG9tL2RvY3VtZW50JztcbmltcG9ydCBIVE1MU2VyaWFsaXplciBmcm9tICdAc2ltcGxlLWRvbS9zZXJpYWxpemVyJztcbmltcG9ydCB2b2lkTWFwIGZyb20gJ0BzaW1wbGUtZG9tL3ZvaWQtbWFwJztcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEJhc2VFbnZEZWxlZ2F0ZSB9IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci1jb3JlJztcbmltcG9ydCB7IE5vZGVET01UcmVlQ29uc3RydWN0aW9uLCBzZXJpYWxpemVCdWlsZGVyIH0gZnJvbSAnQGdsaW1tZXIvbm9kZSc7XG5pbXBvcnQgeyBjbGllbnRCdWlsZGVyLCBET01DaGFuZ2VzLCByZW5kZXJTeW5jIH0gZnJvbSAnQGdsaW1tZXIvcnVudGltZSc7XG5cbi8qKlxuICogU2VydmVyLXNpZGUgZW52aXJvbm1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGdsaW1tZXItdm0gdG8gd29ya1xuICogb24gdGhlIHNlcnZlciBzaWRlLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBTZXJ2ZXJFbnZEZWxlZ2F0ZSBleHRlbmRzIEJhc2VFbnZEZWxlZ2F0ZSB7XG4gIGlzSW50ZXJhY3RpdmUgPSBmYWxzZTtcblxuICBwcm90b2NvbEZvclVSTCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdXJsT2JqZWN0ID0gcGFyc2UodXJsKTtcbiAgICByZXR1cm4gKHVybE9iamVjdCAmJiB1cmxPYmplY3QucHJvdG9jb2wpIHx8ICdodHRwcyc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJPcHRpb25zIHtcbiAgYXJncz86IERpY3Q8dW5rbm93bj47XG4gIHNlcmlhbGl6ZXI/OiBIVE1MU2VyaWFsaXplcjtcbiAgb3duZXI/OiBvYmplY3Q7XG4gIHJlaHlkcmF0ZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRTZXJpYWxpemVyID0gbmV3IEhUTUxTZXJpYWxpemVyKHZvaWRNYXApO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9TdHJpbmcoXG4gIENvbXBvbmVudENsYXNzOiBDb21wb25lbnREZWZpbml0aW9uLFxuICBvcHRpb25zPzogUmVuZGVyT3B0aW9uc1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIGxldCBodG1sID0gJyc7XG5cbiAgICBzdHJlYW0ub24oJ2RhdGEnLCAoc3RyKSA9PiAoaHRtbCArPSBzdHIpKTtcbiAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUoaHRtbCkpO1xuICAgIHN0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiByZWplY3QoZXJyKSk7XG5cbiAgICByZW5kZXJUb1N0cmVhbShzdHJlYW0sIENvbXBvbmVudENsYXNzLCBvcHRpb25zKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUb1N0cmVhbShcbiAgc3RyZWFtOiBOb2RlSlMuV3JpdGFibGVTdHJlYW0sXG4gIENvbXBvbmVudENsYXNzOiBDb21wb25lbnREZWZpbml0aW9uLFxuICBvcHRpb25zOiBSZW5kZXJPcHRpb25zID0ge31cbik6IHZvaWQge1xuICBjb25zdCBkb2N1bWVudCA9IGNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgY29uc3QgYXBwZW5kT3BlcmF0aW9ucyA9IG5ldyBOb2RlRE9NVHJlZUNvbnN0cnVjdGlvbihkb2N1bWVudCk7XG5cbiAgLy8gVE9ETzogUmVtb3ZlIGluIEdsaW1tZXIgVk0gMC40OCwgaXQncyBub3QgbmVjZXNzYXJ5XG4gIGNvbnN0IHVwZGF0ZU9wZXJhdGlvbnMgPSBuZXcgRE9NQ2hhbmdlcyhkb2N1bWVudCk7XG5cbiAgY29uc3QgeyBlbnYsIGl0ZXJhdG9yIH0gPSBnZXRUZW1wbGF0ZUl0ZXJhdG9yKFxuICAgIENvbXBvbmVudENsYXNzLFxuICAgIGVsZW1lbnQsXG4gICAgeyBhcHBlbmRPcGVyYXRpb25zLCB1cGRhdGVPcGVyYXRpb25zIH0sXG4gICAgbmV3IFNlcnZlckVudkRlbGVnYXRlKCksXG4gICAgb3B0aW9ucy5hcmdzLFxuICAgIG9wdGlvbnMub3duZXIsXG4gICAgb3B0aW9ucy5yZWh5ZHJhdGUgPyBzZXJpYWxpemVCdWlsZGVyIDogY2xpZW50QnVpbGRlclxuICApO1xuICByZW5kZXJTeW5jKGVudiwgaXRlcmF0b3IpO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZXIgPSBvcHRpb25zLnNlcmlhbGl6ZXIgfHwgZGVmYXVsdFNlcmlhbGl6ZXI7XG5cbiAgc3RyZWFtLndyaXRlKHNlcmlhbGl6ZXIuc2VyaWFsaXplQ2hpbGRyZW4oZWxlbWVudCkpO1xuICBzdHJlYW0uZW5kKCk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import './render-options-tests';
2
+ import './modifiers-test';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./render-options-tests");
4
+ require("./modifiers-test");
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtDQUFnQztBQUNoQyw0QkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vcmVuZGVyLW9wdGlvbnMtdGVzdHMnO1xuaW1wb3J0ICcuL21vZGlmaWVycy10ZXN0JztcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const glimmer_core_1 = require("@norith/glimmer-core");
4
+ const __1 = require("..");
5
+ class CustomModifier {
6
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
7
+ didInsertElement() { }
8
+ }
9
+ class CustomModifierManager {
10
+ constructor(owner) {
11
+ this.owner = owner;
12
+ this.capabilities = glimmer_core_1.modifierCapabilities('3.22');
13
+ }
14
+ createModifier(factory) {
15
+ return new factory(this.owner);
16
+ }
17
+ installModifier(instance) {
18
+ instance.didInsertElement();
19
+ }
20
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
21
+ updateModifier() { }
22
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
23
+ destroyModifier() { }
24
+ }
25
+ glimmer_core_1.setModifierManager((owner) => new CustomModifierManager(owner), CustomModifier);
26
+ QUnit.module('@glimmer/ssr modifiers', () => {
27
+ QUnit.test('modifiers do not run in SSR', async (assert) => {
28
+ class Modifier extends CustomModifier {
29
+ didInsertElement() {
30
+ assert.ok(false, 'modifiers should not trigger insert in SSR');
31
+ }
32
+ }
33
+ const Component = glimmer_core_1.templateOnlyComponent();
34
+ glimmer_core_1.setComponentTemplate(glimmer_core_1.precompileTemplate('<h1 {{Modifier}}>hello world</h1>', {
35
+ strictMode: true,
36
+ scope: { Modifier },
37
+ }), Component);
38
+ const output = await __1.renderToString(Component);
39
+ assert.equal(output, '<h1>hello world</h1>');
40
+ });
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kaWZpZXJzLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9tb2RpZmllcnMtdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVEQU84QjtBQUM5QiwwQkFBb0M7QUFFcEMsTUFBTSxjQUFjO0lBRWxCLGdFQUFnRTtJQUNoRSxnQkFBZ0IsS0FBVSxDQUFDO0NBQzVCO0FBRUQsTUFBTSxxQkFBcUI7SUFHekIsWUFBb0IsS0FBYztRQUFkLFVBQUssR0FBTCxLQUFLLENBQVM7UUFGbEMsaUJBQVksR0FBRyxtQ0FBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVQLENBQUM7SUFFdEMsY0FBYyxDQUFDLE9BQWlEO1FBQzlELE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxlQUFlLENBQUMsUUFBd0I7UUFDdEMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxjQUFjLEtBQVUsQ0FBQztJQUN6QixnRUFBZ0U7SUFDaEUsZUFBZSxLQUFVLENBQUM7Q0FDM0I7QUFFRCxpQ0FBa0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVoRixLQUFLLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN6RCxNQUFNLFFBQVMsU0FBUSxjQUFjO1lBQ25DLGdCQUFnQjtnQkFDZCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7U0FDRjtRQUVELE1BQU0sU0FBUyxHQUFHLG9DQUFxQixFQUFFLENBQUM7UUFDMUMsbUNBQW9CLENBQ2xCLGlDQUFrQixDQUFDLG1DQUFtQyxFQUFFO1lBQ3RELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRTtTQUNwQixDQUFDLEVBQ0YsU0FBUyxDQUNWLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgc2V0Q29tcG9uZW50VGVtcGxhdGUsXG4gIHByZWNvbXBpbGVUZW1wbGF0ZSxcbiAgdGVtcGxhdGVPbmx5Q29tcG9uZW50LFxuICBzZXRNb2RpZmllck1hbmFnZXIsXG4gIG1vZGlmaWVyQ2FwYWJpbGl0aWVzLFxuICBNb2RpZmllck1hbmFnZXIsXG59IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci1jb3JlJztcbmltcG9ydCB7IHJlbmRlclRvU3RyaW5nIH0gZnJvbSAnLi4nO1xuXG5jbGFzcyBDdXN0b21Nb2RpZmllciB7XG4gIGVsZW1lbnQ/OiBFbGVtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRpZEluc2VydEVsZW1lbnQoKTogdm9pZCB7fVxufVxuXG5jbGFzcyBDdXN0b21Nb2RpZmllck1hbmFnZXIgaW1wbGVtZW50cyBNb2RpZmllck1hbmFnZXI8Q3VzdG9tTW9kaWZpZXI+IHtcbiAgY2FwYWJpbGl0aWVzID0gbW9kaWZpZXJDYXBhYmlsaXRpZXMoJzMuMjInKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG93bmVyOiB1bmtub3duKSB7fVxuXG4gIGNyZWF0ZU1vZGlmaWVyKGZhY3Rvcnk6IHsgbmV3IChvd25lcjogdW5rbm93bik6IEN1c3RvbU1vZGlmaWVyIH0pOiBDdXN0b21Nb2RpZmllciB7XG4gICAgcmV0dXJuIG5ldyBmYWN0b3J5KHRoaXMub3duZXIpO1xuICB9XG5cbiAgaW5zdGFsbE1vZGlmaWVyKGluc3RhbmNlOiBDdXN0b21Nb2RpZmllcik6IHZvaWQge1xuICAgIGluc3RhbmNlLmRpZEluc2VydEVsZW1lbnQoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgdXBkYXRlTW9kaWZpZXIoKTogdm9pZCB7fVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIGRlc3Ryb3lNb2RpZmllcigpOiB2b2lkIHt9XG59XG5cbnNldE1vZGlmaWVyTWFuYWdlcigob3duZXIpID0+IG5ldyBDdXN0b21Nb2RpZmllck1hbmFnZXIob3duZXIpLCBDdXN0b21Nb2RpZmllcik7XG5cblFVbml0Lm1vZHVsZSgnQGdsaW1tZXIvc3NyIG1vZGlmaWVycycsICgpID0+IHtcbiAgUVVuaXQudGVzdCgnbW9kaWZpZXJzIGRvIG5vdCBydW4gaW4gU1NSJywgYXN5bmMgKGFzc2VydCkgPT4ge1xuICAgIGNsYXNzIE1vZGlmaWVyIGV4dGVuZHMgQ3VzdG9tTW9kaWZpZXIge1xuICAgICAgZGlkSW5zZXJ0RWxlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgYXNzZXJ0Lm9rKGZhbHNlLCAnbW9kaWZpZXJzIHNob3VsZCBub3QgdHJpZ2dlciBpbnNlcnQgaW4gU1NSJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgQ29tcG9uZW50ID0gdGVtcGxhdGVPbmx5Q29tcG9uZW50KCk7XG4gICAgc2V0Q29tcG9uZW50VGVtcGxhdGUoXG4gICAgICBwcmVjb21waWxlVGVtcGxhdGUoJzxoMSB7e01vZGlmaWVyfX0+aGVsbG8gd29ybGQ8L2gxPicsIHtcbiAgICAgICAgc3RyaWN0TW9kZTogdHJ1ZSxcbiAgICAgICAgc2NvcGU6IHsgTW9kaWZpZXIgfSxcbiAgICAgIH0pLFxuICAgICAgQ29tcG9uZW50XG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlbmRlclRvU3RyaW5nKENvbXBvbmVudCk7XG5cbiAgICBhc3NlcnQuZXF1YWwob3V0cHV0LCAnPGgxPmhlbGxvIHdvcmxkPC9oMT4nKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const glimmer_component_1 = __importDefault(require("@norith/glimmer-component"));
7
+ const glimmer_core_1 = require("@norith/glimmer-core");
8
+ const serializer_1 = __importDefault(require("@simple-dom/serializer"));
9
+ const void_map_1 = __importDefault(require("@simple-dom/void-map"));
10
+ const __1 = require("..");
11
+ QUnit.module('@glimmer/ssr rendering', () => {
12
+ QUnit.test('options.serializer', async (assert) => {
13
+ class MyComponent extends glimmer_component_1.default {
14
+ }
15
+ class CustomHTMLSerializer extends serializer_1.default {
16
+ text(text) {
17
+ return super.text(text).replace(/Hello/g, 'Goodbye'); // Replaces repetitive whitespace with a single character.
18
+ }
19
+ }
20
+ const options = { serializer: new CustomHTMLSerializer(void_map_1.default) };
21
+ glimmer_core_1.setComponentTemplate(glimmer_core_1.precompileTemplate(`<h1>Hello World</h1>`, { strictMode: true }), MyComponent);
22
+ const output = await __1.renderToString(MyComponent, options);
23
+ assert.equal(output, '<h1>Goodbye World</h1>');
24
+ });
25
+ QUnit.test('setting rehydrate option outputs the block stacks', async (assert) => {
26
+ class MyComponent extends glimmer_component_1.default {
27
+ }
28
+ glimmer_core_1.setComponentTemplate(glimmer_core_1.precompileTemplate(`<h1>Hello World</h1>`, { strictMode: true }), MyComponent);
29
+ const output = await __1.renderToString(MyComponent, { rehydrate: true });
30
+ assert.equal(output, '<!--%+b:0%--><!--%+b:1%--><h1>Hello World</h1><!--%-b:1%--><!--%-b:0%-->');
31
+ });
32
+ });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9wdGlvbnMtdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9yZW5kZXItb3B0aW9ucy10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGtGQUFrRDtBQUNsRCx1REFBZ0Y7QUFDaEYsd0VBQW9EO0FBQ3BELG9FQUEyQztBQUUzQywwQkFBbUQ7QUFFbkQsS0FBSyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDaEQsTUFBTSxXQUFZLFNBQVEsMkJBQVM7U0FBRztRQUV0QyxNQUFNLG9CQUFxQixTQUFRLG9CQUFjO1lBQy9DLElBQUksQ0FBQyxJQUFzQjtnQkFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQywwREFBMEQ7WUFDbEgsQ0FBQztTQUNGO1FBRUQsTUFBTSxPQUFPLEdBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLENBQUMsa0JBQU8sQ0FBQyxFQUFFLENBQUM7UUFFakYsbUNBQW9CLENBQ2xCLGlDQUFrQixDQUFDLHNCQUFzQixFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQ2hFLFdBQVcsQ0FDWixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQkFBYyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUxRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2pELENBQUMsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDL0UsTUFBTSxXQUFZLFNBQVEsMkJBQVM7U0FBRztRQUN0QyxtQ0FBb0IsQ0FDbEIsaUNBQWtCLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDaEUsV0FBVyxDQUNaLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFjLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEUsTUFBTSxDQUFDLEtBQUssQ0FDVixNQUFNLEVBQ04sMEVBQTBFLENBQzNFLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbXBvbmVudCBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29tcG9uZW50JztcbmltcG9ydCB7IHNldENvbXBvbmVudFRlbXBsYXRlLCBwcmVjb21waWxlVGVtcGxhdGUgfSBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29yZSc7XG5pbXBvcnQgSFRNTFNlcmlhbGl6ZXIgZnJvbSAnQHNpbXBsZS1kb20vc2VyaWFsaXplcic7XG5pbXBvcnQgdm9pZE1hcCBmcm9tICdAc2ltcGxlLWRvbS92b2lkLW1hcCc7XG5pbXBvcnQgeyBTZXJpYWxpemFibGVOb2RlIH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcbmltcG9ydCB7IHJlbmRlclRvU3RyaW5nLCBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi4nO1xuXG5RVW5pdC5tb2R1bGUoJ0BnbGltbWVyL3NzciByZW5kZXJpbmcnLCAoKSA9PiB7XG4gIFFVbml0LnRlc3QoJ29wdGlvbnMuc2VyaWFsaXplcicsIGFzeW5jIChhc3NlcnQpID0+IHtcbiAgICBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7fVxuXG4gICAgY2xhc3MgQ3VzdG9tSFRNTFNlcmlhbGl6ZXIgZXh0ZW5kcyBIVE1MU2VyaWFsaXplciB7XG4gICAgICB0ZXh0KHRleHQ6IFNlcmlhbGl6YWJsZU5vZGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gc3VwZXIudGV4dCh0ZXh0KS5yZXBsYWNlKC9IZWxsby9nLCAnR29vZGJ5ZScpOyAvLyBSZXBsYWNlcyByZXBldGl0aXZlIHdoaXRlc3BhY2Ugd2l0aCBhIHNpbmdsZSBjaGFyYWN0ZXIuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogUmVuZGVyT3B0aW9ucyA9IHsgc2VyaWFsaXplcjogbmV3IEN1c3RvbUhUTUxTZXJpYWxpemVyKHZvaWRNYXApIH07XG5cbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgIHByZWNvbXBpbGVUZW1wbGF0ZShgPGgxPkhlbGxvIFdvcmxkPC9oMT5gLCB7IHN0cmljdE1vZGU6IHRydWUgfSksXG4gICAgICBNeUNvbXBvbmVudFxuICAgICk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCByZW5kZXJUb1N0cmluZyhNeUNvbXBvbmVudCwgb3B0aW9ucyk7XG5cbiAgICBhc3NlcnQuZXF1YWwob3V0cHV0LCAnPGgxPkdvb2RieWUgV29ybGQ8L2gxPicpO1xuICB9KTtcblxuICBRVW5pdC50ZXN0KCdzZXR0aW5nIHJlaHlkcmF0ZSBvcHRpb24gb3V0cHV0cyB0aGUgYmxvY2sgc3RhY2tzJywgYXN5bmMgKGFzc2VydCkgPT4ge1xuICAgIGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHt9XG4gICAgc2V0Q29tcG9uZW50VGVtcGxhdGUoXG4gICAgICBwcmVjb21waWxlVGVtcGxhdGUoYDxoMT5IZWxsbyBXb3JsZDwvaDE+YCwgeyBzdHJpY3RNb2RlOiB0cnVlIH0pLFxuICAgICAgTXlDb21wb25lbnRcbiAgICApO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlbmRlclRvU3RyaW5nKE15Q29tcG9uZW50LCB7IHJlaHlkcmF0ZTogdHJ1ZSB9KTtcblxuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG91dHB1dCxcbiAgICAgICc8IS0tJStiOjAlLS0+PCEtLSUrYjoxJS0tPjxoMT5IZWxsbyBXb3JsZDwvaDE+PCEtLSUtYjoxJS0tPjwhLS0lLWI6MCUtLT4nXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export { renderToString, renderToStream, RenderOptions } from './src/render';
@@ -0,0 +1,2 @@
1
+ export { renderToString, renderToStream } from './src/render';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQWlCLE1BQU0sY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgcmVuZGVyVG9TdHJpbmcsIHJlbmRlclRvU3RyZWFtLCBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi9zcmMvcmVuZGVyJztcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import { ComponentDefinition } from '@norith/glimmer-core';
3
+ import { Dict } from '@glimmer/interfaces';
4
+ import HTMLSerializer from '@simple-dom/serializer';
5
+ export interface RenderOptions {
6
+ args?: Dict<unknown>;
7
+ serializer?: HTMLSerializer;
8
+ owner?: object;
9
+ rehydrate?: boolean;
10
+ }
11
+ export declare function renderToString(ComponentClass: ComponentDefinition, options?: RenderOptions): Promise<string>;
12
+ export declare function renderToStream(stream: NodeJS.WritableStream, ComponentClass: ComponentDefinition, options?: RenderOptions): void;
@@ -0,0 +1,49 @@
1
+ import { getTemplateIterator } from '@norith/glimmer-core';
2
+ import createHTMLDocument from '@simple-dom/document';
3
+ import HTMLSerializer from '@simple-dom/serializer';
4
+ import voidMap from '@simple-dom/void-map';
5
+ import { PassThrough } from 'stream';
6
+ import { parse } from 'url';
7
+ import { BaseEnvDelegate } from '@norith/glimmer-core';
8
+ import { NodeDOMTreeConstruction, serializeBuilder } from '@glimmer/node';
9
+ import { clientBuilder, DOMChanges, renderSync } from '@glimmer/runtime';
10
+ /**
11
+ * Server-side environment that can be used to configure the glimmer-vm to work
12
+ * on the server side.
13
+ *
14
+ * @internal
15
+ */
16
+ class ServerEnvDelegate extends BaseEnvDelegate {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.isInteractive = false;
20
+ }
21
+ protocolForURL(url) {
22
+ const urlObject = parse(url);
23
+ return (urlObject && urlObject.protocol) || 'https';
24
+ }
25
+ }
26
+ const defaultSerializer = new HTMLSerializer(voidMap);
27
+ export function renderToString(ComponentClass, options) {
28
+ return new Promise((resolve, reject) => {
29
+ const stream = new PassThrough();
30
+ let html = '';
31
+ stream.on('data', (str) => (html += str));
32
+ stream.on('end', () => resolve(html));
33
+ stream.on('error', (err) => reject(err));
34
+ renderToStream(stream, ComponentClass, options);
35
+ });
36
+ }
37
+ export function renderToStream(stream, ComponentClass, options = {}) {
38
+ const document = createHTMLDocument();
39
+ const element = document.body;
40
+ const appendOperations = new NodeDOMTreeConstruction(document);
41
+ // TODO: Remove in Glimmer VM 0.48, it's not necessary
42
+ const updateOperations = new DOMChanges(document);
43
+ const { env, iterator } = getTemplateIterator(ComponentClass, element, { appendOperations, updateOperations }, new ServerEnvDelegate(), options.args, options.owner, options.rehydrate ? serializeBuilder : clientBuilder);
44
+ renderSync(env, iterator);
45
+ const serializer = options.serializer || defaultSerializer;
46
+ stream.write(serializer.serializeChildren(element));
47
+ stream.end();
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvQGdsaW1tZXIvc3NyL3NyYy9yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWhGLE9BQU8sa0JBQWtCLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxjQUFjLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekU7Ozs7O0dBS0c7QUFDSCxNQUFNLGlCQUFrQixTQUFRLGVBQWU7SUFBL0M7O1FBQ0Usa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFNeEIsQ0FBQztJQUpDLGNBQWMsQ0FBQyxHQUFXO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxPQUFPLENBQUM7SUFDdEQsQ0FBQztDQUNGO0FBU0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUV0RCxNQUFNLFVBQVUsY0FBYyxDQUM1QixjQUFtQyxFQUNuQyxPQUF1QjtJQUV2QixPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzdDLE1BQU0sTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQzVCLE1BQTZCLEVBQzdCLGNBQW1DLEVBQ25DLFVBQXlCLEVBQUU7SUFFM0IsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztJQUN0QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvRCxzREFBc0Q7SUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVsRCxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLG1CQUFtQixDQUMzQyxjQUFjLEVBQ2QsT0FBTyxFQUNQLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsRUFDdEMsSUFBSSxpQkFBaUIsRUFBRSxFQUN2QixPQUFPLENBQUMsSUFBSSxFQUNaLE9BQU8sQ0FBQyxLQUFLLEVBQ2IsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FDckQsQ0FBQztJQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFMUIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsQ0FBQztJQUUzRCxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnREZWZpbml0aW9uLCBnZXRUZW1wbGF0ZUl0ZXJhdG9yIH0gZnJvbSAnQG5vcml0aC9nbGltbWVyLWNvcmUnO1xuaW1wb3J0IHsgRGljdCB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IGNyZWF0ZUhUTUxEb2N1bWVudCBmcm9tICdAc2ltcGxlLWRvbS9kb2N1bWVudCc7XG5pbXBvcnQgSFRNTFNlcmlhbGl6ZXIgZnJvbSAnQHNpbXBsZS1kb20vc2VyaWFsaXplcic7XG5pbXBvcnQgdm9pZE1hcCBmcm9tICdAc2ltcGxlLWRvbS92b2lkLW1hcCc7XG5pbXBvcnQgeyBQYXNzVGhyb3VnaCB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBCYXNlRW52RGVsZWdhdGUgfSBmcm9tICdAbm9yaXRoL2dsaW1tZXItY29yZSc7XG5pbXBvcnQgeyBOb2RlRE9NVHJlZUNvbnN0cnVjdGlvbiwgc2VyaWFsaXplQnVpbGRlciB9IGZyb20gJ0BnbGltbWVyL25vZGUnO1xuaW1wb3J0IHsgY2xpZW50QnVpbGRlciwgRE9NQ2hhbmdlcywgcmVuZGVyU3luYyB9IGZyb20gJ0BnbGltbWVyL3J1bnRpbWUnO1xuXG4vKipcbiAqIFNlcnZlci1zaWRlIGVudmlyb25tZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBnbGltbWVyLXZtIHRvIHdvcmtcbiAqIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgU2VydmVyRW52RGVsZWdhdGUgZXh0ZW5kcyBCYXNlRW52RGVsZWdhdGUge1xuICBpc0ludGVyYWN0aXZlID0gZmFsc2U7XG5cbiAgcHJvdG9jb2xGb3JVUkwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVybE9iamVjdCA9IHBhcnNlKHVybCk7XG4gICAgcmV0dXJuICh1cmxPYmplY3QgJiYgdXJsT2JqZWN0LnByb3RvY29sKSB8fCAnaHR0cHMnO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyT3B0aW9ucyB7XG4gIGFyZ3M/OiBEaWN0PHVua25vd24+O1xuICBzZXJpYWxpemVyPzogSFRNTFNlcmlhbGl6ZXI7XG4gIG93bmVyPzogb2JqZWN0O1xuICByZWh5ZHJhdGU/OiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0U2VyaWFsaXplciA9IG5ldyBIVE1MU2VyaWFsaXplcih2b2lkTWFwKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclRvU3RyaW5nKFxuICBDb21wb25lbnRDbGFzczogQ29tcG9uZW50RGVmaW5pdGlvbixcbiAgb3B0aW9ucz86IFJlbmRlck9wdGlvbnNcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgc3RyZWFtLm9uKCdkYXRhJywgKHN0cikgPT4gKGh0bWwgKz0gc3RyKSk7XG4gICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKGh0bWwpKTtcbiAgICBzdHJlYW0ub24oJ2Vycm9yJywgKGVycikgPT4gcmVqZWN0KGVycikpO1xuXG4gICAgcmVuZGVyVG9TdHJlYW0oc3RyZWFtLCBDb21wb25lbnRDbGFzcywgb3B0aW9ucyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyVG9TdHJlYW0oXG4gIHN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtLFxuICBDb21wb25lbnRDbGFzczogQ29tcG9uZW50RGVmaW5pdGlvbixcbiAgb3B0aW9uczogUmVuZGVyT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBjcmVhdGVIVE1MRG9jdW1lbnQoKTtcbiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XG4gIGNvbnN0IGFwcGVuZE9wZXJhdGlvbnMgPSBuZXcgTm9kZURPTVRyZWVDb25zdHJ1Y3Rpb24oZG9jdW1lbnQpO1xuXG4gIC8vIFRPRE86IFJlbW92ZSBpbiBHbGltbWVyIFZNIDAuNDgsIGl0J3Mgbm90IG5lY2Vzc2FyeVxuICBjb25zdCB1cGRhdGVPcGVyYXRpb25zID0gbmV3IERPTUNoYW5nZXMoZG9jdW1lbnQpO1xuXG4gIGNvbnN0IHsgZW52LCBpdGVyYXRvciB9ID0gZ2V0VGVtcGxhdGVJdGVyYXRvcihcbiAgICBDb21wb25lbnRDbGFzcyxcbiAgICBlbGVtZW50LFxuICAgIHsgYXBwZW5kT3BlcmF0aW9ucywgdXBkYXRlT3BlcmF0aW9ucyB9LFxuICAgIG5ldyBTZXJ2ZXJFbnZEZWxlZ2F0ZSgpLFxuICAgIG9wdGlvbnMuYXJncyxcbiAgICBvcHRpb25zLm93bmVyLFxuICAgIG9wdGlvbnMucmVoeWRyYXRlID8gc2VyaWFsaXplQnVpbGRlciA6IGNsaWVudEJ1aWxkZXJcbiAgKTtcbiAgcmVuZGVyU3luYyhlbnYsIGl0ZXJhdG9yKTtcblxuICBjb25zdCBzZXJpYWxpemVyID0gb3B0aW9ucy5zZXJpYWxpemVyIHx8IGRlZmF1bHRTZXJpYWxpemVyO1xuXG4gIHN0cmVhbS53cml0ZShzZXJpYWxpemVyLnNlcmlhbGl6ZUNoaWxkcmVuKGVsZW1lbnQpKTtcbiAgc3RyZWFtLmVuZCgpO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ import './render-options-tests';
2
+ import './modifiers-test';
@@ -0,0 +1,3 @@
1
+ import './render-options-tests';
2
+ import './modifiers-test';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJy4vcmVuZGVyLW9wdGlvbnMtdGVzdHMnO1xuaW1wb3J0ICcuL21vZGlmaWVycy10ZXN0JztcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { setComponentTemplate, precompileTemplate, templateOnlyComponent, setModifierManager, modifierCapabilities, } from '@norith/glimmer-core';
2
+ import { renderToString } from '..';
3
+ class CustomModifier {
4
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
5
+ didInsertElement() { }
6
+ }
7
+ class CustomModifierManager {
8
+ constructor(owner) {
9
+ this.owner = owner;
10
+ this.capabilities = modifierCapabilities('3.22');
11
+ }
12
+ createModifier(factory) {
13
+ return new factory(this.owner);
14
+ }
15
+ installModifier(instance) {
16
+ instance.didInsertElement();
17
+ }
18
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
19
+ updateModifier() { }
20
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
21
+ destroyModifier() { }
22
+ }
23
+ setModifierManager((owner) => new CustomModifierManager(owner), CustomModifier);
24
+ QUnit.module('@glimmer/ssr modifiers', () => {
25
+ QUnit.test('modifiers do not run in SSR', async (assert) => {
26
+ class Modifier extends CustomModifier {
27
+ didInsertElement() {
28
+ assert.ok(false, 'modifiers should not trigger insert in SSR');
29
+ }
30
+ }
31
+ const Component = templateOnlyComponent();
32
+ setComponentTemplate(precompileTemplate('<h1 {{Modifier}}>hello world</h1>', {
33
+ strictMode: true,
34
+ scope: { Modifier },
35
+ }), Component);
36
+ const output = await renderToString(Component);
37
+ assert.equal(output, '<h1>hello world</h1>');
38
+ });
39
+ });
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kaWZpZXJzLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9tb2RpZmllcnMtdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUVyQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFcEMsTUFBTSxjQUFjO0lBRWxCLGdFQUFnRTtJQUNoRSxnQkFBZ0IsS0FBVSxDQUFDO0NBQzVCO0FBRUQsTUFBTSxxQkFBcUI7SUFHekIsWUFBb0IsS0FBYztRQUFkLFVBQUssR0FBTCxLQUFLLENBQVM7UUFGbEMsaUJBQVksR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVQLENBQUM7SUFFdEMsY0FBYyxDQUFDLE9BQWlEO1FBQzlELE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxlQUFlLENBQUMsUUFBd0I7UUFDdEMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGdFQUFnRTtJQUNoRSxjQUFjLEtBQVUsQ0FBQztJQUN6QixnRUFBZ0U7SUFDaEUsZUFBZSxLQUFVLENBQUM7Q0FDM0I7QUFFRCxrQkFBa0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVoRixLQUFLLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN6RCxNQUFNLFFBQVMsU0FBUSxjQUFjO1lBQ25DLGdCQUFnQjtnQkFDZCxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7U0FDRjtRQUVELE1BQU0sU0FBUyxHQUFHLHFCQUFxQixFQUFFLENBQUM7UUFDMUMsb0JBQW9CLENBQ2xCLGtCQUFrQixDQUFDLG1DQUFtQyxFQUFFO1lBQ3RELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRTtTQUNwQixDQUFDLEVBQ0YsU0FBUyxDQUNWLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUvQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBzZXRDb21wb25lbnRUZW1wbGF0ZSxcbiAgcHJlY29tcGlsZVRlbXBsYXRlLFxuICB0ZW1wbGF0ZU9ubHlDb21wb25lbnQsXG4gIHNldE1vZGlmaWVyTWFuYWdlcixcbiAgbW9kaWZpZXJDYXBhYmlsaXRpZXMsXG4gIE1vZGlmaWVyTWFuYWdlcixcbn0gZnJvbSAnQG5vcml0aC9nbGltbWVyLWNvcmUnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcgfSBmcm9tICcuLic7XG5cbmNsYXNzIEN1c3RvbU1vZGlmaWVyIHtcbiAgZWxlbWVudD86IEVsZW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgZGlkSW5zZXJ0RWxlbWVudCgpOiB2b2lkIHt9XG59XG5cbmNsYXNzIEN1c3RvbU1vZGlmaWVyTWFuYWdlciBpbXBsZW1lbnRzIE1vZGlmaWVyTWFuYWdlcjxDdXN0b21Nb2RpZmllcj4ge1xuICBjYXBhYmlsaXRpZXMgPSBtb2RpZmllckNhcGFiaWxpdGllcygnMy4yMicpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgb3duZXI6IHVua25vd24pIHt9XG5cbiAgY3JlYXRlTW9kaWZpZXIoZmFjdG9yeTogeyBuZXcgKG93bmVyOiB1bmtub3duKTogQ3VzdG9tTW9kaWZpZXIgfSk6IEN1c3RvbU1vZGlmaWVyIHtcbiAgICByZXR1cm4gbmV3IGZhY3RvcnkodGhpcy5vd25lcik7XG4gIH1cblxuICBpbnN0YWxsTW9kaWZpZXIoaW5zdGFuY2U6IEN1c3RvbU1vZGlmaWVyKTogdm9pZCB7XG4gICAgaW5zdGFuY2UuZGlkSW5zZXJ0RWxlbWVudCgpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICB1cGRhdGVNb2RpZmllcigpOiB2b2lkIHt9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgZGVzdHJveU1vZGlmaWVyKCk6IHZvaWQge31cbn1cblxuc2V0TW9kaWZpZXJNYW5hZ2VyKChvd25lcikgPT4gbmV3IEN1c3RvbU1vZGlmaWVyTWFuYWdlcihvd25lciksIEN1c3RvbU1vZGlmaWVyKTtcblxuUVVuaXQubW9kdWxlKCdAZ2xpbW1lci9zc3IgbW9kaWZpZXJzJywgKCkgPT4ge1xuICBRVW5pdC50ZXN0KCdtb2RpZmllcnMgZG8gbm90IHJ1biBpbiBTU1InLCBhc3luYyAoYXNzZXJ0KSA9PiB7XG4gICAgY2xhc3MgTW9kaWZpZXIgZXh0ZW5kcyBDdXN0b21Nb2RpZmllciB7XG4gICAgICBkaWRJbnNlcnRFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICBhc3NlcnQub2soZmFsc2UsICdtb2RpZmllcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGluc2VydCBpbiBTU1InKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBDb21wb25lbnQgPSB0ZW1wbGF0ZU9ubHlDb21wb25lbnQoKTtcbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgIHByZWNvbXBpbGVUZW1wbGF0ZSgnPGgxIHt7TW9kaWZpZXJ9fT5oZWxsbyB3b3JsZDwvaDE+Jywge1xuICAgICAgICBzdHJpY3RNb2RlOiB0cnVlLFxuICAgICAgICBzY29wZTogeyBNb2RpZmllciB9LFxuICAgICAgfSksXG4gICAgICBDb21wb25lbnRcbiAgICApO1xuXG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVuZGVyVG9TdHJpbmcoQ29tcG9uZW50KTtcblxuICAgIGFzc2VydC5lcXVhbChvdXRwdXQsICc8aDE+aGVsbG8gd29ybGQ8L2gxPicpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import Component from '@norith/glimmer-component';
2
+ import { setComponentTemplate, precompileTemplate } from '@norith/glimmer-core';
3
+ import HTMLSerializer from '@simple-dom/serializer';
4
+ import voidMap from '@simple-dom/void-map';
5
+ import { renderToString } from '..';
6
+ QUnit.module('@glimmer/ssr rendering', () => {
7
+ QUnit.test('options.serializer', async (assert) => {
8
+ class MyComponent extends Component {
9
+ }
10
+ class CustomHTMLSerializer extends HTMLSerializer {
11
+ text(text) {
12
+ return super.text(text).replace(/Hello/g, 'Goodbye'); // Replaces repetitive whitespace with a single character.
13
+ }
14
+ }
15
+ const options = { serializer: new CustomHTMLSerializer(voidMap) };
16
+ setComponentTemplate(precompileTemplate(`<h1>Hello World</h1>`, { strictMode: true }), MyComponent);
17
+ const output = await renderToString(MyComponent, options);
18
+ assert.equal(output, '<h1>Goodbye World</h1>');
19
+ });
20
+ QUnit.test('setting rehydrate option outputs the block stacks', async (assert) => {
21
+ class MyComponent extends Component {
22
+ }
23
+ setComponentTemplate(precompileTemplate(`<h1>Hello World</h1>`, { strictMode: true }), MyComponent);
24
+ const output = await renderToString(MyComponent, { rehydrate: true });
25
+ assert.equal(output, '<!--%+b:0%--><!--%+b:1%--><h1>Hello World</h1><!--%-b:1%--><!--%-b:0%-->');
26
+ });
27
+ });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9wdGlvbnMtdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9AZ2xpbW1lci9zc3IvdGVzdC9yZW5kZXItb3B0aW9ucy10ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFNBQVMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRixPQUFPLGNBQWMsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLElBQUksQ0FBQztBQUVuRCxLQUFLLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNoRCxNQUFNLFdBQVksU0FBUSxTQUFTO1NBQUc7UUFFdEMsTUFBTSxvQkFBcUIsU0FBUSxjQUFjO1lBQy9DLElBQUksQ0FBQyxJQUFzQjtnQkFDekIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQywwREFBMEQ7WUFDbEgsQ0FBQztTQUNGO1FBRUQsTUFBTSxPQUFPLEdBQWtCLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUVqRixvQkFBb0IsQ0FDbEIsa0JBQWtCLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDaEUsV0FBVyxDQUNaLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQy9FLE1BQU0sV0FBWSxTQUFRLFNBQVM7U0FBRztRQUN0QyxvQkFBb0IsQ0FDbEIsa0JBQWtCLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFDaEUsV0FBVyxDQUNaLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV0RSxNQUFNLENBQUMsS0FBSyxDQUNWLE1BQU0sRUFDTiwwRUFBMEUsQ0FDM0UsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29tcG9uZW50IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci1jb21wb25lbnQnO1xuaW1wb3J0IHsgc2V0Q29tcG9uZW50VGVtcGxhdGUsIHByZWNvbXBpbGVUZW1wbGF0ZSB9IGZyb20gJ0Bub3JpdGgvZ2xpbW1lci1jb3JlJztcbmltcG9ydCBIVE1MU2VyaWFsaXplciBmcm9tICdAc2ltcGxlLWRvbS9zZXJpYWxpemVyJztcbmltcG9ydCB2b2lkTWFwIGZyb20gJ0BzaW1wbGUtZG9tL3ZvaWQtbWFwJztcbmltcG9ydCB7IFNlcmlhbGl6YWJsZU5vZGUgfSBmcm9tICdAc2ltcGxlLWRvbS9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcmVuZGVyVG9TdHJpbmcsIFJlbmRlck9wdGlvbnMgfSBmcm9tICcuLic7XG5cblFVbml0Lm1vZHVsZSgnQGdsaW1tZXIvc3NyIHJlbmRlcmluZycsICgpID0+IHtcbiAgUVVuaXQudGVzdCgnb3B0aW9ucy5zZXJpYWxpemVyJywgYXN5bmMgKGFzc2VydCkgPT4ge1xuICAgIGNsYXNzIE15Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHt9XG5cbiAgICBjbGFzcyBDdXN0b21IVE1MU2VyaWFsaXplciBleHRlbmRzIEhUTUxTZXJpYWxpemVyIHtcbiAgICAgIHRleHQodGV4dDogU2VyaWFsaXphYmxlTm9kZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBzdXBlci50ZXh0KHRleHQpLnJlcGxhY2UoL0hlbGxvL2csICdHb29kYnllJyk7IC8vIFJlcGxhY2VzIHJlcGV0aXRpdmUgd2hpdGVzcGFjZSB3aXRoIGEgc2luZ2xlIGNoYXJhY3Rlci5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBSZW5kZXJPcHRpb25zID0geyBzZXJpYWxpemVyOiBuZXcgQ3VzdG9tSFRNTFNlcmlhbGl6ZXIodm9pZE1hcCkgfTtcblxuICAgIHNldENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgcHJlY29tcGlsZVRlbXBsYXRlKGA8aDE+SGVsbG8gV29ybGQ8L2gxPmAsIHsgc3RyaWN0TW9kZTogdHJ1ZSB9KSxcbiAgICAgIE15Q29tcG9uZW50XG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHJlbmRlclRvU3RyaW5nKE15Q29tcG9uZW50LCBvcHRpb25zKTtcblxuICAgIGFzc2VydC5lcXVhbChvdXRwdXQsICc8aDE+R29vZGJ5ZSBXb3JsZDwvaDE+Jyk7XG4gIH0pO1xuXG4gIFFVbml0LnRlc3QoJ3NldHRpbmcgcmVoeWRyYXRlIG9wdGlvbiBvdXRwdXRzIHRoZSBibG9jayBzdGFja3MnLCBhc3luYyAoYXNzZXJ0KSA9PiB7XG4gICAgY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge31cbiAgICBzZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgIHByZWNvbXBpbGVUZW1wbGF0ZShgPGgxPkhlbGxvIFdvcmxkPC9oMT5gLCB7IHN0cmljdE1vZGU6IHRydWUgfSksXG4gICAgICBNeUNvbXBvbmVudFxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgcmVuZGVyVG9TdHJpbmcoTXlDb21wb25lbnQsIHsgcmVoeWRyYXRlOiB0cnVlIH0pO1xuXG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgb3V0cHV0LFxuICAgICAgJzwhLS0lK2I6MCUtLT48IS0tJStiOjElLS0+PGgxPkhlbGxvIFdvcmxkPC9oMT48IS0tJS1iOjElLS0+PCEtLSUtYjowJS0tPidcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@norith/glimmer-ssr",
3
+ "version": "1.0.0",
4
+ "description": "Server-side rendering for Glimmer Applications",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/snorith/glimmer.js.git"
8
+ },
9
+ "license": "MIT",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "main": "dist/commonjs/index.js",
14
+ "module": "dist/modules/index.js",
15
+ "dependencies": {
16
+ "@norith/glimmer-core": "1.0.0",
17
+ "@glimmer/node": "0.84.0",
18
+ "@glimmer/reference": "0.84.0",
19
+ "@glimmer/runtime": "0.84.0",
20
+ "@glimmer/util": "0.84.0",
21
+ "@simple-dom/document": "^1.4.0",
22
+ "@simple-dom/serializer": "^1.4.0",
23
+ "@simple-dom/void-map": "^1.4.0"
24
+ },
25
+ "devDependencies": {
26
+ "@norith/glimmer-component": "1.0.0"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public",
30
+ "registry": "https://registry.npmjs.org"
31
+ }
32
+ }