ember-repl 2.0.63 → 3.0.0-beta.1
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 +200 -35
- package/addon-main.cjs +5 -0
- package/dist/browser/cjs/eval.d.ts +10 -0
- package/dist/browser/cjs/eval.d.ts.map +1 -0
- package/dist/browser/cjs/eval.js +22 -0
- package/dist/browser/cjs/eval.js.map +1 -0
- package/dist/browser/cjs/index.d.ts +7 -0
- package/dist/browser/cjs/index.js +43 -0
- package/dist/browser/cjs/index.js.map +1 -0
- package/dist/browser/compile/formats.d.ts +15 -0
- package/dist/browser/compile/formats.js +169 -0
- package/dist/browser/compile/formats.js.map +1 -0
- package/dist/browser/compile/index.d.ts +32 -0
- package/dist/browser/compile/index.js +90 -0
- package/dist/browser/compile/index.js.map +1 -0
- package/dist/browser/compile/markdown-to-ember.d.ts +18 -0
- package/dist/browser/compile/markdown-to-ember.js +237 -0
- package/dist/browser/compile/markdown-to-ember.js.map +1 -0
- package/dist/browser/compile/types.d.ts +7 -0
- package/dist/browser/compile/types.js +2 -0
- package/dist/browser/compile/types.js.map +1 -0
- package/dist/browser/esm/index.d.ts +8 -0
- package/dist/browser/esm/index.js +67 -0
- package/dist/browser/esm/index.js.map +1 -0
- package/dist/browser/eti/babel-plugin.d.ts +54 -0
- package/dist/browser/eti/babel-plugin.js +95 -0
- package/dist/browser/eti/babel-plugin.js.map +1 -0
- package/dist/browser/eti/debug.d.ts +2 -0
- package/dist/browser/eti/debug.js +9 -0
- package/dist/browser/eti/debug.js.map +1 -0
- package/dist/browser/eti/parse-templates.d.ts +56 -0
- package/dist/browser/eti/parse-templates.js +181 -0
- package/dist/browser/eti/parse-templates.js.map +1 -0
- package/dist/browser/eti/preprocess.d.ts +57 -0
- package/dist/browser/eti/preprocess.js +270 -0
- package/dist/browser/eti/preprocess.js.map +1 -0
- package/dist/browser/eti/template-tag-transform.d.ts +15 -0
- package/dist/browser/eti/template-tag-transform.js +46 -0
- package/dist/browser/eti/template-tag-transform.js.map +1 -0
- package/dist/browser/eti/util.d.ts +14 -0
- package/dist/browser/eti/util.js +39 -0
- package/dist/browser/eti/util.js.map +1 -0
- package/dist/browser/gjs.d.ts +4 -0
- package/dist/browser/gjs.js +40 -0
- package/dist/browser/gjs.js.map +1 -0
- package/{hbs.d.ts → dist/browser/hbs.d.ts} +7 -7
- package/dist/browser/hbs.js +91 -0
- package/dist/browser/hbs.js.map +1 -0
- package/dist/browser/index.d.ts +6 -0
- package/dist/browser/index.js +6 -0
- package/dist/browser/index.js.map +1 -0
- package/{js.d.ts → dist/browser/js.d.ts} +3 -6
- package/dist/browser/js.js +38 -0
- package/dist/browser/js.js.map +1 -0
- package/{known-modules.d.ts → dist/browser/known-modules.d.ts} +6 -5
- package/dist/browser/known-modules.js +46 -0
- package/dist/browser/known-modules.js.map +1 -0
- package/dist/browser/types.d.ts +21 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/{utils.d.ts → dist/browser/utils.d.ts} +8 -3
- package/dist/browser/utils.js +46 -0
- package/dist/browser/utils.js.map +1 -0
- package/dist/build/ember-cli.cjs +36 -0
- package/dist/test-support/index.d.ts +2 -0
- package/dist/test-support/index.js +8 -0
- package/dist/test-support/index.js.map +1 -0
- package/package.json +122 -125
- package/{addon → src/browser}/cjs/eval.ts +9 -5
- package/src/browser/cjs/index.ts +44 -0
- package/src/browser/compile/formats.ts +168 -0
- package/src/browser/compile/index.ts +131 -0
- package/src/browser/compile/markdown-to-ember.ts +318 -0
- package/src/browser/compile/types.ts +7 -0
- package/src/browser/esm/index.ts +80 -0
- package/src/browser/eti/babel-plugin.ts +105 -0
- package/src/browser/eti/debug.ts +7 -0
- package/src/browser/eti/parse-templates.ts +284 -0
- package/src/browser/eti/preprocess.ts +187 -0
- package/src/browser/eti/template-tag-transform.ts +100 -0
- package/src/browser/eti/util.ts +72 -0
- package/src/browser/gjs.ts +59 -0
- package/{addon → src/browser}/hbs.ts +24 -12
- package/{addon → src/browser}/index.ts +1 -0
- package/{addon → src/browser}/js.ts +6 -2
- package/{addon → src/browser}/known-modules.ts +4 -2
- package/{addon → src/browser}/types.ts +6 -1
- package/{addon → src/browser}/utils.ts +6 -2
- package/src/build/ember-cli.cjs +36 -0
- package/src/test-support/index.ts +5 -0
- package/.github/renovate.json5 +0 -93
- package/.github/workflows/ci.yml +0 -120
- package/.github/workflows/lint.yml +0 -88
- package/.github/workflows/types.yml +0 -30
- package/CHANGELOG.md +0 -745
- package/addon/cjs/index.ts +0 -100
- package/addon/esm/index.ts +0 -131
- package/cjs/eval.d.ts +0 -8
- package/cjs/index.d.ts +0 -10
- package/config/environment.js +0 -5
- package/esm/index.d.ts +0 -11
- package/index.d.ts +0 -5
- package/index.js +0 -105
- package/tsconfig.json +0 -56
- package/types/dummy/index.d.ts +0 -1
- package/types/global.d.ts +0 -43
- package/types/overrides.d.ts +0 -18
- package/types.d.ts +0 -15
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { resourceFactory, resource, cell } from 'ember-resources';
|
|
2
|
+
import { nameFor } from '../utils.js';
|
|
3
|
+
import { compileMD, compileGJS, compileHBS } from './formats.js';
|
|
4
|
+
|
|
5
|
+
const CACHE = new Map();
|
|
6
|
+
const SUPPORTED_FORMATS = ['glimdown', 'gjs', 'hbs'];
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* This compileMD is a more robust version of the raw compiling used in "formats".
|
|
10
|
+
* This function manages cache, and has events for folks building UIs to hook in to
|
|
11
|
+
*/
|
|
12
|
+
async function compile(text, {
|
|
13
|
+
format,
|
|
14
|
+
onSuccess,
|
|
15
|
+
onError,
|
|
16
|
+
onCompileStart,
|
|
17
|
+
...options
|
|
18
|
+
}) {
|
|
19
|
+
let id = nameFor(text);
|
|
20
|
+
let existing = CACHE.get(id);
|
|
21
|
+
if (existing) {
|
|
22
|
+
onSuccess(existing);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!SUPPORTED_FORMATS.includes(format)) {
|
|
26
|
+
await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await onCompileStart();
|
|
30
|
+
if (!text) {
|
|
31
|
+
await onError('No Input Document yet');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
let result;
|
|
35
|
+
if (format === 'glimdown') {
|
|
36
|
+
result = await compileMD(text, options);
|
|
37
|
+
} else if (format === 'gjs') {
|
|
38
|
+
result = await compileGJS(text, options.importMap);
|
|
39
|
+
} else if (format === 'hbs') {
|
|
40
|
+
result = await compileHBS(text, {
|
|
41
|
+
scope: options.topLevelScope
|
|
42
|
+
});
|
|
43
|
+
} else {
|
|
44
|
+
await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (result.error) {
|
|
48
|
+
await onError(result.error.message || `${result.error}`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
CACHE.set(id, result.component);
|
|
52
|
+
await onSuccess(result.component);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* By default, this compiles to `glimdown`. A Markdown format which
|
|
56
|
+
* extracts `live` tagged code snippets and compiles them to components.
|
|
57
|
+
*/
|
|
58
|
+
const Compiled = resourceFactory((markdownText, format) => {
|
|
59
|
+
return resource(() => {
|
|
60
|
+
let _format = (typeof format === 'function' ? format() : format) || 'glimdown';
|
|
61
|
+
let input = typeof markdownText === 'function' ? markdownText() : markdownText;
|
|
62
|
+
let ready = cell(false);
|
|
63
|
+
let error = cell();
|
|
64
|
+
let result = cell();
|
|
65
|
+
if (input) {
|
|
66
|
+
compile(input, {
|
|
67
|
+
format: _format,
|
|
68
|
+
onSuccess: async component => {
|
|
69
|
+
result.current = component;
|
|
70
|
+
ready.set(true);
|
|
71
|
+
error.set(null);
|
|
72
|
+
},
|
|
73
|
+
onError: async e => {
|
|
74
|
+
error.set(e);
|
|
75
|
+
},
|
|
76
|
+
onCompileStart: async () => {
|
|
77
|
+
ready.set(false);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return () => ({
|
|
82
|
+
isReady: ready.current,
|
|
83
|
+
error: error.current,
|
|
84
|
+
component: result.current
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
export { CACHE, Compiled, compile };
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/browser/compile/index.ts"],"sourcesContent":["import { cell, resource, resourceFactory } from 'ember-resources';\n\nimport { nameFor } from '../utils';\nimport {\n compileGJS as processGJS,\n compileHBS as processHBS,\n compileMD as processMD,\n} from './formats';\n\nimport type { CompileResult } from '../types';\nimport type { EvalImportMap, ScopeMap } from './types';\nimport type { ComponentLike } from '@glint/template';\ntype Format = 'glimdown' | 'gjs' | 'hbs';\n\nexport const CACHE = new Map<string, ComponentLike>();\n\nconst SUPPORTED_FORMATS = ['glimdown', 'gjs', 'hbs'];\n\n/**\n * This compileMD is a more robust version of the raw compiling used in \"formats\".\n * This function manages cache, and has events for folks building UIs to hook in to\n */\nexport async function compile(\n text: string,\n {\n format,\n onSuccess,\n onError,\n onCompileStart,\n ...options\n }: {\n format: Format;\n onSuccess: (component: ComponentLike) => Promise<unknown> | unknown;\n onError: (error: string) => Promise<unknown> | unknown;\n onCompileStart: () => Promise<unknown> | unknown;\n importMap?: EvalImportMap;\n CopyComponent?: string;\n topLevelScope?: ScopeMap;\n }\n) {\n let id = nameFor(text);\n\n let existing = CACHE.get(id);\n\n if (existing) {\n onSuccess(existing);\n\n return;\n }\n\n if (!SUPPORTED_FORMATS.includes(format)) {\n await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);\n\n return;\n }\n\n await onCompileStart();\n\n if (!text) {\n await onError('No Input Document yet');\n\n return;\n }\n\n let result: CompileResult;\n\n if (format === 'glimdown') {\n result = await processMD(text, options);\n } else if (format === 'gjs') {\n result = await processGJS(text, options.importMap);\n } else if (format === 'hbs') {\n result = await processHBS(text, {\n scope: options.topLevelScope,\n });\n } else {\n await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);\n\n return;\n }\n\n if (result.error) {\n await onError(result.error.message || `${result.error}`);\n\n return;\n }\n\n CACHE.set(id, result.component as ComponentLike);\n\n await onSuccess(result.component as ComponentLike);\n}\n\ntype Input = string | undefined | null;\n\n/**\n * By default, this compiles to `glimdown`. A Markdown format which\n * extracts `live` tagged code snippets and compiles them to components.\n */\nexport const Compiled = resourceFactory(\n (markdownText: Input | (() => Input), format?: Format | (() => Format)) => {\n return resource(() => {\n let _format: Format = (typeof format === 'function' ? format() : format) || 'glimdown';\n let input = typeof markdownText === 'function' ? markdownText() : markdownText;\n let ready = cell(false);\n let error = cell();\n let result = cell<ComponentLike>();\n\n if (input) {\n compile(input, {\n format: _format,\n onSuccess: async (component) => {\n result.current = component;\n ready.set(true);\n error.set(null);\n },\n onError: async (e) => {\n error.set(e);\n },\n onCompileStart: async () => {\n ready.set(false);\n },\n });\n }\n\n return () => ({\n isReady: ready.current,\n error: error.current,\n component: result.current,\n });\n });\n }\n);\n"],"names":["CACHE","Map","SUPPORTED_FORMATS","compile","text","format","onSuccess","onError","onCompileStart","options","id","nameFor","existing","get","includes","result","processMD","processGJS","importMap","processHBS","scope","topLevelScope","error","message","set","component","Compiled","resourceFactory","markdownText","resource","_format","input","ready","cell","current","e","isReady"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
interface ExtractedCode {
|
|
2
|
+
name: string;
|
|
3
|
+
code: string;
|
|
4
|
+
lang: string;
|
|
5
|
+
}
|
|
6
|
+
interface LiveCodeExtraction {
|
|
7
|
+
templateOnlyGlimdown: string;
|
|
8
|
+
blocks: ExtractedCode[];
|
|
9
|
+
}
|
|
10
|
+
interface ParseMarkdownOptions {
|
|
11
|
+
CopyComponent?: string;
|
|
12
|
+
ShadowComponent?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @internal not under semver
|
|
16
|
+
*/
|
|
17
|
+
declare function parseMarkdown(input: string, options?: ParseMarkdownOptions): Promise<LiveCodeExtraction>;
|
|
18
|
+
export { ExtractedCode, LiveCodeExtraction, parseMarkdown };
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import rehypeRaw from 'rehype-raw';
|
|
2
|
+
import rehypeStringify from 'rehype-stringify';
|
|
3
|
+
import remarkParse from 'remark-parse';
|
|
4
|
+
import remarkRehype from 'remark-rehype';
|
|
5
|
+
import { unified } from 'unified';
|
|
6
|
+
import { visit } from 'unist-util-visit';
|
|
7
|
+
import { nameFor, invocationOf } from '../utils.js';
|
|
8
|
+
|
|
9
|
+
const GLIMDOWN_PREVIEW = Symbol('__GLIMDOWN_PREVIEW__');
|
|
10
|
+
const GLIMDOWN_RENDER = Symbol('__GLIMDOWN_RENDER__');
|
|
11
|
+
const ALLOWED_LANGUAGES = ['gjs', 'hbs'];
|
|
12
|
+
const escapeCurlies = node => {
|
|
13
|
+
if ('value' in node && node.value) {
|
|
14
|
+
node.value = node.value.replace(/{{/g, '\\{{');
|
|
15
|
+
}
|
|
16
|
+
if ('children' in node && node.children) {
|
|
17
|
+
node.children.forEach(child => escapeCurlies(child));
|
|
18
|
+
}
|
|
19
|
+
if (!node.data) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if ('hChildren' in node.data && Array.isArray(node.data['hChildren'])) {
|
|
23
|
+
node.data['hChildren'].forEach(escapeCurlies);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function isLive(meta) {
|
|
28
|
+
return meta.includes('live');
|
|
29
|
+
}
|
|
30
|
+
function isPreview(meta) {
|
|
31
|
+
return meta.includes('preview');
|
|
32
|
+
}
|
|
33
|
+
function isBelow(meta) {
|
|
34
|
+
return meta.includes('below');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// TODO: extract and publish remark plugin
|
|
38
|
+
function liveCodeExtraction(options = {}) {
|
|
39
|
+
let {
|
|
40
|
+
copyComponent,
|
|
41
|
+
snippets,
|
|
42
|
+
demo
|
|
43
|
+
} = options;
|
|
44
|
+
let {
|
|
45
|
+
classList: snippetClasses
|
|
46
|
+
} = snippets || {};
|
|
47
|
+
let {
|
|
48
|
+
classList: demoClasses
|
|
49
|
+
} = demo || {};
|
|
50
|
+
snippetClasses ??= [];
|
|
51
|
+
demoClasses ??= [];
|
|
52
|
+
function isRelevantCode(node) {
|
|
53
|
+
if (node.type !== 'code') return false;
|
|
54
|
+
let {
|
|
55
|
+
meta,
|
|
56
|
+
lang
|
|
57
|
+
} = node;
|
|
58
|
+
meta = meta?.trim();
|
|
59
|
+
if (!meta || !lang) return false;
|
|
60
|
+
if (!meta.includes('live')) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (!ALLOWED_LANGUAGES.includes(lang)) return false;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
let copyNode = {
|
|
67
|
+
type: 'html',
|
|
68
|
+
value: copyComponent
|
|
69
|
+
};
|
|
70
|
+
function enhance(code) {
|
|
71
|
+
code.data ??= {};
|
|
72
|
+
code.data['hProperties'] ??= {};
|
|
73
|
+
// This is secret-to-us-only API, so we don't really care about the type
|
|
74
|
+
code.data['hProperties'][GLIMDOWN_PREVIEW] = true;
|
|
75
|
+
return {
|
|
76
|
+
data: {
|
|
77
|
+
hProperties: {
|
|
78
|
+
className: snippetClasses
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
type: 'div',
|
|
82
|
+
hProperties: {
|
|
83
|
+
className: snippetClasses
|
|
84
|
+
},
|
|
85
|
+
children: [code, copyNode]
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function flatReplaceAt(array, index, replacement) {
|
|
89
|
+
array.splice(index, 1, ...replacement);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// because we mutate the tree as we iterate,
|
|
93
|
+
// we need to make sure we don't loop forever
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
return function transformer(tree, file) {
|
|
96
|
+
visit(tree, ['code'], function (node, index, parent) {
|
|
97
|
+
if (parent === null) return;
|
|
98
|
+
if (index === null) return;
|
|
99
|
+
if (!isRelevantCode(node)) {
|
|
100
|
+
let enhanced = enhance(node);
|
|
101
|
+
parent.children[index] = enhanced;
|
|
102
|
+
return 'skip';
|
|
103
|
+
}
|
|
104
|
+
if (seen.has(node)) return 'skip';
|
|
105
|
+
seen.add(node);
|
|
106
|
+
let {
|
|
107
|
+
meta,
|
|
108
|
+
lang,
|
|
109
|
+
value
|
|
110
|
+
} = node;
|
|
111
|
+
if (!meta) return 'skip';
|
|
112
|
+
if (!lang) return 'skip';
|
|
113
|
+
file.data.liveCode ??= [];
|
|
114
|
+
let code = value.trim();
|
|
115
|
+
let name = nameFor(code);
|
|
116
|
+
let invocation = invocationOf(name);
|
|
117
|
+
let shadow = options.shadowComponent;
|
|
118
|
+
let wrapInShadow = shadow && !meta?.includes('no-shadow');
|
|
119
|
+
if (wrapInShadow) {
|
|
120
|
+
invocation = `<${shadow}>${invocation}</${shadow}>`;
|
|
121
|
+
}
|
|
122
|
+
let invokeNode = {
|
|
123
|
+
type: 'html',
|
|
124
|
+
data: {
|
|
125
|
+
hProperties: {
|
|
126
|
+
[GLIMDOWN_RENDER]: true
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
value: `<div class="${demoClasses}">${invocation}</div>`
|
|
130
|
+
};
|
|
131
|
+
let wrapper = enhance(node);
|
|
132
|
+
file.data.liveCode.push({
|
|
133
|
+
lang,
|
|
134
|
+
name,
|
|
135
|
+
code
|
|
136
|
+
});
|
|
137
|
+
let live = isLive(meta);
|
|
138
|
+
let preview = isPreview(meta);
|
|
139
|
+
let below = isBelow(meta);
|
|
140
|
+
if (live && preview && below) {
|
|
141
|
+
flatReplaceAt(parent.children, index, [wrapper, invokeNode]);
|
|
142
|
+
return 'skip';
|
|
143
|
+
}
|
|
144
|
+
if (live && preview) {
|
|
145
|
+
flatReplaceAt(parent.children, index, [invokeNode, wrapper]);
|
|
146
|
+
return 'skip';
|
|
147
|
+
}
|
|
148
|
+
if (live) {
|
|
149
|
+
parent.children[index] = invokeNode;
|
|
150
|
+
return 'skip';
|
|
151
|
+
}
|
|
152
|
+
parent.children[index] = wrapper;
|
|
153
|
+
return;
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function buildCompiler(options) {
|
|
158
|
+
return unified()
|
|
159
|
+
// .use(markdown)
|
|
160
|
+
.use(remarkParse)
|
|
161
|
+
// TODO: we only want to do this when we have pre > code.
|
|
162
|
+
// code can exist inline.
|
|
163
|
+
.use(liveCodeExtraction, {
|
|
164
|
+
snippets: {
|
|
165
|
+
classList: ['glimdown-snippet', 'relative']
|
|
166
|
+
},
|
|
167
|
+
demo: {
|
|
168
|
+
classList: ['glimdown-render']
|
|
169
|
+
},
|
|
170
|
+
copyComponent: options?.CopyComponent,
|
|
171
|
+
shadowComponent: options?.ShadowComponent
|
|
172
|
+
})
|
|
173
|
+
// .use(() => (tree) => visit(tree, (node) => console.log('i', node)))
|
|
174
|
+
// remark rehype is needed to convert markdown to HTML
|
|
175
|
+
// However, it also changes all the nodes, so we need another pass
|
|
176
|
+
// to make sure our Glimmer-aware nodes are in tact
|
|
177
|
+
.use(remarkRehype, {
|
|
178
|
+
allowDangerousHtml: true
|
|
179
|
+
})
|
|
180
|
+
// Convert invocables to raw format, so Glimmer can invoke them
|
|
181
|
+
.use(() => tree => {
|
|
182
|
+
visit(tree, function (node) {
|
|
183
|
+
// We rely on an implicit transformation of data.hProperties => properties
|
|
184
|
+
let properties = node.properties;
|
|
185
|
+
if (properties?.[GLIMDOWN_PREVIEW]) {
|
|
186
|
+
// Have to sanitize anything Glimmer could try to render
|
|
187
|
+
escapeCurlies(node);
|
|
188
|
+
return 'skip';
|
|
189
|
+
}
|
|
190
|
+
if (node.type === 'element' || 'tagName' in node && node.tagName === 'code') {
|
|
191
|
+
if (properties?.[GLIMDOWN_RENDER]) {
|
|
192
|
+
node.type = 'glimmer_raw';
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
escapeCurlies(node);
|
|
196
|
+
return 'skip';
|
|
197
|
+
}
|
|
198
|
+
if (node.type === 'text' || node.type === 'raw') {
|
|
199
|
+
// definitively not the better way, but this is supposed to detect "glimmer" nodes
|
|
200
|
+
if ('value' in node && typeof node.value === 'string' && node.value.match(/<\/?[_A-Z:0-9].*>/g)) {
|
|
201
|
+
node.type = 'glimmer_raw';
|
|
202
|
+
}
|
|
203
|
+
node.type = 'glimmer_raw';
|
|
204
|
+
return 'skip';
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
});
|
|
208
|
+
}).use(rehypeRaw, {
|
|
209
|
+
passThrough: ['glimmer_raw', 'raw']
|
|
210
|
+
}).use(() => tree => {
|
|
211
|
+
visit(tree, 'glimmer_raw', node => {
|
|
212
|
+
node.type = 'raw';
|
|
213
|
+
});
|
|
214
|
+
}).use(rehypeStringify, {
|
|
215
|
+
collapseEmptyAttributes: true,
|
|
216
|
+
closeSelfClosing: true,
|
|
217
|
+
allowParseErrors: true,
|
|
218
|
+
allowDangerousCharacters: true,
|
|
219
|
+
allowDangerousHtml: true
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* @internal not under semver
|
|
224
|
+
*/
|
|
225
|
+
async function parseMarkdown(input, options = {}) {
|
|
226
|
+
let markdownCompiler = buildCompiler(options);
|
|
227
|
+
let processed = await markdownCompiler.process(input);
|
|
228
|
+
let liveCode = processed.data.liveCode || [];
|
|
229
|
+
let templateOnly = processed.toString();
|
|
230
|
+
return {
|
|
231
|
+
templateOnlyGlimdown: templateOnly,
|
|
232
|
+
blocks: liveCode
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export { parseMarkdown };
|
|
237
|
+
//# sourceMappingURL=markdown-to-ember.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-to-ember.js","sources":["../../../src/browser/compile/markdown-to-ember.ts"],"sourcesContent":["import rehypeRaw from 'rehype-raw';\nimport rehypeStringify from 'rehype-stringify';\nimport remarkParse from 'remark-parse';\nimport remarkRehype from 'remark-rehype';\nimport { unified } from 'unified';\nimport { visit } from 'unist-util-visit';\n\nimport { invocationOf, nameFor } from '../utils';\n\nimport type { Node } from 'hast';\nimport type { Code, Text } from 'mdast';\nimport type { Parent } from 'unist';\nimport type { VFile } from 'vfile';\n\nexport interface ExtractedCode {\n name: string;\n code: string;\n lang: string;\n}\n\nexport interface LiveCodeExtraction {\n templateOnlyGlimdown: string;\n blocks: ExtractedCode[];\n}\ntype LiveData = {\n liveCode?: ExtractedCode[];\n};\ntype VFileWithMeta = VFile & {\n data: LiveData;\n};\n\ninterface Options {\n snippets?: {\n classList?: string[];\n };\n demo?: {\n classList?: string[];\n };\n copyComponent?: string;\n shadowComponent?: string;\n}\n\nconst GLIMDOWN_PREVIEW = Symbol('__GLIMDOWN_PREVIEW__');\nconst GLIMDOWN_RENDER = Symbol('__GLIMDOWN_RENDER__');\nconst ALLOWED_LANGUAGES = ['gjs', 'hbs'] as const;\n\ntype AllowedLanguage = (typeof ALLOWED_LANGUAGES)[number];\ntype RelevantCode = Omit<Code, 'lang'> & { lang: AllowedLanguage };\n\nconst escapeCurlies = (node: Text | Parent) => {\n if ('value' in node && node.value) {\n node.value = node.value.replace(/{{/g, '\\\\{{');\n }\n\n if ('children' in node && node.children) {\n node.children.forEach((child) => escapeCurlies(child as Parent));\n }\n\n if (!node.data) {\n return;\n }\n\n if ('hChildren' in node.data && Array.isArray(node.data['hChildren'])) {\n node.data['hChildren'].forEach(escapeCurlies);\n\n return;\n }\n};\n\nfunction isLive(meta: string) {\n return meta.includes('live');\n}\n\nfunction isPreview(meta: string) {\n return meta.includes('preview');\n}\n\nfunction isBelow(meta: string) {\n return meta.includes('below');\n}\n\n// TODO: extract and publish remark plugin\nfunction liveCodeExtraction(options: Options = {}) {\n let { copyComponent, snippets, demo } = options;\n let { classList: snippetClasses } = snippets || {};\n let { classList: demoClasses } = demo || {};\n\n snippetClasses ??= [];\n demoClasses ??= [];\n\n function isRelevantCode(node: Code): node is RelevantCode {\n if (node.type !== 'code') return false;\n\n let { meta, lang } = node;\n\n meta = meta?.trim();\n\n if (!meta || !lang) return false;\n\n if (!meta.includes('live')) {\n return false;\n }\n\n if (!(ALLOWED_LANGUAGES as unknown as string[]).includes(lang)) return false;\n\n return true;\n }\n\n let copyNode = {\n type: 'html',\n value: copyComponent,\n };\n\n function enhance(code: Code) {\n code.data ??= {};\n code.data['hProperties'] ??= {};\n // This is secret-to-us-only API, so we don't really care about the type\n (code.data['hProperties'] as any)[GLIMDOWN_PREVIEW] = true;\n\n return {\n data: {\n hProperties: { className: snippetClasses },\n },\n type: 'div',\n hProperties: { className: snippetClasses },\n children: [code, copyNode],\n };\n }\n\n function flatReplaceAt<T>(array: T[], index: number, replacement: T[]) {\n array.splice(index, 1, ...replacement);\n }\n\n // because we mutate the tree as we iterate,\n // we need to make sure we don't loop forever\n const seen = new Set();\n\n return function transformer(tree: Parent, file: VFileWithMeta) {\n visit(tree, ['code'], function (node, index, parent) {\n if (parent === null) return;\n if (index === null) return;\n\n if (!isRelevantCode(node as Code)) {\n let enhanced = enhance(node as Code);\n\n parent.children[index] = enhanced;\n\n return 'skip';\n }\n\n if (seen.has(node)) return 'skip';\n\n seen.add(node);\n\n let { meta, lang, value } = node as Code;\n\n if (!meta) return 'skip';\n if (!lang) return 'skip';\n\n file.data.liveCode ??= [];\n\n let code = value.trim();\n let name = nameFor(code);\n let invocation = invocationOf(name);\n\n let shadow = options.shadowComponent;\n\n let wrapInShadow = shadow && !meta?.includes('no-shadow');\n\n if (wrapInShadow) {\n invocation = `<${shadow}>${invocation}</${shadow}>`;\n }\n\n let invokeNode = {\n type: 'html',\n data: {\n hProperties: { [GLIMDOWN_RENDER]: true },\n },\n value: `<div class=\"${demoClasses}\">${invocation}</div>`,\n };\n\n let wrapper = enhance(node as Code);\n\n file.data.liveCode.push({\n lang,\n name,\n code,\n });\n\n let live = isLive(meta);\n let preview = isPreview(meta);\n let below = isBelow(meta);\n\n if (live && preview && below) {\n flatReplaceAt(parent.children, index, [wrapper, invokeNode]);\n\n return 'skip';\n }\n\n if (live && preview) {\n flatReplaceAt(parent.children, index, [invokeNode, wrapper]);\n\n return 'skip';\n }\n\n if (live) {\n parent.children[index] = invokeNode;\n\n return 'skip';\n }\n\n parent.children[index] = wrapper;\n\n return;\n });\n };\n}\n\nfunction buildCompiler(options: ParseMarkdownOptions) {\n return (\n unified()\n // .use(markdown)\n .use(remarkParse)\n // TODO: we only want to do this when we have pre > code.\n // code can exist inline.\n .use(liveCodeExtraction, {\n snippets: {\n classList: ['glimdown-snippet', 'relative'],\n },\n demo: {\n classList: ['glimdown-render'],\n },\n copyComponent: options?.CopyComponent,\n shadowComponent: options?.ShadowComponent,\n })\n // .use(() => (tree) => visit(tree, (node) => console.log('i', node)))\n // remark rehype is needed to convert markdown to HTML\n // However, it also changes all the nodes, so we need another pass\n // to make sure our Glimmer-aware nodes are in tact\n .use(remarkRehype, { allowDangerousHtml: true })\n // Convert invocables to raw format, so Glimmer can invoke them\n .use(() => (tree: Node) => {\n visit(tree, function (node) {\n // We rely on an implicit transformation of data.hProperties => properties\n let properties = (node as any).properties;\n\n if (properties?.[GLIMDOWN_PREVIEW]) {\n // Have to sanitize anything Glimmer could try to render\n escapeCurlies(node as Parent);\n\n return 'skip';\n }\n\n if (node.type === 'element' || ('tagName' in node && node.tagName === 'code')) {\n if (properties?.[GLIMDOWN_RENDER]) {\n node.type = 'glimmer_raw';\n\n return;\n }\n\n escapeCurlies(node as Parent);\n\n return 'skip';\n }\n\n if (node.type === 'text' || node.type === 'raw') {\n // definitively not the better way, but this is supposed to detect \"glimmer\" nodes\n if (\n 'value' in node &&\n typeof node.value === 'string' &&\n node.value.match(/<\\/?[_A-Z:0-9].*>/g)\n ) {\n node.type = 'glimmer_raw';\n }\n\n node.type = 'glimmer_raw';\n\n return 'skip';\n }\n\n return;\n });\n })\n .use(rehypeRaw, { passThrough: ['glimmer_raw', 'raw'] })\n .use(() => (tree) => {\n visit(tree, 'glimmer_raw', (node: Node) => {\n node.type = 'raw';\n });\n })\n .use(rehypeStringify, {\n collapseEmptyAttributes: true,\n closeSelfClosing: true,\n allowParseErrors: true,\n allowDangerousCharacters: true,\n allowDangerousHtml: true,\n })\n );\n}\n\ninterface ParseMarkdownOptions {\n CopyComponent?: string;\n ShadowComponent?: string;\n}\n\n/**\n * @internal not under semver\n */\nexport async function parseMarkdown(\n input: string,\n options: ParseMarkdownOptions = {}\n): Promise<LiveCodeExtraction> {\n let markdownCompiler = buildCompiler(options);\n let processed = await markdownCompiler.process(input);\n let liveCode = (processed.data as LiveData).liveCode || [];\n let templateOnly = processed.toString();\n\n return { templateOnlyGlimdown: templateOnly, blocks: liveCode };\n}\n"],"names":["GLIMDOWN_PREVIEW","Symbol","GLIMDOWN_RENDER","ALLOWED_LANGUAGES","escapeCurlies","node","value","replace","children","forEach","child","data","Array","isArray","isLive","meta","includes","isPreview","isBelow","liveCodeExtraction","options","copyComponent","snippets","demo","classList","snippetClasses","demoClasses","isRelevantCode","type","lang","trim","copyNode","enhance","code","hProperties","className","flatReplaceAt","array","index","replacement","splice","seen","Set","transformer","tree","file","visit","parent","enhanced","has","add","liveCode","name","nameFor","invocation","invocationOf","shadow","shadowComponent","wrapInShadow","invokeNode","wrapper","push","live","preview","below","buildCompiler","unified","use","remarkParse","CopyComponent","ShadowComponent","remarkRehype","allowDangerousHtml","properties","tagName","match","rehypeRaw","passThrough","rehypeStringify","collapseEmptyAttributes","closeSelfClosing","allowParseErrors","allowDangerousCharacters","parseMarkdown","input","markdownCompiler","processed","process","templateOnly","toString","templateOnlyGlimdown","blocks"],"mappings":";;;;;;;;AA0CA,MAAMA,gBAAgB,GAAGC,MAAM,CAAC,sBAAsB,CAAC,CAAA;AACvD,MAAMC,eAAe,GAAGD,MAAM,CAAC,qBAAqB,CAAC,CAAA;AACrD,MAAME,iBAAiB,GAAG,CAAC,KAAK,EAAE,KAAK,CAAU,CAAA;AAKjD,MAAMC,aAAa,GAAIC,IAAmB,IAAK;AAC7C,EAAA,IAAI,OAAO,IAAIA,IAAI,IAAIA,IAAI,CAACC,KAAK,EAAE;AACjCD,IAAAA,IAAI,CAACC,KAAK,GAAGD,IAAI,CAACC,KAAK,CAACC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;AAChD,GAAA;AAEA,EAAA,IAAI,UAAU,IAAIF,IAAI,IAAIA,IAAI,CAACG,QAAQ,EAAE;IACvCH,IAAI,CAACG,QAAQ,CAACC,OAAO,CAAEC,KAAK,IAAKN,aAAa,CAACM,KAAe,CAAC,CAAC,CAAA;AAClE,GAAA;AAEA,EAAA,IAAI,CAACL,IAAI,CAACM,IAAI,EAAE;AACd,IAAA,OAAA;AACF,GAAA;AAEA,EAAA,IAAI,WAAW,IAAIN,IAAI,CAACM,IAAI,IAAIC,KAAK,CAACC,OAAO,CAACR,IAAI,CAACM,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE;IACrEN,IAAI,CAACM,IAAI,CAAC,WAAW,CAAC,CAACF,OAAO,CAACL,aAAa,CAAC,CAAA;AAE7C,IAAA,OAAA;AACF,GAAA;AACF,CAAC,CAAA;AAED,SAASU,MAAMA,CAACC,IAAY,EAAE;AAC5B,EAAA,OAAOA,IAAI,CAACC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAA;AAEA,SAASC,SAASA,CAACF,IAAY,EAAE;AAC/B,EAAA,OAAOA,IAAI,CAACC,QAAQ,CAAC,SAAS,CAAC,CAAA;AACjC,CAAA;AAEA,SAASE,OAAOA,CAACH,IAAY,EAAE;AAC7B,EAAA,OAAOA,IAAI,CAACC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAC/B,CAAA;;AAEA;AACA,SAASG,kBAAkBA,CAACC,OAAgB,GAAG,EAAE,EAAE;EACjD,IAAI;IAAEC,aAAa;IAAEC,QAAQ;AAAEC,IAAAA,IAAAA;AAAK,GAAC,GAAGH,OAAO,CAAA;EAC/C,IAAI;AAAEI,IAAAA,SAAS,EAAEC,cAAAA;AAAe,GAAC,GAAGH,QAAQ,IAAI,EAAE,CAAA;EAClD,IAAI;AAAEE,IAAAA,SAAS,EAAEE,WAAAA;AAAY,GAAC,GAAGH,IAAI,IAAI,EAAE,CAAA;AAE3CE,EAAAA,cAAc,KAAK,EAAE,CAAA;AACrBC,EAAAA,WAAW,KAAK,EAAE,CAAA;EAElB,SAASC,cAAcA,CAACtB,IAAU,EAAwB;AACxD,IAAA,IAAIA,IAAI,CAACuB,IAAI,KAAK,MAAM,EAAE,OAAO,KAAK,CAAA;IAEtC,IAAI;MAAEb,IAAI;AAAEc,MAAAA,IAAAA;AAAK,KAAC,GAAGxB,IAAI,CAAA;AAEzBU,IAAAA,IAAI,GAAGA,IAAI,EAAEe,IAAI,EAAE,CAAA;AAEnB,IAAA,IAAI,CAACf,IAAI,IAAI,CAACc,IAAI,EAAE,OAAO,KAAK,CAAA;AAEhC,IAAA,IAAI,CAACd,IAAI,CAACC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC1B,MAAA,OAAO,KAAK,CAAA;AACd,KAAA;IAEA,IAAI,CAAEb,iBAAiB,CAAyBa,QAAQ,CAACa,IAAI,CAAC,EAAE,OAAO,KAAK,CAAA;AAE5E,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;AAEA,EAAA,IAAIE,QAAQ,GAAG;AACbH,IAAAA,IAAI,EAAE,MAAM;AACZtB,IAAAA,KAAK,EAAEe,aAAAA;GACR,CAAA;EAED,SAASW,OAAOA,CAACC,IAAU,EAAE;AAC3BA,IAAAA,IAAI,CAACtB,IAAI,KAAK,EAAE,CAAA;AAChBsB,IAAAA,IAAI,CAACtB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;AAC/B;IACCsB,IAAI,CAACtB,IAAI,CAAC,aAAa,CAAC,CAASX,gBAAgB,CAAC,GAAG,IAAI,CAAA;IAE1D,OAAO;AACLW,MAAAA,IAAI,EAAE;AACJuB,QAAAA,WAAW,EAAE;AAAEC,UAAAA,SAAS,EAAEV,cAAAA;AAAe,SAAA;OAC1C;AACDG,MAAAA,IAAI,EAAE,KAAK;AACXM,MAAAA,WAAW,EAAE;AAAEC,QAAAA,SAAS,EAAEV,cAAAA;OAAgB;AAC1CjB,MAAAA,QAAQ,EAAE,CAACyB,IAAI,EAAEF,QAAQ,CAAA;KAC1B,CAAA;AACH,GAAA;AAEA,EAAA,SAASK,aAAaA,CAAIC,KAAU,EAAEC,KAAa,EAAEC,WAAgB,EAAE;IACrEF,KAAK,CAACG,MAAM,CAACF,KAAK,EAAE,CAAC,EAAE,GAAGC,WAAW,CAAC,CAAA;AACxC,GAAA;;AAEA;AACA;AACA,EAAA,MAAME,IAAI,GAAG,IAAIC,GAAG,EAAE,CAAA;AAEtB,EAAA,OAAO,SAASC,WAAWA,CAACC,IAAY,EAAEC,IAAmB,EAAE;AAC7DC,IAAAA,KAAK,CAACF,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,UAAUvC,IAAI,EAAEiC,KAAK,EAAES,MAAM,EAAE;MACnD,IAAIA,MAAM,KAAK,IAAI,EAAE,OAAA;MACrB,IAAIT,KAAK,KAAK,IAAI,EAAE,OAAA;AAEpB,MAAA,IAAI,CAACX,cAAc,CAACtB,IAAY,CAAC,EAAE;AACjC,QAAA,IAAI2C,QAAQ,GAAGhB,OAAO,CAAC3B,IAAY,CAAC,CAAA;AAEpC0C,QAAAA,MAAM,CAACvC,QAAQ,CAAC8B,KAAK,CAAC,GAAGU,QAAQ,CAAA;AAEjC,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;MAEA,IAAIP,IAAI,CAACQ,GAAG,CAAC5C,IAAI,CAAC,EAAE,OAAO,MAAM,CAAA;AAEjCoC,MAAAA,IAAI,CAACS,GAAG,CAAC7C,IAAI,CAAC,CAAA;MAEd,IAAI;QAAEU,IAAI;QAAEc,IAAI;AAAEvB,QAAAA,KAAAA;AAAM,OAAC,GAAGD,IAAY,CAAA;AAExC,MAAA,IAAI,CAACU,IAAI,EAAE,OAAO,MAAM,CAAA;AACxB,MAAA,IAAI,CAACc,IAAI,EAAE,OAAO,MAAM,CAAA;AAExBgB,MAAAA,IAAI,CAAClC,IAAI,CAACwC,QAAQ,KAAK,EAAE,CAAA;AAEzB,MAAA,IAAIlB,IAAI,GAAG3B,KAAK,CAACwB,IAAI,EAAE,CAAA;AACvB,MAAA,IAAIsB,IAAI,GAAGC,OAAO,CAACpB,IAAI,CAAC,CAAA;AACxB,MAAA,IAAIqB,UAAU,GAAGC,YAAY,CAACH,IAAI,CAAC,CAAA;AAEnC,MAAA,IAAII,MAAM,GAAGpC,OAAO,CAACqC,eAAe,CAAA;MAEpC,IAAIC,YAAY,GAAGF,MAAM,IAAI,CAACzC,IAAI,EAAEC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAEzD,MAAA,IAAI0C,YAAY,EAAE;AAChBJ,QAAAA,UAAU,GAAI,CAAGE,CAAAA,EAAAA,MAAO,IAAGF,UAAW,CAAA,EAAA,EAAIE,MAAO,CAAE,CAAA,CAAA,CAAA;AACrD,OAAA;AAEA,MAAA,IAAIG,UAAU,GAAG;AACf/B,QAAAA,IAAI,EAAE,MAAM;AACZjB,QAAAA,IAAI,EAAE;AACJuB,UAAAA,WAAW,EAAE;AAAE,YAAA,CAAChC,eAAe,GAAG,IAAA;AAAK,WAAA;SACxC;AACDI,QAAAA,KAAK,EAAG,CAAA,YAAA,EAAcoB,WAAY,CAAA,EAAA,EAAI4B,UAAW,CAAA,MAAA,CAAA;OAClD,CAAA;AAED,MAAA,IAAIM,OAAO,GAAG5B,OAAO,CAAC3B,IAAY,CAAC,CAAA;AAEnCwC,MAAAA,IAAI,CAAClC,IAAI,CAACwC,QAAQ,CAACU,IAAI,CAAC;QACtBhC,IAAI;QACJuB,IAAI;AACJnB,QAAAA,IAAAA;AACF,OAAC,CAAC,CAAA;AAEF,MAAA,IAAI6B,IAAI,GAAGhD,MAAM,CAACC,IAAI,CAAC,CAAA;AACvB,MAAA,IAAIgD,OAAO,GAAG9C,SAAS,CAACF,IAAI,CAAC,CAAA;AAC7B,MAAA,IAAIiD,KAAK,GAAG9C,OAAO,CAACH,IAAI,CAAC,CAAA;AAEzB,MAAA,IAAI+C,IAAI,IAAIC,OAAO,IAAIC,KAAK,EAAE;AAC5B5B,QAAAA,aAAa,CAACW,MAAM,CAACvC,QAAQ,EAAE8B,KAAK,EAAE,CAACsB,OAAO,EAAED,UAAU,CAAC,CAAC,CAAA;AAE5D,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;MAEA,IAAIG,IAAI,IAAIC,OAAO,EAAE;AACnB3B,QAAAA,aAAa,CAACW,MAAM,CAACvC,QAAQ,EAAE8B,KAAK,EAAE,CAACqB,UAAU,EAAEC,OAAO,CAAC,CAAC,CAAA;AAE5D,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;AAEA,MAAA,IAAIE,IAAI,EAAE;AACRf,QAAAA,MAAM,CAACvC,QAAQ,CAAC8B,KAAK,CAAC,GAAGqB,UAAU,CAAA;AAEnC,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;AAEAZ,MAAAA,MAAM,CAACvC,QAAQ,CAAC8B,KAAK,CAAC,GAAGsB,OAAO,CAAA;AAEhC,MAAA,OAAA;AACF,KAAC,CAAC,CAAA;GACH,CAAA;AACH,CAAA;AAEA,SAASK,aAAaA,CAAC7C,OAA6B,EAAE;AACpD,EAAA,OACE8C,OAAO,EAAC;AACN;GACCC,GAAG,CAACC,WAAW,CAAA;AAChB;AACA;GACCD,GAAG,CAAChD,kBAAkB,EAAE;AACvBG,IAAAA,QAAQ,EAAE;AACRE,MAAAA,SAAS,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAA;KAC3C;AACDD,IAAAA,IAAI,EAAE;MACJC,SAAS,EAAE,CAAC,iBAAiB,CAAA;KAC9B;IACDH,aAAa,EAAED,OAAO,EAAEiD,aAAa;IACrCZ,eAAe,EAAErC,OAAO,EAAEkD,eAAAA;GAC3B,CAAA;AACD;AACA;AACA;AACA;GACCH,GAAG,CAACI,YAAY,EAAE;AAAEC,IAAAA,kBAAkB,EAAE,IAAA;GAAM,CAAA;AAC/C;AAAA,GACCL,GAAG,CAAC,MAAOvB,IAAU,IAAK;AACzBE,IAAAA,KAAK,CAACF,IAAI,EAAE,UAAUvC,IAAI,EAAE;AAC1B;AACA,MAAA,IAAIoE,UAAU,GAAIpE,IAAI,CAASoE,UAAU,CAAA;AAEzC,MAAA,IAAIA,UAAU,GAAGzE,gBAAgB,CAAC,EAAE;AAClC;QACAI,aAAa,CAACC,IAAc,CAAC,CAAA;AAE7B,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;AAEA,MAAA,IAAIA,IAAI,CAACuB,IAAI,KAAK,SAAS,IAAK,SAAS,IAAIvB,IAAI,IAAIA,IAAI,CAACqE,OAAO,KAAK,MAAO,EAAE;AAC7E,QAAA,IAAID,UAAU,GAAGvE,eAAe,CAAC,EAAE;UACjCG,IAAI,CAACuB,IAAI,GAAG,aAAa,CAAA;AAEzB,UAAA,OAAA;AACF,SAAA;QAEAxB,aAAa,CAACC,IAAc,CAAC,CAAA;AAE7B,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;MAEA,IAAIA,IAAI,CAACuB,IAAI,KAAK,MAAM,IAAIvB,IAAI,CAACuB,IAAI,KAAK,KAAK,EAAE;AAC/C;AACA,QAAA,IACE,OAAO,IAAIvB,IAAI,IACf,OAAOA,IAAI,CAACC,KAAK,KAAK,QAAQ,IAC9BD,IAAI,CAACC,KAAK,CAACqE,KAAK,CAAC,oBAAoB,CAAC,EACtC;UACAtE,IAAI,CAACuB,IAAI,GAAG,aAAa,CAAA;AAC3B,SAAA;QAEAvB,IAAI,CAACuB,IAAI,GAAG,aAAa,CAAA;AAEzB,QAAA,OAAO,MAAM,CAAA;AACf,OAAA;AAEA,MAAA,OAAA;AACF,KAAC,CAAC,CAAA;AACJ,GAAC,CAAC,CACDuC,GAAG,CAACS,SAAS,EAAE;AAAEC,IAAAA,WAAW,EAAE,CAAC,aAAa,EAAE,KAAK,CAAA;AAAE,GAAC,CAAC,CACvDV,GAAG,CAAC,MAAOvB,IAAI,IAAK;AACnBE,IAAAA,KAAK,CAACF,IAAI,EAAE,aAAa,EAAGvC,IAAU,IAAK;MACzCA,IAAI,CAACuB,IAAI,GAAG,KAAK,CAAA;AACnB,KAAC,CAAC,CAAA;AACJ,GAAC,CAAC,CACDuC,GAAG,CAACW,eAAe,EAAE;AACpBC,IAAAA,uBAAuB,EAAE,IAAI;AAC7BC,IAAAA,gBAAgB,EAAE,IAAI;AACtBC,IAAAA,gBAAgB,EAAE,IAAI;AACtBC,IAAAA,wBAAwB,EAAE,IAAI;AAC9BV,IAAAA,kBAAkB,EAAE,IAAA;AACtB,GAAC,CAAC,CAAA;AAER,CAAA;AAOA;AACA;AACA;AACO,eAAeW,aAAaA,CACjCC,KAAa,EACbhE,OAA6B,GAAG,EAAE,EACL;AAC7B,EAAA,IAAIiE,gBAAgB,GAAGpB,aAAa,CAAC7C,OAAO,CAAC,CAAA;EAC7C,IAAIkE,SAAS,GAAG,MAAMD,gBAAgB,CAACE,OAAO,CAACH,KAAK,CAAC,CAAA;EACrD,IAAIjC,QAAQ,GAAImC,SAAS,CAAC3E,IAAI,CAAcwC,QAAQ,IAAI,EAAE,CAAA;AAC1D,EAAA,IAAIqC,YAAY,GAAGF,SAAS,CAACG,QAAQ,EAAE,CAAA;EAEvC,OAAO;AAAEC,IAAAA,oBAAoB,EAAEF,YAAY;AAAEG,IAAAA,MAAM,EAAExC,QAAAA;GAAU,CAAA;AACjE;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CompileResult, ExtraModules } from "../types.js";
|
|
2
|
+
interface Info {
|
|
3
|
+
code: string;
|
|
4
|
+
name: string;
|
|
5
|
+
}
|
|
6
|
+
declare function compileJS(code: string, extraModules?: ExtraModules): Promise<CompileResult>;
|
|
7
|
+
declare function proxyToSkypack(code: string, extraModules?: ExtraModules): string;
|
|
8
|
+
export { Info, compileJS, proxyToSkypack };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { preprocess, transform } from '../gjs.js';
|
|
2
|
+
import { modules } from '../known-modules.js';
|
|
3
|
+
import { nameFor } from '../utils.js';
|
|
4
|
+
|
|
5
|
+
async function compileJS(code, extraModules) {
|
|
6
|
+
let name = nameFor(code);
|
|
7
|
+
let component;
|
|
8
|
+
let error;
|
|
9
|
+
try {
|
|
10
|
+
let compiled = await compileGJS({
|
|
11
|
+
code: code,
|
|
12
|
+
name
|
|
13
|
+
});
|
|
14
|
+
if (!compiled) {
|
|
15
|
+
throw new Error(`Compiled output is missing`);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// NOTE: we cannot `eval` ESM
|
|
19
|
+
compiled = proxyToSkypack(compiled, extraModules);
|
|
20
|
+
component = await evalSnippet(compiled);
|
|
21
|
+
} catch (e) {
|
|
22
|
+
error = e;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
name,
|
|
26
|
+
component,
|
|
27
|
+
error
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function proxyToSkypack(code, extraModules) {
|
|
31
|
+
let knownModules = [...Object.keys(extraModules || {}), ...Object.keys(modules)];
|
|
32
|
+
let origin = location.origin;
|
|
33
|
+
let result = code.replaceAll(/from ('|")([^"']+)('|")/g, (_, __, modulePath) => {
|
|
34
|
+
if (knownModules.includes(modulePath)) {
|
|
35
|
+
return `from '${origin}/${modulePath}'`;
|
|
36
|
+
}
|
|
37
|
+
return `from 'https://cdn.skypack.dev/${modulePath}'`;
|
|
38
|
+
});
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
async function evalSnippet(code) {
|
|
42
|
+
let encodedJs = encodeURIComponent(code);
|
|
43
|
+
let result = await import( /* webpackIgnore: true */`data:text/javascript;charset=utf-8,${encodedJs}`);
|
|
44
|
+
if (!result.default) {
|
|
45
|
+
throw new Error(`Expected module to have a default export, found ${Object.keys(result)}`);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
async function compileGJS({
|
|
50
|
+
code: input,
|
|
51
|
+
name
|
|
52
|
+
}) {
|
|
53
|
+
let preprocessed = preprocess(input, name);
|
|
54
|
+
let result = await transform(preprocessed, name, {
|
|
55
|
+
modules: false
|
|
56
|
+
});
|
|
57
|
+
if (!result) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let {
|
|
61
|
+
code
|
|
62
|
+
} = result;
|
|
63
|
+
return code;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export { compileJS, proxyToSkypack };
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/browser/esm/index.ts"],"sourcesContent":["import { preprocess, transform } from '../gjs';\nimport { modules } from '../known-modules';\nimport { nameFor } from '../utils';\n\nimport type { CompileResult, ExtraModules } from '../types';\nimport type Component from '@glimmer/component';\nimport type { ComponentLike } from '@glint/template';\n\nexport interface Info {\n code: string;\n name: string;\n}\n\nexport async function compileJS(code: string, extraModules?: ExtraModules): Promise<CompileResult> {\n let name = nameFor(code);\n let component: undefined | ComponentLike;\n let error: undefined | Error;\n\n try {\n let compiled = await compileGJS({ code: code, name });\n\n if (!compiled) {\n throw new Error(`Compiled output is missing`);\n }\n\n // NOTE: we cannot `eval` ESM\n compiled = proxyToSkypack(compiled, extraModules);\n component = (await evalSnippet(compiled)) as unknown as ComponentLike;\n } catch (e) {\n error = e as Error | undefined;\n }\n\n return { name, component, error };\n}\n\nexport function proxyToSkypack(code: string, extraModules?: ExtraModules) {\n let knownModules = [...Object.keys(extraModules || {}), ...Object.keys(modules)];\n let origin = location.origin;\n\n let result = code.replaceAll(/from ('|\")([^\"']+)('|\")/g, (_, __, modulePath) => {\n if (knownModules.includes(modulePath)) {\n return `from '${origin}/${modulePath}'`;\n }\n\n return `from 'https://cdn.skypack.dev/${modulePath}'`;\n });\n\n return result;\n}\n\nasync function evalSnippet(code: string) {\n let encodedJs = encodeURIComponent(code);\n let result = await import(\n /* webpackIgnore: true */ `data:text/javascript;charset=utf-8,${encodedJs}`\n );\n\n if (!result.default) {\n throw new Error(`Expected module to have a default export, found ${Object.keys(result)}`);\n }\n\n return result as {\n default: Component;\n services?: { [key: string]: unknown };\n };\n}\n\nasync function compileGJS({ code: input, name }: Info) {\n let preprocessed = preprocess(input, name);\n let result = await transform(preprocessed, name, {\n modules: false,\n });\n\n if (!result) {\n return;\n }\n\n let { code } = result;\n\n return code;\n}\n"],"names":["compileJS","code","extraModules","name","nameFor","component","error","compiled","compileGJS","Error","proxyToSkypack","evalSnippet","e","knownModules","Object","keys","modules","origin","location","result","replaceAll","_","__","modulePath","includes","encodedJs","encodeURIComponent","default","input","preprocessed","preprocess","transform"],"mappings":";;;;AAaO,eAAeA,SAASA,CAACC,IAAY,EAAEC,YAA2B,EAA0B;AACjG,EAAA,IAAIC,IAAI,GAAGC,OAAO,CAACH,IAAI,CAAC,CAAA;AACxB,EAAA,IAAII,SAAoC,CAAA;AACxC,EAAA,IAAIC,KAAwB,CAAA;EAE5B,IAAI;AACF,IAAA,IAAIC,QAAQ,GAAG,MAAMC,UAAU,CAAC;AAAEP,MAAAA,IAAI,EAAEA,IAAI;AAAEE,MAAAA,IAAAA;AAAK,KAAC,CAAC,CAAA;IAErD,IAAI,CAACI,QAAQ,EAAE;AACb,MAAA,MAAM,IAAIE,KAAK,CAAE,CAAA,0BAAA,CAA2B,CAAC,CAAA;AAC/C,KAAA;;AAEA;AACAF,IAAAA,QAAQ,GAAGG,cAAc,CAACH,QAAQ,EAAEL,YAAY,CAAC,CAAA;AACjDG,IAAAA,SAAS,GAAI,MAAMM,WAAW,CAACJ,QAAQ,CAA8B,CAAA;GACtE,CAAC,OAAOK,CAAC,EAAE;AACVN,IAAAA,KAAK,GAAGM,CAAsB,CAAA;AAChC,GAAA;EAEA,OAAO;IAAET,IAAI;IAAEE,SAAS;AAAEC,IAAAA,KAAAA;GAAO,CAAA;AACnC,CAAA;AAEO,SAASI,cAAcA,CAACT,IAAY,EAAEC,YAA2B,EAAE;EACxE,IAAIW,YAAY,GAAG,CAAC,GAAGC,MAAM,CAACC,IAAI,CAACb,YAAY,IAAI,EAAE,CAAC,EAAE,GAAGY,MAAM,CAACC,IAAI,CAACC,OAAO,CAAC,CAAC,CAAA;AAChF,EAAA,IAAIC,MAAM,GAAGC,QAAQ,CAACD,MAAM,CAAA;AAE5B,EAAA,IAAIE,MAAM,GAAGlB,IAAI,CAACmB,UAAU,CAAC,0BAA0B,EAAE,CAACC,CAAC,EAAEC,EAAE,EAAEC,UAAU,KAAK;AAC9E,IAAA,IAAIV,YAAY,CAACW,QAAQ,CAACD,UAAU,CAAC,EAAE;AACrC,MAAA,OAAQ,CAAQN,MAAAA,EAAAA,MAAO,CAAGM,CAAAA,EAAAA,UAAW,CAAE,CAAA,CAAA,CAAA;AACzC,KAAA;IAEA,OAAQ,CAAA,8BAAA,EAAgCA,UAAW,CAAE,CAAA,CAAA,CAAA;AACvD,GAAC,CAAC,CAAA;AAEF,EAAA,OAAOJ,MAAM,CAAA;AACf,CAAA;AAEA,eAAeR,WAAWA,CAACV,IAAY,EAAE;AACvC,EAAA,IAAIwB,SAAS,GAAGC,kBAAkB,CAACzB,IAAI,CAAC,CAAA;EACxC,IAAIkB,MAAM,GAAG,MAAM,iCACU,CAAA,mCAAA,EAAqCM,SAAU,CAAA,CAC5E,CAAC,CAAA;AAED,EAAA,IAAI,CAACN,MAAM,CAACQ,OAAO,EAAE;IACnB,MAAM,IAAIlB,KAAK,CAAE,CAAkDK,gDAAAA,EAAAA,MAAM,CAACC,IAAI,CAACI,MAAM,CAAE,CAAA,CAAC,CAAC,CAAA;AAC3F,GAAA;AAEA,EAAA,OAAOA,MAAM,CAAA;AAIf,CAAA;AAEA,eAAeX,UAAUA,CAAC;AAAEP,EAAAA,IAAI,EAAE2B,KAAK;AAAEzB,EAAAA,IAAAA;AAAW,CAAC,EAAE;AACrD,EAAA,IAAI0B,YAAY,GAAGC,UAAU,CAACF,KAAK,EAAEzB,IAAI,CAAC,CAAA;EAC1C,IAAIgB,MAAM,GAAG,MAAMY,SAAS,CAACF,YAAY,EAAE1B,IAAI,EAAE;AAC/Ca,IAAAA,OAAO,EAAE,KAAA;AACX,GAAC,CAAC,CAAA;EAEF,IAAI,CAACG,MAAM,EAAE;AACX,IAAA,OAAA;AACF,GAAA;EAEA,IAAI;AAAElB,IAAAA,IAAAA;AAAK,GAAC,GAAGkB,MAAM,CAAA;AAErB,EAAA,OAAOlB,IAAI,CAAA;AACb;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Babel plugin takes parseable code emitted by the string-based
|
|
3
|
+
* preprocessor plugin in this package and converts it into calls to
|
|
4
|
+
* the standardized `precompileTemplate` macro from `@ember/template-compilation`.
|
|
5
|
+
*
|
|
6
|
+
* Its goal is to convert code like this:
|
|
7
|
+
*
|
|
8
|
+
* ```js
|
|
9
|
+
* import { hbs } from 'ember-template-imports';
|
|
10
|
+
*
|
|
11
|
+
* const A = hbs(`A`, {...});
|
|
12
|
+
* const B = [__GLIMMER_TEMPLATE(`B`, {...})];
|
|
13
|
+
* class C {
|
|
14
|
+
* template = hbs(`C`, {...});
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* [__GLIMMER_TEMPLATE(`default`, {...})];
|
|
18
|
+
*
|
|
19
|
+
* class D {
|
|
20
|
+
* [__GLIMMER_TEMPLATE(`D`, {...})]
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Into this:
|
|
25
|
+
*
|
|
26
|
+
* ```js
|
|
27
|
+
* import { precompileTemplate } from '@ember/template-compilation';
|
|
28
|
+
* import { setComponentTemplate } from '@ember/component';
|
|
29
|
+
* import templateOnlyComponent from '@ember/component/template-only';
|
|
30
|
+
*
|
|
31
|
+
* const A = setComponentTemplate(
|
|
32
|
+
* precompileTemplate(`A`, {...}),
|
|
33
|
+
* templateOnlyComponent('this-module.js', 'A')
|
|
34
|
+
* );
|
|
35
|
+
* const B = setComponentTemplate(
|
|
36
|
+
* precompileTemplate(`B`, {...}),
|
|
37
|
+
* templateOnlyComponent('this-module.js', 'B')
|
|
38
|
+
* );
|
|
39
|
+
* class C {}
|
|
40
|
+
* setComponentTemplate(precompileTemplate(`C`, {...}), C);
|
|
41
|
+
*
|
|
42
|
+
* export default setComponentTemplate(
|
|
43
|
+
* precompileTemplate(`default`, {...}),
|
|
44
|
+
* templateOnlyComponent('this-module.js', '_thisModule')
|
|
45
|
+
* );
|
|
46
|
+
*
|
|
47
|
+
* class D {}
|
|
48
|
+
* setComponentTemplate(precompileTemplate(`D`, {...}), D);
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
declare function babelPluginFunc(babel: any): {
|
|
52
|
+
visitor: any;
|
|
53
|
+
};
|
|
54
|
+
export { babelPluginFunc as default };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ImportUtil } from 'babel-import-util';
|
|
2
|
+
import { transformTemplateTag } from './template-tag-transform.js';
|
|
3
|
+
import { isTemplateTag } from './util.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* This Babel plugin takes parseable code emitted by the string-based
|
|
7
|
+
* preprocessor plugin in this package and converts it into calls to
|
|
8
|
+
* the standardized `precompileTemplate` macro from `@ember/template-compilation`.
|
|
9
|
+
*
|
|
10
|
+
* Its goal is to convert code like this:
|
|
11
|
+
*
|
|
12
|
+
* ```js
|
|
13
|
+
* import { hbs } from 'ember-template-imports';
|
|
14
|
+
*
|
|
15
|
+
* const A = hbs(`A`, {...});
|
|
16
|
+
* const B = [__GLIMMER_TEMPLATE(`B`, {...})];
|
|
17
|
+
* class C {
|
|
18
|
+
* template = hbs(`C`, {...});
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* [__GLIMMER_TEMPLATE(`default`, {...})];
|
|
22
|
+
*
|
|
23
|
+
* class D {
|
|
24
|
+
* [__GLIMMER_TEMPLATE(`D`, {...})]
|
|
25
|
+
* }
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Into this:
|
|
29
|
+
*
|
|
30
|
+
* ```js
|
|
31
|
+
* import { precompileTemplate } from '@ember/template-compilation';
|
|
32
|
+
* import { setComponentTemplate } from '@ember/component';
|
|
33
|
+
* import templateOnlyComponent from '@ember/component/template-only';
|
|
34
|
+
*
|
|
35
|
+
* const A = setComponentTemplate(
|
|
36
|
+
* precompileTemplate(`A`, {...}),
|
|
37
|
+
* templateOnlyComponent('this-module.js', 'A')
|
|
38
|
+
* );
|
|
39
|
+
* const B = setComponentTemplate(
|
|
40
|
+
* precompileTemplate(`B`, {...}),
|
|
41
|
+
* templateOnlyComponent('this-module.js', 'B')
|
|
42
|
+
* );
|
|
43
|
+
* class C {}
|
|
44
|
+
* setComponentTemplate(precompileTemplate(`C`, {...}), C);
|
|
45
|
+
*
|
|
46
|
+
* export default setComponentTemplate(
|
|
47
|
+
* precompileTemplate(`default`, {...}),
|
|
48
|
+
* templateOnlyComponent('this-module.js', '_thisModule')
|
|
49
|
+
* );
|
|
50
|
+
*
|
|
51
|
+
* class D {}
|
|
52
|
+
* setComponentTemplate(precompileTemplate(`D`, {...}), D);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
function babelPluginIntermediateGJS (babel) {
|
|
56
|
+
let t = babel.types;
|
|
57
|
+
let visitor = {
|
|
58
|
+
Program: {
|
|
59
|
+
enter(path, state) {
|
|
60
|
+
state.importUtil = new ImportUtil(t, path);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
// Process class bodies before things like class properties get transformed
|
|
64
|
+
// into imperative constructor code that we can't recognize. Taken directly
|
|
65
|
+
// from babel-plugin-htmlbars-inline-precompile https://git.io/JMi1G
|
|
66
|
+
Class(path, state) {
|
|
67
|
+
let bodyPath = path.get('body.body');
|
|
68
|
+
if (!Array.isArray(bodyPath)) return;
|
|
69
|
+
bodyPath.forEach(path => {
|
|
70
|
+
if (path.type !== 'ClassProperty') return;
|
|
71
|
+
let keyPath = path.get('key');
|
|
72
|
+
let valuePath = path.get('value');
|
|
73
|
+
if (Array.isArray(keyPath)) return;
|
|
74
|
+
if (keyPath && visitor[keyPath.type]) {
|
|
75
|
+
visitor[keyPath.type](keyPath, state);
|
|
76
|
+
}
|
|
77
|
+
if (Array.isArray(valuePath)) return;
|
|
78
|
+
if (valuePath && visitor[valuePath.type]) {
|
|
79
|
+
visitor[valuePath.type](valuePath, state);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
CallExpression(path, state) {
|
|
84
|
+
if (isTemplateTag(path)) {
|
|
85
|
+
transformTemplateTag(t, path, state);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
visitor
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export { babelPluginIntermediateGJS as default };
|
|
95
|
+
//# sourceMappingURL=babel-plugin.js.map
|