Skip to content

Commit

Permalink
feat(vite-plugin-angular): add pipeline to transform analog markdown …
Browse files Browse the repository at this point in the history
…template (#875)
  • Loading branch information
brandonroberts committed Mar 8, 2024
1 parent f72cabb commit 789fa06
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 11 deletions.
4 changes: 4 additions & 0 deletions packages/vite-plugin-angular/src/index.ts
@@ -1,5 +1,9 @@
import { angular } from './lib/angular-vite-plugin';
export { PluginOptions } from './lib/angular-vite-plugin';
export { compileAnalogFile } from './lib/authoring/analog';
export {
MarkdownTemplateTransform,
defaultMarkdownTemplateTransforms,
} from './lib/authoring/markdown-transform';

export default angular;
9 changes: 9 additions & 0 deletions packages/vite-plugin-angular/src/lib/angular-vite-plugin.ts
Expand Up @@ -25,6 +25,10 @@ import {
SourceFileCache,
} from './utils/devkit';
import { getFrontmatterMetadata } from './authoring/frontmatter';
import {
defaultMarkdownTemplateTransforms,
MarkdownTemplateTransform,
} from './authoring/markdown-transform';

export interface PluginOptions {
tsconfig?: string;
Expand All @@ -46,6 +50,7 @@ export interface PluginOptions {
| {
include: string[];
};
markdownTemplateTransforms?: MarkdownTemplateTransform[];
};
supportedBrowsers?: string[];
transformFilter?: (code: string, id: string) => boolean;
Expand Down Expand Up @@ -92,6 +97,9 @@ export function angular(options?: PluginOptions): Plugin[] {
supportedBrowsers: options?.supportedBrowsers ?? ['safari 15'],
jit: options?.jit,
supportAnalogFormat: options?.experimental?.supportAnalogFormat ?? false,
markdownTemplateTransforms:
options?.experimental?.markdownTemplateTransforms ??
defaultMarkdownTemplateTransforms,
};

// The file emitter created during `onStart` that will be used during the build in `onLoad` callbacks for TS files
Expand Down Expand Up @@ -502,6 +510,7 @@ export function angular(options?: PluginOptions): Plugin[] {
inlineStylesExtension: pluginOptions.inlineStylesExtension,
supportAnalogFormat: pluginOptions.supportAnalogFormat,
isProd,
markdownTemplateTransforms: pluginOptions.markdownTemplateTransforms,
});
}
}
Expand Down
@@ -0,0 +1,21 @@
export type MarkdownTemplateTransform = (
content: string,
fileName: string
) => string | Promise<string>;

export const defaultMarkdownTemplateTransform: MarkdownTemplateTransform =
async (content: string) => {
const { MarkedSetupService } = await import('./marked-setup.service');

// read template sections, parse markdown
const markedSetupService = new MarkedSetupService();
const mdContent = markedSetupService
.getMarkedInstance()
.parse(content) as unknown as Promise<string>;

return mdContent;
};

export const defaultMarkdownTemplateTransforms: MarkdownTemplateTransform[] = [
defaultMarkdownTemplateTransform,
];
18 changes: 7 additions & 11 deletions packages/vite-plugin-angular/src/lib/host.ts
Expand Up @@ -4,6 +4,7 @@ import { readFileSync } from 'node:fs';
import * as ts from 'typescript';
import { compileAnalogFile } from './authoring/analog';
import { TEMPLATE_TAG_REGEX } from './authoring/constants';
import { MarkdownTemplateTransform } from './authoring/markdown-transform';

export function augmentHostWithResources(
host: ts.CompilerHost,
Expand All @@ -21,6 +22,7 @@ export function augmentHostWithResources(
};

isProd?: boolean;
markdownTemplateTransforms?: MarkdownTemplateTransform[];
} = {}
) {
const resourceHost = host as CompilerHost;
Expand Down Expand Up @@ -97,22 +99,16 @@ export function augmentHostWithResources(
resourceHost.readResource = async function (fileName: string) {
const filePath = normalizePath(fileName);

const content = (this as any).readFile(filePath);
let content = (this as any).readFile(filePath);

if (content === undefined) {
throw new Error('Unable to locate component resource: ' + fileName);
}

if (fileName.includes('virtual-analog:')) {
const { MarkedSetupService } = await import(
'./authoring/marked-setup.service'
);
// read template sections, parse markdown
const markedSetupService = new MarkedSetupService();
const mdContent = markedSetupService
.getMarkedInstance()
.parse(content) as unknown as Promise<string>;

return mdContent;
for (const transform of options.markdownTemplateTransforms || []) {
content = await transform(content, fileName);
}
}

return content;
Expand Down

0 comments on commit 789fa06

Please sign in to comment.