diff --git a/package.json b/package.json index 837fb64..70c673a 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "deploy:testnet": "npm run build; alem deploy --network testnet" }, "dependencies": { - "alem": "1.0.0-beta.30" + "alem": "1.0.0-beta.34" }, "devDependencies": { "@types/styled-components": "^5.1.26", diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index 15b930c..dd70d3a 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -2,7 +2,7 @@ import { useEffect, getLocation, useState, useRoutes, Storage } from "alem"; import { SidebarAboutLogo, Container } from "./styles"; import getLinksByCategory from "../../utils/getLinksByCategory"; import CollapseList from "../CollapseList"; -import { Categories, RoutesPath } from "@app/routes/routeProps"; +import { Categories, RoutesPath } from "@app/modules/routes/routeProps"; const Sidebar = () => { const { pathname } = getLocation(); @@ -15,6 +15,7 @@ const Sidebar = () => { const [gettingStartedItems, setGettingStartedItems] = useState<(JSX.Element | undefined)[]>([]); const [routerItems, setRouterItems] = useState<(JSX.Element | undefined)[]>([]); const [modulesItems, setModulesItems] = useState<(JSX.Element | undefined)[]>([]); + const [localModulesItems, setLocalModulesItems] = useState<(JSX.Element | undefined)[]>([]); const [contextItems, setContextItems] = useState<(JSX.Element | undefined)[]>([]); const [apisItems, setApisItems] = useState<(JSX.Element | undefined)[]>([]); const [bosItems, setBosItems] = useState<(JSX.Element | undefined)[]>([]); @@ -23,6 +24,7 @@ const Sidebar = () => { const _gettingStartedItems = getLinksByCategory("Getting Started"); const _routerItems = getLinksByCategory("Router"); const _modulesItems = getLinksByCategory("Modules"); + const _localModulesItems = getLinksByCategory("Local Modules"); const _contextItems = getLinksByCategory("Context"); const _apisItems = getLinksByCategory("APIs"); const _bosItems = getLinksByCategory("BOS"); @@ -30,6 +32,7 @@ const Sidebar = () => { setGettingStartedItems(_gettingStartedItems); setRouterItems(_routerItems); setModulesItems(_modulesItems); + setLocalModulesItems(_localModulesItems); setContextItems(_contextItems); setApisItems(_apisItems); setBosItems(_bosItems); @@ -85,7 +88,17 @@ const Sidebar = () => {
handleOpenRegister(isOpen, Categories.localModules)} + > + <>{localModulesItems} + +
+ +
+ handleOpenRegister(isOpen, Categories.modules)} > diff --git a/src/md/ConfigFile.tsx b/src/md/ConfigFile.tsx index fb10c99..8e5faa7 100644 --- a/src/md/ConfigFile.tsx +++ b/src/md/ConfigFile.tsx @@ -1,7 +1,7 @@ import { Markdown } from 'alem'; const ConfigFile = () => { - const mdContent = Buffer.from(`IyBDb25maWcgRmlsZQoKQ3JlYXRlIGEgYGFsZW0uY29uZmlnLmpzb25gIGZpbGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CgpgYGBqc29uCnsKICAvLyBUaGlzIGlzIHRoZSByb290IHBhdGggb2YgdGhlIGFwcC4KICAvLyBpZiB0cnVlOiBhbGVtLWxpYi5uZWFyL3dpZGdldC9JbmRleAogIC8vIGlmIGZhbHNlOiBhbGVtLWxpYi5uZWFyL3dpZGdldC9hbGVtLWRvY3MgKGl0J3MgZ29pbmcgdG8gdXNlIHRoZSBzbHVnaWZpZWQgIm5hbWUiKQogICJpc0luZGV4IjogdHJ1ZSwKICAvLyBUaGUgbWFpbm5ldCBhY2NvdW50IElEIHVuZGVyIHdoaWNoIHRoZSBhcHAgd2lsbCBiZSBkZXBsb3llZC4KICAibWFpbm5ldEFjY291bnQiOiAiYWxlbS1saWIubmVhciIsCiAgLy8gVGhlIHRlc3RuZXQgYWNjb3VudCBJRCB1bmRlciB3aGljaCB0aGUgYXBwIHdpbGwgYmUgZGVwbG95ZWQuCiAgInRlc3RuZXRBY2NvdW50IjogImFsZW0tbGliLnRlc3RuZXQiLAogIC8vIEFwcCBuYW1lCiAgIm5hbWUiOiAiQWxlbSBEb2NzIiwKICAvLyBBcHAgRGVzY3JpcHRpb24KICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRlIHdlYjMgYXBwbGljYXRpb25zIGZvciBORUFSIEJPUyB3aXRoIGEgZm9jdXMgb24gcGVyZm9ybWFuY2Ugd2hpbGUgdXNpbmcgY29uY2VwdHMgdGhhdCBhcmUgYmFzZWQgb24gUmVhY3RKUy4iLAogIC8vIFNvY2lhbCBsaW5rcy4gQ2hlY2sgb3V0IE5FQVIgU29jaWFsIEJvcyBkb2NzIHRvIGdldCB0byBrbm93IHRoZSBvcHRpb25zCiAgLy8gaHR0cHM6Ly9kb2NzLm5lYXIub3JnL3NvY2lhbC9jb250cmFjdAogICJsaW5rdHJlZSI6IHsKICAgICJ3ZWJzaXRlIjogImdpdGh1Yi5jb20vd3BkYXMvYWxlbSIKICB9LAogICJpbWFnZSI6IHsKICAgICJpcGZzX2NpZCI6ICJiYWZrcmVpY2pkZ2F0NXhzdzd2eGJvc295eWdlcm1hd2hrZmkyYnkzb3ZnN2M2dHVtcmF5bjRyaW10eSIKICB9LAogIC8vIFRhZ3Mgb2YgdGhpcyBwcm9qZWN0CiAgInRhZ3MiOiBbInRoZSIsICJwcm9qZWN0IiwgInRhZ3MiLCAiaGVyZSJdCn0KYGBgCgojIFBhdGggQWxpYXNlcwoKWW91IGNhbiBvcHRpb25hbGx5IGNvbmZpZ3VyZSB5b3VyIGFwcGxpY2F0aW9uJ3MgcGF0aCBhbGlhc2VzIHNvIHRoYXQgaXQgd29ya3MgdG9nZXRoZXIgd2l0aCB0c2NvbmZpZy5qc29uLCBmb3IgZXhhbXBsZS4gQXNzdW1pbmcgeW91ciBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBmb3IgcGF0aHM6CgpgYGBqc29uCnsKICAiY29tcGlsZXJPcHRpb25zIjogewogICAgLy8gLi4uCiAgICAiYmFzZVVybCI6ICIuIiwKICAgICJwYXRocyI6IHsKICAgICAgIkBhcHAvKiI6IFsic3JjLyoiXSwKICAgICAgIkBjb21wb25lbnRzLyoiOiBbInNyYy9jb21wb25lbnRzLyoiXQogICAgfQogIH0KfQpgYGAKCllvdSB3aWxsIHdhbnQgdG8gY29uZmlndXJlIHRoZSBzYW1lIGJlaGF2aW9yIHVzaW5nIHRoZSBgYWxlbS5jb25maWcuanNvbmAgZmlsZSBhcyBmb2xsb3dzOgoKYGBganNvbgp7CiAgLy8gLi4uCiAgImNvbXBpbGVyT3B0aW9ucyI6IHsKICAgICJiYXNlVXJsIjogIi4iLAogICAgInBhdGhzIjogewogICAgICAiQGFwcC8iOiAic3JjLyIsCiAgICAgICJAY29tcG9uZW50cy8iOiAic3JjL2NvbXBvbmVudHMvIgogICAgfQogIH0KfQpgYGAKCk5vdyBpbiBhbGwgb2YgeW91ciBzb3VyY2UgZmlsZXMsIHlvdSBjYW4gaW1wb3J0IGNvbXBvbmVudHMgbGlrZSB0aGlzOgoKYGBgdHN4Ci8vIFdpdGhvdXQgcGF0aCBhbGlhc2VzCmltcG9ydCBIZXJvIGZyb20gIi4uLy4uLy4uL2NvbXBvbmVudHMvSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiLi4vLi4vLi4vY29tcG9uZW50cy9Gb290ZXIiOwoKLy8gV2l0aCBwYXRoIGFsaWFzZXMKaW1wb3J0IEhlcm8gZnJvbSAiQGNvbXBvbmVudHMvSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiQGNvbXBvbmVudHMvRm9vdGVyIjsKYGBgCgojIE9wdGlvbnMKCkl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGNvbXBpbGVyIGJlaGF2aW9ycyB1c2luZyB0aGUgb3B0aW9ucyBzZXNzaW9uLgoKIyMgQ3JlYXRlIExvYWRlciBXaWRnZXQKClRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIFdpZGdldCB0aGF0IHdpbGwgc2VydmUgYXMgYSBMb2FkZXIgZm9yIHRoZSBtYWluIFdpZGdldC4gWW91IGNhbiBvcHRpb25hbGx5IGRlZmluZSB3aGljaCBjb21wb25lbnQgd2lsbCBzZXJ2ZSBhcyB0aGUgTG9hZGluZyBkaXNwbGF5IHdoaWxlIHRoZSBtYWluIFdpZGdldCBjb250ZW50IGlzIGxvYWRlZC4gSWYgbm8gZmlsZSBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgTG9hZGluZyBjb21wb25lbnQgb2YgQWzDqW0gd2lsbCBiZSB1c2VkLgoKVGhlIGdlbmVyYXRlZCBmaWxlIG5hbWUgd2lsbCBiZSBhIG1peCBvZiB0aGUgbmFtZSBvZiB0aGUgbWFpbiBXaWRnZXQgKyAiTG9hZGVyIi4gRm9yIGV4YW1wbGU6IGBJbmRleExvYWRlcmAuIEl0IGlzIHVwIHRvIHlvdSB3aGljaCBmaWxlIHRvIHVzZSBhcyB0aGUgcHJpbWFyeSBtZWFucyBvZiBhY2Nlc3NpbmcgeW91ciBhcHBsaWNhdGlvbi4KCi0gKipgY3JlYXRlTG9hZGVyV2lkZ2V0YDogYm9vbGVhbioqIC0gU2hvdWxkIHRoZSBXaWRnZXQgTG9hZGVyIGJlIGNyZWF0ZWQ/Ci0gKipgbG9hZGluZ0NvbXBvbmVudEZpbGVgOiBzdHJpbmcgKG9wdGlvbmFsKSoqIC0gUGF0aCB0byB0aGUgY29tcG9uZW50IHRoYXQgd2lsbCBzZXJ2ZSBhcyBsb2FkaW5nIHdoaWxlIHRoZSBtYWluIFdpZGdldCBjb250ZW50IGlzIGxvYWRlZC4KLSAqKmBsb2FkaW5nQ29tcG9uZW50TmFtZWA6IHN0cmluZyAob3B0aW9uYWwpKiogLSBFeGFjdCBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgbG9hZGVkIHZpYSBgbG9hZGluZ0NvbXBvbmVudEZpbGVgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxvYWRpbmcgZmlsZSBoYXMgdGhpcyBzdHJ1Y3R1cmU6CgpgYGB0c3gKY29uc3QgU3VzcGVuc2VMb2FkaW5nID0gKCkgPT4gPHA+TG9hZGluZy4uLjwvcD47CmBgYAoKU28gdGhlIG5hbWUgbXVzdCBiZSAqKlN1c3BlbnNlTG9hZGluZyoqLgoKKipDb25maWcgRXhhbXBsZSoqCgpgYGBqc29uCiJvcHRpb25zIjogewogICAgImNyZWF0ZUxvYWRlcldpZGdldCI6IHRydWUsCiAgICAibG9hZGluZ0NvbXBvbmVudEZpbGUiOiAic3JjL2NvbXBvbmVudHMvU3VzcGVuc2VMb2FkaW5nLnRzeCIsCiAgICAibG9hZGluZ0NvbXBvbmVudE5hbWUiOiAiU3VzcGVuc2VMb2FkaW5nIgogIH0KYGBgCgojIyBLZWVwIFJvdXRlCgpga2VlcFJvdXRlYCBpcyBvbmx5IHZhbGlkIGR1cmluZyBkZXZlbG9wbWVudCwgYW5kIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbi4KClRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGV0aGVyIHRoZSByb3V0ZSBzaG91bGQgcmVtYWluIHRoZSBzYW1lIGR1cmluZyByZWZyZXNoZXMuIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgYFJvdXRlcmAgdHlwZSBpcyBgIkNvbnRlbnRCYXNlZCJgLgoKRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgoKYGBganNvbgp7CiAgLy8gLi4uCiAgIm9wdGlvbnMiOiB7CiAgICAia2VlcFJvdXRlIjogdHJ1ZQogIH0KfQpgYGAKCiMjIEhpZGUgQWzDqW0gQmFyCgpZb3UgY2FuIHVzZSBgb3B0aW9ucy5oaWRlQWxlbUJhcmAgdG8gcHJldmVudCB0aGUgQWzDqW0gdG9wIGJhciBmcm9tIGJlaW5nIGRpc3BsYXllZC4gVGhpcyBzZXR0aW5nIGFwcGxpZXMgb25seSBpbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCgpgYGBqc29uCnsKICAvLyAuLi4KICAib3B0aW9ucyI6IHsKICAgICJoaWRlQWxlbUJhciI6IHRydWUKICB9Cn0KYGBgCg==`, "base64").toString("utf-8"); + const mdContent = Buffer.from(`IyBDb25maWcgRmlsZQoKQ3JlYXRlIGEgYGFsZW0uY29uZmlnLmpzb25gIGZpbGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CgpgYGBqc29uCnsKICAvLyBUaGlzIGlzIHRoZSByb290IHBhdGggb2YgdGhlIGFwcC4KICAvLyBpZiB0cnVlOiBhbGVtLWxpYi5uZWFyL3dpZGdldC9JbmRleAogIC8vIGlmIGZhbHNlOiBhbGVtLWxpYi5uZWFyL3dpZGdldC9hbGVtLWRvY3MgKGl0J3MgZ29pbmcgdG8gdXNlIHRoZSBzbHVnaWZpZWQgIm5hbWUiKQogICJpc0luZGV4IjogdHJ1ZSwKICAvLyBUaGUgbWFpbm5ldCBhY2NvdW50IElEIHVuZGVyIHdoaWNoIHRoZSBhcHAgd2lsbCBiZSBkZXBsb3llZC4KICAibWFpbm5ldEFjY291bnQiOiAiYWxlbS1saWIubmVhciIsCiAgLy8gVGhlIHRlc3RuZXQgYWNjb3VudCBJRCB1bmRlciB3aGljaCB0aGUgYXBwIHdpbGwgYmUgZGVwbG95ZWQuCiAgInRlc3RuZXRBY2NvdW50IjogImFsZW0tbGliLnRlc3RuZXQiLAogIC8vIEFwcCBuYW1lCiAgIm5hbWUiOiAiQWxlbSBEb2NzIiwKICAvLyBBcHAgRGVzY3JpcHRpb24KICAiZGVzY3JpcHRpb24iOiAiQ3JlYXRlIHdlYjMgYXBwbGljYXRpb25zIGZvciBORUFSIEJPUyB3aXRoIGEgZm9jdXMgb24gcGVyZm9ybWFuY2Ugd2hpbGUgdXNpbmcgY29uY2VwdHMgdGhhdCBhcmUgYmFzZWQgb24gUmVhY3RKUy4iLAogIC8vIFNvY2lhbCBsaW5rcy4gQ2hlY2sgb3V0IE5FQVIgU29jaWFsIEJvcyBkb2NzIHRvIGdldCB0byBrbm93IHRoZSBvcHRpb25zCiAgLy8gaHR0cHM6Ly9kb2NzLm5lYXIub3JnL3NvY2lhbC9jb250cmFjdAogICJsaW5rdHJlZSI6IHsKICAgICJ3ZWJzaXRlIjogImdpdGh1Yi5jb20vd3BkYXMvYWxlbSIKICB9LAogICJpbWFnZSI6IHsKICAgICJpcGZzX2NpZCI6ICJiYWZrcmVpY2pkZ2F0NXhzdzd2eGJvc295eWdlcm1hd2hrZmkyYnkzb3ZnN2M2dHVtcmF5bjRyaW10eSIKICB9LAogIC8vIFRhZ3Mgb2YgdGhpcyBwcm9qZWN0CiAgInRhZ3MiOiBbInRoZSIsICJwcm9qZWN0IiwgInRhZ3MiLCAiaGVyZSJdCn0KYGBgCgojIFBhdGggQWxpYXNlcwoKWW91IGNhbiBvcHRpb25hbGx5IGNvbmZpZ3VyZSB5b3VyIGFwcGxpY2F0aW9uJ3MgcGF0aCBhbGlhc2VzIHNvIHRoYXQgaXQgd29ya3MgdG9nZXRoZXIgd2l0aCB0c2NvbmZpZy5qc29uLCBmb3IgZXhhbXBsZS4gQXNzdW1pbmcgeW91ciBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBmb3IgcGF0aHM6CgpgYGBqc29uCnsKICAiY29tcGlsZXJPcHRpb25zIjogewogICAgLy8gLi4uCiAgICAiYmFzZVVybCI6ICIuIiwKICAgICJwYXRocyI6IHsKICAgICAgIkBhcHAvKiI6IFsic3JjLyoiXSwKICAgICAgIkBjb21wb25lbnRzLyoiOiBbInNyYy9jb21wb25lbnRzLyoiXQogICAgfQogIH0KfQpgYGAKCllvdSB3aWxsIHdhbnQgdG8gY29uZmlndXJlIHRoZSBzYW1lIGJlaGF2aW9yIHVzaW5nIHRoZSBgYWxlbS5jb25maWcuanNvbmAgZmlsZSBhcyBmb2xsb3dzOgoKYGBganNvbgp7CiAgLy8gLi4uCiAgImNvbXBpbGVyT3B0aW9ucyI6IHsKICAgICJiYXNlVXJsIjogIi4iLAogICAgInBhdGhzIjogewogICAgICAiQGFwcC8iOiAic3JjLyIsCiAgICAgICJAY29tcG9uZW50cy8iOiAic3JjL2NvbXBvbmVudHMvIgogICAgfQogIH0KfQpgYGAKCk5vdyBpbiBhbGwgb2YgeW91ciBzb3VyY2UgZmlsZXMsIHlvdSBjYW4gaW1wb3J0IGNvbXBvbmVudHMgbGlrZSB0aGlzOgoKYGBgdHN4Ci8vIFdpdGhvdXQgcGF0aCBhbGlhc2VzCmltcG9ydCBIZXJvIGZyb20gIi4uLy4uLy4uL2NvbXBvbmVudHMvSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiLi4vLi4vLi4vY29tcG9uZW50cy9Gb290ZXIiOwoKLy8gV2l0aCBwYXRoIGFsaWFzZXMKaW1wb3J0IEhlcm8gZnJvbSAiQGNvbXBvbmVudHMvSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiQGNvbXBvbmVudHMvRm9vdGVyIjsKYGBgCgojIE9wdGlvbnMKCkl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBzb21lIGNvbXBpbGVyIGJlaGF2aW9ycyB1c2luZyB0aGUgb3B0aW9ucyBzZXNzaW9uLgoKIyMgQ3JlYXRlIExvYWRlciBXaWRnZXQKClRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIFdpZGdldCB0aGF0IHdpbGwgc2VydmUgYXMgYSBMb2FkZXIgZm9yIHRoZSBtYWluIFdpZGdldC4gWW91IGNhbiBvcHRpb25hbGx5IGRlZmluZSB3aGljaCBjb21wb25lbnQgd2lsbCBzZXJ2ZSBhcyB0aGUgTG9hZGluZyBkaXNwbGF5IHdoaWxlIHRoZSBtYWluIFdpZGdldCBjb250ZW50IGlzIGxvYWRlZC4gSWYgbm8gZmlsZSBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgTG9hZGluZyBjb21wb25lbnQgb2YgQWzDqW0gd2lsbCBiZSB1c2VkLgoKVGhlIGdlbmVyYXRlZCBmaWxlIG5hbWUgd2lsbCBiZSBhIG1peCBvZiB0aGUgbmFtZSBvZiB0aGUgbWFpbiBXaWRnZXQgKyAiTG9hZGVyIi4gRm9yIGV4YW1wbGU6IGBJbmRleExvYWRlcmAuIEl0IGlzIHVwIHRvIHlvdSB3aGljaCBmaWxlIHRvIHVzZSBhcyB0aGUgcHJpbWFyeSBtZWFucyBvZiBhY2Nlc3NpbmcgeW91ciBhcHBsaWNhdGlvbi4KCi0gKipgY3JlYXRlTG9hZGVyV2lkZ2V0YDogYm9vbGVhbioqIC0gU2hvdWxkIHRoZSBXaWRnZXQgTG9hZGVyIGJlIGNyZWF0ZWQ/Ci0gKipgbG9hZGluZ0NvbXBvbmVudEZpbGVgOiBzdHJpbmcgKG9wdGlvbmFsKSoqIC0gUGF0aCB0byB0aGUgY29tcG9uZW50IHRoYXQgd2lsbCBzZXJ2ZSBhcyBsb2FkaW5nIHdoaWxlIHRoZSBtYWluIFdpZGdldCBjb250ZW50IGlzIGxvYWRlZC4KLSAqKmBsb2FkaW5nQ29tcG9uZW50TmFtZWA6IHN0cmluZyAob3B0aW9uYWwpKiogLSBFeGFjdCBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgbG9hZGVkIHZpYSBgbG9hZGluZ0NvbXBvbmVudEZpbGVgLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxvYWRpbmcgZmlsZSBoYXMgdGhpcyBzdHJ1Y3R1cmU6CgpgYGB0c3gKY29uc3QgU3VzcGVuc2VMb2FkaW5nID0gKCkgPT4gPHA+TG9hZGluZy4uLjwvcD47CmBgYAoKU28gdGhlIG5hbWUgbXVzdCBiZSAqKlN1c3BlbnNlTG9hZGluZyoqLgoKKipDb25maWcgRXhhbXBsZSoqCgpgYGBqc29uCiJvcHRpb25zIjogewogICAgImNyZWF0ZUxvYWRlcldpZGdldCI6IHRydWUsCiAgICAibG9hZGluZ0NvbXBvbmVudEZpbGUiOiAic3JjL2NvbXBvbmVudHMvU3VzcGVuc2VMb2FkaW5nLnRzeCIsCiAgICAibG9hZGluZ0NvbXBvbmVudE5hbWUiOiAiU3VzcGVuc2VMb2FkaW5nIgogIH0KYGBgCgojIyBLZWVwIFJvdXRlCgpga2VlcFJvdXRlYCBpcyBvbmx5IHZhbGlkIGR1cmluZyBkZXZlbG9wbWVudCwgYW5kIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgaW4gcHJvZHVjdGlvbi4KClRoaXMgcHJvcGVydHkgZGVmaW5lcyB3aGV0aGVyIHRoZSByb3V0ZSBzaG91bGQgcmVtYWluIHRoZSBzYW1lIGR1cmluZyByZWZyZXNoZXMuIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgYFJvdXRlcmAgdHlwZSBpcyBgIkNvbnRlbnRCYXNlZCJgLgoKRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLgoKYGBganNvbgp7CiAgLy8gLi4uCiAgIm9wdGlvbnMiOiB7CiAgICAia2VlcFJvdXRlIjogdHJ1ZQogIH0KfQpgYGAKCiMjIEhpZGUgQWzDqW0gQmFyCgpZb3UgY2FuIHVzZSBgb3B0aW9ucy5oaWRlQWxlbUJhcmAgdG8gcHJldmVudCB0aGUgQWzDqW0gdG9wIGJhciBmcm9tIGJlaW5nIGRpc3BsYXllZC4gVGhpcyBzZXR0aW5nIGFwcGxpZXMgb25seSBpbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCgpgYGBqc29uCnsKICAvLyAuLi4KICAib3B0aW9ucyI6IHsKICAgICJoaWRlQWxlbUJhciI6IHRydWUKICB9Cn0KYGBgCgojIExvY2FsIE1vZHVsZXMgT3B0aW9ucwoKQWxsIGZpbGVzIGluc2lkZSB0aGUgYHNyYy9tb2R1bGVzYCBmb2xkZXIgd2lsbCBiZSBjb21waWxlZCBhcyBsb2NhbCBtb2R1bGVzLiBUbyBmaWx0ZXIgYW55IGZpbGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBjb21waWxlciBldmVuIHRob3VnaCBpdCBpcyBpbiB0aGUgYHNyYy9tb2R1bGVzYCBmb2xkZXIsIHlvdSBtdXN0IG1ha2UgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uOgoKSW5zaWRlIHRoZSBgYWxlbS5jb25maWcuanNvbmAgZmlsZSBhZGQgdGhlIGxpc3Qgb2YgcGFydCBvZiBmaWxlIG5hbWVzIHlvdSB3YW50IHRvIGlnbm9yZS4KCmBgYGpzb24KIm1vZHVsZXMiOiB7CiAgImlnbm9yZUZpbGVJZkluY2x1ZGVzIjogWyJzdHlsZXMiXQp9CmBgYAoKSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGFueSBmaWxlIHRoYXQgaGFzICJzdHlsZXMiIGFzIHBhcnQgb2YgaXRzIG5hbWUgd2lsbCBiZSBpZ25vcmVkIGFuZCB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgbm9ybWFsIGZpbGUgKHNjcmlwdCBmaWxlLCBzdGF0ZWxlc3MgY29tcG9uZW50IG9yIHN0YXRlZnVsIGNvbXBvbmVudCkuCg==`, "base64").toString("utf-8"); return } diff --git a/src/md/Environment.tsx b/src/md/Environment.tsx index e2bef47..c95a466 100644 --- a/src/md/Environment.tsx +++ b/src/md/Environment.tsx @@ -1,7 +1,7 @@ import { Markdown } from 'alem'; const Environment = () => { - const mdContent = Buffer.from(`IyBFbnZpcm9ubWVudAoKQ3JlYXRlIGEgYC5lbnZgIGZpbGUgdG8gc2V0IHVwIHRoZSBwcm9qZWN0J3MgZW52aXJvbm1lbnQgYW5kIG90aGVyIHZhcnMuCgoqKmUuZzoqKiBpZiB5b3UgYWRkIGBOT0RFX0VOVj1kZXZlbG9wbWVudGAgdG8geW91ciBgLmVudmAgZmlsZS4gVGhpcyB3aWxsIHNldCB0aGUgcHJvamVjdCBlbnYgYXMgYGRldmVsb3BtZW50YC4KClRoZSBhYnNlbmNlIG9mIHRoZSBgLmVudmAgZmlsZSBtZWFucyB0aGF0IGBOT0RFX0VOVj1wcm9kdWN0aW9uYC4KCllvdSBjYW4gdXNlIGBnZXRBbGVtRW52aXJvbm1lbnQoKWAgcHJvdmlkZWQgYnkgQWzDqW0gdG8gYWNjZXNzIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhbHVlLgo=`, "base64").toString("utf-8"); + const mdContent = Buffer.from(`IyBFbnZpcm9ubWVudAoKQ3JlYXRlIGEgYC5lbnZgIGZpbGUgdG8gc2V0IHVwIHRoZSBwcm9qZWN0J3MgZW52aXJvbm1lbnQgYW5kIG90aGVyIHZhcnMuCgoqKmUuZzoqKiBpZiB5b3UgYWRkIGBOT0RFX0VOVj1kZXZlbG9wbWVudGAgdG8geW91ciBgLmVudmAgZmlsZS4gVGhpcyB3aWxsIHNldCB0aGUgcHJvamVjdCBlbnYgYXMgYGRldmVsb3BtZW50YC4KClRoZSBhYnNlbmNlIG9mIHRoZSBgLmVudmAgZmlsZSBtZWFucyB0aGF0IGBOT0RFX0VOVj1wcm9kdWN0aW9uYC4KCllvdSBjYW4gdXNlIGBnZXRBbGVtRW52aXJvbm1lbnQoKWAgcHJvdmlkZWQgYnkgQWzDqW0gdG8gYWNjZXNzIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHZhbHVlLgoKIyBBdmFpbGFibGUgQWzDqW0gRW52IFZhcnMKCmBgYHNoCiMgQWzDqW0gZW52aXJvbm1lbnQgKGRlZmF1bHQgaXMgcHJvZHVjdGlvbikKTk9ERV9FTlY9ZGV2ZWxvcG1lbnQKYGBgCgpgYGBzaAojIFNob3VsZCBmaW5hbCBmaWxlIGJlIG1pbmlmaWVkPyAoZGVmYXVsdCBpcyB0cnVlKQpNSU5JRlk9dHJ1ZQpgYGAKCmBgYHNoCiMgU2F2ZSBmaWxlIHNjaGVtYXM/IChkZWZhdWx0IGlzIGZhbHNlKS4gVGhpcyBpcyB1c2VmdWwgdG8gZXZhbHVhdGUgaG93IGZpbGVzIGFyZSBiZWluZyBoYW5kbGVkLgpTQVZFX1NDSEVNQVM9ZmFsc2UKYGBgCgpgYGBzaAojIFNob3cgaG93IGxvbmcgaXQncyB0YWtpbmcgdG8gY29tcGlsZSBmaWxlcy4gKGRlZmF1bHQgaXMgZmFsc2UpLiBUaGlzIGlzIHV0aWwgZHVyaW5nIEFsw6ltIGVuaGFuY2VtZW50cyAvIG5ldyBpbXBsZW1lbnRhdGlvbnMgb3IgYnVnIGZpeGVzClNIT1dfRVhFQ1VUSU9OX1RJTUU9ZmFsc2UKYGBgCg==`, "base64").toString("utf-8"); return } diff --git a/src/md/FeatureOverview.tsx b/src/md/FeatureOverview.tsx index 15556c0..f17dd61 100644 --- a/src/md/FeatureOverview.tsx +++ b/src/md/FeatureOverview.tsx @@ -1,7 +1,7 @@ import { Markdown } from 'alem'; const FeatureOverview = () => { - const mdContent = Buffer.from(`IyBGZWF0dXJlIE92ZXJ2aWV3CgpBbGVtIGlzIGEgd2ViMyAqKkphdmFTY3JpcHQqKiAvICoqVHlwZVNjcmlwdCoqIGxpYnJhcnkgdG8gY3JlYXRlIHdlYjMgYXBwcyBmb3IgTmVhciBCT1MuIFlvdSBjYW4gY3JlYXRlIHlvdXIgYXBwbGljYXRpb25zIGluIGEgc2ltaWxhciB3YXkgdG8gUmVhY3QuIEFsbCBjb21wb25lbnRzIGFuZCBvdGhlciByZXNvdXJjZXMgd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGEgZmlsZSB1bmRlcnN0YW5kYWJsZSBieSBOZWFyIFZNLgoKQWxlbSBtYWtlcyBpdCBwYWlubGVzcyB0byBjcmVhdGUgaW50ZXJhY3RpdmUgVUlzLiBEZXNpZ24gc2ltcGxlIHZpZXdzIGZvciBlYWNoIHN0YXRlIGluIHlvdXIgYXBwbGljYXRpb24uIERlY2xhcmF0aXZlIHZpZXdzIG1ha2UgeW91ciBjb2RlIG1vcmUgcHJlZGljdGFibGUsIHNpbXBsZXIgdG8gdW5kZXJzdGFuZCwgYW5kIGVhc2llciB0byBkZWJ1Zy4KCkJ1aWxkIGVuY2Fwc3VsYXRlZCBjb21wb25lbnRzIHRoYXQgbWFuYWdlIHRoZWlyIG93biBzdGF0ZSwgdGhlbiBjb21wb3NlIHRoZW0gdG8gbWFrZSBjb21wbGV4IFVJcy4gU2luY2UgY29tcG9uZW50IGxvZ2ljIGlzIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdCwgeW91IGNhbiBlYXNpbHkgcGFzcyByaWNoIGRhdGEgdGhyb3VnaCB5b3VyIGFwcC4KCioqVGlwOioqIFVzZSBmdW5jdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLiBFdmVuIGlmIGl0IGlzIGFuIG9iamVjdCB0byBiZSBzaGFyZWQsIHVzZSBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb2JqZWN0LiBFLmcuOgoKYGBgdHMKZXhwb3J0IGNvbnN0IHV0aWxzID0gKCkgPT4gKHsKICBjb250cmFjdElkOiAiY29udHJhY3QtZm9vLm5lYXIiLAogIGdldEl0ZW1zOiAoKSA9PiBTdG9yYWdlLmdldCgiaXRlbXMiKSwKICAvLyAuLi4KfSk7CmBgYAoKIyMgQ29tcG9uZW50CgpZb3UgY2FuIGNyZWF0ZSBhbnkgY29tcG9uZW50IGZpbGUgdXNpbmcgKipKYXZhU2NyaXB0Kiogb3IgKipUeXBlU2NyaXB0KiouIFRoZSBlbnRyeXBvaW50IG11c3QgYmUgYW4gQXBwIGNvbXBvbmVudCBsaWtlIHNvOgoKYGBgdHN4CmNvbnN0IEFwcCA9ICgpID0+IHsKICByZXR1cm4gKAogICAgPD4KICAgICAgPGgxPkhlbGxvIFdvcmxkPC9oMT4KICAgIDwvPgogICk7Cn07CgpleHBvcnQgZGVmYXVsdCBBcHA7CmBgYAoKIyMgQ29tcG9uZW50IFByb3BzCgpQYXNzaW5nIHByb3BlcnRpZXMgdG8gYSBjb21wb25lbnQgaXMgdmVyeSBzaW1wbGUuIEp1c3QgdXNlIHJlYWN0J3MgZGVmYXVsdHM6CgpgYGB0c3gKZXhwb3J0IGNvbnN0IENvbXBvbmVudEEgPSAoeyBuYW1lIH06IHsgbmFtZTogc3RyaW5nIH0pID0+IHsKICByZXR1cm4gPHA+e25hbWV9PC9wPjsKfTsKCmV4cG9ydCBjb25zdCBDb21wb25lbnRCID0gKCkgPT4gewogIHJldHVybiA8Q29tcG9uZW50QSBuYW1lPSJXZW5keiIgLz47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QyA9IChjb21wb25lbnRQcm9wczogeyBuYW1lOiBzdHJpbmcgfSkgPT4gewogIHJldHVybiA8cD57Y29tcG9uZW50UHJvcHMubmFtZX08L3A+Owp9OwpgYGAKCiMgR29vZCB0byBLbm93CgojIyBTdGF0ZWZ1bCAmIFN0YXRlbGVzcyBDb21wb25lbnRzCgpTdGF0ZWZ1bCBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBXaWRnZXRzIGJ5IEFsw6ltLCB3aGlsZSBTdGF0ZWxlc3MgY29tcG9uZW50cyBhcmUgc2VlbiBhcyBhdXhpbGlhcnkgcmVzb3VyY2VzIGluamVjdGVkIGludG8gdGhlIFdpZGdldHMgdGhhdCBpbXBvcnQgdGhlbS4KClVzaW5nIGFueSBvZiB0aGVzZSBmZWF0dXJlcyB3aWxsIGNhdXNlIGEgY29tcG9uZW50IHRvIGJlIGNvbnNpZGVyZWQgU3RhdGVmdWw6CgpgYGB0cwpjb25zdCBbZm9vLCBzZXRGb29dID0gdXNlU3RhdGUoYmFyKTsKdXNlRWZmZWN0KCgpID0+IHt9LCBbXSk7CnVzZU1lbW8oKCkgPT4ge30sIFtdKTsKU3RhdGUuaW5pdCh7fSk7CmBgYAoKRXhhbXBsZSBvZiBzdGF0ZWxlc3MgYW5kIHN0YXRlZnVsIGNvbXBvbmVudHM6CgpgYGB0c3gKLy8gU3RhdGVsZXNzIGNvbXBvbmVudApjb25zdCBIZXJvID0gKHsgbGFiZWwgfTogeyBsYWJlbDogc3RyaW5nIH0pID0+IHsKICByZXR1cm4gPHA+SGVybyBCYXIgLSB7bGFiZWx9PC9wPjsKfTsKYGBgCgpgYGB0c3gKLy8gU3RhdGVmdWwgY29tcG9uZW50CmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICJhbGVtIjsKCmNvbnN0IEZvb3RlciA9ICgpID0+IHsKICBjb25zdCBbZm9vdGVyTGFiZWxdID0gdXNlU3RhdGUoIlRoaXMgaXMgZm9vdGVyIik7CgogIHJldHVybiA8cD57Zm9vdGVyTGFiZWx9PC9wPjsKfTsKYGBgCgpOb3csIGxldCdzIGltcGxlbWVudCB0aGUgY29tcG9uZW50IHRoYXQgaXMgZ29pbmcgdG8gaW1wb3J0IGJvdGggY29tcG9uZW50cyBhYm92ZToKCmBgYHRzeAovLyBTdGF0ZWZ1bCBjb21wb25lbnQKaW1wb3J0IHsgU3RhdGUsIHN0YXRlIH0gZnJvbSAiYWxlbSI7CmltcG9ydCBIZXJvIGZyb20gIi4vSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiLi9Gb290ZXIiOwoKY29uc3QgTXlTdGF0ZWZ1bENvbXBvbmVudCA9ICgpID0+IHsKICBTdGF0ZS5pbml0KHsgdmVyc2lvbjogMSB9KTsgLy8gQW55IHJhbmRvbSBpbmZvcm1hdGlvbgoKICByZXR1cm4gKAogICAgPD4KICAgICAgPHA+VmVyc2lvbjoge3N0YXRlLnZlcnNpb259PC9wPgogICAgICA8SGVybyBsYWJlbD17c3RhdGUudmVyc2lvbn0gLz4KICAgICAgPEZvb3RlciAvPgogICAgPC8+CiAgKTsKfTsKYGBgCgojIyBUU1ggJiBKU1gKCkEgLnRzeC8uanN4IGZpbGUgY2FuIGhhdmUgb25seSBvbmUgc3RhdGVmdWwgY29tcG9uZW50LiBZb3UgY2FuIGNyZWF0ZSBvdGhlciBpbnRlcm5hbCBjb21wb25lbnRzIHdpdGhpbiB0aGUgY29tcG9uZW50J3MgZnVuY3Rpb24uCgrinIUgKiotIFJpZ2h0KioKCmBgYHRzeAppbXBvcnQgeyBTdGF0ZSwgc3RhdGUgfSBmcm9tICJhbGVtIjsKCmNvbnN0IE15U3RhdGVmdWxDb21wb25lbnQgPSAoKSA9PiB7CiAgU3RhdGUuaW5pdCh7IG5hbWU6ICJXZW5keiIgfSk7CgogIHJldHVybiA8cD5vaSB7c3RhdGUubmFtZX08L3A+Owp9OwoKZXhwb3J0IGRlZmF1bHQgTXlTdGF0ZWZ1bENvbXBvbmVudDsKYGBgCgrinYwgKiotIFdyb25nKioKCmBgYHRzeAppbXBvcnQgeyBTdGF0ZSwgc3RhdGUgfSBmcm9tICJhbGVtIjsKCmNvbnN0IE15U3RhdGVmdWxDb21wb25lbnQgPSAoKSA9PiB7CiAgU3RhdGUuaW5pdCh7IG5hbWU6ICJXZW5keiIgfSk7CgogIHJldHVybiA8cD5vaSB7c3RhdGUubmFtZX08L3A+Owp9OwoKZXhwb3J0IGRlZmF1bHQgTXlTdGF0ZWZ1bENvbXBvbmVudDsKCi8vIFNlY29uZCBzdGF0ZWZ1bCBjb21wb25lbnQgYXQgdGhlIHNhbWUgZmlsZS4gVGhpcyBpcyBnb2luZyB0byBmYWlsIQpleHBvcnQgY29uc3QgT3RoZXJTdGF0ZWZ1bENvbXBvbmVudCA9ICgpID0+IHsKICBTdGF0ZS5pbml0KHsgYWdlOiAyMiB9KTsKCiAgcmV0dXJuIDxwPkFnZToge3N0YXRlLmFnZX08L3A+Owp9OwpgYGAKClN0YXRlbGVzcyBjb21wb25lbnRzIGNhbiBoYXZlIGFzIG1hbnkgY29tcG9uZW50cyBhcyB5b3Ugd2FudCBpbiBvbmUgZmlsZS4KCuKchSAqKi0gUmlnaHQqKgoKYGBgdHN4Ci8vIEdyb3VwIG9mIHN0YXRlbGVzcyBjb21wb25lbnRzCmV4cG9ydCBjb25zdCBDb21wb25lbnRBID0gKGNvbXBvbmVudFByb3BzKSA9PiB7CiAgLy8gLi4uCiAgcmV0dXJuIDxwPm9pIHtjb21wb25lbnRQcm9wcy5uYW1lfTwvcD47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QiA9IChjb21wb25lbnRQcm9wcykgPT4gewogIC8vIC4uLgogIHJldHVybiA8cD5Ib2xhIHtjb21wb25lbnRQcm9wcy5uYW1lfTwvcD47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QyA9IChjb21wb25lbnRQcm9wcykgPT4gewogIC8vIC4uLgogIHJldHVybiAoCiAgICA8PgogICAgICA8cD5IaSB7Y29tcG9uZW50UHJvcHMubmFtZX08L3A+CiAgICAgIDxDb21wb25lbnRCIC8+CiAgICAgIDxDb21wb25lbnRBIC8+CiAgICA8Lz4KICApOwp9OwpgYGAKCiMjIFByZXBhcmluZyB0aGUgUmVzb3VyY2VzCgpQcmVmZXIgdG8gY3JlYXRlIG9uZSBmaWxlIHBlciByZXNvdXJjZSwgYXMgaW1wb3J0aW5nIGEgcmVzb3VyY2UgZnJvbSBhIGAudHMvLmpzYCBmaWxlIHdpbGwgaW5qZWN0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhhdCBmaWxlIGludG8gdGhlIFdpZGdldC4gVGhlIHNhbWUgZ29lcyBmb3Igc3RhdGVsZXNzIGNvbXBvbmVudHMuCgojIyBDb21tZW50cwoKVGhpcyBtYXkgYmUgb2J2aW91cyBidXQgdXNlIHRoZSBjb3JyZWN0IGZvcm0gb2YgY29tbWVudHMgZHVyaW5nIGRldmVsb3BtZW50IGZvciAqKkNTUyoqIGFuZCAqKnN0eWxlZC1jb21wb25lbnRzKiouCgpgYGBjc3MKLyogY3NzIGZpbGUgKi8KCi5teS1jbGFzcyB7CiAgLyogQ29ycmVjdCAqLwogIGRpc3BsYXk6IGZsZXg7CiAgLy8gSW5jb3JyZWN0CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmBgYAoKYGBgdHN4Ci8vIHRzeCBvciBqc3ggZmlsZSB1c2luZyBzdHlsZWQgY29tcG9uZW50cwppbXBvcnQgc3R5bGVkIGZyb20gInN0eWxlZC1jb21wb25lbnRzIjsKCmV4cG9ydCBjb25zdCBBcHBDb250YWluZXIgPSBzdHlsZWQuZGl2YAogIGRpc3BsYXk6IGZsZXg7CiAgLyogQ29ycmVjdCAqLwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgLy8gSW5jb3JyZWN0CiAgZm9udC1mYW1pbHk6ICJXaXggTWFkZWZvciBEaXNwbGF5Iiwgc2Fucy1zZXJpZjsKCiAgQG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQpgOwpgYGAKCiMjIEFzeW5jIC8gQXdhaXQKClRoZSB1c2Ugb2YgYGFzeW5jL2F3YWl0YCBpcyBzdXBwb3J0ZWQgYW5kIGV4cGVyaW1lbnRhbC4gSXQgc2hvdWxkIGJlIHVzZWQgb25seSBpbiB0aGUgbWFpbiBzY29wZSBvZiB0aGUgY29tcG9uZW50LiBJdCB3aWxsIG1ha2UgY2hhbmdlcyB0byB0aGUgc3RhdGUgb2YgdGhlIG1haW4gV2lkZ2V0LiBEbyBub3QgdXNlIGluIGhvb2tzLiBCZWxvdyBpcyBhbiBleGFtcGxlIG9mIHVzYWdlOgoKYGBgdHN4CmltcG9ydCB7IGZldGNoLCB1c2VFZmZlY3QgfSBmcm9tICJhbGVtIjsKCmNvbnN0IFNvbWVDb21wb25lbnQgPSAoKSA9PiB7CiAgY29uc3QgZmV0Y2hJdGVtcyA9IGFzeW5jICgpID0+IHsKICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgZmV0Y2goImh0dHBzOi8vYXBpLmNvbS9pdGVtcyIpOwogIH07CgogIHVzZUVmZmVjdCgoKSA9PiB7CiAgICBmZXRjaEl0ZW1zKCk7CiAgfSwgW10pOwoKICBjb25zb2xlLmxvZyhpdGVtcyk7CgogIHJldHVybiA8PjwvPjsKfTsKYGBgCgojIExpbWl0YXRpb25zCgojIyBJbXBvcnQgXCoKClRoZSB1c2Ugb2YgdGhlIGBpbXBvcnQgKiBmb28gZnJvbSAnLi9mb28nYCBzaWduYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgYXMgdGhlIGlkZWEgaXMgdG8gaW1wb3J0IG9ubHkgdGhlIG5lY2Vzc2FyeSBmcmFnbWVudHMgaW50byB0aGUgV2lkZ2V0LgoKIyMgSW50ZXJuYWwgRHVwbGljYXRlIEl0ZW1zCgpBbMOpbSBmaXhlcyBkdXBsaWNhdGUgaXRlbSBuYW1lcyBiZWluZyBleHBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24gYXV0b21hdGljYWxseSwgYnV0IHlvdSBzaG91bGQgYXZvaWQgaW1wb3J0aW5nIGEgcmVzb3VyY2UgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhbnkgdmFyaWFibGUgd2l0aGluIHlvdXIgY29tcG9uZW50LiBFLmcuOgoK4pyFICoqLSBSaWdodCoqCgpgYGB0cwovLyBhQ29udHJhY3QudHMKZXhwb3J0IGNvbnN0IGNvbnRyYWN0SWQgPSAiY29udHJhY3QtaWQtYS5uZWFyIjsKLy8gLi4uCmBgYAoKYGBgdHMKLy8gSG9tZVBhZ2UudHN4CmltcG9ydCB7IGNvbnRyYWN0SWQgfSBmcm9tICcuL2NvbnRyYWN0SWQnOwoKY29uc3QgSG9tZVBhZ2UgPSAoKSA9PiB7CiAgY29uc3QgY29udHJhY3RJZF9CID0gImNvbnRyYWN0LWlkLWIubmVhciIKCiAgcmV0dXJuICgKICAgIC8vIC4uLgogICkKfQoKZXhwb3J0IGRlZmF1bHQgSG9tZVBhZ2U7CmBgYAoK4p2MICoqLSBXcm9uZyoqCgpgYGB0cwovLyBhQ29udHJhY3QudHMKZXhwb3J0IGNvbnN0IGNvbnRyYWN0SWQgPSAiY29udHJhY3QtaWQtYS5uZWFyIjsKZXhwb3J0IGNvbnN0IGNvbnRyYWN0SWRfQyA9ICJjb250cmFjdC1pZC1jLm5lYXIiOwovLyAuLi4KYGBgCgpgYGB0cwovLyBIb21lUGFnZS50c3gKaW1wb3J0IHsgY29udHJhY3RJZF9DIH0gZnJvbSAnLi9jb250cmFjdElkJzsKCmNvbnN0IEhvbWVQYWdlID0gKCkgPT4gewogIC8vIEVSUk9SOiB0aGlzIHdpbGwgYnJlYWsgdGhlIGFwcGxpY2F0aW9uIGJlY2F1c2UgdGhlICJjb250cmFjdElkIiBmcm9tIGFDb250cmFjdC50cyBpcyBhbHNvIGdvaW5nIHRvIGJlCiAgLy8gaW5qZWN0ZWQgdG8gdGhlIGZpbmFsIGZpbGUgYWZ0ZXIgY29tcGlsYXRpb24uCiAgY29uc3QgY29udHJhY3RJZCA9ICJjb250cmFjdC1pZC1iLm5lYXIiOwoKICByZXR1cm4gKAogICAgLy8gLi4uCiAgKQp9CgpleHBvcnQgZGVmYXVsdCBIb21lUGFnZTsKYGBgCgojIyBTdWItQ29tcG9uZW50cyAmIENvbXBvbmVudHMKCkF0IHRoZSBtb21lbnQsIGlmIHlvdSBoYXZlIGEgY29tcG9uZW50IHdpdGggc3ViLWNvbXBvbmVudHMsIGFuZCB5b3UgYWxzbyBoYXZlIGFub3RoZXIgY29tcG9uZW50IGJlaW5nIGltcG9ydGVkIHRoYXQgdXNlcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzdWItY29tcG9uZW50LCBhIGNvbXBpbGF0aW9uIGZhaWx1cmUgbWF5IG9jY3VyIGFzIGN1cnJlbnRseSB0aGUgY29tcGlsZXIgYXV0b21hdGljYWxseSByZW5hbWVzIGR1cGxpY2F0ZSBjb21wb25lbnQgbmFtZXMuCgpGb3IgZXhhbXBsZToKCuKdjCAqKi0gQXZvaWQgaXQqKgoKYGBgdHN4Ci8vIEV4cG9ydGluZyBjb21wb25lbnRzCmV4cG9ydCBjb25zdCBDb250ZW50ID0gKCkgPT4gPHA+QTwvcD47CmBgYAoKYGBgdHN4Ci8vIEltcG9ydGluZyBjb21wb25lbnRzICsgVXNpbmcgUmFkaXggY29tcG9uZW50cwppbXBvcnQgeyBDb250ZW50IH0gZnJvbSAiLi9Gb28iOwoKY29uc3QgTXlDb21wb25lbnQgPSAoKSA9PiB7CiAgcmV0dXJuICgKICAgIDw+CiAgICAgIHsvKiBSYWRpeCBTZWxlY3QgY29tcG9uZW50ICovfQogICAgICA8U2VsZWN0LkNvbnRlbnQ+CiAgICAgICAgPENvbnRlbnQgLz4KICAgICAgPC9TZWxlY3QuQ29udGVudD4KICAgIDwvPgogICk7Cn07CmBgYAoKSWYgYnkgY2hhbmNlLCBpbiBhbm90aGVyIGZpbGUgdGhlcmUgaXMgYW5vdGhlciBjb21wb25lbnQgd2l0aCB0aGUgbmFtZSBgQ29udGVudGAsIHRoZSBgQ29udGVudGAgYmVpbmcgaW1wb3J0ZWQgd2lsbCBoYXZlIGl0cyBuYW1lIGNoYW5nZWQgYXV0b21hdGljYWxseSBhbmQgdGhpcyB3aWxsIGFsc28gYWZmZWN0IGBTZWxlY3QuQ29udGVudGAsIHRodXMgZ2VuZXJhdGluZyBhbiBlcnJvci4KClRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgaWYgYSBzdWItY29tcG9uZW50IGlzIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSwgY2hhbmdlIHRoZSBjb21wb25lbnQgbmFtZToKCuKchSAqKi0gUmlnaHQqKgoKYGBgdHN4Ci8vIEV4cG9ydGluZyBjb21wb25lbnRzCmV4cG9ydCBjb25zdCBDb250ZW50Rm9vID0gKCkgPT4gPHA+QTwvcD47CmBgYAoKYGBgdHN4Ci8vIEltcG9ydGluZyBjb21wb25lbnRzICsgVXNpbmcgUmFkaXggY29tcG9uZW50cwppbXBvcnQgeyBDb250ZW50Rm9vIH0gZnJvbSAiLi9Gb28iOwoKY29uc3QgTXlDb21wb25lbnQgPSAoKSA9PiB7CiAgcmV0dXJuICgKICAgIDw+CiAgICAgIHsvKiBSYWRpeCBTZWxlY3QgY29tcG9uZW50ICovfQogICAgICA8U2VsZWN0LkNvbnRlbnQ+CiAgICAgICAgPENvbnRlbnRGb28gLz4KICAgICAgPC9TZWxlY3QuQ29udGVudD4KICAgIDwvPgogICk7Cn07CmBgYAoKVGhpcyB3YXksIGlmIGBDb250ZW50Rm9vYCBoYXMgaXRzIG5hbWUgY2hhbmdlZCBieSB0aGUgY29tcGlsZXIsIHRoZSBzdWItY29tcG9uZW50IChTZWxlY3QgLT4gKipDb250ZW50KiopIGBTZWxlY3QuQ29udGVudGAgd2lsbCBub3QgYmUgY2hhbmdlZC4K`, "base64").toString("utf-8"); + const mdContent = Buffer.from(`IyBGZWF0dXJlIE92ZXJ2aWV3CgpBbGVtIGlzIGEgd2ViMyAqKkphdmFTY3JpcHQqKiAvICoqVHlwZVNjcmlwdCoqIGxpYnJhcnkgdG8gY3JlYXRlIHdlYjMgYXBwcyBmb3IgTmVhciBCT1MuIFlvdSBjYW4gY3JlYXRlIHlvdXIgYXBwbGljYXRpb25zIGluIGEgc2ltaWxhciB3YXkgdG8gUmVhY3QuIEFsbCBjb21wb25lbnRzIGFuZCBvdGhlciByZXNvdXJjZXMgd2lsbCBiZSB0cmFuc2Zvcm1lZCBpbnRvIGEgZmlsZSB1bmRlcnN0YW5kYWJsZSBieSBOZWFyIFZNLgoKQWxlbSBtYWtlcyBpdCBwYWlubGVzcyB0byBjcmVhdGUgaW50ZXJhY3RpdmUgVUlzLiBEZXNpZ24gc2ltcGxlIHZpZXdzIGZvciBlYWNoIHN0YXRlIGluIHlvdXIgYXBwbGljYXRpb24uIERlY2xhcmF0aXZlIHZpZXdzIG1ha2UgeW91ciBjb2RlIG1vcmUgcHJlZGljdGFibGUsIHNpbXBsZXIgdG8gdW5kZXJzdGFuZCwgYW5kIGVhc2llciB0byBkZWJ1Zy4KCkJ1aWxkIGVuY2Fwc3VsYXRlZCBjb21wb25lbnRzIHRoYXQgbWFuYWdlIHRoZWlyIG93biBzdGF0ZSwgdGhlbiBjb21wb3NlIHRoZW0gdG8gbWFrZSBjb21wbGV4IFVJcy4gU2luY2UgY29tcG9uZW50IGxvZ2ljIGlzIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdCwgeW91IGNhbiBlYXNpbHkgcGFzcyByaWNoIGRhdGEgdGhyb3VnaCB5b3VyIGFwcC4KCioqVGlwOioqIFVzZSBmdW5jdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLiBFdmVuIGlmIGl0IGlzIGFuIG9iamVjdCB0byBiZSBzaGFyZWQsIHVzZSBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb2JqZWN0LiBFLmcuOgoKYGBgdHMKZXhwb3J0IGNvbnN0IHV0aWxzID0gKCkgPT4gKHsKICBjb250cmFjdElkOiAiY29udHJhY3QtZm9vLm5lYXIiLAogIGdldEl0ZW1zOiAoKSA9PiBTdG9yYWdlLmdldCgiaXRlbXMiKSwKICAvLyAuLi4KfSk7CmBgYAoKIyMgQ29tcG9uZW50CgpZb3UgY2FuIGNyZWF0ZSBhbnkgY29tcG9uZW50IGZpbGUgdXNpbmcgKipKYXZhU2NyaXB0Kiogb3IgKipUeXBlU2NyaXB0KiouIFRoZSBlbnRyeXBvaW50IG11c3QgYmUgYW4gQXBwIGNvbXBvbmVudCBsaWtlIHNvOgoKYGBgdHN4CmNvbnN0IEFwcCA9ICgpID0+IHsKICByZXR1cm4gKAogICAgPD4KICAgICAgPGgxPkhlbGxvIFdvcmxkPC9oMT4KICAgIDwvPgogICk7Cn07CgpleHBvcnQgZGVmYXVsdCBBcHA7CmBgYAoKIyMgQ29tcG9uZW50IFByb3BzCgpQYXNzaW5nIHByb3BlcnRpZXMgdG8gYSBjb21wb25lbnQgaXMgdmVyeSBzaW1wbGUuIEp1c3QgdXNlIHJlYWN0J3MgZGVmYXVsdHM6CgpgYGB0c3gKZXhwb3J0IGNvbnN0IENvbXBvbmVudEEgPSAoeyBuYW1lIH06IHsgbmFtZTogc3RyaW5nIH0pID0+IHsKICByZXR1cm4gPHA+e25hbWV9PC9wPjsKfTsKCmV4cG9ydCBjb25zdCBDb21wb25lbnRCID0gKCkgPT4gewogIHJldHVybiA8Q29tcG9uZW50QSBuYW1lPSJXZW5keiIgLz47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QyA9IChjb21wb25lbnRQcm9wczogeyBuYW1lOiBzdHJpbmcgfSkgPT4gewogIHJldHVybiA8cD57Y29tcG9uZW50UHJvcHMubmFtZX08L3A+Owp9OwpgYGAKCiMgR29vZCB0byBLbm93CgojIyBTdGF0ZWZ1bCAmIFN0YXRlbGVzcyBDb21wb25lbnRzCgpTdGF0ZWZ1bCBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBXaWRnZXRzIGJ5IEFsw6ltLCB3aGlsZSBTdGF0ZWxlc3MgY29tcG9uZW50cyBhcmUgc2VlbiBhcyBhdXhpbGlhcnkgcmVzb3VyY2VzIGluamVjdGVkIGludG8gdGhlIFdpZGdldHMgdGhhdCBpbXBvcnQgdGhlbS4KClVzaW5nIGFueSBvZiB0aGVzZSBmZWF0dXJlcyB3aWxsIGNhdXNlIGEgY29tcG9uZW50IHRvIGJlIGNvbnNpZGVyZWQgU3RhdGVmdWw6CgpgYGB0cwpjb25zdCBbZm9vLCBzZXRGb29dID0gdXNlU3RhdGUoYmFyKTsKdXNlRWZmZWN0KCgpID0+IHt9LCBbXSk7CnVzZU1lbW8oKCkgPT4ge30sIFtdKTsKU3RhdGUuaW5pdCh7fSk7CmBgYAoKRXhhbXBsZSBvZiBzdGF0ZWxlc3MgYW5kIHN0YXRlZnVsIGNvbXBvbmVudHM6CgpgYGB0c3gKLy8gU3RhdGVsZXNzIGNvbXBvbmVudApjb25zdCBIZXJvID0gKHsgbGFiZWwgfTogeyBsYWJlbDogc3RyaW5nIH0pID0+IHsKICByZXR1cm4gPHA+SGVybyBCYXIgLSB7bGFiZWx9PC9wPjsKfTsKYGBgCgpgYGB0c3gKLy8gU3RhdGVmdWwgY29tcG9uZW50CmltcG9ydCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tICJhbGVtIjsKCmNvbnN0IEZvb3RlciA9ICgpID0+IHsKICBjb25zdCBbZm9vdGVyTGFiZWxdID0gdXNlU3RhdGUoIlRoaXMgaXMgZm9vdGVyIik7CgogIHJldHVybiA8cD57Zm9vdGVyTGFiZWx9PC9wPjsKfTsKYGBgCgpOb3csIGxldCdzIGltcGxlbWVudCB0aGUgY29tcG9uZW50IHRoYXQgaXMgZ29pbmcgdG8gaW1wb3J0IGJvdGggY29tcG9uZW50cyBhYm92ZToKCmBgYHRzeAovLyBTdGF0ZWZ1bCBjb21wb25lbnQKaW1wb3J0IHsgU3RhdGUsIHN0YXRlIH0gZnJvbSAiYWxlbSI7CmltcG9ydCBIZXJvIGZyb20gIi4vSGVybyI7CmltcG9ydCBGb290ZXIgZnJvbSAiLi9Gb290ZXIiOwoKY29uc3QgTXlTdGF0ZWZ1bENvbXBvbmVudCA9ICgpID0+IHsKICBTdGF0ZS5pbml0KHsgdmVyc2lvbjogMSB9KTsgLy8gQW55IHJhbmRvbSBpbmZvcm1hdGlvbgoKICByZXR1cm4gKAogICAgPD4KICAgICAgPHA+VmVyc2lvbjoge3N0YXRlLnZlcnNpb259PC9wPgogICAgICA8SGVybyBsYWJlbD17c3RhdGUudmVyc2lvbn0gLz4KICAgICAgPEZvb3RlciAvPgogICAgPC8+CiAgKTsKfTsKYGBgCgojIyBUU1ggJiBKU1gKCkEgLnRzeC8uanN4IGZpbGUgY2FuIGhhdmUgb25seSBvbmUgc3RhdGVmdWwgY29tcG9uZW50LiBZb3UgY2FuIGNyZWF0ZSBvdGhlciBpbnRlcm5hbCBjb21wb25lbnRzIHdpdGhpbiB0aGUgY29tcG9uZW50J3MgZnVuY3Rpb24uCgrinIUgKiotIFJpZ2h0KioKCmBgYHRzeAppbXBvcnQgeyBTdGF0ZSwgc3RhdGUgfSBmcm9tICJhbGVtIjsKCmNvbnN0IE15U3RhdGVmdWxDb21wb25lbnQgPSAoKSA9PiB7CiAgU3RhdGUuaW5pdCh7IG5hbWU6ICJXZW5keiIgfSk7CgogIHJldHVybiA8cD5vaSB7c3RhdGUubmFtZX08L3A+Owp9OwoKZXhwb3J0IGRlZmF1bHQgTXlTdGF0ZWZ1bENvbXBvbmVudDsKYGBgCgrinYwgKiotIFdyb25nKioKCmBgYHRzeAppbXBvcnQgeyBTdGF0ZSwgc3RhdGUgfSBmcm9tICJhbGVtIjsKCmNvbnN0IE15U3RhdGVmdWxDb21wb25lbnQgPSAoKSA9PiB7CiAgU3RhdGUuaW5pdCh7IG5hbWU6ICJXZW5keiIgfSk7CgogIHJldHVybiA8cD5vaSB7c3RhdGUubmFtZX08L3A+Owp9OwoKZXhwb3J0IGRlZmF1bHQgTXlTdGF0ZWZ1bENvbXBvbmVudDsKCi8vIFNlY29uZCBzdGF0ZWZ1bCBjb21wb25lbnQgYXQgdGhlIHNhbWUgZmlsZS4gVGhpcyBpcyBnb2luZyB0byBmYWlsIQpleHBvcnQgY29uc3QgT3RoZXJTdGF0ZWZ1bENvbXBvbmVudCA9ICgpID0+IHsKICBTdGF0ZS5pbml0KHsgYWdlOiAyMiB9KTsKCiAgcmV0dXJuIDxwPkFnZToge3N0YXRlLmFnZX08L3A+Owp9OwpgYGAKClN0YXRlbGVzcyBjb21wb25lbnRzIGNhbiBoYXZlIGFzIG1hbnkgY29tcG9uZW50cyBhcyB5b3Ugd2FudCBpbiBvbmUgZmlsZS4KCuKchSAqKi0gUmlnaHQqKgoKYGBgdHN4Ci8vIEdyb3VwIG9mIHN0YXRlbGVzcyBjb21wb25lbnRzCmV4cG9ydCBjb25zdCBDb21wb25lbnRBID0gKGNvbXBvbmVudFByb3BzKSA9PiB7CiAgLy8gLi4uCiAgcmV0dXJuIDxwPm9pIHtjb21wb25lbnRQcm9wcy5uYW1lfTwvcD47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QiA9IChjb21wb25lbnRQcm9wcykgPT4gewogIC8vIC4uLgogIHJldHVybiA8cD5Ib2xhIHtjb21wb25lbnRQcm9wcy5uYW1lfTwvcD47Cn07CgpleHBvcnQgY29uc3QgQ29tcG9uZW50QyA9IChjb21wb25lbnRQcm9wcykgPT4gewogIC8vIC4uLgogIHJldHVybiAoCiAgICA8PgogICAgICA8cD5IaSB7Y29tcG9uZW50UHJvcHMubmFtZX08L3A+CiAgICAgIDxDb21wb25lbnRCIC8+CiAgICAgIDxDb21wb25lbnRBIC8+CiAgICA8Lz4KICApOwp9OwpgYGAKCiMjIFByZXBhcmluZyB0aGUgUmVzb3VyY2VzCgpQcmVmZXIgdG8gY3JlYXRlIG9uZSBmaWxlIHBlciByZXNvdXJjZSwgYXMgaW1wb3J0aW5nIGEgcmVzb3VyY2UgZnJvbSBhIGAudHMvLmpzYCBmaWxlIHdpbGwgaW5qZWN0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhhdCBmaWxlIGludG8gdGhlIFdpZGdldC4gVGhlIHNhbWUgZ29lcyBmb3Igc3RhdGVsZXNzIGNvbXBvbmVudHMuCgojIyBDb21tZW50cwoKVGhpcyBtYXkgYmUgb2J2aW91cyBidXQgdXNlIHRoZSBjb3JyZWN0IGZvcm0gb2YgY29tbWVudHMgZHVyaW5nIGRldmVsb3BtZW50IGZvciAqKkNTUyoqIGFuZCAqKnN0eWxlZC1jb21wb25lbnRzKiouCgpgYGBjc3MKLyogY3NzIGZpbGUgKi8KCi5teS1jbGFzcyB7CiAgLyogQ29ycmVjdCAqLwogIGRpc3BsYXk6IGZsZXg7CiAgLy8gSW5jb3JyZWN0CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CmBgYAoKYGBgdHN4Ci8vIHRzeCBvciBqc3ggZmlsZSB1c2luZyBzdHlsZWQgY29tcG9uZW50cwppbXBvcnQgc3R5bGVkIGZyb20gInN0eWxlZC1jb21wb25lbnRzIjsKCmV4cG9ydCBjb25zdCBBcHBDb250YWluZXIgPSBzdHlsZWQuZGl2YAogIGRpc3BsYXk6IGZsZXg7CiAgLyogQ29ycmVjdCAqLwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgLy8gSW5jb3JyZWN0CiAgZm9udC1mYW1pbHk6ICJXaXggTWFkZWZvciBEaXNwbGF5Iiwgc2Fucy1zZXJpZjsKCiAgQG1lZGlhIChtYXgtd2lkdGg6IDgwMHB4KSB7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgfQpgOwpgYGAKCiMgTGltaXRhdGlvbnMKCiMjIEltcG9ydCBcKgoKVGhlIHVzZSBvZiB0aGUgYGltcG9ydCAqIGZvbyBmcm9tICcuL2ZvbydgIHNpZ25hdHVyZSBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIGludGVudGlvbmFsLCBhcyB0aGUgaWRlYSBpcyB0byBpbXBvcnQgb25seSB0aGUgbmVjZXNzYXJ5IGZyYWdtZW50cyBpbnRvIHRoZSBXaWRnZXQuCgojIyBJbnRlcm5hbCBEdXBsaWNhdGUgSXRlbXMKCkFsw6ltIGZpeGVzIGR1cGxpY2F0ZSBpdGVtIG5hbWVzIGJlaW5nIGV4cG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5LCBidXQgeW91IHNob3VsZCBhdm9pZCBpbXBvcnRpbmcgYSByZXNvdXJjZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGFueSB2YXJpYWJsZSB3aXRoaW4geW91ciBjb21wb25lbnQuIEUuZy46CgrinIUgKiotIFJpZ2h0KioKCmBgYHRzCi8vIGFDb250cmFjdC50cwpleHBvcnQgY29uc3QgY29udHJhY3RJZCA9ICJjb250cmFjdC1pZC1hLm5lYXIiOwovLyAuLi4KYGBgCgpgYGB0cwovLyBIb21lUGFnZS50c3gKaW1wb3J0IHsgY29udHJhY3RJZCB9IGZyb20gJy4vY29udHJhY3RJZCc7Cgpjb25zdCBIb21lUGFnZSA9ICgpID0+IHsKICBjb25zdCBjb250cmFjdElkX0IgPSAiY29udHJhY3QtaWQtYi5uZWFyIgoKICByZXR1cm4gKAogICAgLy8gLi4uCiAgKQp9CgpleHBvcnQgZGVmYXVsdCBIb21lUGFnZTsKYGBgCgrinYwgKiotIFdyb25nKioKCmBgYHRzCi8vIGFDb250cmFjdC50cwpleHBvcnQgY29uc3QgY29udHJhY3RJZCA9ICJjb250cmFjdC1pZC1hLm5lYXIiOwpleHBvcnQgY29uc3QgY29udHJhY3RJZF9DID0gImNvbnRyYWN0LWlkLWMubmVhciI7Ci8vIC4uLgpgYGAKCmBgYHRzCi8vIEhvbWVQYWdlLnRzeAppbXBvcnQgeyBjb250cmFjdElkX0MgfSBmcm9tICcuL2NvbnRyYWN0SWQnOwoKY29uc3QgSG9tZVBhZ2UgPSAoKSA9PiB7CiAgLy8gRVJST1I6IHRoaXMgd2lsbCBicmVhayB0aGUgYXBwbGljYXRpb24gYmVjYXVzZSB0aGUgImNvbnRyYWN0SWQiIGZyb20gYUNvbnRyYWN0LnRzIGlzIGFsc28gZ29pbmcgdG8gYmUKICAvLyBpbmplY3RlZCB0byB0aGUgZmluYWwgZmlsZSBhZnRlciBjb21waWxhdGlvbi4KICBjb25zdCBjb250cmFjdElkID0gImNvbnRyYWN0LWlkLWIubmVhciI7CgogIHJldHVybiAoCiAgICAvLyAuLi4KICApCn0KCmV4cG9ydCBkZWZhdWx0IEhvbWVQYWdlOwpgYGAKCiMjIFN1Yi1Db21wb25lbnRzICYgQ29tcG9uZW50cwoKQXQgdGhlIG1vbWVudCwgaWYgeW91IGhhdmUgYSBjb21wb25lbnQgd2l0aCBzdWItY29tcG9uZW50cywgYW5kIHlvdSBhbHNvIGhhdmUgYW5vdGhlciBjb21wb25lbnQgYmVpbmcgaW1wb3J0ZWQgdGhhdCB1c2VzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHN1Yi1jb21wb25lbnQsIGEgY29tcGlsYXRpb24gZmFpbHVyZSBtYXkgb2NjdXIgYXMgY3VycmVudGx5IHRoZSBjb21waWxlciBhdXRvbWF0aWNhbGx5IHJlbmFtZXMgZHVwbGljYXRlIGNvbXBvbmVudCBuYW1lcy4KCkZvciBleGFtcGxlOgoK4p2MICoqLSBBdm9pZCBpdCoqCgpgYGB0c3gKLy8gRXhwb3J0aW5nIGNvbXBvbmVudHMKZXhwb3J0IGNvbnN0IENvbnRlbnQgPSAoKSA9PiA8cD5BPC9wPjsKYGBgCgpgYGB0c3gKLy8gSW1wb3J0aW5nIGNvbXBvbmVudHMgKyBVc2luZyBSYWRpeCBjb21wb25lbnRzCmltcG9ydCB7IENvbnRlbnQgfSBmcm9tICIuL0ZvbyI7Cgpjb25zdCBNeUNvbXBvbmVudCA9ICgpID0+IHsKICByZXR1cm4gKAogICAgPD4KICAgICAgey8qIFJhZGl4IFNlbGVjdCBjb21wb25lbnQgKi99CiAgICAgIDxTZWxlY3QuQ29udGVudD4KICAgICAgICA8Q29udGVudCAvPgogICAgICA8L1NlbGVjdC5Db250ZW50PgogICAgPC8+CiAgKTsKfTsKYGBgCgpJZiBieSBjaGFuY2UsIGluIGFub3RoZXIgZmlsZSB0aGVyZSBpcyBhbm90aGVyIGNvbXBvbmVudCB3aXRoIHRoZSBuYW1lIGBDb250ZW50YCwgdGhlIGBDb250ZW50YCBiZWluZyBpbXBvcnRlZCB3aWxsIGhhdmUgaXRzIG5hbWUgY2hhbmdlZCBhdXRvbWF0aWNhbGx5IGFuZCB0aGlzIHdpbGwgYWxzbyBhZmZlY3QgYFNlbGVjdC5Db250ZW50YCwgdGh1cyBnZW5lcmF0aW5nIGFuIGVycm9yLgoKVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBpZiBhIHN1Yi1jb21wb25lbnQgaXMgdXNlZCBpbiB0aGUgc2FtZSBmaWxlLCBjaGFuZ2UgdGhlIGNvbXBvbmVudCBuYW1lOgoK4pyFICoqLSBSaWdodCoqCgpgYGB0c3gKLy8gRXhwb3J0aW5nIGNvbXBvbmVudHMKZXhwb3J0IGNvbnN0IENvbnRlbnRGb28gPSAoKSA9PiA8cD5BPC9wPjsKYGBgCgpgYGB0c3gKLy8gSW1wb3J0aW5nIGNvbXBvbmVudHMgKyBVc2luZyBSYWRpeCBjb21wb25lbnRzCmltcG9ydCB7IENvbnRlbnRGb28gfSBmcm9tICIuL0ZvbyI7Cgpjb25zdCBNeUNvbXBvbmVudCA9ICgpID0+IHsKICByZXR1cm4gKAogICAgPD4KICAgICAgey8qIFJhZGl4IFNlbGVjdCBjb21wb25lbnQgKi99CiAgICAgIDxTZWxlY3QuQ29udGVudD4KICAgICAgICA8Q29udGVudEZvbyAvPgogICAgICA8L1NlbGVjdC5Db250ZW50PgogICAgPC8+CiAgKTsKfTsKYGBgCgpUaGlzIHdheSwgaWYgYENvbnRlbnRGb29gIGhhcyBpdHMgbmFtZSBjaGFuZ2VkIGJ5IHRoZSBjb21waWxlciwgdGhlIHN1Yi1jb21wb25lbnQgKFNlbGVjdCAtPiAqKkNvbnRlbnQqKikgYFNlbGVjdC5Db250ZW50YCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgo=`, "base64").toString("utf-8"); return } diff --git a/src/md/config-file.md b/src/md/config-file.md index 84039fa..c1f943b 100644 --- a/src/md/config-file.md +++ b/src/md/config-file.md @@ -132,3 +132,17 @@ You can use `options.hideAlemBar` to prevent the Além top bar from being displa } } ``` + +# Local Modules Options + +All files inside the `src/modules` folder will be compiled as local modules. To filter any file that you do not want to be interpreted as a compiler even though it is in the `src/modules` folder, you must make the following configuration: + +Inside the `alem.config.json` file add the list of part of file names you want to ignore. + +```json +"modules": { + "ignoreFileIfIncludes": ["styles"] +} +``` + +In the example above, any file that has "styles" as part of its name will be ignored and will be compiled as a normal file (script file, stateless component or stateful component). diff --git a/src/md/environment.md b/src/md/environment.md index daf8164..b0891a4 100644 --- a/src/md/environment.md +++ b/src/md/environment.md @@ -7,3 +7,25 @@ Create a `.env` file to set up the project's environment and other vars. The absence of the `.env` file means that `NODE_ENV=production`. You can use `getAlemEnvironment()` provided by Além to access the current environment value. + +# Available Além Env Vars + +```sh +# Além environment (default is production) +NODE_ENV=development +``` + +```sh +# Should final file be minified? (default is true) +MINIFY=true +``` + +```sh +# Save file schemas? (default is false). This is useful to evaluate how files are being handled. +SAVE_SCHEMAS=false +``` + +```sh +# Show how long it's taking to compile files. (default is false). This is util during Além enhancements / new implementations or bug fixes +SHOW_EXECUTION_TIME=false +``` diff --git a/src/md/feature-overview.md b/src/md/feature-overview.md index 5dba581..1377e38 100644 --- a/src/md/feature-overview.md +++ b/src/md/feature-overview.md @@ -209,28 +209,6 @@ export const AppContainer = styled.div` `; ``` -## Async / Await - -The use of `async/await` is supported and experimental. It should be used only in the main scope of the component. It will make changes to the state of the main Widget. Do not use in hooks. Below is an example of usage: - -```tsx -import { fetch, useEffect } from "alem"; - -const SomeComponent = () => { - const fetchItems = async () => { - const items = await fetch("https://api.com/items"); - }; - - useEffect(() => { - fetchItems(); - }, []); - - console.log(items); - - return <>; -}; -``` - # Limitations ## Import \* diff --git a/src/md/local-modules/LocalModules.tsx b/src/md/local-modules/LocalModules.tsx new file mode 100644 index 0000000..7400b60 --- /dev/null +++ b/src/md/local-modules/LocalModules.tsx @@ -0,0 +1,8 @@ +import { Markdown } from 'alem'; + +const LocalModules = () => { + const mdContent = Buffer.from(`IyBMb2NhbCBNb2R1bGVzCgpUbyBjcmVhdGUgbG9jYWwgbW9kdWxlcywgeW91IG5lZWQgdG8gcHV0IHRoZSBmaWxlIGluc2lkZSB0aGUgYHNyYy9tb2R1bGVzYCBmb2xkZXIuIExvY2FsIE1vZHVsZXMgYXJlIGdvaW5nIHRvIGJlIGluamVjdGVkIG9ubHkgb25jZSBhbmQgdGhlaXIgcmVmZXJlbmNlcyB3aWxsIGJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYXBwLCB0aHVzIHJlZHVjaW5nIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBmaW5hbCBmaWxlLiBBcyBtZW50aW9uZWQgYmVmb3JlLCB0byBhZGQgYSBmaWxlIHRvIGJlIGNvbXBpbGVkIGFzIG1vZHVsZSwganVzdCBhZGQgaXQgdG8gdGhlIGBzcmMvbW9kdWxlc2AgZm9sZGVyLgoKKipXYXJuaW5nIFBvaW50cyoqOgoKLSBJZiB5b3Ugd2FudCB0byB1c2UgYHByb3BzYCBpbnNpZGUgdGhlIG1vZHVsZXMsIHlvdSBtdXN0IHBhc3MgaXQgYXMgYSBwYXJhbWV0ZXIuIE1vZHVsZXMgbGl2ZSBhdCB0aGUgdmVyeSB0b3AgbGF5ZXIgb2YgQWzDqW0gYW5kIGNhbid0IGF1dG9tYXRpY2FsbHkgYWNjZXNzIHRoZSBgcHJvcHNgIHdoZXJlIGl0J3MgYmVpbmcgdXNlZC4KLSBJdCdzIG5vdCByZWNvbW1lbmRlZCB0byBhZGQgc3RhdGVmdWwgY29tcG9uZW50cyB0byBgc3JjL21vZHVsZXNgOwotIEl0IHN1cHBvcnRzIHN0YXRlbGVzcyBjb21wb25lbnRzLgoKIyMgV2hlbiBzaG91bGQgSSBjcmVhdGUgYSBMb2NhbCBNb2R1bGU/CgpZb3Ugc2hvdWxkIGNyZWF0ZSBhIExvY2FsIE1vZHVsZSB3aGVuIHRoZSBmaWxlcyBhcmUgcmVwZWF0ZWRseSBpbXBvcnRlZCBpbnRvIHRoZSBwcm9qZWN0LiBSZW1lbWJlcmluZyBhZ2FpbiB0aGF0IHRoZXkgd2lsbCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByb3BlcnRpZXMgd2hlcmUgdGhleSBhcmUgYmVpbmcgdXNlZCBhdXRvbWF0aWNhbGx5LiBUaGVyZWZvcmUsIHlvdSBtdXN0IHBhc3MgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIHBlciBwYXJhbWV0ZXIuCgpFeGFtcGxlOgoKKipNb2R1bGUgZmlsZXMqKgoKYGBgdHMKLy8gc3JjL21vZHVsZXMvcm91dGVzUHJvcHMudHMgTW9kdWxlCmV4cG9ydCBjb25zdCByb3V0ZXMgPSB7CiAgSE9NRTogImhvbWUiOwogIFBST0ZJTEU6ICJwcm9maWxlIjsKICBFRElUX1BST0ZJTEU6ICJwcm9maWxlL2VkaXQiCn0KCi8vICJwYXJlbnRQcm9wcyIgLSBwcm9wcyBwYXNzZWQgYnkgdGhlIGNhbGxlcgpleHBvcnQgY29uc3QgbG9nUGFyYW1zID0gKHBhcmVudFByb3BzOiBhbnkpID0+IHsKICBjb25zb2xlLmxvZyhwYXJlbnRQcm9wcyk7Cn0KYGBgCgpgYGB0cwovLyBzcmMvbW9kdWxlcy9CYW5uZXIudHN4IE1vZHVsZQppbXBvcnQgeyByb3V0ZXMgfSBmcm9tICIuL21vZHVsZXMvcGFyZW50UHJvcHMiOwoKY29uc3QgYmFubmVyVGV4dCA9ICJUaGlzIGlzIG15IGJhbm5lciEiOwoKdHlwZSBCYW5uZXJQcm9wcyA9IHsgbGFiZWw6IHN0cmluZyB9OwoKY29uc3QgQmFubmVyID0gKHsgbGFiZWwgfTogQmFubmVyUHJvcHMpID0+IHsKICBjb25zdCBhdmFpbGFibGVSb3V0ZXMgPSBPYmplY3Qua2V5cyhyb3V0ZXMpLmpvaW4oIiwgIik7CgogIHJldHVybiAoCiAgICA8PgogICAgICA8aDM+e2Jhbm5lclRleHR9PC9oMz4KICAgICAgPHA+e2xhYmVsfTwvcD4KICAgICAgPHA+QXZhaWxhYmxlIHJvdXRlczoge2F2YWlsYWJsZVJvdXRlc308L3A+CiAgICA8Lz4KICApOwp9OwpleHBvcnQgZGVmYXVsdCBCYW5uZXI7CmBgYAoKKipVc2luZyBtb2R1bGUqKgoKYGBgdHN4Ci8vIHNyYy9NeVN0YXRlZnVsQ29tcG9uZW50LnRzeAppbXBvcnQgeyB1c2VFZmZlY3QsIHByb3BzIH0gZnJvbSAiYWxlbSI7CmltcG9ydCB7IGxvZ1BhcmFtcyB9IGZyb20gIi4vbW9kdWxlcy9wYXJlbnRQcm9wcyI7CmltcG9ydCBCYW5uZXIgZnJvbSAiLi9tb2R1bGVzL0Jhbm5lciI7Cgpjb25zdCBNeVN0YXRlZnVsQ29tcG9uZW50ID0gKCkgPT4gewogIC8vLi4uCiAgdXNlRWZmZWN0KCgpID0+IHsKICAgIGxvZ1BhcmFtcyhwcm9wcyk7CiAgfSwgW10pOwoKICByZXR1cm4gKAogICAgPD4KICAgICAgPEJhbm5lciBsYWJlbD0ianVzdCBhIHNpbXBsZSBiYW5uZXIiIC8+CiAgICA8Lz4KICApOwp9OwpgYGAK`, "base64").toString("utf-8"); + return +} + +export default LocalModules; diff --git a/src/md/local-modules/local-modules.md b/src/md/local-modules/local-modules.md new file mode 100644 index 0000000..de6b738 --- /dev/null +++ b/src/md/local-modules/local-modules.md @@ -0,0 +1,75 @@ +# Local Modules + +To create local modules, you need to put the file inside the `src/modules` folder. Local Modules are going to be injected only once and their references will be used throughout the app, thus reducing the final size of the final file. As mentioned before, to add a file to be compiled as module, just add it to the `src/modules` folder. + +**Warning Points**: + +- If you want to use `props` inside the modules, you must pass it as a parameter. Modules live at the very top layer of Além and can't automatically access the `props` where it's being used. +- It's not recommended to add stateful components to `src/modules`; +- It supports stateless components. + +## When should I create a Local Module? + +You should create a Local Module when the files are repeatedly imported into the project. Remembering again that they will not have access to the properties where they are being used automatically. Therefore, you must pass the necessary properties per parameter. + +Example: + +**Module files** + +```ts +// src/modules/routesProps.ts Module +export const routes = { + HOME: "home"; + PROFILE: "profile"; + EDIT_PROFILE: "profile/edit" +} + +// "parentProps" - props passed by the caller +export const logParams = (parentProps: any) => { + console.log(parentProps); +} +``` + +```ts +// src/modules/Banner.tsx Module +import { routes } from "./modules/parentProps"; + +const bannerText = "This is my banner!"; + +type BannerProps = { label: string }; + +const Banner = ({ label }: BannerProps) => { + const availableRoutes = Object.keys(routes).join(", "); + + return ( + <> +

{bannerText}

+

{label}

+

Available routes: {availableRoutes}

+ + ); +}; +export default Banner; +``` + +**Using module** + +```tsx +// src/MyStatefulComponent.tsx +import { useEffect, props } from "alem"; +import { logParams } from "./modules/parentProps"; +import Banner from "./modules/Banner"; + +const MyStatefulComponent = () => { + //... + useEffect(() => { + logParams(props); + }, []); + + return ( + <> + + + ); +}; +``` diff --git a/src/md/modules/InstallingModules.tsx b/src/md/modules/InstallingModules.tsx index 6c8971c..d5872a4 100644 --- a/src/md/modules/InstallingModules.tsx +++ b/src/md/modules/InstallingModules.tsx @@ -1,7 +1,7 @@ import { Markdown } from 'alem'; const InstallingModules = () => { - const mdContent = Buffer.from(`IyBJbnN0YWxsaW5nIE1vZHVsZXMKClRoZSBBbMOpbSBDb21waWxlciBzdXBwb3J0cyB0aGUgdXNlIG9mIGV4dGVybmFsIE5QTSBtb2R1bGVzIHRocm91Z2ggdGhlIHVzZSBvZiBDRE4gc2VydmljZXMuIFRvIGxvYWQgYW55IGV4dGVybmFsIG1vZHVsZSwgY3JlYXRlIGEgZmlsZSBgYWxlbS5tb2R1bGVzLmpzb25gIGluIHRoZSBwcm9qZWN0IHJvb3QuIEV4YW1wbGU6CgpgYGBqc29uCnsKICAiamF2YXNjcmlwdC10aW1lLWFnbyI6ICJodHRwczovL3VucGtnLmNvbS9qYXZhc2NyaXB0LXRpbWUtYWdvQDIuNS45L2J1bmRsZS9qYXZhc2NyaXB0LXRpbWUtYWdvLmpzIiwKICAiZGF5anMiOiAiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZGF5anMvMS4xMS4xMC9kYXlqcy5taW4uanMiCn0KYGBgCgpUaGUgYGtleWAgb2YgZWFjaCBtb2R1bGUgZGlyZWN0bHkgcmVjZWl2ZXMgaXRzIFVSTCB0byBpdHMgamF2YXNjcmlwdCBmaWxlLgoKQXMgdGhlcmUgYXJlIHRob3VzYW5kcyBvZiBtb2R1bGVzIGF2YWlsYWJsZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCBvZiB0aGVtIHdpbGwgd29yayBwcm9wZXJseS4gSWYgeW91IHdhbnQgdG8gZ2l2ZSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBmZWVkYmFjayByZWdhcmRpbmcgdGhlIG9wZXJhdGlvbiBvZiBhIG1vZHVsZSwgdXNlIG91ciBUZWxlZ3JhbSBjaGFubmVsLCB5b3UgY2FuIGhlbHAgb3RoZXIgcGVvcGxlLgoKIyBOUE0gTW9kdWxlIFNvdXJjZXMKCkhlcmUgYXJlIHNvbWUgc2l0ZXMgdGhhdCBzZXJ2ZSBtb2R1bGUgc291cmNlczoKCi0gKipDRE4gSnM6KiogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzCi0gKipVTlBLRzoqKiBodHRwczovL3d3dy51bnBrZy5jb20vCg==`, "base64").toString("utf-8"); + const mdContent = Buffer.from(`IyBJbnN0YWxsaW5nIE5QTSBNb2R1bGVzCgpUaGUgQWzDqW0gQ29tcGlsZXIgc3VwcG9ydHMgdGhlIHVzZSBvZiBleHRlcm5hbCBOUE0gbW9kdWxlcyB0aHJvdWdoIHRoZSB1c2Ugb2YgQ0ROIHNlcnZpY2VzLiBUbyBsb2FkIGFueSBleHRlcm5hbCBtb2R1bGUsIGNyZWF0ZSBhIGZpbGUgYGFsZW0ubW9kdWxlcy5qc29uYCBpbiB0aGUgcHJvamVjdCByb290LiBFeGFtcGxlOgoKYGBganNvbgp7CiAgImphdmFzY3JpcHQtdGltZS1hZ28iOiAiaHR0cHM6Ly91bnBrZy5jb20vamF2YXNjcmlwdC10aW1lLWFnb0AyLjUuOS9idW5kbGUvamF2YXNjcmlwdC10aW1lLWFnby5qcyIsCiAgImRheWpzIjogImh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL2RheWpzLzEuMTEuMTAvZGF5anMubWluLmpzIgp9CmBgYAoKVGhlIGBrZXlgIG9mIGVhY2ggbW9kdWxlIGRpcmVjdGx5IHJlY2VpdmVzIGl0cyBVUkwgdG8gaXRzIGphdmFzY3JpcHQgZmlsZS4KCkFzIHRoZXJlIGFyZSB0aG91c2FuZHMgb2YgbW9kdWxlcyBhdmFpbGFibGUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhhdCBhbGwgb2YgdGhlbSB3aWxsIHdvcmsgcHJvcGVybHkuIElmIHlvdSB3YW50IHRvIGdpdmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgZmVlZGJhY2sgcmVnYXJkaW5nIHRoZSBvcGVyYXRpb24gb2YgYSBtb2R1bGUsIHVzZSBvdXIgVGVsZWdyYW0gY2hhbm5lbCwgeW91IGNhbiBoZWxwIG90aGVyIHBlb3BsZS4KCiMgTlBNIE1vZHVsZSBTb3VyY2VzCgpIZXJlIGFyZSBzb21lIHNpdGVzIHRoYXQgc2VydmUgbW9kdWxlIHNvdXJjZXM6CgotICoqQ0ROIEpzOioqIGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcwotICoqVU5QS0c6KiogaHR0cHM6Ly93d3cudW5wa2cuY29tLwo=`, "base64").toString("utf-8"); return } diff --git a/src/md/modules/installing-modules.md b/src/md/modules/installing-modules.md index 52fd4df..d5400fa 100644 --- a/src/md/modules/installing-modules.md +++ b/src/md/modules/installing-modules.md @@ -1,4 +1,4 @@ -# Installing Modules +# Installing NPM Modules The Além Compiler supports the use of external NPM modules through the use of CDN services. To load any external module, create a file `alem.modules.json` in the project root. Example: diff --git a/src/modules/readme.md b/src/modules/readme.md new file mode 100644 index 0000000..b7bef4e --- /dev/null +++ b/src/modules/readme.md @@ -0,0 +1,75 @@ +# Modules + +Thes files inside this folder are going to be injected only once and their references will be used throughout the app, thus reducing the final size of the final file. To add a file to be compiled as module, just add it to the `src/modules` folder. + +**Warning Points**: + +- If you want to use `props` inside the modules, you must pass it as a parameter. Modules live at the very top layer of Além and can't automatically access the `props` where it's being used. +- It's not recommended to add stateful components to `src/modules`; +- It supports stateless components. + +## When should I put files here? + +You should place files here when they are repeatedly imported into the project. Remembering again that they will not have access to the properties where they are being used automatically. Therefore, you must pass the necessary properties per parameter. + +Example: + +**Module files** + +```ts +// src/modules/routesProps.ts Module +export const routes = { + HOME: "home"; + PROFILE: "profile"; + EDIT_PROFILE: "profile/edit" +} + +// "parentProps" - props passed by the caller +export const logParams = (parentProps: any) => { + console.log(parentProps); +} +``` + +```ts +// src/modules/Banner.tsx Module +import { routes } from "./modules/parentProps"; + +const bannerText = "This is my banner!"; + +type BannerProps = { label: string }; + +const Banner = ({ label }: BannerProps) => { + const availableRoutes = Object.keys(routes).join(", "); + + return ( + <> +

{bannerText}

+

{label}

+

Available routes: {availableRoutes}

+ + ); +}; +export default Banner; +``` + +**Using module** + +```tsx +// src/MyStatefulComponent.tsx +import { useEffect, props } from "alem"; +import { logParams } from "./modules/parentProps"; +import Banner from "./modules/Banner"; + +const MyStatefulComponent = () => { + //... + useEffect(() => { + logParams(props); + }, []); + + return ( + <> + + + ); +}; +``` diff --git a/src/routes/getRouteTitleByPath.ts b/src/modules/routes/getRouteTitleByPath.ts similarity index 100% rename from src/routes/getRouteTitleByPath.ts rename to src/modules/routes/getRouteTitleByPath.ts diff --git a/src/routes/nextPrevRoutes.ts b/src/modules/routes/nextPrevRoutes.ts similarity index 93% rename from src/routes/nextPrevRoutes.ts rename to src/modules/routes/nextPrevRoutes.ts index a1cc33d..624aef0 100644 --- a/src/routes/nextPrevRoutes.ts +++ b/src/modules/routes/nextPrevRoutes.ts @@ -32,12 +32,18 @@ const nextPrevRoutes = () => ({ [RoutesPath.environment.path]: { prev: RoutesPath.deployingWithGithubActions.path, + next: RoutesPath.aboutLocalModules.path, + }, + + // Local Modules + [RoutesPath.aboutLocalModules.path]: { + prev: RoutesPath.environment.path, next: RoutesPath.installingModules.path, }, // Modules [RoutesPath.installingModules.path]: { - prev: RoutesPath.deployingWithGithubActions.path, + prev: RoutesPath.aboutLocalModules.path, next: RoutesPath.howToUseModules.path, }, diff --git a/src/routes/routeProps.ts b/src/modules/routes/routeProps.ts similarity index 92% rename from src/routes/routeProps.ts rename to src/modules/routes/routeProps.ts index 4a1bb56..bb81dee 100644 --- a/src/routes/routeProps.ts +++ b/src/modules/routes/routeProps.ts @@ -1,6 +1,7 @@ export const Categories = { gettingStarted: "Getting Started", router: "Router", + localModules: "Local Modules", modules: "Modules", context: "Context", apis: "APIs", @@ -54,10 +55,17 @@ export const RoutesPath = { category: Categories.gettingStarted, }, + // Local Modules + aboutLocalModules: { + path: "using-local-modules", + title: "Using Local Modules", + category: Categories.localModules, + }, + // Modules installingModules: { path: "installing-modules", - title: "Installing Modules", + title: "Installing NPM Modules", category: Categories.modules, }, howToUseModules: { diff --git a/src/pages/About/About.tsx b/src/pages/About/About.tsx index bb8a2d4..ffd9818 100644 --- a/src/pages/About/About.tsx +++ b/src/pages/About/About.tsx @@ -1,6 +1,6 @@ import { RouteLink } from "alem"; import { Row } from "../../components/UI"; -import { RoutesPath } from "../../routes/routeProps"; +import { RoutesPath } from "../../modules/routes/routeProps"; import { Container, Logo, diff --git a/src/routes/Routes.tsx b/src/routes/Routes.tsx index 7ebe5b6..83cc882 100644 --- a/src/routes/Routes.tsx +++ b/src/routes/Routes.tsx @@ -1,8 +1,8 @@ import { Router, createRoute, getLocation, useParams } from "alem"; import { AboutPage } from "../pages/About/About"; -import { RoutesPath } from "./routeProps"; -import nextPrevRoutes from "./nextPrevRoutes"; -import getRouteTitleByPath from "./getRouteTitleByPath"; +import { RoutesPath } from "../modules/routes/routeProps"; +import nextPrevRoutes from "../modules/routes/nextPrevRoutes"; +import getRouteTitleByPath from "../modules/routes/getRouteTitleByPath"; import { FooterNavContainer, NextPrevButton } from "./styles"; import FeatureOverview from "@md/FeatureOverview"; import Installation from "@md/Installation"; @@ -26,6 +26,7 @@ import InstallingModules from "@app/md/modules/InstallingModules"; import HowToUseModules from "@app/md/modules/HowToUseModules"; import Environment from "@app/md/Environment"; import GetAlemEnvironment from "@app/md/api/GetAlemEnvironment"; +import LocalModules from "@app/md/local-modules/LocalModules"; const Routes = () => { const urlParams = useParams(); @@ -73,6 +74,9 @@ const Routes = () => { // Modules createRoute(RoutesPath.installingModules.path, InstallingModules), createRoute(RoutesPath.howToUseModules.path, HowToUseModules), + + // Local Modules + createRoute(RoutesPath.aboutLocalModules.path, LocalModules), ]; return ( diff --git a/src/utils/getLinksByCategory.tsx b/src/utils/getLinksByCategory.tsx index 5fa24fe..e944b48 100644 --- a/src/utils/getLinksByCategory.tsx +++ b/src/utils/getLinksByCategory.tsx @@ -1,5 +1,5 @@ import { RouteLink, getLocation } from "alem"; -import { RoutesPath, RoutesPathProps } from "../routes/routeProps"; +import { RoutesPath, RoutesPathProps } from "../modules/routes/routeProps"; const getLinksByCategory = (category: string, onItemClick?: () => void) => { const { pathname } = getLocation();