diff --git a/packages/common-all/src/helpers.ts b/packages/common-all/src/helpers.ts index c1f688191a..9e15f88e51 100644 --- a/packages/common-all/src/helpers.ts +++ b/packages/common-all/src/helpers.ts @@ -29,3 +29,47 @@ export async function asyncLoopOneAtATime( export async function asyncLoop(things: T[], cb: (t: T) => Promise) { return Promise.all(things.map((t) => cb(t))); } + + +/** + * Retry resolving promise factory n number of times before rejecting it + * @param retriable + * @param handler + * @param n + * @returns + */ +export async function asyncRetry(retriable: () => Promise, handler: (arg0: any) => any, n?: number) { + n = n ?? 3; + + for (let i = 0; i < n; i += 1) { + try { + /* eslint-disable no-await-in-loop */ + return await retriable(); + } catch (error) { + if (i < (n - 1)) { + continue; + } + return handler(error); + } + } +} + +/** + * Deferrable promise + */ +export class Deferred { + promise: Promise; + reject!: (reason?: any) => void; + resolve!: (value: T) => void; + + constructor(value?: T | null) { + this.promise = new Promise((resolve, reject) => { + this.reject = reject + this.resolve = resolve + }) + + if(value) { + this.resolve(value); + } + } +} diff --git a/packages/engine-test-utils/src/__tests__/pods-core/NotionPod.spec.ts b/packages/engine-test-utils/src/__tests__/pods-core/NotionPod.spec.ts index 6a0769148a..c5f08b02e8 100644 --- a/packages/engine-test-utils/src/__tests__/pods-core/NotionPod.spec.ts +++ b/packages/engine-test-utils/src/__tests__/pods-core/NotionPod.spec.ts @@ -19,7 +19,7 @@ describe("GIVEN a Notion export pod", () => { const vaultName = VaultUtils.getName(vaults[0]); pod.createPagesInNotion = jest.fn(); pod.getAllNotionPages = jest.fn(); - pod.convertMdToNotionBlock = jest.fn(); + NotionExportPod.convertMdToNotionBlock = jest.fn(); await pod.execute({ engine, vaults, @@ -32,7 +32,7 @@ describe("GIVEN a Notion export pod", () => { utilityMethods, }); expect(pod.createPagesInNotion).toHaveBeenCalledTimes(1); - expect(pod.convertMdToNotionBlock).toHaveBeenCalledTimes(1); + expect(NotionExportPod.convertMdToNotionBlock).toHaveBeenCalledTimes(1); }, { expect, diff --git a/packages/engine-test-utils/src/__tests__/pods-core/podsv2.spec.ts b/packages/engine-test-utils/src/__tests__/pods-core/podsv2.spec.ts index 8848d97f66..fc01aac4b7 100644 --- a/packages/engine-test-utils/src/__tests__/pods-core/podsv2.spec.ts +++ b/packages/engine-test-utils/src/__tests__/pods-core/podsv2.spec.ts @@ -19,6 +19,7 @@ import { RunnableGoogleDocsV2PodConfig, RunnableNotionV2PodConfig, RunnableJSONV2PodConfig, + NotionExportPod, } from "@dendronhq/pods-core"; import fs from "fs-extra"; import _ from "lodash"; @@ -471,7 +472,7 @@ describe("GIVEN a Notion Export Pod with a particular config", () => { ], errors: [], }; - pod.convertMdToNotionBlock = jest.fn(); + NotionExportPod.convertMdToNotionBlock = jest.fn(); pod.createPagesInNotion = jest.fn().mockResolvedValue(response); const result = await pod.exportNotes([props]); const entCreate = result.data?.created!; diff --git a/packages/pods-core/package.json b/packages/pods-core/package.json index ceac4f4465..731c3f3ddb 100644 --- a/packages/pods-core/package.json +++ b/packages/pods-core/package.json @@ -56,8 +56,8 @@ "@dendronhq/common-server": "^0.124.0", "@dendronhq/engine-server": "^0.124.0", "@dendronhq/unified": "^0.124.0", - "@instantish/martian": "1.0.3", - "@notionhq/client": "^0.1.9", + "@tryfabric/martian": "1.2.4", + "@notionhq/client": "^1.0.4", "@octokit/graphql": "^4.6.4", "@types/airtable": "^0.10.1", "airtable": "^0.11.1", diff --git a/packages/pods-core/src/builtin/NotionPod.ts b/packages/pods-core/src/builtin/NotionPod.ts index f896ac8f65..386ac05ca5 100644 --- a/packages/pods-core/src/builtin/NotionPod.ts +++ b/packages/pods-core/src/builtin/NotionPod.ts @@ -1,10 +1,12 @@ import { asyncLoop, + asyncRetry, + Deferred, DendronError, ERROR_SEVERITY, NoteProps, } from "@dendronhq/common-all"; -import { markdownToBlocks } from "@instantish/martian"; +import { markdownToBlocks } from "@tryfabric/martian"; import type { Page, TitlePropertyValue, @@ -53,28 +55,48 @@ export class NotionExportPod extends ExportPod { * Method to create pages in Notion */ createPagesInNotion = ( - blockPagesArray: any, - notion: Client + notes: NoteProps[], + notion: Client, + parentPageId: string, ): Promise => { - return asyncLoop(blockPagesArray, async (block: any) => { - await limiter.removeTokens(1); - try { - await notion.pages.create(block); - } catch (error) { - throw new DendronError({ - message: "Failed to export all the notes. " + JSON.stringify(error), - severity: ERROR_SEVERITY.MINOR, + const keyMap = Object.fromEntries( + notes.map(note => [ + note.parent ?? "undefined", + note.parent ? new Deferred() : new Deferred(parentPageId) + ]) + ); + + return asyncLoop(notes, async (note: NoteProps) => { + const parentId = await keyMap[note.parent ?? "undefined"].promise; + const blockPage = NotionExportPod.convertMdToNotionBlock(note, parentId); + + await asyncRetry( + async () => { + await limiter.removeTokens(1); + + const page = await notion.pages.create(blockPage); + + keyMap[note.id]?.resolve(page.id); + + return { + notionId: page.id, + dendronId: note.id, + } + }, + (error) => { + keyMap[note.id]?.reject(`Failed to export the note title:'${note.title}' - id:${note.id}.`); + throw new DendronError({ + message: `Failed to export the note title:'${note.title}' - id:${note.id} - content: ${JSON.stringify(blockPage)}` + JSON.stringify(error), + severity: ERROR_SEVERITY.MINOR, + }); }); - } }); }; /** * Method to convert markdown to Notion Block */ - convertMdToNotionBlock = (notes: NoteProps[], pageId: string) => { - const notionBlock = notes.map((note) => { - const children = markdownToBlocks(note.body); + public static convertMdToNotionBlock = (note: NoteProps, pageId: string): any => { return { parent: { page_id: pageId, @@ -84,10 +106,8 @@ export class NotionExportPod extends ExportPod { title: [{ type: "text", text: { content: note.title } }], }, }, - children, + children: markdownToBlocks(note.body), }; - }); - return notionBlock; }; /** @@ -159,8 +179,7 @@ export class NotionExportPod extends ExportPod { return { notes: [] }; } const pageId = pagesMap[selectedPage]; - const blockPagesArray = this.convertMdToNotionBlock(notes, pageId); - await this.createPagesInNotion(blockPagesArray, notion); + await this.createPagesInNotion(notes, notion, pageId); return { notes }; } } diff --git a/packages/pods-core/src/v2/pods/export/NotionExportPodV2.ts b/packages/pods-core/src/v2/pods/export/NotionExportPodV2.ts index 6d8e2cdff7..0a23acd8f4 100644 --- a/packages/pods-core/src/v2/pods/export/NotionExportPodV2.ts +++ b/packages/pods-core/src/v2/pods/export/NotionExportPodV2.ts @@ -1,4 +1,7 @@ import { + asyncLoop, + asyncRetry, + Deferred, DendronCompositeError, DendronError, DEngineClient, @@ -7,7 +10,6 @@ import { ResponseUtil, RespV2, } from "@dendronhq/common-all"; -import { markdownToBlocks } from "@instantish/martian"; import { JSONSchemaType } from "ajv"; import { RateLimiter } from "limiter"; import _ from "lodash"; @@ -15,6 +17,7 @@ import { Client, ConfigFileUtils, ExportPodV2, + NotionExportPod, NotionV2PodConfig, RunnableNotionV2PodConfig, } from "../../.."; @@ -50,8 +53,7 @@ export class NotionExportPodV2 implements ExportPodV2 { async exportNotes(notes: NoteProps[]): Promise { const { parentPageId } = this._config; - const blockPagesArray = this.convertMdToNotionBlock(notes, parentPageId); - const { data, errors } = await this.createPagesInNotion(blockPagesArray); + const { data, errors } = await this.createPagesInNotion(notes, parentPageId); const createdNotes = data.filter( (ent): ent is NotionFields => !_.isUndefined(ent) ); @@ -70,35 +72,12 @@ export class NotionExportPodV2 implements ExportPodV2 { } } - /** - * Method to convert markdown to Notion Block - */ - convertMdToNotionBlock = (notes: NoteProps[], parentPageId: string) => { - const notionBlock = notes.map((note) => { - const children = markdownToBlocks(note.body); - return { - dendronId: note.id, - block: { - parent: { - page_id: parentPageId, - }, - properties: { - title: { - title: [{ type: "text", text: { content: note.title } }], - }, - }, - children, - }, - }; - }); - return notionBlock; - }; - /** * Method to create pages in Notion */ createPagesInNotion = async ( - blockPagesArray: any + notes: NoteProps[], + parentPageId: string, ): Promise<{ data: NotionFields[]; errors: IDendronError[]; @@ -106,23 +85,35 @@ export class NotionExportPodV2 implements ExportPodV2 { const notion = new Client({ auth: this._config.apiKey, }); + + const keyMap = Object.fromEntries( + notes.map(note => [ + note.parent ?? "undefined", + note.parent ? new Deferred() : new Deferred(parentPageId) + ]) + ); + const errors: IDendronError[] = []; - const out: NotionFields[] = await Promise.all( - blockPagesArray.map(async (ent: any) => { - // @ts-ignore - await limiter.removeTokens(1); - try { - const response = await notion.pages.create(ent.block); + const out: NotionFields[] = await asyncLoop(notes, async (note: NoteProps) => { + const parentId = await keyMap[note.parent ?? "undefined"].promise; + const blockPage = NotionExportPod.convertMdToNotionBlock(note, parentId); + + return asyncRetry( + async () => { + await limiter.removeTokens(1); + const page = await notion.pages.create(blockPage); + keyMap[note.id]?.resolve(page.id); return { - notionId: response.id, - dendronId: ent.dendronId, - }; - } catch (error) { + notionId: page.id, + dendronId: note.id, + } + }, + (error) => { + keyMap[note.id]?.reject(`Failed to export the note title:'${note.title}' - id:${note.id}.`); errors.push(error as DendronError); - return; - } - }) - ); + }); + }); + return { data: out, errors, diff --git a/yarn.lock b/yarn.lock index 992e724e57..6b42bdd6d9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2046,16 +2046,6 @@ resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@instantish/martian@1.0.3": - version "1.0.3" - resolved "https://registry.npmjs.org/@instantish/martian/-/martian-1.0.3.tgz#aa9bedfb41a53b0328289c3e791c636df044110f" - integrity sha512-VLH1vpEHqia90gHWWZw2iEFISi/frLw5ZT99pWB2MM8rCOmm6hca2FUv8ns9AxiBAVj0epFRoxcjRtec+evxlw== - dependencies: - "@notionhq/client" "^0.1.9" - remark-gfm "^1.0.0" - remark-parse "^9.0.0" - unified "^9.2.1" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -3343,12 +3333,13 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@notionhq/client@^0.1.9": - version "0.1.9" - resolved "https://registry.npmjs.org/@notionhq/client/-/client-0.1.9.tgz#866c6a66b0533c9a62d9e99c0d97e3d4b9eb4e48" - integrity sha512-hClAGWAT/IAgRp9P6K1dl5fYg2CsQ1NSftKLx3tmz4yx12cAyp3FFEflmLD/PLg+xPlRpnK7WkvjromBuBplHg== +"@notionhq/client@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@notionhq/client/-/client-1.0.4.tgz#405e9468576baf81019db4d791f4b52d091f4a57" + integrity sha512-m7zZ5l3RUktayf1lRBV1XMb8HSKsmWTv/LZPqP7UGC1NMzOlc+bbTOPNQ4CP/c1P4cP61VWLb/zBq7a3c0nMaw== dependencies: - got "^11.8.2" + "@types/node-fetch" "^2.5.10" + node-fetch "^2.6.1" "@npmcli/fs@^1.0.0": version "1.1.1" @@ -3936,6 +3927,17 @@ resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tryfabric/martian@1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@tryfabric/martian/-/martian-1.2.4.tgz#3fdfe7129f1c28bccddc34854cf353b0f37c0c02" + integrity sha512-g7SP7beaxrjxLnW//vskra07a1jsJowqp07KMouxh4gCwaF+ItHbRZN8O+1dhJivBi3VdasT71BPyk+8wzEreQ== + dependencies: + "@notionhq/client" "^1.0.4" + remark-gfm "^1.0.0" + remark-math "^4.0.0" + remark-parse "^9.0.0" + unified "^9.2.1" + "@types/airtable@^0.10.1": version "0.10.1" resolved "https://registry.npmjs.org/@types/airtable/-/airtable-0.10.1.tgz#d7575251c890cb9a93e92c59344f7b7c4f7d9ae0" @@ -4369,6 +4371,14 @@ resolved "https://registry.npmjs.org/@types/nanoid-dictionary/-/nanoid-dictionary-4.2.0.tgz#5a3ae86d7c0db2d3ecf5b1233fc27f5874903f77" integrity sha512-DyQddKC2AYsInXBMqKSwhom4gpouV8SF1smsCPSzR8hp20vZJ5o5Yxg7qXThCHwr/H6VMq01UArEGbF0q2FXig== +"@types/node-fetch@^2.5.10": + version "2.6.9" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.9.tgz#15f529d247f1ede1824f7e7acdaa192d5f28071e" + integrity sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + "@types/node-fetch@^3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-3.0.3.tgz#9d969c9a748e841554a40ee435d26e53fa3ee899" @@ -6729,9 +6739,9 @@ bfj@^7.0.2: tryer "^1.0.1" big-integer@^1.6.17: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== + version "1.6.52" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" + integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== big.js@^5.2.2: version "5.2.2" @@ -6755,8 +6765,8 @@ binary-extensions@^2.0.0: binary@~0.3.0: version "0.3.0" - resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg== dependencies: buffers "~0.1.1" chainsaw "~0.1.0" @@ -6792,8 +6802,8 @@ bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: bluebird@~3.4.1: version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" @@ -7164,7 +7174,7 @@ buffer-from@^1.0.0, buffer-from@^1.1.0: buffer-indexof-polyfill@~1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== buffer-indexof@^1.0.0: @@ -7204,8 +7214,8 @@ buffer@~5.2.1: buffers@~0.1.1: version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== builtin-modules@^1.1.1: version "1.1.1" @@ -7524,8 +7534,8 @@ center-align@^0.1.1: chainsaw@~0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ== dependencies: traverse ">=0.3.0 <0.4" @@ -8092,7 +8102,7 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -commander@2, commander@^2.12.1, commander@^2.16.0, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1: +commander@2, commander@^2.12.1, commander@^2.16.0, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -12366,7 +12376,7 @@ fsevents@~2.1.1: fstream@^1.0.12: version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: graceful-fs "^4.1.2" @@ -13040,23 +13050,6 @@ got@^11.8.1: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^11.8.2: - version "11.8.3" - resolved "https://registry.npmjs.org/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" - integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - got@^9.6.0: version "9.6.0" resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -16163,6 +16156,13 @@ jws@^4.0.0: jwa "^2.0.0" safe-buffer "^5.0.1" +katex@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" + integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== + dependencies: + commander "^2.19.0" + katex@^0.13.0: version "0.13.24" resolved "https://registry.npmjs.org/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905" @@ -16557,8 +16557,8 @@ lint-staged@>=10: listenercount@~1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ== listr2@^4.0.1: version "4.0.4" @@ -17346,6 +17346,15 @@ mdast-util-inject@^1.1.0: dependencies: mdast-util-to-string "^1.0.0" +mdast-util-math@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-0.1.2.tgz#629a0793bd8822432917e5ddda5279492390cc2b" + integrity sha512-fogAitds+wH+QRas78Yr1TwmQGN4cW/G2WRw5ePuNoJbBSPJCxIOCE8MTzHgWHVSpgkRaPQTgfzXRE1CrwWSlg== + dependencies: + longest-streak "^2.0.0" + mdast-util-to-markdown "^0.6.0" + repeat-string "^1.0.0" + mdast-util-to-hast@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" @@ -17623,6 +17632,14 @@ micromark-extension-gfm@^0.3.0: micromark-extension-gfm-tagfilter "~0.3.0" micromark-extension-gfm-task-list-item "~0.3.0" +micromark-extension-math@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-0.1.2.tgz#5d7bb2b86018da4a758c05f3991664430ee4d711" + integrity sha512-ZJXsT2eVPM8VTmcw0CPSDeyonOn9SziGK3Z+nkf9Vb6xMPeU+4JMEnO6vzDL10562Favw8Vste74f54rxJ/i6Q== + dependencies: + katex "^0.12.0" + micromark "~2.11.0" + micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: version "2.11.4" resolved "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" @@ -17947,13 +17964,20 @@ mkdirp@0.3.0: resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" integrity sha1-G79asbqCevI1dRQ0kEJkVfSB/h4= -mkdirp@0.5.5, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@0.5.5, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +"mkdirp@>=0.5 0": + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mocha@^7.1.2: version "7.2.0" resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -22281,6 +22305,14 @@ remark-math@3: resolved "https://registry.npmjs.org/remark-math/-/remark-math-3.0.1.tgz#85a02a15b15cad34b89a27244d4887b3a95185bb" integrity sha512-epT77R/HK0x7NqrWHdSV75uNLwn8g9qTyMqCRCDujL0vj/6T6+yhdrR7mjELWtkse+Fw02kijAaBuVcHBor1+Q== +remark-math@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-4.0.0.tgz#494ddd50766555ad2332e3afca7796a76452256f" + integrity sha512-lH7SoQenXtQrvL0bm+mjZbvOk//YWNuyR+MxV18Qyv8rgFmMEGNuB0TSCQDkoDaiJ40FCnG8lxErc/zhcedYbw== + dependencies: + mdast-util-math "^0.1.0" + micromark-extension-math "^0.1.0" + remark-parse@^8.0.0, remark-parse@^8.0.3: version "8.0.3" resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" @@ -24883,8 +24915,8 @@ tr46@~0.0.3: "traverse@>=0.3.0 <0.4": version "0.3.9" - resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== trim-newlines@^1.0.0: version "1.0.0" @@ -25637,9 +25669,9 @@ unset-value@^1.0.0: isobject "^3.0.0" unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + version "0.10.14" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.14.tgz#d2b33c977714da0fbc0f82774ad35470a7c962b1" + integrity sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g== dependencies: big-integer "^1.6.17" binary "~0.3.0" @@ -26140,7 +26172,7 @@ vscode-oniguruma@^1.6.1: vscode-test@^1.3.0: version "1.6.1" - resolved "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" + resolved "https://registry.yarnpkg.com/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" integrity sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA== dependencies: http-proxy-agent "^4.0.1"