diff --git a/.i18n-codegen.json b/.i18n-codegen.json
index 6ef6e33910e5..807ea0027cc4 100644
--- a/.i18n-codegen.json
+++ b/.i18n-codegen.json
@@ -157,6 +157,18 @@
"trans": "Translate",
"sourceMap": "inline"
}
+ },
+ {
+ "input": "./packages/plugins/template/src/locales/en-US.json",
+ "output": "./packages/plugins/template/src/locales/i18n_generated",
+ "parser": "i18next",
+ "generator": {
+ "type": "i18next/react-hooks",
+ "hooks": "useI18N",
+ "namespace": "__template__",
+ "trans": "Translate",
+ "sourceMap": "inline"
+ }
}
]
}
diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs
index 850883e4424e..18f81567dd5f 100644
--- a/.pnpmfile.cjs
+++ b/.pnpmfile.cjs
@@ -20,8 +20,6 @@ const approvedList = new Map([
['html-parse-stringify2', 'github:locize/html-parse-stringify2'],
/* cspell:disable-next-line */
['async-eventemitter', 'github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c'],
- // !!! Relative path
- ['xhr2-cookies', 'link:./package-overrides/xhr2-cookies'],
])
/**
diff --git a/docs/plugin-development-guide.md b/docs/plugin-development-guide.md
index ca6d6e68de16..42c2ef8676cc 100644
--- a/docs/plugin-development-guide.md
+++ b/docs/plugin-development-guide.md
@@ -7,9 +7,15 @@ maintainer:
# Plugin Development Guide
+## Run
+
+> npx gulp new-pkg
+
+To create a new plugin
+
## Minimum File Structure
-`packages/plugins/example/src` is an example of this structure.
+The following folder is automatically created by the command above.
```plaintext
packages/mask/src/plugins/{your-plugin-name}
@@ -34,22 +40,14 @@ The file need to provide this information:
- Reference resource list
- Known issues / Caveats
-## Registration
-
-Import your plugin definition at: `packages/mask/src/plugin-infra/register.ts`.
-
-If your plugin is defined at `packages/plugins/*` instead of `packages/mask/src/plugins/*`, please make sure you have set up the monorepo correctly.
-
-Plugins defined at `packages/plugins/*` and compatible with the isolated dashboard should also be registered in `packages/dashboard/src/initialization/plugins.ts`
-
## Plugin APIs
- Plugin definition: `packages/plugin-infra/src/types.ts`
- Database: `context.getDatabaseStorage()` (2nd parameter of the `init` method of your `Worker` definition). See example in `packages/plugins/example/src/Worker/index.ts`.
-- Message emitter: `createPluginMessage` in `packages/plugin-infra/src/utils/message.ts`
-- RPC: `createPluginRPC` in `packages/plugin-infra/src/utils/rpc.ts`
-- Metadata reader: `createTypedMessageMetadataReader` in `packages/mask/src/protocols/typed-message/metadata.ts`
-- React renderer with metadata reader: `createRenderWithMetadata` in `packages/mask/src/protocols/typed-message/metadata.ts`
+- Message emitter: `createPluginMessage` exported from `@masknet/plugin-infra`
+- RPC: `createPluginRPC` exported from `@masknet/plugin-infra`
+- Metadata reader: `createTypedMessageMetadataReader` in `@masknet/shared-base`
+- React renderer with metadata reader: `createRenderWithMetadata` in `@masknet/shared-base`
## Architecture
diff --git a/package-overrides/xhr2-cookies/index.cjs b/package-overrides/xhr2-cookies/index.cjs
deleted file mode 100644
index 9e6169823132..000000000000
--- a/package-overrides/xhr2-cookies/index.cjs
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = globalThis.XMLHttpRequest
diff --git a/package-overrides/xhr2-cookies/index.mjs b/package-overrides/xhr2-cookies/index.mjs
deleted file mode 100644
index 5c7550194623..000000000000
--- a/package-overrides/xhr2-cookies/index.mjs
+++ /dev/null
@@ -1,2 +0,0 @@
-export const XMLHttpRequest = globalThis.XMLHttpRequest
-export default globalThis.XMLHttpRequest
diff --git a/package-overrides/xhr2-cookies/package.json b/package-overrides/xhr2-cookies/package.json
deleted file mode 100644
index 40556c0b21a2..000000000000
--- a/package-overrides/xhr2-cookies/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "xhr2-cookies",
- "type": "module",
- "main": "./index.cjs",
- "module": "./index.mjs"
-}
diff --git a/package.json b/package.json
index 93c36f85cdfb..2059a7bd7dca 100644
--- a/package.json
+++ b/package.json
@@ -83,8 +83,7 @@
},
"pnpm": {
"overrides": {
- "xhr2-cookies": "link:./package-overrides/xhr2-cookies",
- "@types/node": "^16.11.6"
+ "@types/node": "^17.0.17"
}
}
}
diff --git a/packages/empty/package.json b/packages/empty/package.json
index ef41fd6e157a..916baf8f2a71 100644
--- a/packages/empty/package.json
+++ b/packages/empty/package.json
@@ -1,6 +1,5 @@
{
"name": "@masknet/null",
- "version": "0.0.0",
"private": true,
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
diff --git a/packages/empty/tests/.gitkeep b/packages/empty/tests/.gitkeep
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/packages/empty/tsconfig.tests.json b/packages/empty/tsconfig.tests.json
new file mode 100644
index 000000000000..5c696bf78dab
--- /dev/null
+++ b/packages/empty/tsconfig.tests.json
@@ -0,0 +1,10 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "noEmit": true,
+ "tsBuildInfoFile": "./dist/tests.tsbuildinfo",
+ "types": ["node"]
+ },
+ "include": ["./tests"],
+ "references": [{ "path": "./tsconfig.json" }]
+}
diff --git a/packages/mask/src/plugins/NextID/locales/languages.ts b/packages/mask/src/plugins/NextID/locales/languages.ts
index b188075ca8d6..b0b73b68c8b3 100644
--- a/packages/mask/src/plugins/NextID/locales/languages.ts
+++ b/packages/mask/src/plugins/NextID/locales/languages.ts
@@ -3,17 +3,32 @@
// Default fallback language in a family of languages are chosen by the alphabet order
// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts
import en_US from './en-US.json'
+import ja_JP from './ja-JP.json'
+import ko_KR from './ko-KR.json'
+import qya_AA from './qya-AA.json'
+import zh_CN from './zh-CN.json'
+import zh_TW from './zh-TW.json'
export const languages = {
en: en_US,
+ ja: ja_JP,
+ ko: ko_KR,
+ qy: qya_AA,
+ 'zh-CN': zh_CN,
+ zh: zh_TW,
}
// @ts-ignore
if (import.meta.webpackHot) {
// @ts-ignore
- import.meta.webpackHot.accept(['./en-US.json'], () =>
- globalThis.dispatchEvent?.(
- new CustomEvent('MASK_I18N_HMR', {
- detail: ['com.mask.nextid', { en: en_US }],
- }),
- ),
+ import.meta.webpackHot.accept(
+ ['./en-US.json', './ja-JP.json', './ko-KR.json', './qya-AA.json', './zh-CN.json', './zh-TW.json'],
+ () =>
+ globalThis.dispatchEvent?.(
+ new CustomEvent('MASK_I18N_HMR', {
+ detail: [
+ 'com.mask.next_id',
+ { en: en_US, ja: ja_JP, ko: ko_KR, qy: qya_AA, 'zh-CN': zh_CN, zh: zh_TW },
+ ],
+ }),
+ ),
)
}
diff --git a/packages/plugin-infra/src/types.ts b/packages/plugin-infra/src/types.ts
index 573d240b1ca4..7d6eeba9a3a1 100644
--- a/packages/plugin-infra/src/types.ts
+++ b/packages/plugin-infra/src/types.ts
@@ -720,6 +720,7 @@ export enum PluginId {
PoolTogether = 'com.pooltogether',
UnlockProtocol = 'com.maskbook.unlockprotocol',
FileService = 'com.maskbook.fileservice',
+ // @masknet/scripts: insert-here
}
export interface Pagination {
diff --git a/packages/plugins/example/src/locales/languages.ts b/packages/plugins/example/src/locales/languages.ts
index 0818a6f2f73f..1c9a8260bafb 100644
--- a/packages/plugins/example/src/locales/languages.ts
+++ b/packages/plugins/example/src/locales/languages.ts
@@ -3,18 +3,16 @@
// Default fallback language in a family of languages are chosen by the alphabet order
// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts
import en_US from './en-US.json'
-import zh_TW from './zh-TW.json'
export const languages = {
en: en_US,
- zh: zh_TW,
}
// @ts-ignore
if (import.meta.webpackHot) {
// @ts-ignore
- import.meta.webpackHot.accept(['./en-US.json', './zh-TW.json'], () =>
+ import.meta.webpackHot.accept(['./en-US.json'], () =>
globalThis.dispatchEvent?.(
new CustomEvent('MASK_I18N_HMR', {
- detail: ['io.mask.example', { en: en_US, zh: zh_TW }],
+ detail: ['io.mask.example', { en: en_US }],
}),
),
)
diff --git a/packages/plugins/example/src/locales/zh-TW.json b/packages/plugins/example/src/locales/zh-TW.json
deleted file mode 100644
index 0230173f422c..000000000000
--- a/packages/plugins/example/src/locales/zh-TW.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "name": "測試插件",
- "__entry__": "🤔 測試"
-}
diff --git a/packages/plugins/template/README.md b/packages/plugins/template/README.md
new file mode 100644
index 000000000000..c67dc19c5f8b
--- /dev/null
+++ b/packages/plugins/template/README.md
@@ -0,0 +1,7 @@
+# Example plugin
+
+## TODOs
+
+## Referenced resources
+
+## Known issues / Caveats
diff --git a/packages/plugins/template/package.json b/packages/plugins/template/package.json
new file mode 100644
index 000000000000..7539398a33db
--- /dev/null
+++ b/packages/plugins/template/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "@masknet/plugin-template",
+ "private": true,
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "dependencies": {
+ "@masknet/plugin-infra": "workspace:*",
+ "@masknet/shared": "workspace:*",
+ "@masknet/shared-base": "workspace:*",
+ "react-use": "^17.3.2"
+ }
+}
diff --git a/packages/plugins/template/src/Dashboard/index.tsx b/packages/plugins/template/src/Dashboard/index.tsx
new file mode 100644
index 000000000000..3052bb2f8ad3
--- /dev/null
+++ b/packages/plugins/template/src/Dashboard/index.tsx
@@ -0,0 +1,9 @@
+import type { Plugin } from '@masknet/plugin-infra'
+import { base } from '../base'
+
+const dashboard: Plugin.Dashboard.Definition = {
+ ...base,
+ init(signal, context) {},
+}
+
+export default dashboard
diff --git a/packages/plugins/template/src/SNSAdaptor/index.tsx b/packages/plugins/template/src/SNSAdaptor/index.tsx
new file mode 100644
index 000000000000..6a18d03fda0c
--- /dev/null
+++ b/packages/plugins/template/src/SNSAdaptor/index.tsx
@@ -0,0 +1,9 @@
+import type { Plugin } from '@masknet/plugin-infra'
+import { base } from '../base'
+
+const sns: Plugin.SNSAdaptor.Definition = {
+ ...base,
+ init(signal, context) {},
+}
+
+export default sns
diff --git a/packages/plugins/template/src/Worker/index.ts b/packages/plugins/template/src/Worker/index.ts
new file mode 100644
index 000000000000..6c436f1cb4fb
--- /dev/null
+++ b/packages/plugins/template/src/Worker/index.ts
@@ -0,0 +1,9 @@
+import type { Plugin } from '@masknet/plugin-infra'
+import { base } from '../base'
+
+const worker: Plugin.Worker.Definition = {
+ ...base,
+ init(signal, context) {},
+}
+
+export default worker
diff --git a/packages/plugins/template/src/base.ts b/packages/plugins/template/src/base.ts
new file mode 100644
index 000000000000..b88adee59a7f
--- /dev/null
+++ b/packages/plugins/template/src/base.ts
@@ -0,0 +1,18 @@
+import type { Plugin } from '@masknet/plugin-infra'
+import { PLUGIN_DESCRIPTION, PLUGIN_ID, PLUGIN_NAME } from './constants'
+import { languages } from './locales/languages'
+
+export const base: Plugin.Shared.Definition = {
+ ID: PLUGIN_ID,
+ icon: '\u{1F9EA}',
+ name: { fallback: PLUGIN_NAME },
+ description: { fallback: PLUGIN_DESCRIPTION },
+ publisher: { name: { fallback: '' }, link: '' },
+ enableRequirement: {
+ architecture: { app: false, web: true },
+ networks: { type: 'opt-out', networks: {} },
+ target: 'beta',
+ },
+ experimentalMark: true,
+ i18n: languages,
+}
diff --git a/packages/plugins/template/src/constants.ts b/packages/plugins/template/src/constants.ts
new file mode 100644
index 000000000000..ff2f9de64642
--- /dev/null
+++ b/packages/plugins/template/src/constants.ts
@@ -0,0 +1,5 @@
+import { PluginId } from '@masknet/plugin-infra'
+
+export const PLUGIN_ID = PluginId.Example
+export const PLUGIN_DESCRIPTION = 'An example plugin of Mask Network.'
+export const PLUGIN_NAME = 'Example'
diff --git a/packages/plugins/template/src/env.d.ts b/packages/plugins/template/src/env.d.ts
new file mode 100644
index 000000000000..868322d5ff30
--- /dev/null
+++ b/packages/plugins/template/src/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/packages/plugins/template/src/index.ts b/packages/plugins/template/src/index.ts
new file mode 100644
index 000000000000..ec9b1a34e7af
--- /dev/null
+++ b/packages/plugins/template/src/index.ts
@@ -0,0 +1,23 @@
+import { registerPlugin } from '@masknet/plugin-infra'
+import { base } from './base'
+
+export * from './constants'
+
+registerPlugin({
+ ...base,
+ SNSAdaptor: {
+ load: () => import('./SNSAdaptor'),
+ hotModuleReload: (hot) =>
+ import.meta.webpackHot && import.meta.webpackHot.accept('./SNSAdaptor', () => hot(import('./SNSAdaptor'))),
+ },
+ Dashboard: {
+ load: () => import('./Dashboard'),
+ hotModuleReload: (hot) =>
+ import.meta.webpackHot && import.meta.webpackHot.accept('./Dashboard', () => hot(import('./Dashboard'))),
+ },
+ Worker: {
+ load: () => import('./Worker'),
+ hotModuleReload: (hot) =>
+ import.meta.webpackHot && import.meta.webpackHot.accept('./Worker', () => hot(import('./Worker'))),
+ },
+})
diff --git a/packages/plugins/template/src/locales/en-US.json b/packages/plugins/template/src/locales/en-US.json
new file mode 100644
index 000000000000..6585c4ff2c25
--- /dev/null
+++ b/packages/plugins/template/src/locales/en-US.json
@@ -0,0 +1,4 @@
+{
+ "name": "Example Plugin",
+ "__entry__": "🤔 Example"
+}
diff --git a/packages/plugins/template/src/locales/index.ts b/packages/plugins/template/src/locales/index.ts
new file mode 100644
index 000000000000..d6ead60252e4
--- /dev/null
+++ b/packages/plugins/template/src/locales/index.ts
@@ -0,0 +1,6 @@
+// This file is auto generated. DO NOT EDIT
+// Run `npx gulp sync-languages` to regenerate.
+// Default fallback language in a family of languages are chosen by the alphabet order
+// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts
+
+export * from './i18n_generated'
diff --git a/packages/plugins/template/src/locales/languages.ts b/packages/plugins/template/src/locales/languages.ts
new file mode 100644
index 000000000000..ae368751ee48
--- /dev/null
+++ b/packages/plugins/template/src/locales/languages.ts
@@ -0,0 +1,21 @@
+// This file is auto generated. DO NOT EDIT
+// Run `npx gulp sync-languages` to regenerate.
+// Default fallback language in a family of languages are chosen by the alphabet order
+// To overwrite this, please overwrite packages/scripts/src/locale-kit-next/index.ts
+import en_US from './en-US.json'
+export const languages = {
+ en: en_US,
+}
+import { createI18NBundle } from '@masknet/shared-base'
+export const add__template__I18N = createI18NBundle('__template__', languages)
+// @ts-ignore
+if (import.meta.webpackHot) {
+ // @ts-ignore
+ import.meta.webpackHot.accept(['./en-US.json'], () =>
+ globalThis.dispatchEvent?.(
+ new CustomEvent('MASK_I18N_HMR', {
+ detail: ['__template__', { en: en_US }],
+ }),
+ ),
+ )
+}
diff --git a/packages/plugins/template/tsconfig.json b/packages/plugins/template/tsconfig.json
new file mode 100644
index 000000000000..da48bfe2740e
--- /dev/null
+++ b/packages/plugins/template/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "outDir": "dist",
+ "tsBuildInfoFile": "dist/.tsbuildinfo",
+ "resolveJsonModule": true
+ },
+ "include": ["src", "src/**/*.json"],
+ "references": [{ "path": "../../plugin-infra" }, { "path": "../../shared" }, { "path": "../../shared-base" }]
+}
diff --git a/packages/plugins/tsconfig.json b/packages/plugins/tsconfig.json
index 89cb24e84ab7..805c5a367f8c 100644
--- a/packages/plugins/tsconfig.json
+++ b/packages/plugins/tsconfig.json
@@ -1,6 +1,7 @@
{
"extends": "../../tsconfig.json",
"references": [
+ { "path": "./template/" },
{ "path": "./example/" },
{ "path": "./Debugger/" },
{ "path": "./Flow/" },
diff --git a/packages/scripts/package.json b/packages/scripts/package.json
index 89e92cb182b2..1351ab1ec3e2 100644
--- a/packages/scripts/package.json
+++ b/packages/scripts/package.json
@@ -8,12 +8,15 @@
"dependencies": {
"@types/rimraf": "^3.0.2",
"chalk": "^4.1.2",
+ "enquirer": "^2.3.6",
+ "fs-extra": "^10.0.0",
"gulp-zip": "^5.1.0",
"proper-lockfile": "^4.1.1",
"rimraf": "^3.0.2",
"yargs": "^17.3.1"
},
"devDependencies": {
+ "@types/fs-extra": "^9.0.13",
"@types/gulp": "^4.0.9",
"@types/lodash": "^4.14.178",
"@types/proper-lockfile": "^4.1.2",
diff --git a/packages/scripts/src/commands/clean.ts b/packages/scripts/src/commands/clean.ts
index cca37ad9d75c..263cfbb86f60 100644
--- a/packages/scripts/src/commands/clean.ts
+++ b/packages/scripts/src/commands/clean.ts
@@ -1,26 +1,14 @@
-import { awaitChildProcess, parseArgs, printShell, ROOT_PATH, shell, task } from '../utils'
+import { awaitChildProcess, printShell, ROOT_PATH, shell, task } from '../utils'
import rimraf from 'rimraf'
import { join } from 'path'
import { promisify } from 'util'
const rm = promisify(rimraf)
-interface Args {
- deps: boolean
-}
export async function clean() {
- const { deps } = parseArgs()
- if (deps) {
- printShell`rm -rf **/node_modules`
- await rm(join(ROOT_PATH, '**/node_modules'))
- await awaitChildProcess(shell.cwd(ROOT_PATH)`git clean -xdf ./packages/`)
- } else {
- await awaitChildProcess(shell.cwd(ROOT_PATH)`git clean -xdf -e node_modules ./packages/`)
- printShell`rm -rf **/node_modules/.cache`
- await rm(join(ROOT_PATH, '**/node_modules/.cache'))
- }
+ await awaitChildProcess(shell.cwd(ROOT_PATH)`git clean -xdf -e node_modules ./packages/`)
+ printShell`rm -rf **/node_modules/.cache`
+ await rm(join(ROOT_PATH, '**/node_modules/.cache'))
await awaitChildProcess(shell.cwd(ROOT_PATH)`pnpm install --frozen-lockfile --prefer-offline`)
}
-task(clean, 'clean', 'Clean all build caches', {
- '--deps': 'including node_modules',
-})
+task(clean, 'clean', 'Clean all build caches')
diff --git a/packages/scripts/src/commands/index.ts b/packages/scripts/src/commands/index.ts
index c695a46f6c2e..284d86201548 100644
--- a/packages/scripts/src/commands/index.ts
+++ b/packages/scripts/src/commands/index.ts
@@ -1,2 +1,3 @@
export * from './clean'
export * from './help'
+export * from './new-package'
diff --git a/packages/scripts/src/commands/new-package.ts b/packages/scripts/src/commands/new-package.ts
new file mode 100644
index 000000000000..a4d55f2843d8
--- /dev/null
+++ b/packages/scripts/src/commands/new-package.ts
@@ -0,0 +1,146 @@
+import { resolve } from 'path'
+import { copy, ensureDir } from 'fs-extra'
+import { prompt } from 'enquirer'
+import { identity, kebabCase, upperFirst } from 'lodash-unified'
+import { task } from '../utils/task'
+import { ROOT_PATH } from '../utils/paths'
+import { awaitChildProcess, changeFile, shell } from '../utils'
+
+type PackageOptions = {
+ type: 'plugin' | 'package'
+ path: string
+ npmName: string
+ pluginID?: string
+}
+export async function createPackageInteractive() {
+ // Select package type
+ const packageDetail: PackageOptions = {
+ path: '',
+ npmName: '',
+ type: await prompt<{ type: 'plugin' | 'package' }>({
+ type: 'select',
+ name: 'type',
+ choices: ['plugin', 'package'],
+ message: 'What type of package do you want to create?',
+ }).then((x) => x.type),
+ }
+
+ if (packageDetail.type === 'plugin') {
+ packageDetail.pluginID = await prompt<{ pluginID: string }>({
+ type: 'input',
+ message: 'What is the plugin ID? (e.g. "io.mask.example-plugin")',
+ name: 'pluginID',
+ }).then((x) => x.pluginID)
+ }
+
+ // Choose monorepo folder name
+ {
+ const base = 'packages/' + (packageDetail.type === 'plugin' ? 'plugins/' : '')
+ packageDetail.path =
+ base +
+ (packageDetail.type === 'plugin' ? upperFirst : identity)(
+ await prompt<{ name: string }>({
+ type: 'input',
+ name: 'name',
+ message: 'Create a new package at: ' + base,
+ }).then((x) => x.name),
+ )
+ packageDetail.path
+ }
+
+ // Choose npm package name
+ {
+ const suggestedNpmPackageName = kebabCase(packageDetail.path.split('/').at(-1))
+ packageDetail.npmName =
+ '@masknet/' +
+ (await prompt<{ npmName: string }>({
+ type: 'input',
+ name: 'npmName',
+ message: 'What is the npm package name? @masknet/',
+ initial:
+ packageDetail.type === 'package' ? suggestedNpmPackageName : 'plugin-' + suggestedNpmPackageName,
+ }).then((x) => x.npmName))
+ }
+
+ return createNewPackage(packageDetail)
+}
+task(createPackageInteractive, 'new-pkg', 'Create a new package interactively')
+
+const INSERT_HERE = '// @masknet/scripts: insert-here'
+async function createNewPackage({ path, npmName, type, pluginID }: PackageOptions) {
+ await changeFile(resolve(ROOT_PATH, 'pnpm-workspace.yaml'), (content) => content + ` - '${path}'\n`)
+
+ const packagePath = resolve(ROOT_PATH, path)
+ await ensureDir(packagePath)
+
+ if (type === 'plugin') {
+ const NormativeName = path.split('/').at(-1)
+ // cp -r packages/plugins/template packages/plugins/NEW_PLUGIN
+ await copy(resolve(ROOT_PATH, 'packages/plugins/template'), packagePath, {
+ filter: (src) => {
+ if (src.includes('node_modules') || src.includes('dist')) return false
+ return true
+ },
+ })
+ await changeFile.typescript(resolve(packagePath, 'src/constants.ts'), (content) =>
+ content.replace('PluginId.Example', `PluginId.${NormativeName}`),
+ )
+ await changeFile.JSON(resolve(packagePath, 'package.json'), (content) => {
+ content.name = npmName
+ })
+
+ /**
+ * .i18n-codegen.json
+ * packages/plugins/tsconfig.json
+ * packages/plugin-infra/src/types.ts
+ * packages/mask/src/plugin-infra/register.ts
+ * packages/mask/package.json
+ */
+ await changeFile.JSON(resolve(ROOT_PATH, '.i18n-codegen.json'), (content) => {
+ content.list.push({
+ input: `./${path}/src/locales/en-US.json`,
+ output: `./${path}/src/locales/i18n_generated`,
+ parser: 'i18next',
+ generator: {
+ type: 'i18next/react-hooks',
+ hooks: 'useI18N',
+ namespace: pluginID,
+ trans: 'Translate',
+ sourceMap: 'inline',
+ },
+ })
+ })
+ await changeFile.JSON(resolve(ROOT_PATH, 'packages/plugins/tsconfig.json'), (content) => {
+ content.references.push({ path: `./${NormativeName}/` })
+ })
+ await changeFile.typescript(resolve(ROOT_PATH, 'packages/plugin-infra/src/types.ts'), (content) =>
+ content.replace(INSERT_HERE, `${NormativeName} = '${pluginID}'\n${INSERT_HERE}`),
+ )
+ await changeFile.typescript(
+ resolve(ROOT_PATH, `packages/mask/src/plugin-infra/register.ts`),
+ (content) => `${content}import '${npmName}'`,
+ )
+ await awaitChildProcess(shell.cwd(ROOT_PATH)`pnpm install --prefer-offline -C packages/mask ${npmName}`)
+ await changeFile(resolve(ROOT_PATH, 'packages/mask/package.json'), (content) =>
+ content.replaceAll(/workspace:\^undefined/g, 'workspace:*'),
+ )
+ } else {
+ // cp -r packages/empty packages/NEW_PACKAGE
+ await copy(resolve(ROOT_PATH, 'packages/empty'), packagePath, {
+ filter: (src) => {
+ if (src.includes('node_modules') || src.includes('dist')) return false
+ return true
+ },
+ })
+ await changeFile.JSON(resolve(packagePath, 'package.json'), (content) => {
+ content.name = npmName
+ })
+ await changeFile(resolve(ROOT_PATH, 'tsconfig.json'), (content) =>
+ content.replace(INSERT_HERE, `${INSERT_HERE}\n { "path": "./${path}/tsconfig.tests.json" },`),
+ )
+ await changeFile(resolve(packagePath, 'README.md'), (content) => `# ${npmName}`)
+ }
+
+ // regenerate lockfile and install dependencies for newly installed packages
+ await awaitChildProcess(shell.cwd(ROOT_PATH)`pnpm install --prefer-offline`)
+}
diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts
index e69989569c06..46fb098cb97b 100644
--- a/packages/scripts/src/index.ts
+++ b/packages/scripts/src/index.ts
@@ -1,5 +1,3 @@
-export { clean, help } from './commands'
-export { localeKit } from './locale-kit'
export {
codegen,
codegenWatch,
@@ -12,6 +10,10 @@ export {
} from './codegen'
export { ciBuild } from './extension'
export { buildNetlify } from './netlify'
+
+// Tools
+export { clean, help, createPackageInteractive } from './commands'
+export { localeKit } from './locale-kit'
export { syncLanguages } from './locale-kit-next'
export { reorderSpellcheck } from './spellcheck'
diff --git a/packages/scripts/src/utils/index.ts b/packages/scripts/src/utils/index.ts
index 0f0df01d8d25..24aac8c04a53 100644
--- a/packages/scripts/src/utils/index.ts
+++ b/packages/scripts/src/utils/index.ts
@@ -6,3 +6,4 @@ export * from './run'
export * from './process-lock'
export * from './storybook'
export * from './walk'
+export * from './write'
diff --git a/packages/scripts/src/utils/write.ts b/packages/scripts/src/utils/write.ts
new file mode 100644
index 000000000000..27b9e98be167
--- /dev/null
+++ b/packages/scripts/src/utils/write.ts
@@ -0,0 +1,18 @@
+import { readFile, writeFile } from 'fs/promises'
+import { prettier } from './prettier'
+
+export async function changeFile(path: string, f: (x: string) => string | Promise) {
+ const content = await readFile(path, 'utf8')
+ const newContent = f(content)
+ await writeFile(path, await newContent)
+}
+changeFile.JSON = (path: string, f: (x: any) => void) => {
+ return changeFile(path, (content) => {
+ const obj = JSON.parse(content)
+ f(obj)
+ return prettier(JSON.stringify(obj), 'json')
+ })
+}
+changeFile.typescript = (path: string, f: (x: any) => any) => {
+ return changeFile(path, (content) => prettier(f(content), 'typescript'))
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c5a4ef742206..fc42ea3db80f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,8 +1,7 @@
lockfileVersion: 5.3
overrides:
- xhr2-cookies: link:./package-overrides/xhr2-cookies
- '@types/node': ^16.11.6
+ '@types/node': ^17.0.17
importers:
@@ -327,7 +326,7 @@ importers:
'@types/elliptic': ^6.4.14
'@types/json-stable-stringify': ^1.0.33
'@types/json2csv': ^5.0.3
- '@types/node': ^16.11.6
+ '@types/node': ^17.0.17
'@types/react-highlight-words': ^0.16.4
'@types/react-router-dom': ^5.3.3
'@types/react-virtualized-auto-sizer': ^1.0.1
@@ -460,7 +459,7 @@ importers:
'@types/elliptic': 6.4.14
'@types/json-stable-stringify': 1.0.33
'@types/json2csv': 5.0.3
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/react-highlight-words': 0.16.4
'@types/react-router-dom': 5.3.3
'@types/react-virtualized-auto-sizer': 1.0.1
@@ -803,13 +802,25 @@ importers:
'@masknet/plugin-infra': link:../../plugin-infra
ts-results: 3.3.0
+ packages/plugins/template:
+ specifiers:
+ '@masknet/plugin-infra': workspace:*
+ '@masknet/shared': workspace:*
+ '@masknet/shared-base': workspace:*
+ react-use: ^17.3.2
+ dependencies:
+ '@masknet/plugin-infra': link:../../plugin-infra
+ '@masknet/shared': link:../../shared
+ '@masknet/shared-base': link:../../shared-base
+ react-use: 17.3.2_757a802188413a36d4f24237d13b8e90
+
packages/polyfills:
specifiers:
'@rollup/plugin-commonjs': ^21.0.1
'@rollup/plugin-json': ^4.1.0
'@rollup/plugin-node-resolve': ^13.1.3
'@rollup/plugin-sucrase': ^4.0.2
- '@types/node': ^16.11.6
+ '@types/node': ^17.0.17
buffer: ^6.0.3
clipboard-polyfill: ^3.0.3
core-js: ^3.21.0
@@ -829,7 +840,7 @@ importers:
'@rollup/plugin-json': 4.1.0_rollup@2.67.2
'@rollup/plugin-node-resolve': 13.1.3_rollup@2.67.2
'@rollup/plugin-sucrase': 4.0.2_rollup@2.67.2
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
core-js-builder: 3.21.0
rollup: 2.67.2
rollup-plugin-terser: 7.0.2_rollup@2.67.2
@@ -875,11 +886,14 @@ importers:
packages/scripts:
specifiers:
+ '@types/fs-extra': ^9.0.13
'@types/gulp': ^4.0.9
'@types/lodash': ^4.14.178
'@types/proper-lockfile': ^4.1.2
'@types/rimraf': ^3.0.2
chalk: ^4.1.2
+ enquirer: ^2.3.6
+ fs-extra: ^10.0.0
gulp-zip: ^5.1.0
proper-lockfile: ^4.1.1
rimraf: ^3.0.2
@@ -888,11 +902,14 @@ importers:
dependencies:
'@types/rimraf': 3.0.2
chalk: 4.1.2
+ enquirer: 2.3.6
+ fs-extra: 10.0.0
gulp-zip: 5.1.0_gulp@4.0.2
proper-lockfile: 4.1.2
rimraf: 3.0.2
yargs: 17.3.1
devDependencies:
+ '@types/fs-extra': 9.0.13
'@types/gulp': 4.0.9
'@types/lodash': 4.14.178
'@types/proper-lockfile': 4.1.2
@@ -1255,7 +1272,7 @@ packages:
engines: {node: '>=6.12'}
dependencies:
'@0xproject/typescript-typings': 0.3.2
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
jsonschema: 1.4.0
lodash.values: 4.3.0
dev: false
@@ -1271,7 +1288,7 @@ packages:
resolution: {integrity: sha1-+tE5Je6SrU7hmAZopcsr7U3Kq48=}
engines: {node: '>=6.12'}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
bignumber.js: 4.1.0
dev: false
@@ -4368,7 +4385,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
jest-message-util: 27.5.1
jest-util: 27.5.1
@@ -4389,7 +4406,7 @@ packages:
'@jest/test-result': 27.5.1
'@jest/transform': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.8.1
@@ -4426,7 +4443,7 @@ packages:
dependencies:
'@jest/fake-timers': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
jest-mock: 27.5.1
dev: true
@@ -4436,7 +4453,7 @@ packages:
dependencies:
'@jest/types': 27.5.1
'@sinonjs/fake-timers': 8.1.0
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
jest-message-util: 27.5.1
jest-mock: 27.5.1
jest-util: 27.5.1
@@ -4465,7 +4482,7 @@ packages:
'@jest/test-result': 27.5.1
'@jest/transform': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
collect-v8-coverage: 1.0.1
exit: 0.1.2
@@ -4572,7 +4589,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/yargs': 15.0.14
chalk: 4.1.2
dev: true
@@ -4583,7 +4600,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
- '@types/node': 16.11.21
+ '@types/node': 17.0.18
'@types/yargs': 16.0.4
chalk: 4.1.2
dev: true
@@ -4594,7 +4611,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
'@types/istanbul-reports': 3.0.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/yargs': 16.0.4
chalk: 4.1.2
dev: true
@@ -6042,7 +6059,7 @@ packages:
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/ui': 6.4.18_9eb0130ea7f00b7e78e913147317bb83
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/webpack': 4.41.32
autoprefixer: 9.8.8
babel-loader: 8.2.3_60b7ed408fec1293d95f86d9ceaa88ca
@@ -6134,7 +6151,7 @@ packages:
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/ui': 6.4.18_9eb0130ea7f00b7e78e913147317bb83
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/webpack': 4.41.32
autoprefixer: 9.8.8
babel-loader: 8.2.3_60b7ed408fec1293d95f86d9ceaa88ca
@@ -6224,7 +6241,7 @@ packages:
'@storybook/semver': 7.3.2
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
babel-loader: 8.2.3_900eac683bef8a6b239b47efcf24e8a9
babel-plugin-macros: 3.1.0
babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.2
@@ -6476,7 +6493,7 @@ packages:
'@babel/register': 7.17.0_@babel+core@7.17.2
'@storybook/node-logger': 6.4.18
'@storybook/semver': 7.3.2
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/pretty-hrtime': 1.0.1
babel-loader: 8.2.3_60b7ed408fec1293d95f86d9ceaa88ca
babel-plugin-macros: 3.1.0
@@ -6546,7 +6563,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/semver': 7.3.2
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/node-fetch': 2.5.12
'@types/pretty-hrtime': 1.0.1
'@types/webpack': 4.41.32
@@ -6622,7 +6639,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/semver': 7.3.2
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/node-fetch': 2.5.12
'@types/pretty-hrtime': 1.0.1
'@types/webpack': 4.41.32
@@ -6698,7 +6715,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/semver': 7.3.2
'@storybook/store': 6.4.18_757a802188413a36d4f24237d13b8e90
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/node-fetch': 2.5.12
'@types/pretty-hrtime': 1.0.1
'@types/webpack': 4.41.32
@@ -6898,7 +6915,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/ui': 6.4.18_9eb0130ea7f00b7e78e913147317bb83
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/webpack': 4.41.32
babel-loader: 8.2.3_60b7ed408fec1293d95f86d9ceaa88ca
case-sensitive-paths-webpack-plugin: 2.4.0
@@ -6958,7 +6975,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/ui': 6.4.18_9eb0130ea7f00b7e78e913147317bb83
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/webpack': 4.41.32
babel-loader: 8.2.3_60b7ed408fec1293d95f86d9ceaa88ca
case-sensitive-paths-webpack-plugin: 2.4.0
@@ -7018,7 +7035,7 @@ packages:
'@storybook/node-logger': 6.4.18
'@storybook/theming': 6.4.18_757a802188413a36d4f24237d13b8e90
'@storybook/ui': 6.4.18_9eb0130ea7f00b7e78e913147317bb83
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
babel-loader: 8.2.3_900eac683bef8a6b239b47efcf24e8a9
case-sensitive-paths-webpack-plugin: 2.4.0
chalk: 4.1.2
@@ -7598,24 +7615,24 @@ packages:
/@types/bn.js/4.11.6:
resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
/@types/bn.js/5.1.0:
resolution: {integrity: sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
/@types/body-parser/1.19.2:
resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
dependencies:
'@types/connect': 3.4.35
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/bonjour/3.5.10:
resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/bs58/4.0.1:
@@ -7649,13 +7666,13 @@ packages:
resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==}
dependencies:
'@types/express-serve-static-core': 4.17.28
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/connect/3.4.35:
resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
/@types/d3-array/1.2.9:
resolution: {integrity: sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA==}
@@ -7890,7 +7907,7 @@ packages:
/@types/express-serve-static-core/4.17.25:
resolution: {integrity: sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==}
dependencies:
- '@types/node': 16.11.17
+ '@types/node': 17.0.18
'@types/qs': 6.9.7
'@types/range-parser': 1.2.4
dev: false
@@ -7898,7 +7915,7 @@ packages:
/@types/express-serve-static-core/4.17.28:
resolution: {integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/qs': 6.9.7
'@types/range-parser': 1.2.4
dev: true
@@ -7922,6 +7939,12 @@ packages:
resolution: {integrity: sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ==}
dev: false
+ /@types/fs-extra/9.0.13:
+ resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
+ dependencies:
+ '@types/node': 17.0.18
+ dev: true
+
/@types/geojson/7946.0.8:
resolution: {integrity: sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==}
dev: false
@@ -7930,26 +7953,26 @@ packages:
resolution: {integrity: sha512-AGOUTsTdbPkRS0qDeyeS+6KypmfVpbT5j23SN8UPG63qjKXNKjXn6V9wZUr8Fin0m9l8oGYaPK8b2WUMF8xI1A==}
dependencies:
'@types/glob': 7.1.4
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
dev: true
/@types/glob/7.1.4:
resolution: {integrity: sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==}
dependencies:
'@types/minimatch': 3.0.5
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
/@types/glob/7.2.0:
resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
dependencies:
'@types/minimatch': 3.0.5
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/graceful-fs/4.1.5:
resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/gulp/4.0.9:
@@ -7989,7 +8012,7 @@ packages:
/@types/http-proxy/1.17.8:
resolution: {integrity: sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/is-function/1.0.1:
@@ -8027,7 +8050,7 @@ packages:
/@types/json2csv/5.0.3:
resolution: {integrity: sha512-ZJEv6SzhPhgpBpxZU4n/TZekbZqI4EcyXXRwms1lAITG2kIAtj85PfNYafUOY1zy8bWs5ujaub0GU4copaA0sw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: false
/@types/json5/0.0.29:
@@ -8070,26 +8093,12 @@ packages:
/@types/node-fetch/2.5.12:
resolution: {integrity: sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
form-data: 3.0.1
dev: true
- /@types/node/16.11.17:
- resolution: {integrity: sha512-C1vTZME8cFo8uxY2ui41xcynEotVkczIVI5AjLmy5pkpBv/FtG+jhtOlfcPysI8VRVwoOMv6NJm44LGnoMSWkw==}
-
- /@types/node/16.11.21:
- resolution: {integrity: sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A==}
- dev: true
-
- /@types/node/16.11.24:
- resolution: {integrity: sha512-Ezv33Rl4mIi6YdSHfIRNBd4Q9kUe5okiaw/ikvJiJDmuQZNW5kfdg7+oQPF8NO6sTcr3woIpj3jANzTXdvEZXA==}
-
- /@types/node/16.11.6:
- resolution: {integrity: sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==}
-
- /@types/node/16.11.7:
- resolution: {integrity: sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==}
- dev: false
+ /@types/node/17.0.18:
+ resolution: {integrity: sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==}
/@types/normalize-package-data/2.4.1:
resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
@@ -8112,7 +8121,7 @@ packages:
/@types/pbkdf2/3.1.0:
resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
/@types/prettier/2.3.2:
resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==}
@@ -8142,7 +8151,7 @@ packages:
/@types/qrcode/1.4.2:
resolution: {integrity: sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==}
dependencies:
- '@types/node': 16.11.17
+ '@types/node': 17.0.18
dev: false
/@types/qs/6.9.7:
@@ -8255,7 +8264,7 @@ packages:
/@types/resolve/1.17.1:
resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==}
dependencies:
- '@types/node': 16.11.21
+ '@types/node': 17.0.18
dev: true
/@types/retry/0.12.1:
@@ -8266,7 +8275,7 @@ packages:
resolution: {integrity: sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==}
dependencies:
'@types/glob': 7.1.4
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
dev: false
/@types/scheduler/0.16.2:
@@ -8275,7 +8284,7 @@ packages:
/@types/secp256k1/4.0.3:
resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
/@types/serve-index/1.9.1:
resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==}
@@ -8287,7 +8296,7 @@ packages:
resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==}
dependencies:
'@types/mime': 1.3.2
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/socket.io-client/1.4.36:
@@ -8297,7 +8306,7 @@ packages:
/@types/sockjs/0.3.33:
resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/source-list-map/0.1.2:
@@ -8333,7 +8342,7 @@ packages:
/@types/undertaker/1.2.7:
resolution: {integrity: sha512-xuY7nBwo1zSRoY2aitp/HArHfTulFAKql2Fr4b4mWbBBP+F50n7Jm6nwISTTMaDk2xvl92O10TTejVF0Q9mInw==}
dependencies:
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
'@types/undertaker-registry': 1.0.1
async-done: 1.3.2
dev: true
@@ -8353,7 +8362,7 @@ packages:
resolution: {integrity: sha512-LgBpYIWuuGsihnlF+OOWWz4ovwCYlT03gd3DuLwex50cYZLmX3yrW+sFF9ndtmh7zcZpS6Ri47PrIu+fV+sbXw==}
dependencies:
'@types/glob-stream': 6.1.1
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
'@types/vinyl': 2.0.5
dev: true
@@ -8361,7 +8370,7 @@ packages:
resolution: {integrity: sha512-1m6uReH8R/RuLVQGvTT/4LlWq67jZEUxp+FBHt0hYv2BT7TUwFbKI0wa7JZVEU/XtlcnX1QcTuZ36es4rGj7jg==}
dependencies:
'@types/expect': 1.20.4
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
dev: true
/@types/web/0.0.52:
@@ -8375,7 +8384,7 @@ packages:
/@types/webpack-sources/3.2.0:
resolution: {integrity: sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/source-list-map': 0.1.2
source-map: 0.7.3
dev: true
@@ -8383,7 +8392,7 @@ packages:
/@types/webpack/4.41.32:
resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
'@types/tapable': 1.0.8
'@types/uglify-js': 3.13.1
'@types/webpack-sources': 3.2.0
@@ -8394,13 +8403,13 @@ packages:
/@types/ws/7.4.7:
resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
dependencies:
- '@types/node': 16.11.7
+ '@types/node': 17.0.18
dev: false
/@types/ws/8.2.2:
resolution: {integrity: sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/@types/yargs-parser/20.2.1:
@@ -9217,6 +9226,11 @@ packages:
engines: {node: '>=6'}
dev: true
+ /ansi-colors/4.1.1:
+ resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
+ engines: {node: '>=6'}
+ dev: false
+
/ansi-escapes/4.3.2:
resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
engines: {node: '>=8'}
@@ -10599,7 +10613,7 @@ packages:
/bip39/3.0.4:
resolution: {integrity: sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
create-hash: 1.2.0
pbkdf2: 3.1.2
randombytes: 2.1.0
@@ -11746,6 +11760,9 @@ packages:
resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==}
engines: {node: '>= 0.6'}
+ /cookiejar/2.1.3:
+ resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==}
+
/copy-concurrently/1.0.5:
resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==}
dependencies:
@@ -13181,6 +13198,13 @@ packages:
tapable: 2.2.1
dev: true
+ /enquirer/2.3.6:
+ resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ ansi-colors: 4.1.1
+ dev: false
+
/entities/2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: true
@@ -14787,7 +14811,6 @@ packages:
graceful-fs: 4.2.9
jsonfile: 6.1.0
universalify: 2.0.0
- dev: true
/fs-extra/4.0.3:
resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==}
@@ -16713,7 +16736,7 @@ packages:
'@types/connect': 3.4.35
'@types/express-serve-static-core': 4.17.25
'@types/lodash': 4.14.177
- '@types/node': 16.11.7
+ '@types/node': 17.0.18
'@types/ws': 7.4.7
commander: 2.20.3
delay: 5.0.0
@@ -16746,7 +16769,7 @@ packages:
'@jest/environment': 27.5.1
'@jest/test-result': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
co: 4.6.0
dedent: 0.7.0
@@ -16882,7 +16905,7 @@ packages:
'@jest/environment': 27.5.1
'@jest/fake-timers': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
jest-mock: 27.5.1
jest-util: 27.5.1
jsdom: 16.7.0
@@ -16900,7 +16923,7 @@ packages:
'@jest/environment': 27.5.1
'@jest/fake-timers': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
jest-mock: 27.5.1
jest-util: 27.5.1
dev: true
@@ -16921,7 +16944,7 @@ packages:
dependencies:
'@jest/types': 26.6.2
'@types/graceful-fs': 4.1.5
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
anymatch: 3.1.2
fb-watchman: 2.0.1
graceful-fs: 4.2.9
@@ -16942,7 +16965,7 @@ packages:
dependencies:
'@jest/types': 27.5.1
'@types/graceful-fs': 4.1.5
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
anymatch: 3.1.2
fb-watchman: 2.0.1
graceful-fs: 4.2.9
@@ -16964,7 +16987,7 @@ packages:
'@jest/source-map': 27.5.1
'@jest/test-result': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
co: 4.6.0
expect: 27.5.1
@@ -17019,7 +17042,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
dev: true
/jest-pnp-resolver/1.2.2_jest-resolve@27.5.1:
@@ -17080,7 +17103,7 @@ packages:
'@jest/test-result': 27.5.1
'@jest/transform': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
emittery: 0.8.1
graceful-fs: 4.2.9
@@ -17137,7 +17160,7 @@ packages:
resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==}
engines: {node: '>= 10.14.2'}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
graceful-fs: 4.2.9
dev: true
@@ -17145,7 +17168,7 @@ packages:
resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
graceful-fs: 4.2.9
dev: true
@@ -17184,7 +17207,7 @@ packages:
engines: {node: '>= 10.14.2'}
dependencies:
'@jest/types': 26.6.2
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
graceful-fs: 4.2.9
is-ci: 2.0.0
@@ -17196,7 +17219,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.4.2
- '@types/node': 16.11.21
+ '@types/node': 17.0.18
chalk: 4.1.2
ci-info: 3.3.0
graceful-fs: 4.2.9
@@ -17208,7 +17231,7 @@ packages:
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
dependencies:
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
chalk: 4.1.2
ci-info: 3.3.0
graceful-fs: 4.2.9
@@ -17233,7 +17256,7 @@ packages:
dependencies:
'@jest/test-result': 27.5.1
'@jest/types': 27.5.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
ansi-escapes: 4.3.2
chalk: 4.1.2
jest-util: 27.5.1
@@ -17251,7 +17274,7 @@ packages:
resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==}
engines: {node: '>= 10.13.0'}
dependencies:
- '@types/node': 16.11.17
+ '@types/node': 17.0.18
merge-stream: 2.0.0
supports-color: 7.2.0
dev: true
@@ -17260,7 +17283,7 @@ packages:
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
engines: {node: '>= 10.13.0'}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
merge-stream: 2.0.0
supports-color: 8.1.1
dev: true
@@ -17573,7 +17596,6 @@ packages:
universalify: 2.0.0
optionalDependencies:
graceful-fs: 4.2.9
- dev: true
/jsonify/0.0.0:
resolution: {integrity: sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=}
@@ -20017,7 +20039,7 @@ packages:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.1
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
long: 4.0.0
dev: false
@@ -21336,7 +21358,7 @@ packages:
/rtl-css-js/1.15.0:
resolution: {integrity: sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew==}
dependencies:
- '@babel/runtime': 7.16.7
+ '@babel/runtime': 7.17.2
dev: false
/run-parallel/1.2.0:
@@ -23696,7 +23718,6 @@ packages:
/universalify/2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'}
- dev: true
/unpipe/1.0.0:
resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=}
@@ -24138,7 +24159,7 @@ packages:
engines: {node: '>=8.0.0'}
requiresBuild: true
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
got: 9.6.0
swarm-js: 0.1.40
dev: false
@@ -24189,7 +24210,7 @@ packages:
engines: {node: '>=8.0.0'}
dependencies:
'@types/bn.js': 4.11.6
- '@types/node': 16.11.6
+ '@types/node': 17.0.18
bignumber.js: 9.0.1
web3-core-helpers: 1.5.2
web3-core-method: 1.5.2
@@ -24258,7 +24279,7 @@ packages:
resolution: {integrity: sha512-nH5N2GiVC0C5XeMEKU16PeFP3Hb3hkPvlR6Tf9WQ+pE+jw1c8eaXBO1CJQLr15ikhUF3s94ICyHcfjzkDsmRbA==}
engines: {node: '>=8.0.0'}
dependencies:
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
web3-core: 1.5.2
web3-core-helpers: 1.5.2
web3-core-method: 1.5.2
@@ -24322,7 +24343,7 @@ packages:
engines: {node: '>=8.0.0'}
dependencies:
web3-core-helpers: 1.5.2
- xhr2-cookies: link:package-overrides/xhr2-cookies
+ xhr2-cookies: 1.1.0
/web3-providers-ipc/1.5.2:
resolution: {integrity: sha512-SJC4Sivt4g9LHKlRy7cs1jkJgp7bjrQeUndE6BKs0zNALKguxu6QYnzbmuHCTFW85GfMDjhvi24jyyZHMnBNXQ==}
@@ -24381,7 +24402,7 @@ packages:
bignumber.js: github.com/frozeman/bignumber.js-nolookahead/57692b3ecfc98bbdd6b3a516cb2353652ea49934
crypto-js: 3.3.0
utf8: 2.1.2
- xhr2-cookies: link:package-overrides/xhr2-cookies
+ xhr2-cookies: 1.1.0
xmlhttprequest: 1.8.0
dev: false
@@ -25119,6 +25140,11 @@ packages:
parse-headers: 2.0.4
xtend: 4.0.2
+ /xhr2-cookies/1.1.0:
+ resolution: {integrity: sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=}
+ dependencies:
+ cookiejar: 2.1.3
+
/xml-name-validator/3.0.0:
resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==}
dev: true
@@ -25436,7 +25462,7 @@ packages:
'@0xproject/utils': 0.1.3
'@0xproject/web3-wrapper': 0.1.14
'@types/lodash': 4.14.178
- '@types/node': 16.11.24
+ '@types/node': 17.0.18
0x.js: 0.29.2
awesome-typescript-loader: 3.5.0_typescript@2.9.2
bn.js: 4.12.0
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 03fa5787a12b..b4c852afdb45 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -25,6 +25,7 @@ packages:
- 'packages/icons'
- 'packages/theme'
- 'packages/plugin-infra'
+ - 'packages/plugins/template'
- 'packages/plugins/example'
- 'packages/plugins/Debugger'
- 'packages/plugins/Wallet'
diff --git a/tsconfig.json b/tsconfig.json
index 11d880a856e4..f57ae37e680d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -12,6 +12,7 @@
{ "path": "./packages/dashboard/stories" },
{ "path": "./packages/theme/stories" },
// Tests
+ // @masknet/scripts: insert-here
{ "path": "./packages/backup-format/tsconfig.tests.json" },
{ "path": "./packages/encryption/tsconfig.tests.json" },
{ "path": "./packages/shared-base/tsconfig.tests.json" },