@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 +30 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.js +7 -0
- package/dist/commonjs/src/render.d.ts +12 -0
- package/dist/commonjs/src/render.js +57 -0
- package/dist/commonjs/test/index.d.ts +2 -0
- package/dist/commonjs/test/index.js +5 -0
- package/dist/commonjs/test/modifiers-test.d.ts +1 -0
- package/dist/commonjs/test/modifiers-test.js +42 -0
- package/dist/commonjs/test/render-options-tests.d.ts +1 -0
- package/dist/commonjs/test/render-options-tests.js +33 -0
- package/dist/modules/index.d.ts +1 -0
- package/dist/modules/index.js +2 -0
- package/dist/modules/src/render.d.ts +12 -0
- package/dist/modules/src/render.js +49 -0
- package/dist/modules/test/index.d.ts +2 -0
- package/dist/modules/test/index.js +3 -0
- package/dist/modules/test/modifiers-test.d.ts +1 -0
- package/dist/modules/test/modifiers-test.js +40 -0
- package/dist/modules/test/render-options-tests.d.ts +1 -0
- package/dist/modules/test/render-options-tests.js +28 -0
- package/package.json +32 -0
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,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,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
|
+
}
|