@vuepress/core 2.0.0-beta.27 → 2.0.0-beta.28

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.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.appInit = void 0;
4
4
  const utils_1 = require("@vuepress/utils");
5
+ const createAppMarkdown_1 = require("./createAppMarkdown");
5
6
  const createAppPages_1 = require("./createAppPages");
6
7
  const log = (0, utils_1.debug)('vuepress:core/app');
7
8
  /**
@@ -15,8 +16,8 @@ const appInit = async (app) => {
15
16
  // plugins should be used before `registerHooks()`
16
17
  // hooks in plugins will take effect after `registerHooks()`
17
18
  app.pluginApi.registerHooks();
18
- // plugin hook: extendsMarkdown
19
- await app.pluginApi.hooks.extendsMarkdown.process(app.markdown, app);
19
+ // create markdown
20
+ app.markdown = await (0, createAppMarkdown_1.createAppMarkdown)(app);
20
21
  // create pages
21
22
  app.pages = await (0, createAppPages_1.createAppPages)(app);
22
23
  // plugin hook: onInitialized
@@ -0,0 +1,6 @@
1
+ import type { Markdown } from '@vuepress/markdown';
2
+ import type { App } from '../types';
3
+ /**
4
+ * Create markdown-it instance for vuepress app
5
+ */
6
+ export declare const createAppMarkdown: (app: App) => Promise<Markdown>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAppMarkdown = void 0;
4
+ const markdown_1 = require("@vuepress/markdown");
5
+ /**
6
+ * Create markdown-it instance for vuepress app
7
+ */
8
+ const createAppMarkdown = async (app) => {
9
+ // plugin hook: extendsMarkdownOptions
10
+ await app.pluginApi.hooks.extendsMarkdownOptions.process(app.options.markdown, app);
11
+ const markdown = (0, markdown_1.createMarkdown)(app.options.markdown);
12
+ // plugin hook: extendsMarkdown
13
+ await app.pluginApi.hooks.extendsMarkdown.process(markdown, app);
14
+ return markdown;
15
+ };
16
+ exports.createAppMarkdown = createAppMarkdown;
@@ -15,7 +15,15 @@ const createAppPages = async (app) => {
15
15
  cwd: app.dir.source(),
16
16
  });
17
17
  // create pages from files
18
- const pages = await Promise.all(pageFilePaths.map((filePath) => (0, page_1.createPage)(app, { filePath })));
18
+ const pages = await Promise.all(pageFilePaths.map(async (filePath) => {
19
+ const pageOptions = { filePath };
20
+ // plugin hook: extendsPageOptions
21
+ await app.pluginApi.hooks.extendsPageOptions.process(pageOptions, app);
22
+ const page = await (0, page_1.createPage)(app, pageOptions);
23
+ // plugin hook: extendsPage
24
+ await app.pluginApi.hooks.extendsPage.process(page, app);
25
+ return page;
26
+ }));
19
27
  // if there is no 404 page, add one
20
28
  if (!pages.some((page) => page.path === '/404.html')) {
21
29
  pages.push(await (0, page_1.createPage)(app, {
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createBaseApp = void 0;
4
- const markdown_1 = require("@vuepress/markdown");
5
4
  const pluginApi_1 = require("../pluginApi");
6
5
  const appInit_1 = require("./appInit");
7
6
  const appPrepare_1 = require("./appPrepare");
@@ -23,7 +22,6 @@ const createBaseApp = (config, isBuild = false) => {
23
22
  const dir = (0, createAppDir_1.createAppDir)(options);
24
23
  const env = (0, createAppEnv_1.createAppEnv)(options, isBuild);
25
24
  const siteData = (0, createAppSiteData_1.createAppSiteData)(options);
26
- const markdown = (0, markdown_1.createMarkdown)(options.markdown);
27
25
  const pluginApi = (0, pluginApi_1.createPluginApi)();
28
26
  const writeTemp = (0, createAppWriteTemp_1.createAppWriteTemp)(dir);
29
27
  const app = {
@@ -32,7 +30,6 @@ const createBaseApp = (config, isBuild = false) => {
32
30
  dir,
33
31
  env,
34
32
  siteData,
35
- markdown,
36
33
  pluginApi,
37
34
  writeTemp,
38
35
  use: (...args) => (0, appUse_1.appUse)(app, ...args),
@@ -11,9 +11,9 @@ import { Vuepress } from '@vuepress/client/lib/components/Vuepress'
11
11
 
12
12
  const routeItems = [\
13
13
  ${app.pages
14
- .map(({ key, path, pathInferred, filePathRelative, title }) => {
14
+ .map(({ key, path, pathInferred, filePathRelative, routeMeta }) => {
15
15
  const redirects = [];
16
- const routeItem = [key, path, title, redirects];
16
+ const routeItem = [key, path, routeMeta, redirects];
17
17
  // paths that should redirect to this page
18
18
  const redirectsSet = new Set();
19
19
  // redirect from decoded path
@@ -47,13 +47,13 @@ ${app.pages
47
47
  ]
48
48
 
49
49
  export const pagesRoutes = routeItems.reduce(
50
- (result, [name, path, title, redirects]) => {
50
+ (result, [name, path, meta, redirects]) => {
51
51
  result.push(
52
52
  {
53
53
  name,
54
54
  path,
55
55
  component: Vuepress,
56
- meta: { title },
56
+ meta,
57
57
  },
58
58
  ...redirects.map((item) => ({
59
59
  path: item,
@@ -1,2 +1,2 @@
1
1
  import type { App, Page, PageOptions } from '../types';
2
- export declare const createPage: (app: App, optionsRaw: PageOptions) => Promise<Page>;
2
+ export declare const createPage: (app: App, options: PageOptions) => Promise<Page>;
@@ -6,7 +6,6 @@ const renderPageContent_1 = require("./renderPageContent");
6
6
  const renderPageExcerpt_1 = require("./renderPageExcerpt");
7
7
  const resolvePageComponentInfo_1 = require("./resolvePageComponentInfo");
8
8
  const resolvePageContent_1 = require("./resolvePageContent");
9
- const resolvePageData_1 = require("./resolvePageData");
10
9
  const resolvePageDataInfo_1 = require("./resolvePageDataInfo");
11
10
  const resolvePageDate_1 = require("./resolvePageDate");
12
11
  const resolvePageFileContent_1 = require("./resolvePageFileContent");
@@ -15,13 +14,11 @@ const resolvePageFrontmatter_1 = require("./resolvePageFrontmatter");
15
14
  const resolvePageHtmlInfo_1 = require("./resolvePageHtmlInfo");
16
15
  const resolvePageKey_1 = require("./resolvePageKey");
17
16
  const resolvePageLang_1 = require("./resolvePageLang");
18
- const resolvePageOptions_1 = require("./resolvePageOptions");
19
17
  const resolvePagePath_1 = require("./resolvePagePath");
20
18
  const resolvePagePermalink_1 = require("./resolvePagePermalink");
19
+ const resolvePageRouteMeta_1 = require("./resolvePageRouteMeta");
21
20
  const resolvePageSlug_1 = require("./resolvePageSlug");
22
- const createPage = async (app, optionsRaw) => {
23
- // resolve page options from raw options
24
- const options = await (0, resolvePageOptions_1.resolvePageOptions)({ app, optionsRaw });
21
+ const createPage = async (app, options) => {
25
22
  // resolve page file absolute path and relative path
26
23
  const { filePath, filePathRelative } = (0, resolvePageFilePath_1.resolvePageFilePath)({
27
24
  app,
@@ -44,13 +41,15 @@ const createPage = async (app, optionsRaw) => {
44
41
  frontmatter,
45
42
  });
46
43
  // render page content and extract information
47
- const { contentRendered, deps, headers, hoistedTags, links, title, } = await (0, renderPageContent_1.renderPageContent)({
44
+ const { contentRendered, deps, headers, hoistedTags, links, title } = await (0, renderPageContent_1.renderPageContent)({
48
45
  app,
49
46
  content,
50
47
  filePath,
51
48
  filePathRelative,
52
49
  frontmatter,
53
50
  });
51
+ // resolve route meta from frontmatter
52
+ const routeMeta = (0, resolvePageRouteMeta_1.resolvePageRouteMeta)({ frontmatter });
54
53
  // resolve slug from file path
55
54
  const slug = (0, resolvePageSlug_1.resolvePageSlug)({ filePathRelative });
56
55
  // resolve date from file path
@@ -69,7 +68,7 @@ const createPage = async (app, optionsRaw) => {
69
68
  });
70
69
  // resolve page path
71
70
  const path = (0, resolvePagePath_1.resolvePagePath)({ permalink, pathInferred, options });
72
- // resolve path key
71
+ // resolve page key
73
72
  const key = (0, resolvePageKey_1.resolvePageKey)({ path });
74
73
  // resolve page rendered html file path
75
74
  const { htmlFilePath, htmlFilePathRelative } = (0, resolvePageHtmlInfo_1.resolvePageHtmlInfo)({
@@ -83,8 +82,18 @@ const createPage = async (app, optionsRaw) => {
83
82
  htmlFilePathRelative,
84
83
  key,
85
84
  });
86
- const { dataFilePath, dataFilePathRelative, dataFileChunkName, } = (0, resolvePageDataInfo_1.resolvePageDataInfo)({ app, htmlFilePathRelative, key });
85
+ const { dataFilePath, dataFilePathRelative, dataFileChunkName } = (0, resolvePageDataInfo_1.resolvePageDataInfo)({ app, htmlFilePathRelative, key });
87
86
  const page = {
87
+ // page data
88
+ data: {
89
+ key,
90
+ path,
91
+ title,
92
+ lang,
93
+ frontmatter,
94
+ excerpt,
95
+ headers,
96
+ },
88
97
  // base fields
89
98
  key,
90
99
  path,
@@ -103,6 +112,7 @@ const createPage = async (app, optionsRaw) => {
103
112
  pathInferred,
104
113
  pathLocale,
105
114
  permalink,
115
+ routeMeta,
106
116
  slug,
107
117
  // file info
108
118
  filePath,
@@ -116,8 +126,6 @@ const createPage = async (app, optionsRaw) => {
116
126
  htmlFilePath,
117
127
  htmlFilePathRelative,
118
128
  };
119
- // resolve page data
120
- page.data = await (0, resolvePageData_1.resolvePageData)({ app, page });
121
129
  return page;
122
130
  };
123
131
  exports.createPage = createPage;
@@ -5,7 +5,6 @@ export * from './renderPageExcerpt';
5
5
  export * from './resolvePageComponentInfo';
6
6
  export * from './resolvePageContent';
7
7
  export * from './resolvePageDataInfo';
8
- export * from './resolvePageData';
9
8
  export * from './resolvePageDate';
10
9
  export * from './resolvePageFileContent';
11
10
  export * from './resolvePageFilePath';
@@ -13,7 +12,7 @@ export * from './resolvePageFrontmatter';
13
12
  export * from './resolvePageHtmlInfo';
14
13
  export * from './resolvePageKey';
15
14
  export * from './resolvePageLang';
16
- export * from './resolvePageOptions';
17
15
  export * from './resolvePagePath';
18
16
  export * from './resolvePagePermalink';
17
+ export * from './resolvePageRouteMeta';
19
18
  export * from './resolvePageSlug';
package/lib/page/index.js CHANGED
@@ -17,7 +17,6 @@ __exportStar(require("./renderPageExcerpt"), exports);
17
17
  __exportStar(require("./resolvePageComponentInfo"), exports);
18
18
  __exportStar(require("./resolvePageContent"), exports);
19
19
  __exportStar(require("./resolvePageDataInfo"), exports);
20
- __exportStar(require("./resolvePageData"), exports);
21
20
  __exportStar(require("./resolvePageDate"), exports);
22
21
  __exportStar(require("./resolvePageFileContent"), exports);
23
22
  __exportStar(require("./resolvePageFilePath"), exports);
@@ -25,7 +24,7 @@ __exportStar(require("./resolvePageFrontmatter"), exports);
25
24
  __exportStar(require("./resolvePageHtmlInfo"), exports);
26
25
  __exportStar(require("./resolvePageKey"), exports);
27
26
  __exportStar(require("./resolvePageLang"), exports);
28
- __exportStar(require("./resolvePageOptions"), exports);
29
27
  __exportStar(require("./resolvePagePath"), exports);
30
28
  __exportStar(require("./resolvePagePermalink"), exports);
29
+ __exportStar(require("./resolvePageRouteMeta"), exports);
31
30
  __exportStar(require("./resolvePageSlug"), exports);
@@ -15,7 +15,7 @@ const resolvePageContent = ({ contentRaw, }) => {
15
15
  };
16
16
  }
17
17
  /* istanbul ignore next */
18
- const { data, content, excerpt = '' } = matter(contentRaw, {
18
+ const { data, content, excerpt = '', } = matter(contentRaw, {
19
19
  excerpt_separator: '<!-- more -->',
20
20
  engines: {
21
21
  toml: toml.parse.bind(toml),
@@ -0,0 +1,7 @@
1
+ import type { PageFrontmatter } from '../types';
2
+ /**
3
+ * Resolve page route meta
4
+ */
5
+ export declare const resolvePageRouteMeta: ({ frontmatter, }: {
6
+ frontmatter: PageFrontmatter;
7
+ }) => Record<string, unknown>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvePageRouteMeta = void 0;
4
+ /**
5
+ * Resolve page route meta
6
+ */
7
+ const resolvePageRouteMeta = ({ frontmatter, }) => { var _a; return (_a = frontmatter.routeMeta) !== null && _a !== void 0 ? _a : {}; };
8
+ exports.resolvePageRouteMeta = resolvePageRouteMeta;
@@ -8,11 +8,11 @@ const createPluginApiHooks = () => ({
8
8
  onPrepared: (0, createHookQueue_1.createHookQueue)('onPrepared'),
9
9
  onWatched: (0, createHookQueue_1.createHookQueue)('onWatched'),
10
10
  onGenerated: (0, createHookQueue_1.createHookQueue)('onGenerated'),
11
- // page hooks
12
- extendsPageOptions: (0, createHookQueue_1.createHookQueue)('extendsPageOptions'),
13
- extendsPageData: (0, createHookQueue_1.createHookQueue)('extendsPageData'),
14
- // markdown hooks
11
+ // extends hooks
12
+ extendsMarkdownOptions: (0, createHookQueue_1.createHookQueue)('extendsMarkdownOptions'),
15
13
  extendsMarkdown: (0, createHookQueue_1.createHookQueue)('extendsMarkdown'),
14
+ extendsPageOptions: (0, createHookQueue_1.createHookQueue)('extendsPageOptions'),
15
+ extendsPage: (0, createHookQueue_1.createHookQueue)('extendsPage'),
16
16
  // client files hooks
17
17
  clientAppEnhanceFiles: (0, createHookQueue_1.createHookQueue)('clientAppEnhanceFiles'),
18
18
  clientAppRootComponentFiles: (0, createHookQueue_1.createHookQueue)('clientAppRootComponentFiles'),
@@ -30,10 +30,6 @@ export interface App {
30
30
  * Site data, which will be used in client side
31
31
  */
32
32
  siteData: SiteData;
33
- /**
34
- * Markdown-it instance
35
- */
36
- markdown: Markdown;
37
33
  /**
38
34
  * Plugin system
39
35
  */
@@ -65,6 +61,12 @@ export interface App {
65
61
  * Only available after initialization
66
62
  */
67
63
  layouts: Record<string, string>;
64
+ /**
65
+ * Markdown-it instance.
66
+ *
67
+ * Only available after initialization
68
+ */
69
+ markdown: Markdown;
68
70
  /**
69
71
  * Page objects.
70
72
  *
@@ -3,11 +3,11 @@ import type { PageData, PageFrontmatter } from '@vuepress/shared';
3
3
  /**
4
4
  * Vuepress Page
5
5
  */
6
- export interface Page<T extends PageData = PageData> extends PageData {
6
+ export declare type Page<ExtraPageData extends Record<any, any> = Record<never, never>, ExtraPageFields extends Record<any, any> = Record<never, never>> = PageData & ExtraPageFields & {
7
7
  /**
8
8
  * Data of the page, which will be available in client code
9
9
  */
10
- data: T;
10
+ data: PageData<ExtraPageData>;
11
11
  /**
12
12
  * Raw Content of the page
13
13
  */
@@ -56,6 +56,12 @@ export interface Page<T extends PageData = PageData> extends PageData {
56
56
  * If the page does not have a permalink, it would be `null`
57
57
  */
58
58
  permalink: string | null;
59
+ /**
60
+ * Custom data to be attached to the page route record of vue-router
61
+ *
62
+ * @see https://next.router.vuejs.org/api/#meta
63
+ */
64
+ routeMeta: Record<string, unknown>;
59
65
  /**
60
66
  * Slug of the page
61
67
  */
@@ -108,7 +114,7 @@ export interface Page<T extends PageData = PageData> extends PageData {
108
114
  * Rendered html file path relative to dest directory
109
115
  */
110
116
  htmlFilePathRelative: string;
111
- }
117
+ };
112
118
  /**
113
119
  * Options to create vuepress page
114
120
  */
@@ -1,4 +1,4 @@
1
- import type { Markdown } from '@vuepress/markdown';
1
+ import type { Markdown, MarkdownOptions } from '@vuepress/markdown';
2
2
  import type { App } from '../app';
3
3
  import type { Page, PageOptions } from '../page';
4
4
  declare type PromiseOrNot<T> = Promise<T> | T;
@@ -11,11 +11,9 @@ export declare type Hook<Exposed, Normalized = Exposed, Result = Normalized exte
11
11
  result: Result;
12
12
  };
13
13
  export declare type LifeCycleHook<T extends unknown[] = []> = Hook<(app: App, ...args: T) => PromiseOrNot<void>>;
14
+ export declare type ExtendsHook<T> = Hook<(extendable: T, app: App) => PromiseOrNot<void>>;
14
15
  export declare type ClientFilesHook = Hook<string | string[] | ((app: App) => PromiseOrNot<string | string[]>), (app: App) => Promise<string[]>>;
15
16
  export declare type ReturnObjectHook = Hook<Record<string, any> | ((app: App) => PromiseOrNot<Record<string, any>>), (app: App) => Promise<Record<string, any>>>;
16
- export declare type ExtendsMarkdownHook = Hook<(md: Markdown, app: App) => PromiseOrNot<void>>;
17
- export declare type ExtendsPageOptionsHook = Hook<(options: PageOptions, app: App) => PromiseOrNot<PageOptions>>;
18
- export declare type ExtendsPageDataHook = Hook<(page: Omit<Page, 'data'>, app: App) => PromiseOrNot<Record<string, any>>>;
19
17
  /**
20
18
  * List of hooks
21
19
  */
@@ -24,9 +22,10 @@ export interface Hooks {
24
22
  onPrepared: LifeCycleHook;
25
23
  onWatched: LifeCycleHook<[watchers: Closable[], restart: () => Promise<void>]>;
26
24
  onGenerated: LifeCycleHook;
27
- extendsMarkdown: ExtendsMarkdownHook;
28
- extendsPageOptions: ExtendsPageOptionsHook;
29
- extendsPageData: ExtendsPageDataHook;
25
+ extendsMarkdownOptions: ExtendsHook<MarkdownOptions>;
26
+ extendsMarkdown: ExtendsHook<Markdown>;
27
+ extendsPageOptions: ExtendsHook<PageOptions>;
28
+ extendsPage: ExtendsHook<Page>;
30
29
  clientAppEnhanceFiles: ClientFilesHook;
31
30
  clientAppRootComponentFiles: ClientFilesHook;
32
31
  clientAppSetupFiles: ClientFilesHook;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vuepress/core",
3
- "version": "2.0.0-beta.27",
3
+ "version": "2.0.0-beta.28",
4
4
  "description": "Core package of VuePress",
5
5
  "keywords": [
6
6
  "vuepress",
@@ -26,15 +26,15 @@
26
26
  "clean": "rimraf lib *.tsbuildinfo"
27
27
  },
28
28
  "dependencies": {
29
- "@vuepress/client": "2.0.0-beta.27",
30
- "@vuepress/markdown": "2.0.0-beta.27",
31
- "@vuepress/shared": "2.0.0-beta.27",
32
- "@vuepress/utils": "2.0.0-beta.27",
29
+ "@vuepress/client": "2.0.0-beta.28",
30
+ "@vuepress/markdown": "2.0.0-beta.28",
31
+ "@vuepress/shared": "2.0.0-beta.28",
32
+ "@vuepress/utils": "2.0.0-beta.28",
33
33
  "gray-matter": "^4.0.3",
34
34
  "toml": "^3.0.0"
35
35
  },
36
36
  "publishConfig": {
37
37
  "access": "public"
38
38
  },
39
- "gitHead": "2671a94fe6864e215eb84f318b7e657744a0bc5d"
39
+ "gitHead": "71c34816a79263c7dcba3ff0c103e264abdbf0d2"
40
40
  }
@@ -1,8 +0,0 @@
1
- import type { App, Page, PageData } from '../types';
2
- /**
3
- * Resolve page data
4
- */
5
- export declare const resolvePageData: ({ app, page, }: {
6
- app: App;
7
- page: Page;
8
- }) => Promise<PageData>;
@@ -1,23 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolvePageData = void 0;
4
- /**
5
- * Resolve page data
6
- */
7
- const resolvePageData = async ({ app, page, }) => {
8
- const { key, path, title, lang, frontmatter, excerpt, headers } = page;
9
- const data = {
10
- key,
11
- path,
12
- title,
13
- lang,
14
- frontmatter,
15
- excerpt,
16
- headers,
17
- };
18
- // plugin hook: extendsPageData
19
- const extendsPageData = await app.pluginApi.hooks.extendsPageData.process(page, app);
20
- extendsPageData.forEach((item) => Object.assign(data, item));
21
- return data;
22
- };
23
- exports.resolvePageData = resolvePageData;
@@ -1,8 +0,0 @@
1
- import type { App, PageOptions } from '../types';
2
- /**
3
- * Render page content and extract related info
4
- */
5
- export declare const resolvePageOptions: ({ app, optionsRaw, }: {
6
- app: App;
7
- optionsRaw: PageOptions;
8
- }) => Promise<PageOptions>;
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolvePageOptions = void 0;
4
- /**
5
- * Render page content and extract related info
6
- */
7
- const resolvePageOptions = async ({ app, optionsRaw, }) => {
8
- // avoid mutating the original options object provided by user
9
- const options = { ...optionsRaw };
10
- // plugin hook: extendsPageOptions
11
- const extendsPageOptions = await app.pluginApi.hooks.extendsPageOptions.process(options, app);
12
- extendsPageOptions.forEach((item) => Object.assign(options, item));
13
- return options;
14
- };
15
- exports.resolvePageOptions = resolvePageOptions;