ember-repl 3.0.0-beta.5 → 3.0.0-beta.6
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/declarations/browser/__PRIVATE__.d.ts +2 -0
- package/declarations/browser/__PRIVATE__.d.ts.map +1 -0
- package/declarations/browser/compile/formats.d.ts +2 -0
- package/declarations/browser/compile/formats.d.ts.map +1 -1
- package/declarations/browser/compile/index.d.ts +31 -7
- package/declarations/browser/compile/index.d.ts.map +1 -1
- package/declarations/browser/compile/markdown-to-ember.d.ts +2 -0
- package/declarations/browser/compile/markdown-to-ember.d.ts.map +1 -1
- package/declarations/browser/compile/types.d.ts +2 -0
- package/declarations/browser/compile/types.d.ts.map +1 -1
- package/dist/browser/__PRIVATE__.js +2 -0
- package/dist/browser/__PRIVATE__.js.map +1 -0
- package/dist/browser/compile/formats.js +2 -1
- package/dist/browser/compile/formats.js.map +1 -1
- package/dist/browser/compile/index.js +28 -14
- package/dist/browser/compile/index.js.map +1 -1
- package/dist/browser/compile/markdown-to-ember.js +26 -8
- package/dist/browser/compile/markdown-to-ember.js.map +1 -1
- package/dist/browser/compile/types.js +1 -1
- package/package.json +20 -16
- package/src/browser/__PRIVATE__.ts +1 -0
- package/src/browser/compile/formats.ts +3 -0
- package/src/browser/compile/index.ts +58 -24
- package/src/browser/compile/markdown-to-ember.ts +91 -76
- package/src/browser/compile/types.ts +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__PRIVATE__.d.ts","sourceRoot":"","sources":["../../src/browser/__PRIVATE__.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CompileResult } from '../types.ts';
|
|
2
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
2
3
|
import type { EvalImportMap, ScopeMap } from './types.ts';
|
|
3
4
|
export declare function compileGJS(gjsInput: string, importMap?: EvalImportMap): Promise<CompileResult>;
|
|
4
5
|
export declare function compileHBS(hbsInput: string, options?: {
|
|
@@ -8,6 +9,7 @@ export declare function compileHBS(hbsInput: string, options?: {
|
|
|
8
9
|
export declare function compileMD(glimdownInput: string, options?: {
|
|
9
10
|
importMap?: EvalImportMap;
|
|
10
11
|
topLevelScope?: ScopeMap;
|
|
12
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
11
13
|
CopyComponent?: string;
|
|
12
14
|
ShadowComponent?: string;
|
|
13
15
|
}): Promise<CompileResult & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/formats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY1D,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,aAAa,CAAC,CAQxB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GACA,OAAO,CAAC,aAAa,CAAC,CAQxB;AAwCD,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,aAAa,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"formats.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/formats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY1D,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC,aAAa,CAAC,CAQxB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GACA,OAAO,CAAC,aAAa,CAAC,CAQxB;AAwCD,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,EAAE,QAAQ,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,aAAa,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkFpD"}
|
|
@@ -1,24 +1,48 @@
|
|
|
1
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
1
2
|
import type { EvalImportMap, ScopeMap } from './types.ts';
|
|
2
3
|
import type { ComponentLike } from '@glint/template';
|
|
3
4
|
type Format = 'glimdown' | 'gjs' | 'hbs';
|
|
4
5
|
export declare const CACHE: Map<string, ComponentLike>;
|
|
5
|
-
|
|
6
|
-
* This compileMD is a more robust version of the raw compiling used in "formats".
|
|
7
|
-
* This function manages cache, and has events for folks building UIs to hook in to
|
|
8
|
-
*/
|
|
9
|
-
export declare function compile(text: string, { format, onSuccess, onError, onCompileStart, ...options }: {
|
|
10
|
-
format: Format;
|
|
6
|
+
interface Events {
|
|
11
7
|
onSuccess: (component: ComponentLike) => Promise<unknown> | unknown;
|
|
12
8
|
onError: (error: string) => Promise<unknown> | unknown;
|
|
13
9
|
onCompileStart: () => Promise<unknown> | unknown;
|
|
10
|
+
}
|
|
11
|
+
interface Scope {
|
|
14
12
|
importMap?: EvalImportMap;
|
|
13
|
+
}
|
|
14
|
+
interface GlimdownOptions extends Scope, Events {
|
|
15
|
+
format: 'glimdown';
|
|
16
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
15
17
|
CopyComponent?: string;
|
|
16
18
|
ShadowComponent?: string;
|
|
17
19
|
topLevelScope?: ScopeMap;
|
|
18
|
-
}
|
|
20
|
+
}
|
|
21
|
+
interface GJSOptions extends Scope, Events {
|
|
22
|
+
format: 'gjs';
|
|
23
|
+
}
|
|
24
|
+
interface HBSOptions extends Scope, Events {
|
|
25
|
+
format: 'hbs';
|
|
26
|
+
topLevelScope?: ScopeMap;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compile GitHub-flavored Markdown with GJS support
|
|
30
|
+
* and optionally render gjs-snippets via a `live` meta tag
|
|
31
|
+
* on the code fences.
|
|
32
|
+
*/
|
|
33
|
+
export declare function compile(text: string, options: GlimdownOptions): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Compile GJS
|
|
36
|
+
*/
|
|
37
|
+
export declare function compile(text: string, options: GJSOptions): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Compile a stateless component using just the template
|
|
40
|
+
*/
|
|
41
|
+
export declare function compile(text: string, options: HBSOptions): Promise<void>;
|
|
19
42
|
type Input = string | undefined | null;
|
|
20
43
|
type ExtraOptions = {
|
|
21
44
|
format: 'glimdown';
|
|
45
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
22
46
|
importMap?: EvalImportMap;
|
|
23
47
|
CopyComponent?: string;
|
|
24
48
|
ShadowComponent?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,KAAK,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzC,eAAO,MAAM,KAAK,4BAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
1
2
|
export interface ExtractedCode {
|
|
2
3
|
name: string;
|
|
3
4
|
code: string;
|
|
@@ -10,6 +11,7 @@ export interface LiveCodeExtraction {
|
|
|
10
11
|
interface ParseMarkdownOptions {
|
|
11
12
|
CopyComponent?: string;
|
|
12
13
|
ShadowComponent?: string;
|
|
14
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* @internal not under semver
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-to-ember.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/markdown-to-ember.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"markdown-to-ember.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/markdown-to-ember.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAiSD,UAAU,oBAAoB;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAO7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/compile/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__PRIVATE__.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -87,7 +87,8 @@ async function compileMD(glimdownInput, options) {
|
|
|
87
87
|
blocks
|
|
88
88
|
} = await parseMarkdown(glimdownInput, {
|
|
89
89
|
CopyComponent: options?.CopyComponent,
|
|
90
|
-
ShadowComponent: options?.ShadowComponent
|
|
90
|
+
ShadowComponent: options?.ShadowComponent,
|
|
91
|
+
remarkPlugins: options?.remarkPlugins
|
|
91
92
|
});
|
|
92
93
|
rootTemplate = templateOnlyGlimdown;
|
|
93
94
|
liveCode = blocks;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formats.js","sources":["../../../src/browser/compile/formats.ts"],"sourcesContent":["import { invocationName } from '../utils.ts';\n\nimport type { CompileResult } from '../types.ts';\nimport type { ExtractedCode } from './markdown-to-ember.ts';\nimport type { EvalImportMap, ScopeMap } from './types.ts';\n\nasync function compileAll(js: { code: string }[], importMap?: EvalImportMap) {\n let modules = await Promise.all(\n js.map(async ({ code }) => {\n return await compileGJS(code, importMap);\n })\n );\n\n return modules;\n}\n\nexport async function compileGJS(\n gjsInput: string,\n importMap?: EvalImportMap\n): Promise<CompileResult> {\n try {\n let { compileJS } = await import('../js.ts');\n\n return await compileJS(gjsInput, importMap);\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n}\n\nexport async function compileHBS(\n hbsInput: string,\n options?: {\n moduleName?: string;\n scope?: Record<string, unknown>;\n }\n): Promise<CompileResult> {\n try {\n let { compileHBS } = await import('../hbs.ts');\n\n return compileHBS(hbsInput, options);\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n}\n\nasync function extractScope(\n liveCode: ExtractedCode[],\n importMap?: EvalImportMap\n): Promise<CompileResult[]> {\n let scope: CompileResult[] = [];\n\n let hbs = liveCode.filter((code) => code.lang === 'hbs');\n let js = liveCode.filter((code) => ['js', 'gjs'].includes(code.lang));\n\n if (js.length > 0) {\n let compiled = await compileAll(js, importMap);\n\n await Promise.all(\n compiled.map(async (info) => {\n // using web worker + import maps is not available yet (need firefox support)\n // (and to somehow be able to point at npm)\n //\n // if ('importPath' in info) {\n // return scope.push({\n // moduleName: name,\n // component: await import(/* webpackIgnore: true */ info.importPath),\n // });\n // }\n\n return scope.push(info);\n })\n );\n }\n\n for (let { code } of hbs) {\n let compiled = await compileHBS(code);\n\n scope.push(compiled);\n }\n\n return scope;\n}\n\nexport async function compileMD(\n glimdownInput: string,\n options?: {\n importMap?: EvalImportMap;\n topLevelScope?: ScopeMap;\n CopyComponent?: string;\n ShadowComponent?: string;\n }\n): Promise<CompileResult & { rootTemplate?: string }> {\n let importMap = options?.importMap;\n let topLevelScope = options?.topLevelScope ?? {};\n let rootTemplate: string;\n let liveCode: ExtractedCode[];\n let scope: CompileResult[] = [];\n\n /**\n * Step 1: Convert Markdown To HTML (Ember).\n *\n * The remark plugin, remark-code-extra also extracts\n * and transforms the code blocks we care about.\n *\n * These blocks will be compiled through babel and eval'd so the\n * compiled rootTemplate can invoke them\n */\n try {\n let { parseMarkdown } = await import('./markdown-to-ember.ts');\n let { templateOnlyGlimdown, blocks } = await parseMarkdown(glimdownInput, {\n CopyComponent: options?.CopyComponent,\n ShadowComponent: options?.ShadowComponent,\n });\n\n rootTemplate = templateOnlyGlimdown;\n liveCode = blocks;\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n\n /**\n * Step 2: Compile the live code samples\n */\n if (liveCode.length > 0) {\n try {\n scope = await extractScope(liveCode, importMap);\n } catch (error) {\n console.info({ scope });\n console.error(error);\n\n return { error: error as Error, rootTemplate, name: 'unknown' };\n }\n }\n\n /**\n * Make sure non of our snippets errored\n *\n * TODO: for these errors, report them differently so that we\n * can render the 'Ember' and still highlight the correct line?\n * or maybe there is a way to highlight in the editor instead?\n */\n for (let { error, component } of scope) {\n if (!component) {\n if (error) {\n return { error, rootTemplate, name: 'unknown' };\n }\n }\n }\n\n /**\n * Step 4: Compile the Ember Template\n */\n try {\n let localScope = scope.reduce(\n (accum, { component, name }) => {\n accum[invocationName(name)] = component;\n\n return accum;\n },\n {} as Record<string, unknown>\n );\n\n return await compileHBS(rootTemplate, {\n moduleName: 'DynamicRootTemplate',\n scope: {\n ...topLevelScope,\n ...localScope,\n },\n });\n } catch (error) {\n return { error: error as Error, rootTemplate, name: 'unknown' };\n }\n}\n"],"names":["compileAll","js","importMap","modules","Promise","all","map","code","compileGJS","gjsInput","compileJS","error","name","compileHBS","hbsInput","options","extractScope","liveCode","scope","hbs","filter","lang","includes","length","compiled","info","push","compileMD","glimdownInput","topLevelScope","rootTemplate","parseMarkdown","templateOnlyGlimdown","blocks","CopyComponent","ShadowComponent","console","component","localScope","reduce","accum","invocationName","moduleName"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"formats.js","sources":["../../../src/browser/compile/formats.ts"],"sourcesContent":["import { invocationName } from '../utils.ts';\n\nimport type { CompileResult } from '../types.ts';\nimport type { ExtractedCode } from './markdown-to-ember.ts';\nimport type { UnifiedPlugin } from './types.ts';\nimport type { EvalImportMap, ScopeMap } from './types.ts';\n\nasync function compileAll(js: { code: string }[], importMap?: EvalImportMap) {\n let modules = await Promise.all(\n js.map(async ({ code }) => {\n return await compileGJS(code, importMap);\n })\n );\n\n return modules;\n}\n\nexport async function compileGJS(\n gjsInput: string,\n importMap?: EvalImportMap\n): Promise<CompileResult> {\n try {\n let { compileJS } = await import('../js.ts');\n\n return await compileJS(gjsInput, importMap);\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n}\n\nexport async function compileHBS(\n hbsInput: string,\n options?: {\n moduleName?: string;\n scope?: Record<string, unknown>;\n }\n): Promise<CompileResult> {\n try {\n let { compileHBS } = await import('../hbs.ts');\n\n return compileHBS(hbsInput, options);\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n}\n\nasync function extractScope(\n liveCode: ExtractedCode[],\n importMap?: EvalImportMap\n): Promise<CompileResult[]> {\n let scope: CompileResult[] = [];\n\n let hbs = liveCode.filter((code) => code.lang === 'hbs');\n let js = liveCode.filter((code) => ['js', 'gjs'].includes(code.lang));\n\n if (js.length > 0) {\n let compiled = await compileAll(js, importMap);\n\n await Promise.all(\n compiled.map(async (info) => {\n // using web worker + import maps is not available yet (need firefox support)\n // (and to somehow be able to point at npm)\n //\n // if ('importPath' in info) {\n // return scope.push({\n // moduleName: name,\n // component: await import(/* webpackIgnore: true */ info.importPath),\n // });\n // }\n\n return scope.push(info);\n })\n );\n }\n\n for (let { code } of hbs) {\n let compiled = await compileHBS(code);\n\n scope.push(compiled);\n }\n\n return scope;\n}\n\nexport async function compileMD(\n glimdownInput: string,\n options?: {\n importMap?: EvalImportMap;\n topLevelScope?: ScopeMap;\n remarkPlugins?: UnifiedPlugin[];\n CopyComponent?: string;\n ShadowComponent?: string;\n }\n): Promise<CompileResult & { rootTemplate?: string }> {\n let importMap = options?.importMap;\n let topLevelScope = options?.topLevelScope ?? {};\n let rootTemplate: string;\n let liveCode: ExtractedCode[];\n let scope: CompileResult[] = [];\n\n /**\n * Step 1: Convert Markdown To HTML (Ember).\n *\n * The remark plugin, remark-code-extra also extracts\n * and transforms the code blocks we care about.\n *\n * These blocks will be compiled through babel and eval'd so the\n * compiled rootTemplate can invoke them\n */\n try {\n let { parseMarkdown } = await import('./markdown-to-ember.ts');\n let { templateOnlyGlimdown, blocks } = await parseMarkdown(glimdownInput, {\n CopyComponent: options?.CopyComponent,\n ShadowComponent: options?.ShadowComponent,\n remarkPlugins: options?.remarkPlugins,\n });\n\n rootTemplate = templateOnlyGlimdown;\n liveCode = blocks;\n } catch (error) {\n return { error: error as Error, name: 'unknown' };\n }\n\n /**\n * Step 2: Compile the live code samples\n */\n if (liveCode.length > 0) {\n try {\n scope = await extractScope(liveCode, importMap);\n } catch (error) {\n console.info({ scope });\n console.error(error);\n\n return { error: error as Error, rootTemplate, name: 'unknown' };\n }\n }\n\n /**\n * Make sure non of our snippets errored\n *\n * TODO: for these errors, report them differently so that we\n * can render the 'Ember' and still highlight the correct line?\n * or maybe there is a way to highlight in the editor instead?\n */\n for (let { error, component } of scope) {\n if (!component) {\n if (error) {\n return { error, rootTemplate, name: 'unknown' };\n }\n }\n }\n\n /**\n * Step 4: Compile the Ember Template\n */\n try {\n let localScope = scope.reduce(\n (accum, { component, name }) => {\n accum[invocationName(name)] = component;\n\n return accum;\n },\n {} as Record<string, unknown>\n );\n\n return await compileHBS(rootTemplate, {\n moduleName: 'DynamicRootTemplate',\n scope: {\n ...topLevelScope,\n ...localScope,\n },\n });\n } catch (error) {\n return { error: error as Error, rootTemplate, name: 'unknown' };\n }\n}\n"],"names":["compileAll","js","importMap","modules","Promise","all","map","code","compileGJS","gjsInput","compileJS","error","name","compileHBS","hbsInput","options","extractScope","liveCode","scope","hbs","filter","lang","includes","length","compiled","info","push","compileMD","glimdownInput","topLevelScope","rootTemplate","parseMarkdown","templateOnlyGlimdown","blocks","CopyComponent","ShadowComponent","remarkPlugins","console","component","localScope","reduce","accum","invocationName","moduleName"],"mappings":"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"}
|
|
@@ -5,25 +5,38 @@ import { compileMD, compileGJS, compileHBS } from './formats.js';
|
|
|
5
5
|
const CACHE = new Map();
|
|
6
6
|
const SUPPORTED_FORMATS = ['glimdown', 'gjs', 'hbs'];
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* Compile GitHub-flavored Markdown with GJS support
|
|
10
|
+
* and optionally render gjs-snippets via a `live` meta tag
|
|
11
|
+
* on the code fences.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Compile GJS
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Compile a stateless component using just the template
|
|
20
|
+
*/
|
|
21
|
+
|
|
8
22
|
/**
|
|
9
23
|
* This compileMD is a more robust version of the raw compiling used in "formats".
|
|
10
24
|
* This function manages cache, and has events for folks building UIs to hook in to
|
|
11
25
|
*/
|
|
12
|
-
async function compile(text, {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
}) {
|
|
26
|
+
async function compile(text, options) {
|
|
27
|
+
let {
|
|
28
|
+
onSuccess,
|
|
29
|
+
onError,
|
|
30
|
+
onCompileStart
|
|
31
|
+
} = options;
|
|
19
32
|
let id = nameFor(text);
|
|
20
33
|
let existing = CACHE.get(id);
|
|
21
34
|
if (existing) {
|
|
22
35
|
onSuccess(existing);
|
|
23
36
|
return;
|
|
24
37
|
}
|
|
25
|
-
if (!SUPPORTED_FORMATS.includes(format)) {
|
|
26
|
-
await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
38
|
+
if (!SUPPORTED_FORMATS.includes(options.format)) {
|
|
39
|
+
await onError(`Unsupported format: ${options.format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
27
40
|
return;
|
|
28
41
|
}
|
|
29
42
|
await onCompileStart();
|
|
@@ -32,16 +45,16 @@ async function compile(text, {
|
|
|
32
45
|
return;
|
|
33
46
|
}
|
|
34
47
|
let result;
|
|
35
|
-
if (format === 'glimdown') {
|
|
48
|
+
if (options.format === 'glimdown') {
|
|
36
49
|
result = await compileMD(text, options);
|
|
37
|
-
} else if (format === 'gjs') {
|
|
50
|
+
} else if (options.format === 'gjs') {
|
|
38
51
|
result = await compileGJS(text, options.importMap);
|
|
39
|
-
} else if (format === 'hbs') {
|
|
52
|
+
} else if (options.format === 'hbs') {
|
|
40
53
|
result = await compileHBS(text, {
|
|
41
54
|
scope: options.topLevelScope
|
|
42
55
|
});
|
|
43
56
|
} else {
|
|
44
|
-
await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
57
|
+
await onError(`Unsupported format: ${options.format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
45
58
|
return;
|
|
46
59
|
}
|
|
47
60
|
if (result.error) {
|
|
@@ -67,7 +80,8 @@ function buildCompiler(markdownText, maybeOptions) {
|
|
|
67
80
|
let result = cell();
|
|
68
81
|
if (input) {
|
|
69
82
|
compile(input, {
|
|
70
|
-
|
|
83
|
+
// narrowing is hard here, but this is an implementation detail
|
|
84
|
+
format: format,
|
|
71
85
|
onSuccess: async component => {
|
|
72
86
|
result.current = component;
|
|
73
87
|
ready.set(true);
|
|
@@ -1 +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.ts';\nimport {\n compileGJS as processGJS,\n compileHBS as processHBS,\n compileMD as processMD,\n} from './formats.ts';\n\nimport type { CompileResult } from '../types.ts';\nimport type { EvalImportMap, ScopeMap } from './types.ts';\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
|
|
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.ts';\nimport {\n compileGJS as processGJS,\n compileHBS as processHBS,\n compileMD as processMD,\n} from './formats.ts';\n\nimport type { CompileResult } from '../types.ts';\nimport type { UnifiedPlugin } from './types.ts';\nimport type { EvalImportMap, ScopeMap } from './types.ts';\nimport type { ComponentLike } from '@glint/template';\ntype Format = 'glimdown' | 'gjs' | 'hbs';\n\nexport const CACHE = new Map<string, ComponentLike>();\n\ninterface Events {\n onSuccess: (component: ComponentLike) => Promise<unknown> | unknown;\n onError: (error: string) => Promise<unknown> | unknown;\n onCompileStart: () => Promise<unknown> | unknown;\n}\n\ninterface Scope {\n importMap?: EvalImportMap;\n}\n\nconst SUPPORTED_FORMATS = ['glimdown', 'gjs', 'hbs'];\n\ninterface GlimdownOptions extends Scope, Events {\n format: 'glimdown';\n remarkPlugins?: UnifiedPlugin[];\n CopyComponent?: string;\n ShadowComponent?: string;\n topLevelScope?: ScopeMap;\n}\ninterface GJSOptions extends Scope, Events {\n format: 'gjs';\n}\n\ninterface HBSOptions extends Scope, Events {\n format: 'hbs';\n topLevelScope?: ScopeMap;\n}\n\n/**\n * Compile GitHub-flavored Markdown with GJS support\n * and optionally render gjs-snippets via a `live` meta tag\n * on the code fences.\n */\nexport async function compile(text: string, options: GlimdownOptions): Promise<void>;\n\n/**\n * Compile GJS\n */\nexport async function compile(text: string, options: GJSOptions): Promise<void>;\n\n/**\n * Compile a stateless component using just the template\n */\nexport async function compile(text: string, options: HBSOptions): Promise<void>;\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 options: GlimdownOptions | GJSOptions | HBSOptions\n): Promise<void> {\n let { onSuccess, onError, onCompileStart } = options;\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(options.format)) {\n await onError(`Unsupported format: ${options.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 (options.format === 'glimdown') {\n result = await processMD(text, options);\n } else if (options.format === 'gjs') {\n result = await processGJS(text, options.importMap);\n } else if (options.format === 'hbs') {\n result = await processHBS(text, {\n scope: options.topLevelScope,\n });\n } else {\n await onError(\n `Unsupported format: ${(options as any).format}. Supported formats: ${SUPPORTED_FORMATS}`\n );\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\ntype ExtraOptions =\n | {\n format: 'glimdown';\n remarkPlugins?: UnifiedPlugin[];\n importMap?: EvalImportMap;\n CopyComponent?: string;\n ShadowComponent?: string;\n topLevelScope?: ScopeMap;\n }\n | {\n format: 'hbs';\n topLevelScope?: ScopeMap;\n }\n | {\n format: 'gjs';\n importMap?: EvalImportMap;\n };\n\n/**\n * @internal\n */\nexport interface Value {\n isReady: boolean;\n error: string | null;\n component: ComponentLike;\n}\n\nexport function buildCompiler(markdownText: Input | (() => Input)): Value;\nexport function buildCompiler(markdownText: Input | (() => Input), options?: Format): Value;\nexport function buildCompiler(markdownText: Input | (() => Input), options?: () => Format): Value;\nexport function buildCompiler(markdownText: Input | (() => Input), options?: ExtraOptions): Value;\nexport function buildCompiler(\n markdownText: Input | (() => Input),\n options?: () => ExtraOptions\n): Value;\n\nexport function buildCompiler(\n markdownText: Input | (() => Input),\n maybeOptions?: Format | (() => Format) | ExtraOptions | (() => ExtraOptions)\n): Value {\n return resource(() => {\n let maybeObject = typeof maybeOptions === 'function' ? maybeOptions() : maybeOptions;\n let format =\n (typeof maybeObject === 'string' ? maybeObject : maybeObject?.format) || 'glimdown';\n let options = (typeof maybeObject === 'string' ? {} : maybeObject) || {};\n\n let input = typeof markdownText === 'function' ? markdownText() : markdownText;\n let ready = cell(false);\n let error = cell<string | null>();\n let result = cell<ComponentLike>();\n\n if (input) {\n compile(input, {\n // narrowing is hard here, but this is an implementation detail\n format: format as any,\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 ...options,\n });\n }\n\n return () => ({\n isReady: ready.current,\n error: error.current,\n component: result.current,\n });\n });\n}\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(buildCompiler) as typeof buildCompiler;\n"],"names":["CACHE","Map","SUPPORTED_FORMATS","compile","text","options","onSuccess","onError","onCompileStart","id","nameFor","existing","get","includes","format","result","processMD","processGJS","importMap","processHBS","scope","topLevelScope","error","message","set","component","buildCompiler","markdownText","maybeOptions","resource","maybeObject","input","ready","cell","current","e","isReady","Compiled","resourceFactory"],"mappings":"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"}
|
|
@@ -156,10 +156,11 @@ function liveCodeExtraction(options = {}) {
|
|
|
156
156
|
};
|
|
157
157
|
}
|
|
158
158
|
function buildCompiler(options) {
|
|
159
|
-
|
|
159
|
+
let compiler = unified().use(remarkParse).use(remarkGfm);
|
|
160
|
+
|
|
160
161
|
// TODO: we only want to do this when we have pre > code.
|
|
161
162
|
// code can exist inline.
|
|
162
|
-
.use(liveCodeExtraction, {
|
|
163
|
+
compiler = compiler.use(liveCodeExtraction, {
|
|
163
164
|
snippets: {
|
|
164
165
|
classList: ['glimdown-snippet', 'relative']
|
|
165
166
|
},
|
|
@@ -168,16 +169,28 @@ function buildCompiler(options) {
|
|
|
168
169
|
},
|
|
169
170
|
copyComponent: options?.CopyComponent,
|
|
170
171
|
shadowComponent: options?.ShadowComponent
|
|
171
|
-
})
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* If this were "use"d after `remarkRehype`,
|
|
176
|
+
* remark is gone, and folks would need to work with rehype trees
|
|
177
|
+
*/
|
|
178
|
+
if (options.remarkPlugins) {
|
|
179
|
+
options.remarkPlugins.forEach(plugin => {
|
|
180
|
+
compiler = compiler.use(plugin);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
|
|
172
184
|
// .use(() => (tree) => visit(tree, (node) => console.log('i', node)))
|
|
173
185
|
// remark rehype is needed to convert markdown to HTML
|
|
174
186
|
// However, it also changes all the nodes, so we need another pass
|
|
175
187
|
// to make sure our Glimmer-aware nodes are in tact
|
|
176
|
-
.use(remarkRehype, {
|
|
188
|
+
compiler = compiler.use(remarkRehype, {
|
|
177
189
|
allowDangerousHtml: true
|
|
178
|
-
})
|
|
190
|
+
});
|
|
191
|
+
|
|
179
192
|
// Convert invocables to raw format, so Glimmer can invoke them
|
|
180
|
-
.use(() => tree => {
|
|
193
|
+
compiler = compiler.use(() => tree => {
|
|
181
194
|
visit(tree, function (node) {
|
|
182
195
|
// We rely on an implicit transformation of data.hProperties => properties
|
|
183
196
|
let properties = node.properties;
|
|
@@ -204,19 +217,24 @@ function buildCompiler(options) {
|
|
|
204
217
|
}
|
|
205
218
|
return;
|
|
206
219
|
});
|
|
207
|
-
})
|
|
220
|
+
});
|
|
221
|
+
compiler = compiler.use(rehypeRaw, {
|
|
208
222
|
passThrough: ['glimmer_raw', 'raw']
|
|
209
223
|
}).use(() => tree => {
|
|
210
224
|
visit(tree, 'glimmer_raw', node => {
|
|
211
225
|
node.type = 'raw';
|
|
212
226
|
});
|
|
213
|
-
})
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Finally convert to string! oofta!
|
|
230
|
+
compiler = compiler.use(rehypeStringify, {
|
|
214
231
|
collapseEmptyAttributes: true,
|
|
215
232
|
closeSelfClosing: true,
|
|
216
233
|
allowParseErrors: true,
|
|
217
234
|
allowDangerousCharacters: true,
|
|
218
235
|
allowDangerousHtml: true
|
|
219
236
|
});
|
|
237
|
+
return compiler;
|
|
220
238
|
}
|
|
221
239
|
/**
|
|
222
240
|
* @internal not under semver
|
|
@@ -1 +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 remarkGfm from 'remark-gfm';\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.ts';\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 as any)['hProperties'] ??= {};\n // This is secret-to-us-only API, so we don't really care about the type\n (code.data as any)['hProperties'][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 || parent === undefined) return;\n if (index === null || index === undefined) 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(remarkParse)\n .use(remarkGfm)\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","undefined","enhanced","has","add","liveCode","name","nameFor","invocation","invocationOf","shadow","shadowComponent","wrapInShadow","invokeNode","wrapper","push","live","preview","below","buildCompiler","unified","use","remarkParse","remarkGfm","CopyComponent","ShadowComponent","remarkRehype","allowDangerousHtml","properties","tagName","match","rehypeRaw","passThrough","rehypeStringify","collapseEmptyAttributes","closeSelfClosing","allowParseErrors","allowDangerousCharacters","parseMarkdown","input","markdownCompiler","processed","process","templateOnly","toString","templateOnlyGlimdown","blocks"],"mappings":"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"}
|
|
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 remarkGfm from 'remark-gfm';\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.ts';\n\nimport type { UnifiedPlugin } from './types.ts';\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 as any)['hProperties'] ??= {};\n // This is secret-to-us-only API, so we don't really care about the type\n (code.data as any)['hProperties'][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 || parent === undefined) return;\n if (index === null || index === undefined) 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 let compiler = unified().use(remarkParse).use(remarkGfm);\n\n // TODO: we only want to do this when we have pre > code.\n // code can exist inline.\n compiler = compiler.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\n /**\n * If this were \"use\"d after `remarkRehype`,\n * remark is gone, and folks would need to work with rehype trees\n */\n if (options.remarkPlugins) {\n options.remarkPlugins.forEach((plugin) => {\n compiler = compiler.use(plugin) as any;\n });\n }\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 compiler = compiler.use(remarkRehype, { allowDangerousHtml: true });\n\n // Convert invocables to raw format, so Glimmer can invoke them\n compiler = compiler.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\n compiler = compiler.use(rehypeRaw, { passThrough: ['glimmer_raw', 'raw'] }).use(() => (tree) => {\n visit(tree, 'glimmer_raw', (node: Node) => {\n node.type = 'raw';\n });\n });\n\n // Finally convert to string! oofta!\n compiler = compiler.use(rehypeStringify, {\n collapseEmptyAttributes: true,\n closeSelfClosing: true,\n allowParseErrors: true,\n allowDangerousCharacters: true,\n allowDangerousHtml: true,\n }) as any;\n\n return compiler as ReturnType<typeof unified>;\n}\n\ninterface ParseMarkdownOptions {\n CopyComponent?: string;\n ShadowComponent?: string;\n remarkPlugins?: UnifiedPlugin[];\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","undefined","enhanced","has","add","liveCode","name","nameFor","invocation","invocationOf","shadow","shadowComponent","wrapInShadow","invokeNode","wrapper","push","live","preview","below","buildCompiler","compiler","unified","use","remarkParse","remarkGfm","CopyComponent","ShadowComponent","remarkPlugins","plugin","remarkRehype","allowDangerousHtml","properties","tagName","match","rehypeRaw","passThrough","rehypeStringify","collapseEmptyAttributes","closeSelfClosing","allowParseErrors","allowDangerousCharacters","parseMarkdown","input","markdownCompiler","processed","process","templateOnly","toString","templateOnlyGlimdown","blocks"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import 'unified';
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ember-repl",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.6",
|
|
4
4
|
"description": "Addon for enabling REPL and Playground creation with Ember/Glimmer",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ember-addon"
|
|
@@ -46,6 +46,10 @@
|
|
|
46
46
|
"types": "./declarations/test-support/index.d.ts",
|
|
47
47
|
"default": "./dist/test-support/index.js"
|
|
48
48
|
},
|
|
49
|
+
"./__PRIVATE__DO_NOT_USE__": {
|
|
50
|
+
"types": "./declarations/browser/__PRIVATE__.d.ts",
|
|
51
|
+
"default": "./dist/browser/__PRIVATE__.js"
|
|
52
|
+
},
|
|
49
53
|
"./addon-main.js": "./addon-main.cjs"
|
|
50
54
|
},
|
|
51
55
|
"files": [
|
|
@@ -56,7 +60,7 @@
|
|
|
56
60
|
],
|
|
57
61
|
"dependencies": {
|
|
58
62
|
"@babel/helper-plugin-utils": "^7.22.5",
|
|
59
|
-
"@babel/standalone": "^7.22.
|
|
63
|
+
"@babel/standalone": "^7.22.14",
|
|
60
64
|
"@embroider/addon-shim": "1.8.6",
|
|
61
65
|
"@embroider/macros": "1.13.1",
|
|
62
66
|
"babel-import-util": "^1.4.1",
|
|
@@ -65,7 +69,7 @@
|
|
|
65
69
|
"change-case": "^4.1.2",
|
|
66
70
|
"common-tags": "^1.8.2",
|
|
67
71
|
"line-column": "^1.0.2",
|
|
68
|
-
"magic-string": "^0.30.
|
|
72
|
+
"magic-string": "^0.30.3",
|
|
69
73
|
"mdast": "^3.0.0",
|
|
70
74
|
"parse-static-imports": "^1.1.0",
|
|
71
75
|
"rehype-raw": "^6.1.1",
|
|
@@ -79,9 +83,9 @@
|
|
|
79
83
|
"vfile": "^6.0.1"
|
|
80
84
|
},
|
|
81
85
|
"devDependencies": {
|
|
82
|
-
"@babel/core": "^7.22.
|
|
83
|
-
"@babel/preset-typescript": "^7.22.
|
|
84
|
-
"@babel/types": "^7.22.
|
|
86
|
+
"@babel/core": "^7.22.11",
|
|
87
|
+
"@babel/preset-typescript": "^7.22.11",
|
|
88
|
+
"@babel/types": "^7.22.11",
|
|
85
89
|
"@ember/test-helpers": "^3.2.0",
|
|
86
90
|
"@ember/test-waiters": "^3.0.2",
|
|
87
91
|
"@embroider/addon-dev": "4.1.0",
|
|
@@ -106,25 +110,25 @@
|
|
|
106
110
|
"@types/hast": "^3.0.0",
|
|
107
111
|
"@types/mdast": "^4.0.0",
|
|
108
112
|
"@types/unist": "^3.0.0",
|
|
109
|
-
"@types/uuid": "^9.0.
|
|
110
|
-
"@typescript-eslint/eslint-plugin": "^6.
|
|
111
|
-
"@typescript-eslint/parser": "^6.
|
|
112
|
-
"concurrently": "^8.2.
|
|
113
|
+
"@types/uuid": "^9.0.3",
|
|
114
|
+
"@typescript-eslint/eslint-plugin": "^6.5.0",
|
|
115
|
+
"@typescript-eslint/parser": "^6.5.0",
|
|
116
|
+
"concurrently": "^8.2.1",
|
|
113
117
|
"ember-resources": "^6.4.0",
|
|
114
118
|
"ember-source": "^5.2.0",
|
|
115
119
|
"ember-template-imports": "^3.4.2",
|
|
116
120
|
"ember-template-lint": "^5.11.2",
|
|
117
|
-
"eslint": "^8.
|
|
118
|
-
"eslint-plugin-ember": "^11.
|
|
121
|
+
"eslint": "^8.48.0",
|
|
122
|
+
"eslint-plugin-ember": "^11.11.1",
|
|
119
123
|
"eslint-plugin-node": "^11.1.0",
|
|
120
124
|
"eslint-plugin-prettier": "^5.0.0",
|
|
121
|
-
"prettier": "^3.0.
|
|
125
|
+
"prettier": "^3.0.3",
|
|
122
126
|
"prettier-plugin-ember-template-tag": "^1.0.2",
|
|
123
|
-
"publint": "^0.2.
|
|
124
|
-
"rollup": "~3.28.
|
|
127
|
+
"publint": "^0.2.2",
|
|
128
|
+
"rollup": "~3.28.1",
|
|
125
129
|
"rollup-plugin-copy": "^3.4.0",
|
|
126
130
|
"rollup-plugin-glimmer-template-tag": "^0.4.1",
|
|
127
|
-
"typescript": "^5.
|
|
131
|
+
"typescript": "^5.2.2",
|
|
128
132
|
"@nullvoxpopuli/limber-untyped": "0.0.0"
|
|
129
133
|
},
|
|
130
134
|
"volta": {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CACHE } from './compile/index.ts';
|
|
@@ -2,6 +2,7 @@ import { invocationName } from '../utils.ts';
|
|
|
2
2
|
|
|
3
3
|
import type { CompileResult } from '../types.ts';
|
|
4
4
|
import type { ExtractedCode } from './markdown-to-ember.ts';
|
|
5
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
5
6
|
import type { EvalImportMap, ScopeMap } from './types.ts';
|
|
6
7
|
|
|
7
8
|
async function compileAll(js: { code: string }[], importMap?: EvalImportMap) {
|
|
@@ -86,6 +87,7 @@ export async function compileMD(
|
|
|
86
87
|
options?: {
|
|
87
88
|
importMap?: EvalImportMap;
|
|
88
89
|
topLevelScope?: ScopeMap;
|
|
90
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
89
91
|
CopyComponent?: string;
|
|
90
92
|
ShadowComponent?: string;
|
|
91
93
|
}
|
|
@@ -110,6 +112,7 @@ export async function compileMD(
|
|
|
110
112
|
let { templateOnlyGlimdown, blocks } = await parseMarkdown(glimdownInput, {
|
|
111
113
|
CopyComponent: options?.CopyComponent,
|
|
112
114
|
ShadowComponent: options?.ShadowComponent,
|
|
115
|
+
remarkPlugins: options?.remarkPlugins,
|
|
113
116
|
});
|
|
114
117
|
|
|
115
118
|
rootTemplate = templateOnlyGlimdown;
|
|
@@ -8,37 +8,67 @@ import {
|
|
|
8
8
|
} from './formats.ts';
|
|
9
9
|
|
|
10
10
|
import type { CompileResult } from '../types.ts';
|
|
11
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
11
12
|
import type { EvalImportMap, ScopeMap } from './types.ts';
|
|
12
13
|
import type { ComponentLike } from '@glint/template';
|
|
13
14
|
type Format = 'glimdown' | 'gjs' | 'hbs';
|
|
14
15
|
|
|
15
16
|
export const CACHE = new Map<string, ComponentLike>();
|
|
16
17
|
|
|
18
|
+
interface Events {
|
|
19
|
+
onSuccess: (component: ComponentLike) => Promise<unknown> | unknown;
|
|
20
|
+
onError: (error: string) => Promise<unknown> | unknown;
|
|
21
|
+
onCompileStart: () => Promise<unknown> | unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface Scope {
|
|
25
|
+
importMap?: EvalImportMap;
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
const SUPPORTED_FORMATS = ['glimdown', 'gjs', 'hbs'];
|
|
18
29
|
|
|
30
|
+
interface GlimdownOptions extends Scope, Events {
|
|
31
|
+
format: 'glimdown';
|
|
32
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
33
|
+
CopyComponent?: string;
|
|
34
|
+
ShadowComponent?: string;
|
|
35
|
+
topLevelScope?: ScopeMap;
|
|
36
|
+
}
|
|
37
|
+
interface GJSOptions extends Scope, Events {
|
|
38
|
+
format: 'gjs';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface HBSOptions extends Scope, Events {
|
|
42
|
+
format: 'hbs';
|
|
43
|
+
topLevelScope?: ScopeMap;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compile GitHub-flavored Markdown with GJS support
|
|
48
|
+
* and optionally render gjs-snippets via a `live` meta tag
|
|
49
|
+
* on the code fences.
|
|
50
|
+
*/
|
|
51
|
+
export async function compile(text: string, options: GlimdownOptions): Promise<void>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Compile GJS
|
|
55
|
+
*/
|
|
56
|
+
export async function compile(text: string, options: GJSOptions): Promise<void>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Compile a stateless component using just the template
|
|
60
|
+
*/
|
|
61
|
+
export async function compile(text: string, options: HBSOptions): Promise<void>;
|
|
62
|
+
|
|
19
63
|
/**
|
|
20
64
|
* This compileMD is a more robust version of the raw compiling used in "formats".
|
|
21
65
|
* This function manages cache, and has events for folks building UIs to hook in to
|
|
22
66
|
*/
|
|
23
67
|
export async function compile(
|
|
24
68
|
text: string,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
onError,
|
|
29
|
-
onCompileStart,
|
|
30
|
-
...options
|
|
31
|
-
}: {
|
|
32
|
-
format: Format;
|
|
33
|
-
onSuccess: (component: ComponentLike) => Promise<unknown> | unknown;
|
|
34
|
-
onError: (error: string) => Promise<unknown> | unknown;
|
|
35
|
-
onCompileStart: () => Promise<unknown> | unknown;
|
|
36
|
-
importMap?: EvalImportMap;
|
|
37
|
-
CopyComponent?: string;
|
|
38
|
-
ShadowComponent?: string;
|
|
39
|
-
topLevelScope?: ScopeMap;
|
|
40
|
-
}
|
|
41
|
-
) {
|
|
69
|
+
options: GlimdownOptions | GJSOptions | HBSOptions
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
let { onSuccess, onError, onCompileStart } = options;
|
|
42
72
|
let id = nameFor(text);
|
|
43
73
|
|
|
44
74
|
let existing = CACHE.get(id);
|
|
@@ -49,8 +79,8 @@ export async function compile(
|
|
|
49
79
|
return;
|
|
50
80
|
}
|
|
51
81
|
|
|
52
|
-
if (!SUPPORTED_FORMATS.includes(format)) {
|
|
53
|
-
await onError(`Unsupported format: ${format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
82
|
+
if (!SUPPORTED_FORMATS.includes(options.format)) {
|
|
83
|
+
await onError(`Unsupported format: ${options.format}. Supported formats: ${SUPPORTED_FORMATS}`);
|
|
54
84
|
|
|
55
85
|
return;
|
|
56
86
|
}
|
|
@@ -65,16 +95,18 @@ export async function compile(
|
|
|
65
95
|
|
|
66
96
|
let result: CompileResult;
|
|
67
97
|
|
|
68
|
-
if (format === 'glimdown') {
|
|
98
|
+
if (options.format === 'glimdown') {
|
|
69
99
|
result = await processMD(text, options);
|
|
70
|
-
} else if (format === 'gjs') {
|
|
100
|
+
} else if (options.format === 'gjs') {
|
|
71
101
|
result = await processGJS(text, options.importMap);
|
|
72
|
-
} else if (format === 'hbs') {
|
|
102
|
+
} else if (options.format === 'hbs') {
|
|
73
103
|
result = await processHBS(text, {
|
|
74
104
|
scope: options.topLevelScope,
|
|
75
105
|
});
|
|
76
106
|
} else {
|
|
77
|
-
await onError(
|
|
107
|
+
await onError(
|
|
108
|
+
`Unsupported format: ${(options as any).format}. Supported formats: ${SUPPORTED_FORMATS}`
|
|
109
|
+
);
|
|
78
110
|
|
|
79
111
|
return;
|
|
80
112
|
}
|
|
@@ -95,6 +127,7 @@ type Input = string | undefined | null;
|
|
|
95
127
|
type ExtraOptions =
|
|
96
128
|
| {
|
|
97
129
|
format: 'glimdown';
|
|
130
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
98
131
|
importMap?: EvalImportMap;
|
|
99
132
|
CopyComponent?: string;
|
|
100
133
|
ShadowComponent?: string;
|
|
@@ -144,7 +177,8 @@ export function buildCompiler(
|
|
|
144
177
|
|
|
145
178
|
if (input) {
|
|
146
179
|
compile(input, {
|
|
147
|
-
|
|
180
|
+
// narrowing is hard here, but this is an implementation detail
|
|
181
|
+
format: format as any,
|
|
148
182
|
onSuccess: async (component) => {
|
|
149
183
|
result.current = component;
|
|
150
184
|
ready.set(true);
|
|
@@ -8,6 +8,7 @@ import { visit } from 'unist-util-visit';
|
|
|
8
8
|
|
|
9
9
|
import { invocationOf, nameFor } from '../utils.ts';
|
|
10
10
|
|
|
11
|
+
import type { UnifiedPlugin } from './types.ts';
|
|
11
12
|
import type { Node } from 'hast';
|
|
12
13
|
import type { Code, Text } from 'mdast';
|
|
13
14
|
import type { Parent } from 'unist';
|
|
@@ -218,89 +219,103 @@ function liveCodeExtraction(options: Options = {}) {
|
|
|
218
219
|
}
|
|
219
220
|
|
|
220
221
|
function buildCompiler(options: ParseMarkdownOptions) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
// definitively not the better way, but this is supposed to detect "glimmer" nodes
|
|
269
|
-
if (
|
|
270
|
-
'value' in node &&
|
|
271
|
-
typeof node.value === 'string' &&
|
|
272
|
-
node.value.match(/<\/?[_A-Z:0-9].*>/g)
|
|
273
|
-
) {
|
|
274
|
-
node.type = 'glimmer_raw';
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
node.type = 'glimmer_raw';
|
|
278
|
-
|
|
279
|
-
return 'skip';
|
|
280
|
-
}
|
|
222
|
+
let compiler = unified().use(remarkParse).use(remarkGfm);
|
|
223
|
+
|
|
224
|
+
// TODO: we only want to do this when we have pre > code.
|
|
225
|
+
// code can exist inline.
|
|
226
|
+
compiler = compiler.use(liveCodeExtraction, {
|
|
227
|
+
snippets: {
|
|
228
|
+
classList: ['glimdown-snippet', 'relative'],
|
|
229
|
+
},
|
|
230
|
+
demo: {
|
|
231
|
+
classList: ['glimdown-render'],
|
|
232
|
+
},
|
|
233
|
+
copyComponent: options?.CopyComponent,
|
|
234
|
+
shadowComponent: options?.ShadowComponent,
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* If this were "use"d after `remarkRehype`,
|
|
239
|
+
* remark is gone, and folks would need to work with rehype trees
|
|
240
|
+
*/
|
|
241
|
+
if (options.remarkPlugins) {
|
|
242
|
+
options.remarkPlugins.forEach((plugin) => {
|
|
243
|
+
compiler = compiler.use(plugin) as any;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// .use(() => (tree) => visit(tree, (node) => console.log('i', node)))
|
|
248
|
+
// remark rehype is needed to convert markdown to HTML
|
|
249
|
+
// However, it also changes all the nodes, so we need another pass
|
|
250
|
+
// to make sure our Glimmer-aware nodes are in tact
|
|
251
|
+
compiler = compiler.use(remarkRehype, { allowDangerousHtml: true });
|
|
252
|
+
|
|
253
|
+
// Convert invocables to raw format, so Glimmer can invoke them
|
|
254
|
+
compiler = compiler.use(() => (tree: Node) => {
|
|
255
|
+
visit(tree, function (node) {
|
|
256
|
+
// We rely on an implicit transformation of data.hProperties => properties
|
|
257
|
+
let properties = (node as any).properties;
|
|
258
|
+
|
|
259
|
+
if (properties?.[GLIMDOWN_PREVIEW]) {
|
|
260
|
+
// Have to sanitize anything Glimmer could try to render
|
|
261
|
+
escapeCurlies(node as Parent);
|
|
262
|
+
|
|
263
|
+
return 'skip';
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (node.type === 'element' || ('tagName' in node && node.tagName === 'code')) {
|
|
267
|
+
if (properties?.[GLIMDOWN_RENDER]) {
|
|
268
|
+
node.type = 'glimmer_raw';
|
|
281
269
|
|
|
282
270
|
return;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
escapeCurlies(node as Parent);
|
|
274
|
+
|
|
275
|
+
return 'skip';
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (node.type === 'text' || node.type === 'raw') {
|
|
279
|
+
// definitively not the better way, but this is supposed to detect "glimmer" nodes
|
|
280
|
+
if (
|
|
281
|
+
'value' in node &&
|
|
282
|
+
typeof node.value === 'string' &&
|
|
283
|
+
node.value.match(/<\/?[_A-Z:0-9].*>/g)
|
|
284
|
+
) {
|
|
285
|
+
node.type = 'glimmer_raw';
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
node.type = 'glimmer_raw';
|
|
289
|
+
|
|
290
|
+
return 'skip';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return;
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
compiler = compiler.use(rehypeRaw, { passThrough: ['glimmer_raw', 'raw'] }).use(() => (tree) => {
|
|
298
|
+
visit(tree, 'glimmer_raw', (node: Node) => {
|
|
299
|
+
node.type = 'raw';
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
// Finally convert to string! oofta!
|
|
304
|
+
compiler = compiler.use(rehypeStringify, {
|
|
305
|
+
collapseEmptyAttributes: true,
|
|
306
|
+
closeSelfClosing: true,
|
|
307
|
+
allowParseErrors: true,
|
|
308
|
+
allowDangerousCharacters: true,
|
|
309
|
+
allowDangerousHtml: true,
|
|
310
|
+
}) as any;
|
|
311
|
+
|
|
312
|
+
return compiler as ReturnType<typeof unified>;
|
|
299
313
|
}
|
|
300
314
|
|
|
301
315
|
interface ParseMarkdownOptions {
|
|
302
316
|
CopyComponent?: string;
|
|
303
317
|
ShadowComponent?: string;
|
|
318
|
+
remarkPlugins?: UnifiedPlugin[];
|
|
304
319
|
}
|
|
305
320
|
|
|
306
321
|
/**
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { type Plugin } from 'unified';
|
|
2
|
+
|
|
1
3
|
export interface EvalImportMap {
|
|
2
4
|
[moduleName: string]: ScopeMap;
|
|
3
5
|
}
|
|
@@ -5,3 +7,5 @@ export interface EvalImportMap {
|
|
|
5
7
|
export interface ScopeMap {
|
|
6
8
|
[localName: string]: unknown;
|
|
7
9
|
}
|
|
10
|
+
|
|
11
|
+
export type UnifiedPlugin = Plugin; // Parameters<ReturnType<typeof unified>['use']>[0];
|