@sillsdev/docu-notion 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +135 -0
- package/dist/FlatGuidLayoutStrategy.d.ts +6 -0
- package/dist/FlatGuidLayoutStrategy.js +25 -0
- package/dist/HierarchicalNamedLayoutStrategy.d.ts +7 -0
- package/dist/HierarchicalNamedLayoutStrategy.js +80 -0
- package/dist/LayoutStrategy.d.ts +12 -0
- package/dist/LayoutStrategy.js +83 -0
- package/dist/MakeImagePersistencePlan.d.ts +2 -0
- package/dist/MakeImagePersistencePlan.js +66 -0
- package/dist/NotionImage-CaptionReading.spec.d.ts +1 -0
- package/dist/NotionImage-CaptionReading.spec.js +233 -0
- package/dist/NotionPage.d.ts +45 -0
- package/dist/NotionPage.js +229 -0
- package/dist/NotionPage.spec.d.ts +1 -0
- package/dist/NotionPage.spec.js +143 -0
- package/dist/config/configuration.d.ts +5 -0
- package/dist/config/configuration.js +86 -0
- package/dist/config/default.docunotion.config.d.ts +3 -0
- package/dist/config/default.docunotion.config.js +37 -0
- package/dist/images.d.ts +24 -0
- package/dist/images.js +230 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +37 -0
- package/dist/log.d.ts +11 -0
- package/dist/log.js +61 -0
- package/dist/makeImagePersistencePlan.spec.d.ts +1 -0
- package/dist/makeImagePersistencePlan.spec.js +35 -0
- package/dist/notion-styles.css +58 -0
- package/dist/plugins/CalloutTransformer.d.ts +24 -0
- package/dist/plugins/CalloutTransformer.js +88 -0
- package/dist/plugins/CalloutTransformer.spec.d.ts +1 -0
- package/dist/plugins/CalloutTransformer.spec.js +199 -0
- package/dist/plugins/ColumnListTransformer.d.ts +2 -0
- package/dist/plugins/ColumnListTransformer.js +34 -0
- package/dist/plugins/ColumnTransformer.d.ts +2 -0
- package/dist/plugins/ColumnTransformer.js +67 -0
- package/dist/plugins/EscapeHtmlBlockModifier.d.ts +2 -0
- package/dist/plugins/EscapeHtmlBlockModifier.js +41 -0
- package/dist/plugins/EscapeHtmlBlockModifier.spec.d.ts +1 -0
- package/dist/plugins/EscapeHtmlBlockModifier.spec.js +130 -0
- package/dist/plugins/HeadingTranformer.spec.d.ts +1 -0
- package/dist/plugins/HeadingTranformer.spec.js +46 -0
- package/dist/plugins/HeadingTransformer.d.ts +2 -0
- package/dist/plugins/HeadingTransformer.js +63 -0
- package/dist/plugins/NumberedListTransformer.d.ts +2 -0
- package/dist/plugins/NumberedListTransformer.js +55 -0
- package/dist/plugins/NumberedListTransformer.spec.d.ts +1 -0
- package/dist/plugins/NumberedListTransformer.spec.js +86 -0
- package/dist/plugins/TableTransformer.d.ts +5 -0
- package/dist/plugins/TableTransformer.js +70 -0
- package/dist/plugins/embedTweaks.d.ts +5 -0
- package/dist/plugins/embedTweaks.js +46 -0
- package/dist/plugins/embedTweaks.spec.d.ts +1 -0
- package/dist/plugins/embedTweaks.spec.js +230 -0
- package/dist/plugins/externalLinks.d.ts +2 -0
- package/dist/plugins/externalLinks.js +26 -0
- package/dist/plugins/externalLinks.spec.d.ts +1 -0
- package/dist/plugins/externalLinks.spec.js +132 -0
- package/dist/plugins/internalLinks.d.ts +7 -0
- package/dist/plugins/internalLinks.js +102 -0
- package/dist/plugins/internalLinks.spec.d.ts +1 -0
- package/dist/plugins/internalLinks.spec.js +505 -0
- package/dist/plugins/mermaidLinkPlugin.spec.d.ts +1 -0
- package/dist/plugins/mermaidLinkPlugin.spec.js +77 -0
- package/dist/plugins/pluginTestRun.d.ts +10 -0
- package/dist/plugins/pluginTestRun.js +252 -0
- package/dist/plugins/pluginTypes.d.ts +44 -0
- package/dist/plugins/pluginTypes.js +2 -0
- package/dist/pull.d.ts +12 -0
- package/dist/pull.js +255 -0
- package/dist/run.d.ts +1 -0
- package/dist/run.js +35 -0
- package/dist/transform.d.ts +6 -0
- package/dist/transform.js +200 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.js +2 -0
- package/package.json +103 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getMarkdownFromNotionBlocks = exports.getMarkdownForPage = void 0;
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
const log_1 = require("./log");
|
|
18
|
+
function getMarkdownForPage(config, context, page) {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
(0, log_1.info)(`Reading & converting page ${page.layoutContext}/${page.nameOrTitle} (${chalk_1.default.blue(page.hasExplicitSlug
|
|
21
|
+
? page.slug
|
|
22
|
+
: page.foundDirectlyInOutline
|
|
23
|
+
? "Descendant of Outline, not Database"
|
|
24
|
+
: "NO SLUG")})`);
|
|
25
|
+
const blocks = yield context.getBlockChildren(page.pageId);
|
|
26
|
+
(0, log_1.logDebugFn)("markdown from page", () => JSON.stringify(blocks, null, 2));
|
|
27
|
+
const body = yield getMarkdownFromNotionBlocks(context, config, blocks);
|
|
28
|
+
const frontmatter = getFrontMatter(page); // todo should be a plugin
|
|
29
|
+
return `${frontmatter}\n${body}`;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
exports.getMarkdownForPage = getMarkdownForPage;
|
|
33
|
+
// this is split off from getMarkdownForPage so that unit tests can provide the block contents
|
|
34
|
+
function getMarkdownFromNotionBlocks(context, config, blocks) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
// changes to the blocks we get from notion API
|
|
37
|
+
doNotionBlockTransforms(blocks, config);
|
|
38
|
+
// overrides for the default notion-to-markdown conversions
|
|
39
|
+
registerNotionToMarkdownCustomTransforms(config, context);
|
|
40
|
+
// the main conversion to markdown, using the notion-to-md library
|
|
41
|
+
let markdown = yield doNotionToMarkdown(context, blocks); // ?
|
|
42
|
+
// corrections to links after they are converted to markdown,
|
|
43
|
+
// with access to all the pages we've seen
|
|
44
|
+
markdown = doLinkFixes(context, markdown, config);
|
|
45
|
+
//console.log("markdown after link fixes", markdown);
|
|
46
|
+
// simple regex-based tweaks. These are usually related to docusaurus
|
|
47
|
+
const { imports, body } = yield doTransformsOnMarkdown(context, config, markdown);
|
|
48
|
+
// console.log("markdown after regex fixes", markdown);
|
|
49
|
+
// console.log("body after regex", body);
|
|
50
|
+
return `${imports}\n${body}`;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
exports.getMarkdownFromNotionBlocks = getMarkdownFromNotionBlocks;
|
|
54
|
+
// operations on notion blocks before they are converted to markdown
|
|
55
|
+
function doNotionBlockTransforms(blocks, config) {
|
|
56
|
+
for (const block of blocks) {
|
|
57
|
+
config.plugins.forEach(plugin => {
|
|
58
|
+
if (plugin.notionBlockModifications) {
|
|
59
|
+
plugin.notionBlockModifications.forEach(transform => {
|
|
60
|
+
(0, log_1.logDebug)("transforming block with plugin", plugin.name);
|
|
61
|
+
transform.modify(block);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function doTransformsOnMarkdown(context, config, input) {
|
|
68
|
+
var _a;
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
const regexMods = config.plugins
|
|
71
|
+
.filter(plugin => !!plugin.regexMarkdownModifications)
|
|
72
|
+
.map(plugin => {
|
|
73
|
+
const mods = plugin.regexMarkdownModifications;
|
|
74
|
+
// stick the name of the plugin into each mode for logging
|
|
75
|
+
const modsWithNames = mods.map(m => (Object.assign({ name: plugin.name }, m)));
|
|
76
|
+
return modsWithNames;
|
|
77
|
+
})
|
|
78
|
+
.flat();
|
|
79
|
+
// regex that matches markdown code blocks
|
|
80
|
+
const codeBlocks = /```.*\n[\s\S]*?\n```/;
|
|
81
|
+
let body = input;
|
|
82
|
+
//console.log("body before regex: " + body);
|
|
83
|
+
let match;
|
|
84
|
+
const imports = new Set();
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
86
|
+
for (const mod of regexMods) {
|
|
87
|
+
let replacement = undefined;
|
|
88
|
+
// regex.exec is stateful, so we don't want to mess up the plugin's use of its own regex, so we clone it.
|
|
89
|
+
// we also add the "g" flag to make sure we get all matches
|
|
90
|
+
const regex = new RegExp(`${codeBlocks.source}|(${mod.regex.source})`, "g");
|
|
91
|
+
while ((match = regex.exec(input)) !== null) {
|
|
92
|
+
if (match[0]) {
|
|
93
|
+
const original = match[0];
|
|
94
|
+
if (original.startsWith("```") &&
|
|
95
|
+
original.endsWith("```") &&
|
|
96
|
+
!mod.includeCodeBlocks) {
|
|
97
|
+
continue; // code block, and they didn't say to include them
|
|
98
|
+
}
|
|
99
|
+
if (mod.getReplacement) {
|
|
100
|
+
// our match here has an extra group, which is an implementation detail
|
|
101
|
+
// that shouldn't be made visible to the plugin
|
|
102
|
+
const matchAsThePluginWouldExpectIt = mod.regex.exec(match[0]);
|
|
103
|
+
replacement = yield mod.getReplacement(context, matchAsThePluginWouldExpectIt);
|
|
104
|
+
}
|
|
105
|
+
else if (mod.replacementPattern) {
|
|
106
|
+
console.log(`mod.replacementPattern.replace("$1", ${match[2]}`);
|
|
107
|
+
replacement = mod.replacementPattern.replace("$1", match[2]);
|
|
108
|
+
}
|
|
109
|
+
if (replacement !== undefined) {
|
|
110
|
+
(0, log_1.verbose)(`[${mod.name}] ${original} --> ${replacement}`);
|
|
111
|
+
const precedingPart = body.substring(0, match.index); // ?
|
|
112
|
+
const partStartingFromThisMatch = body.substring(match.index); // ?
|
|
113
|
+
body =
|
|
114
|
+
precedingPart +
|
|
115
|
+
partStartingFromThisMatch.replace(original, replacement);
|
|
116
|
+
// add any library imports
|
|
117
|
+
(_a = mod.imports) === null || _a === void 0 ? void 0 : _a.forEach(imp => imports.add(imp));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
(0, log_1.logDebug)("doTransformsOnMarkdown", "body after regex: " + body);
|
|
123
|
+
const uniqueImports = [...new Set(imports)];
|
|
124
|
+
return { body, imports: [...uniqueImports].join("\n") };
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function doNotionToMarkdown(docunotionContext, blocks) {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
const mdBlocks = yield docunotionContext.notionToMarkdown.blocksToMarkdown(blocks);
|
|
130
|
+
const markdown = docunotionContext.notionToMarkdown.toMarkdownString(mdBlocks);
|
|
131
|
+
return markdown;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// corrections to links after they are converted to markdown
|
|
135
|
+
// Note: from notion (or notion-md?) we get slightly different hrefs depending on whether the links is "inline"
|
|
136
|
+
// (has some other text that's been turned into a link) or "raw".
|
|
137
|
+
// Raw links come in without a leading slash, e.g. [link_to_page](4a6de8c0-b90b-444b-8a7b-d534d6ec71a4)
|
|
138
|
+
// Inline links come in with a leading slash, e.g. [pointer to the introduction](/4a6de8c0b90b444b8a7bd534d6ec71a4)
|
|
139
|
+
function doLinkFixes(context, markdown, config) {
|
|
140
|
+
const linkRegExp = /\[.*\]\([^\)]*\)/g;
|
|
141
|
+
(0, log_1.logDebug)("markdown before link fixes", markdown);
|
|
142
|
+
let match;
|
|
143
|
+
// since we're going to make changes to the markdown,
|
|
144
|
+
// we need to keep track of where we are in the string as we search
|
|
145
|
+
const markdownToSearch = markdown;
|
|
146
|
+
// The key to understanding this `while` is that linkRegExp actually has state, and
|
|
147
|
+
// it gives you a new one each time. https://stackoverflow.com/a/1520853/723299
|
|
148
|
+
while ((match = linkRegExp.exec(markdownToSearch)) !== null) {
|
|
149
|
+
const originalLinkMarkdown = match[0];
|
|
150
|
+
(0, log_1.verbose)(`Checking to see if a plugin wants to modify "${originalLinkMarkdown}" `);
|
|
151
|
+
// We only use the first plugin that matches and makes a change to the link.
|
|
152
|
+
// Enhance: we could take the time to see if multiple plugins match, and
|
|
153
|
+
// and point this out in verbose logging mode.
|
|
154
|
+
config.plugins.some(plugin => {
|
|
155
|
+
if (!plugin.linkModifier)
|
|
156
|
+
return false;
|
|
157
|
+
if (plugin.linkModifier.match.exec(originalLinkMarkdown) === null) {
|
|
158
|
+
(0, log_1.verbose)(`plugin "${plugin.name}" did not match this url`);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
const newMarkdown = plugin.linkModifier.convert(context, originalLinkMarkdown);
|
|
162
|
+
if (newMarkdown !== originalLinkMarkdown) {
|
|
163
|
+
markdown = markdown.replace(originalLinkMarkdown, newMarkdown);
|
|
164
|
+
(0, log_1.verbose)(`plugin "${plugin.name}" transformed link: ${originalLinkMarkdown}-->${newMarkdown}`);
|
|
165
|
+
return true; // the first plugin that matches and does something wins
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
(0, log_1.verbose)(`plugin "${plugin.name}" did not change this url`);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return markdown;
|
|
174
|
+
}
|
|
175
|
+
// overrides for the conversions that notion-to-md does
|
|
176
|
+
function registerNotionToMarkdownCustomTransforms(config, docunotionContext) {
|
|
177
|
+
config.plugins.forEach(plugin => {
|
|
178
|
+
if (plugin.notionToMarkdownTransforms) {
|
|
179
|
+
plugin.notionToMarkdownTransforms.forEach(transform => {
|
|
180
|
+
(0, log_1.logDebug)("registering custom transform", `${plugin.name} for ${transform.type}`);
|
|
181
|
+
docunotionContext.notionToMarkdown.setCustomTransformer(transform.type, (block) => {
|
|
182
|
+
(0, log_1.logDebug)("notion to MD conversion of ", `${transform.type} with plugin: ${plugin.name}`);
|
|
183
|
+
return transform.getStringFromBlock(docunotionContext, block);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
// enhance:make this built-in plugin so that it can be overridden
|
|
190
|
+
function getFrontMatter(page) {
|
|
191
|
+
var _a;
|
|
192
|
+
let frontmatter = "---\n";
|
|
193
|
+
frontmatter += `title: ${page.nameOrTitle.replaceAll(":", "-")}\n`; // I have not found a way to escape colons
|
|
194
|
+
frontmatter += `sidebar_position: ${page.order}\n`;
|
|
195
|
+
frontmatter += `slug: ${(_a = page.slug) !== null && _a !== void 0 ? _a : ""}\n`;
|
|
196
|
+
if (page.keywords)
|
|
197
|
+
frontmatter += `keywords: [${page.keywords}]\n`;
|
|
198
|
+
frontmatter += "---\n";
|
|
199
|
+
return frontmatter;
|
|
200
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BlockObjectResponse } from "@notionhq/client/build/src/api-endpoints";
|
|
2
|
+
export type NotionBlock = BlockObjectResponse;
|
|
3
|
+
export type ICounts = {
|
|
4
|
+
output_normally: number;
|
|
5
|
+
skipped_because_empty: number;
|
|
6
|
+
skipped_because_status: number;
|
|
7
|
+
skipped_because_level_cannot_have_content: number;
|
|
8
|
+
};
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sillsdev/docu-notion",
|
|
3
|
+
"description": "Download Notion pages as markdown and image files, preserving hierarchy and enabling workflow properties. Works with Docusaurus.",
|
|
4
|
+
"main": "./dist/index.js",
|
|
5
|
+
"bin": "dist/index.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist/**/*"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "vitest",
|
|
11
|
+
"build": "npm run test -- --run && tsc && cp ./src/css/*.css dist/",
|
|
12
|
+
"build-only": "tsc && cp ./src/css/*.css dist/",
|
|
13
|
+
"clean": "rimraf ./dist/",
|
|
14
|
+
"semantic-release": "semantic-release",
|
|
15
|
+
"cmdhelp": "ts-node src/index.ts",
|
|
16
|
+
"// note that we're not using ts-node at the moment because of ": "https://github.com/Codex-/cosmiconfig-typescript-loader/issues/70",
|
|
17
|
+
"ts": "tsc && rimraf ./docs/ && cross-var node dist/index.js",
|
|
18
|
+
"// typescript check": "",
|
|
19
|
+
"tsc": "tsc",
|
|
20
|
+
"// test out with a private sample notion db": "",
|
|
21
|
+
"pull-test-tagged": "npm run ts -- -n $DOCU_NOTION_INTEGRATION_TOKEN -r $DOCU_NOTION_TEST_ROOT_PAGE_ID --log-level debug --status-tag test",
|
|
22
|
+
"pull-sample-site": "npm run ts -- -n $DOCU_NOTION_INTEGRATION_TOKEN -r $DOCU_NOTION_SAMPLE_ROOT_PAGE --log-level debug",
|
|
23
|
+
"// test with a semi-stable/public site:": "",
|
|
24
|
+
"pull-sample": "npm run ts -- -n $DOCU_NOTION_INTEGRATION_TOKEN -r $DOCU_NOTION_SAMPLE_ROOT_PAGE -m ./sample --locales en,es,fr,de --log-level verbose",
|
|
25
|
+
"pull-sample-with-paths": "npm run ts -- -n $DOCU_NOTION_INTEGRATION_TOKEN -r $DOCU_NOTION_SAMPLE_ROOT_PAGE -m ./sample --img-output-path ./sample_img"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/sillsdev/docu-notion.git"
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"author": {
|
|
33
|
+
"name": "SIL Language Software Development",
|
|
34
|
+
"email": "sillsdev@users.noreply.github.com",
|
|
35
|
+
"url": "https://github.com/sillsdev"
|
|
36
|
+
},
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=12.0"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"docusaurus",
|
|
42
|
+
"notion",
|
|
43
|
+
"markdown"
|
|
44
|
+
],
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/sillsdev/docu-notion/issues"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/sillsdev/docu-notion#readme",
|
|
49
|
+
"//file-type": "have to use this version before they switched to ESM, which gives a compile error related to require()",
|
|
50
|
+
"//node-fetch@2.6.6file-type": "have to use this version before they switched to ESM, which gives a compile error related to require()",
|
|
51
|
+
"//chalk@4": "also ESM related problem",
|
|
52
|
+
"//notion-client@4": "also ESM related problem",
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@notionhq/client": "2.2.3",
|
|
55
|
+
"chalk": "^4.1.2",
|
|
56
|
+
"commander": "^9.2.0",
|
|
57
|
+
"cosmiconfig": "^8.0.0",
|
|
58
|
+
"cosmiconfig-typescript-loader": "^4.3.0",
|
|
59
|
+
"file-type": "16.5.1",
|
|
60
|
+
"fs-extra": "^10.1.0",
|
|
61
|
+
"limiter": "^2.1.0",
|
|
62
|
+
"markdown-table": "^2.0.0",
|
|
63
|
+
"node-fetch": "2.6.6",
|
|
64
|
+
"notion-client": "^4",
|
|
65
|
+
"notion-to-md": "^2.5.5",
|
|
66
|
+
"path": "^0.12.7",
|
|
67
|
+
"sanitize-filename": "^1.6.3"
|
|
68
|
+
},
|
|
69
|
+
"devDependencies": {
|
|
70
|
+
"@types/fs-extra": "^9.0.13",
|
|
71
|
+
"@types/markdown-table": "^2.0.0",
|
|
72
|
+
"@types/node": "^18.15.11",
|
|
73
|
+
"@typescript-eslint/eslint-plugin": "^4.22.0",
|
|
74
|
+
"@typescript-eslint/parser": "^4.22.0",
|
|
75
|
+
"@vitest/ui": "^0.30.1",
|
|
76
|
+
"cross-var": "^1.1.0",
|
|
77
|
+
"cz-conventional-changelog": "^3.3.0",
|
|
78
|
+
"eslint": "^7.25.0",
|
|
79
|
+
"eslint-config-prettier": "^8.3.0",
|
|
80
|
+
"eslint-plugin-node": "^11.1.0",
|
|
81
|
+
"eslint-plugin-prettier": "^3.4.0",
|
|
82
|
+
"lint-staged": "^10.5.4",
|
|
83
|
+
"prettier": "^2.2.1",
|
|
84
|
+
"rimraf": "^4.1.2",
|
|
85
|
+
"semantic-release": "^19.0.2",
|
|
86
|
+
"ts-node": "^10.2.1",
|
|
87
|
+
"typescript": "^4.6.4",
|
|
88
|
+
"vite": "^4.2.1",
|
|
89
|
+
"vitest": "^0.30.1"
|
|
90
|
+
},
|
|
91
|
+
"release": {
|
|
92
|
+
"branches": [
|
|
93
|
+
"main"
|
|
94
|
+
]
|
|
95
|
+
},
|
|
96
|
+
"publishConfig": {
|
|
97
|
+
"access": "public"
|
|
98
|
+
},
|
|
99
|
+
"volta": {
|
|
100
|
+
"node": "18.16.0"
|
|
101
|
+
},
|
|
102
|
+
"version": "0.11.1"
|
|
103
|
+
}
|