mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 13:39:24 +08:00
Merge branch 'next' into develop
This commit is contained in:
commit
6b51026941
4
.github/workflows/nocobase-test-backend.yml
vendored
4
.github/workflows/nocobase-test-backend.yml
vendored
@ -61,7 +61,9 @@ jobs:
|
||||
node-version: ${{ matrix.node_version }}
|
||||
cache: 'yarn'
|
||||
- name: Install project dependencies
|
||||
run: yarn install
|
||||
run: |
|
||||
yarn install
|
||||
yarn add sqlite3 --no-save -W
|
||||
- name: Test with Sqlite
|
||||
run: yarn test --server --single-thread=false
|
||||
env:
|
||||
|
4
.github/workflows/nocobase-test-windows.yml
vendored
4
.github/workflows/nocobase-test-windows.yml
vendored
@ -63,7 +63,9 @@ jobs:
|
||||
${{ runner.os }}-yarn-
|
||||
|
||||
- name: Install project dependencies
|
||||
run: yarn --prefer-offline
|
||||
run: |
|
||||
yarn --prefer-offline
|
||||
yarn add sqlite3 --no-save -W
|
||||
|
||||
- name: Test with Sqlite
|
||||
run: yarn test --server --single-thread=false
|
||||
|
37
CHANGELOG.md
37
CHANGELOG.md
@ -5,6 +5,43 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [v1.6.22](https://github.com/nocobase/nocobase/compare/v1.6.21...v1.6.22) - 2025-04-22
|
||||
|
||||
### 🚀 Improvements
|
||||
|
||||
- **[create-nocobase-app]** Upgrade dependencies and remove SQLite support ([#6708](https://github.com/nocobase/nocobase/pull/6708)) by @chenos
|
||||
|
||||
- **[File manager]** Expose utils API ([#6705](https://github.com/nocobase/nocobase/pull/6705)) by @mytharcher
|
||||
|
||||
- **[Workflow]** Add date types to variable types set ([#6717](https://github.com/nocobase/nocobase/pull/6717)) by @mytharcher
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- **[client]**
|
||||
- The problem of mobile top navigation bar icons being difficult to delete ([#6734](https://github.com/nocobase/nocobase/pull/6734)) by @zhangzhonghe
|
||||
|
||||
- After connecting through a foreign key, clicking to trigger filtering results in empty filter conditions ([#6634](https://github.com/nocobase/nocobase/pull/6634)) by @zhangzhonghe
|
||||
|
||||
- picker switching issue in date field of filter button ([#6695](https://github.com/nocobase/nocobase/pull/6695)) by @katherinehhh
|
||||
|
||||
- The issue of the collapse button in the left menu being obscured by the workflow pop-up window ([#6733](https://github.com/nocobase/nocobase/pull/6733)) by @zhangzhonghe
|
||||
|
||||
- missing action option constraints when reopening linkage rules ([#6723](https://github.com/nocobase/nocobase/pull/6723)) by @katherinehhh
|
||||
|
||||
- export button shown without export permission ([#6689](https://github.com/nocobase/nocobase/pull/6689)) by @katherinehhh
|
||||
|
||||
- Required fields hidden by linkage rules should not affect form submission ([#6709](https://github.com/nocobase/nocobase/pull/6709)) by @zhangzhonghe
|
||||
|
||||
- **[server]** appVersion incorrectly generated by create-migration ([#6740](https://github.com/nocobase/nocobase/pull/6740)) by @chenos
|
||||
|
||||
- **[build]** Fix error thrown in tar command ([#6722](https://github.com/nocobase/nocobase/pull/6722)) by @mytharcher
|
||||
|
||||
- **[Workflow]** Fix error thrown when execute schedule event in subflow ([#6721](https://github.com/nocobase/nocobase/pull/6721)) by @mytharcher
|
||||
|
||||
- **[Workflow: Custom action event]** Support to execute in multiple records mode by @mytharcher
|
||||
|
||||
- **[File storage: S3(Pro)]** Add multer make logic for server-side upload by @mytharcher
|
||||
|
||||
## [v1.6.21](https://github.com/nocobase/nocobase/compare/v1.6.20...v1.6.21) - 2025-04-17
|
||||
|
||||
### 🚀 Improvements
|
||||
|
@ -5,6 +5,43 @@
|
||||
格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
|
||||
并且本项目遵循 [语义化版本](https://semver.org/spec/v2.0.0.html)。
|
||||
|
||||
## [v1.6.22](https://github.com/nocobase/nocobase/compare/v1.6.21...v1.6.22) - 2025-04-22
|
||||
|
||||
### 🚀 优化
|
||||
|
||||
- **[create-nocobase-app]** 更新依赖,移除 SQLite 支持 ([#6708](https://github.com/nocobase/nocobase/pull/6708)) by @chenos
|
||||
|
||||
- **[文件管理器]** 暴露公共包 API ([#6705](https://github.com/nocobase/nocobase/pull/6705)) by @mytharcher
|
||||
|
||||
- **[工作流]** 为变量的类型集合增加日期相关类型 ([#6717](https://github.com/nocobase/nocobase/pull/6717)) by @mytharcher
|
||||
|
||||
### 🐛 修复
|
||||
|
||||
- **[client]**
|
||||
- 移动端顶部的导航栏图标很难被删除的问题 ([#6734](https://github.com/nocobase/nocobase/pull/6734)) by @zhangzhonghe
|
||||
|
||||
- 通过外键连接后,点击触发筛选,筛选条件为空 ([#6634](https://github.com/nocobase/nocobase/pull/6634)) by @zhangzhonghe
|
||||
|
||||
- 筛选按钮中日期字段,切换picker 异常 ([#6695](https://github.com/nocobase/nocobase/pull/6695)) by @katherinehhh
|
||||
|
||||
- 左侧菜单的收起按钮会被绑定工作流弹窗遮挡的问题 ([#6733](https://github.com/nocobase/nocobase/pull/6733)) by @zhangzhonghe
|
||||
|
||||
- 重新打开联动规则时缺少操作选项约束 ([#6723](https://github.com/nocobase/nocobase/pull/6723)) by @katherinehhh
|
||||
|
||||
- 未设置导出权限时仍显示导出按钮 ([#6689](https://github.com/nocobase/nocobase/pull/6689)) by @katherinehhh
|
||||
|
||||
- 被联动规则隐藏的必填字段,不应该影响表单的提交 ([#6709](https://github.com/nocobase/nocobase/pull/6709)) by @zhangzhonghe
|
||||
|
||||
- **[server]** create-migration 命令生成的 appVersion 不准确 ([#6740](https://github.com/nocobase/nocobase/pull/6740)) by @chenos
|
||||
|
||||
- **[build]** 修复 tar 命令报错的问题 ([#6722](https://github.com/nocobase/nocobase/pull/6722)) by @mytharcher
|
||||
|
||||
- **[工作流]** 修复子流程执行定时任务报错的问题 ([#6721](https://github.com/nocobase/nocobase/pull/6721)) by @mytharcher
|
||||
|
||||
- **[工作流:自定义操作事件]** 支持多行记录模式的手动执行 by @mytharcher
|
||||
|
||||
- **[文件存储:S3 (Pro)]** 增加 multer 逻辑用于服务端上传 by @mytharcher
|
||||
|
||||
## [v1.6.21](https://github.com/nocobase/nocobase/compare/v1.6.20...v1.6.21) - 2025-04-17
|
||||
|
||||
### 🚀 优化
|
||||
|
@ -8,7 +8,11 @@ RUN cd /app \
|
||||
&& yarn config set network-timeout 600000 -g \
|
||||
&& npx -y create-nocobase-app@${CNA_VERSION} my-nocobase-app --skip-dev-dependencies -a -e APP_ENV=production \
|
||||
&& cd /app/my-nocobase-app \
|
||||
&& yarn install --production
|
||||
&& yarn install --production \
|
||||
&& rm -rf yarn.lock \
|
||||
&& find node_modules -type f -name "yarn.lock" -delete \
|
||||
&& find node_modules -type f -name "bower.json" -delete \
|
||||
&& find node_modules -type f -name "composer.json" -delete
|
||||
|
||||
RUN cd /app \
|
||||
&& rm -rf nocobase.tar.gz \
|
||||
|
@ -83,6 +83,7 @@
|
||||
"ghooks": "^2.0.4",
|
||||
"lint-staged": "^13.2.3",
|
||||
"patch-package": "^8.0.0",
|
||||
"pm2": "^6.0.5",
|
||||
"pretty-format": "^24.0.0",
|
||||
"pretty-quick": "^3.1.0",
|
||||
"react": "^18.0.0",
|
||||
|
@ -11,8 +11,8 @@
|
||||
"@nocobase/database": "1.7.0-alpha.11",
|
||||
"@nocobase/resourcer": "1.7.0-alpha.11",
|
||||
"@nocobase/utils": "1.7.0-alpha.11",
|
||||
"@types/jsonwebtoken": "^8.5.8",
|
||||
"jsonwebtoken": "^8.5.1"
|
||||
"@types/jsonwebtoken": "^9.0.9",
|
||||
"jsonwebtoken": "^9.0.2"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -13,6 +13,7 @@
|
||||
"@umijs/utils": "3.5.20",
|
||||
"chalk": "^4.1.1",
|
||||
"commander": "^9.2.0",
|
||||
"deepmerge": "^4.3.1",
|
||||
"dotenv": "^16.0.0",
|
||||
"execa": "^5.1.1",
|
||||
"fast-glob": "^3.3.1",
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
const _ = require('lodash');
|
||||
const { Command } = require('commander');
|
||||
const { generatePlugins, run, postCheck, nodeCheck, promptForTs, isPortReachable } = require('../util');
|
||||
const { generatePlugins, run, postCheck, nodeCheck, promptForTs, isPortReachable, checkDBDialect } = require('../util');
|
||||
const { getPortPromise } = require('portfinder');
|
||||
const chokidar = require('chokidar');
|
||||
const { uid } = require('@formily/shared');
|
||||
@ -36,6 +36,7 @@ module.exports = (cli) => {
|
||||
.option('-i, --inspect [port]')
|
||||
.allowUnknownOption()
|
||||
.action(async (opts) => {
|
||||
checkDBDialect();
|
||||
let subprocess;
|
||||
const runDevClient = () => {
|
||||
console.log('starting client', 1 * clientPort);
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
const { Command } = require('commander');
|
||||
const { run, isPortReachable } = require('../util');
|
||||
const { run, isPortReachable, checkDBDialect } = require('../util');
|
||||
const { execSync } = require('node:child_process');
|
||||
const axios = require('axios');
|
||||
const { pTest } = require('./p-test');
|
||||
@ -165,6 +165,7 @@ const filterArgv = () => {
|
||||
*/
|
||||
module.exports = (cli) => {
|
||||
const e2e = cli.command('e2e').hook('preAction', () => {
|
||||
checkDBDialect();
|
||||
if (process.env.APP_BASE_URL) {
|
||||
process.env.APP_BASE_URL = process.env.APP_BASE_URL.replace('localhost', '127.0.0.1');
|
||||
console.log('APP_BASE_URL:', process.env.APP_BASE_URL);
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
const { Command } = require('commander');
|
||||
const { run, isDev, isProd, promptForTs, downloadPro } = require('../util');
|
||||
const { run, isDev, isProd, promptForTs, downloadPro, checkDBDialect } = require('../util');
|
||||
|
||||
/**
|
||||
*
|
||||
@ -21,6 +21,7 @@ module.exports = (cli) => {
|
||||
.option('-h, --help')
|
||||
.option('--ts-node-dev')
|
||||
.action(async (options) => {
|
||||
checkDBDialect();
|
||||
const cmd = process.argv.slice(2)?.[0];
|
||||
if (cmd === 'install') {
|
||||
await downloadPro();
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
const _ = require('lodash');
|
||||
const { Command } = require('commander');
|
||||
const { run, postCheck, downloadPro, promptForTs } = require('../util');
|
||||
const { run, postCheck, downloadPro, promptForTs, checkDBDialect } = require('../util');
|
||||
const { existsSync, rmSync } = require('fs');
|
||||
const { resolve, isAbsolute } = require('path');
|
||||
const chalk = require('chalk');
|
||||
@ -48,8 +48,10 @@ module.exports = (cli) => {
|
||||
.option('-i, --instances [instances]')
|
||||
.option('--db-sync')
|
||||
.option('--quickstart')
|
||||
.option('--launch-mode [launchMode]')
|
||||
.allowUnknownOption()
|
||||
.action(async (opts) => {
|
||||
checkDBDialect();
|
||||
if (opts.quickstart) {
|
||||
await downloadPro();
|
||||
}
|
||||
@ -118,17 +120,27 @@ module.exports = (cli) => {
|
||||
]);
|
||||
process.exit();
|
||||
} else {
|
||||
run(
|
||||
'pm2-runtime',
|
||||
[
|
||||
'start',
|
||||
...instancesArgs,
|
||||
`${APP_PACKAGE_ROOT}/lib/index.js`,
|
||||
NODE_ARGS ? `--node-args="${NODE_ARGS}"` : undefined,
|
||||
'--',
|
||||
...process.argv.slice(2),
|
||||
].filter(Boolean),
|
||||
);
|
||||
const launchMode = opts.launchMode || process.env.APP_LAUNCH_MODE || 'pm2';
|
||||
if (launchMode === 'pm2') {
|
||||
run(
|
||||
'pm2-runtime',
|
||||
[
|
||||
'start',
|
||||
...instancesArgs,
|
||||
`${APP_PACKAGE_ROOT}/lib/index.js`,
|
||||
NODE_ARGS ? `--node-args="${NODE_ARGS}"` : undefined,
|
||||
'--',
|
||||
...process.argv.slice(2),
|
||||
].filter(Boolean),
|
||||
);
|
||||
} else {
|
||||
run(
|
||||
'node',
|
||||
[`${APP_PACKAGE_ROOT}/lib/index.js`, ...(NODE_ARGS || '').split(' '), ...process.argv.slice(2)].filter(
|
||||
Boolean,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
@ -7,7 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
const { run } = require('../util');
|
||||
const { run, checkDBDialect } = require('../util');
|
||||
const fg = require('fast-glob');
|
||||
|
||||
const coreClientPackages = ['packages/core/client', 'packages/core/sdk'];
|
||||
@ -30,6 +30,7 @@ const getPackagesDir = (isClient) => {
|
||||
|
||||
module.exports = (cli) => {
|
||||
cli.command('test-coverage:server').action(async () => {
|
||||
checkDBDialect();
|
||||
const packageRoots = getPackagesDir(false);
|
||||
for (const dir of packageRoots) {
|
||||
try {
|
||||
@ -41,6 +42,7 @@ module.exports = (cli) => {
|
||||
});
|
||||
|
||||
cli.command('test-coverage:client').action(async () => {
|
||||
checkDBDialect();
|
||||
const packageRoots = getPackagesDir(true);
|
||||
for (const dir of packageRoots) {
|
||||
try {
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
const { Command } = require('commander');
|
||||
const { run } = require('../util');
|
||||
const { run, checkDBDialect } = require('../util');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
@ -29,6 +29,7 @@ function addTestCommand(name, cli) {
|
||||
.arguments('[paths...]')
|
||||
.allowUnknownOption()
|
||||
.action(async (paths, opts) => {
|
||||
checkDBDialect();
|
||||
if (name === 'test:server') {
|
||||
process.env.TEST_ENV = 'server-side';
|
||||
} else if (name === 'test:client') {
|
||||
|
@ -10,8 +10,19 @@
|
||||
const chalk = require('chalk');
|
||||
const { Command } = require('commander');
|
||||
const { resolve } = require('path');
|
||||
const { run, promptForTs, runAppCommand, hasCorePackages, downloadPro, hasTsNode } = require('../util');
|
||||
const { run, promptForTs, runAppCommand, hasCorePackages, downloadPro, hasTsNode, checkDBDialect } = require('../util');
|
||||
const { existsSync, rmSync } = require('fs');
|
||||
const { readJSON, writeJSON } = require('fs-extra');
|
||||
const deepmerge = require('deepmerge');
|
||||
|
||||
async function updatePackage() {
|
||||
const sourcePath = resolve(__dirname, '../../templates/create-app-package.json');
|
||||
const descPath = resolve(process.cwd(), 'package.json');
|
||||
const sourceJson = await readJSON(sourcePath, 'utf8');
|
||||
const descJson = await readJSON(descPath, 'utf8');
|
||||
const json = deepmerge(descJson, sourceJson);
|
||||
await writeJSON(descPath, json, { spaces: 2, encoding: 'utf8' });
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
@ -26,6 +37,7 @@ module.exports = (cli) => {
|
||||
.option('--next')
|
||||
.option('-S|--skip-code-update')
|
||||
.action(async (options) => {
|
||||
checkDBDialect();
|
||||
if (hasTsNode()) promptForTs();
|
||||
if (hasCorePackages()) {
|
||||
// await run('yarn', ['install']);
|
||||
@ -69,6 +81,7 @@ module.exports = (cli) => {
|
||||
return;
|
||||
}
|
||||
await run('yarn', ['add', `@nocobase/cli@${distTag}`, `@nocobase/devtools@${distTag}`, '-W']);
|
||||
await updatePackage();
|
||||
await run('yarn', ['install']);
|
||||
await downloadPro();
|
||||
await runAppCommand('upgrade');
|
||||
|
@ -360,7 +360,7 @@ exports.initEnv = function initEnv() {
|
||||
API_BASE_PATH: '/api/',
|
||||
API_CLIENT_STORAGE_PREFIX: 'NOCOBASE_',
|
||||
API_CLIENT_STORAGE_TYPE: 'localStorage',
|
||||
DB_DIALECT: 'sqlite',
|
||||
// DB_DIALECT: 'sqlite',
|
||||
DB_STORAGE: 'storage/db/nocobase.sqlite',
|
||||
// DB_TIMEZONE: '+00:00',
|
||||
DB_UNDERSCORED: parseEnv('DB_UNDERSCORED'),
|
||||
@ -472,6 +472,12 @@ exports.initEnv = function initEnv() {
|
||||
}
|
||||
};
|
||||
|
||||
exports.checkDBDialect = function () {
|
||||
if (!process.env.DB_DIALECT) {
|
||||
throw new Error('DB_DIALECT is required.');
|
||||
}
|
||||
};
|
||||
|
||||
exports.generatePlugins = function () {
|
||||
try {
|
||||
require.resolve('@nocobase/devtools/umiConfig');
|
||||
|
39
packages/core/cli/templates/create-app-package.json
Normal file
39
packages/core/cli/templates/create-app-package.json
Normal file
@ -0,0 +1,39 @@
|
||||
{
|
||||
"private": true,
|
||||
"workspaces": ["packages/*/*", "packages/*/*/*"],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"scripts": {
|
||||
"nocobase": "nocobase",
|
||||
"pm": "nocobase pm",
|
||||
"pm2": "nocobase pm2",
|
||||
"dev": "nocobase dev",
|
||||
"start": "nocobase start",
|
||||
"clean": "nocobase clean",
|
||||
"build": "nocobase build",
|
||||
"test": "nocobase test",
|
||||
"e2e": "nocobase e2e",
|
||||
"tar": "nocobase tar",
|
||||
"postinstall": "nocobase postinstall",
|
||||
"lint": "eslint ."
|
||||
},
|
||||
"resolutions": {
|
||||
"cytoscape": "3.28.0",
|
||||
"@types/react": "18.3.18",
|
||||
"@types/react-dom": "^18.0.0",
|
||||
"react-router-dom": "6.28.1",
|
||||
"react-router": "6.28.1",
|
||||
"async": "^3.2.6",
|
||||
"antd": "5.12.8",
|
||||
"rollup": "4.24.0",
|
||||
"semver": "^7.7.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"pm2": "^6.0.5",
|
||||
"mysql2": "^3.14.0",
|
||||
"mariadb": "^3.4.1",
|
||||
"pg": "^8.14.1",
|
||||
"pg-hstore": "^2.3.4"
|
||||
}
|
||||
}
|
@ -167,7 +167,7 @@ export function getOperators() {
|
||||
const dateA = parseDate(a);
|
||||
const dateB = parseDate(b);
|
||||
if (!dateA || !dateB) {
|
||||
throw new Error('Invalid date format');
|
||||
return false;
|
||||
}
|
||||
return dateA < dateB;
|
||||
},
|
||||
@ -651,10 +651,11 @@ function parseYear(dateStr) {
|
||||
}
|
||||
|
||||
function parseDate(targetDateStr) {
|
||||
let dateStr = Array.isArray(targetDateStr) ? targetDateStr[1] : targetDateStr;
|
||||
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$/.test(dateStr)) {
|
||||
// ISO 8601 格式:YYYY-MM-DDTHH:mm:ss.sssZ
|
||||
return new Date(dateStr); // 直接解析为 Date 对象
|
||||
let dateStr = Array.isArray(targetDateStr) ? targetDateStr[1] ?? targetDateStr[0] : targetDateStr;
|
||||
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(dateStr)) {
|
||||
return new Date(dateStr);
|
||||
} else if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dateStr)) {
|
||||
return new Date(dateStr.replace(' ', 'T'));
|
||||
} else if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
|
||||
// YYYY-MM-DD 格式
|
||||
return parseFullDate(dateStr);
|
||||
@ -668,5 +669,6 @@ function parseDate(targetDateStr) {
|
||||
// YYYY 格式
|
||||
return parseYear(dateStr);
|
||||
}
|
||||
return null; // Invalid format
|
||||
|
||||
return null;
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import React, { useState, useContext } from 'react';
|
||||
import React, { useState, useContext, useEffect } from 'react';
|
||||
import { RecordPickerProvider, RecordPickerContext } from '../../../schema-component/antd/record-picker';
|
||||
import {
|
||||
SchemaComponentOptions,
|
||||
@ -41,9 +41,16 @@ const useTableSelectorProps = () => {
|
||||
export const AssociateActionProvider = (props) => {
|
||||
const [selectedRows, setSelectedRows] = useState([]);
|
||||
const collection = useCollection();
|
||||
const { resource, service, block, __parent } = useBlockRequestContext();
|
||||
const { resource, block, __parent } = useBlockRequestContext();
|
||||
const actionCtx = useActionContext();
|
||||
const { isMobile } = useOpenModeContext() || {};
|
||||
const [associationData, setAssociationData] = useState([]);
|
||||
useEffect(() => {
|
||||
resource?.list?.().then((res) => {
|
||||
setAssociationData(res.data?.data || []);
|
||||
});
|
||||
}, [resource]);
|
||||
|
||||
const pickerProps = {
|
||||
size: 'small',
|
||||
onChange: props?.onChange,
|
||||
@ -73,8 +80,8 @@ export const AssociateActionProvider = (props) => {
|
||||
};
|
||||
const getFilter = () => {
|
||||
const targetKey = collection?.filterTargetKey || 'id';
|
||||
if (service.data?.data) {
|
||||
const list = service.data?.data.map((option) => option[targetKey]).filter(Boolean);
|
||||
if (associationData) {
|
||||
const list = associationData.map((option) => option[targetKey]).filter(Boolean);
|
||||
const filter = list.length ? { $and: [{ [`${targetKey}.$ne`]: list }] } : {};
|
||||
return filter;
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ export const Action: ComposedAction = withDynamicSchemaProps(
|
||||
className={className}
|
||||
type={props.type}
|
||||
Designer={Designer}
|
||||
onClick={onClick}
|
||||
onClick={handleClick}
|
||||
confirm={confirm}
|
||||
confirmTitle={confirmTitle}
|
||||
popover={popover}
|
||||
|
@ -7,7 +7,7 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { dayjs, getPickerFormat, Handlebars } from '@nocobase/utils/client';
|
||||
import { dayjs, getPickerFormat, Handlebars, getFormatFromDateStr } from '@nocobase/utils/client';
|
||||
import _, { every, findIndex, some } from 'lodash';
|
||||
import { replaceVariableValue } from '../../../block-provider/hooks';
|
||||
import { VariableOption, VariablesContextType } from '../../../variables/types';
|
||||
|
@ -352,11 +352,6 @@ const InternalSchemaToolbar: FC<SchemaToolbarProps> = React.memo((props) => {
|
||||
}
|
||||
}
|
||||
|
||||
// const style = window.getComputedStyle(parentElement);
|
||||
// if (style.position === 'static') {
|
||||
// parentElement.style.position = 'relative';
|
||||
// }
|
||||
|
||||
el.addEventListener('mouseenter', show);
|
||||
el.addEventListener('mouseleave', hide);
|
||||
return () => {
|
||||
|
@ -131,7 +131,7 @@ export const ValueDynamicComponent = (props: ValueDynamicComponentProps) => {
|
||||
<span style={{ marginLeft: '.25em' }} className={'ant-formily-item-extra'}>
|
||||
{t('Syntax references')}:
|
||||
</span>
|
||||
<a href="https://formulajs.info/functions/" target="_blank" rel="noreferrer">
|
||||
<a href="https://docs.nocobase.com/handbook/calculation-engines/formula" target="_blank" rel="noreferrer">
|
||||
Formula.js
|
||||
</a>
|
||||
</div>
|
||||
|
@ -48,6 +48,7 @@ import {
|
||||
SchemaSettingsItemType,
|
||||
SchemaToolbarVisibleContext,
|
||||
VariablesContext,
|
||||
getZIndex,
|
||||
useCollection,
|
||||
useCollectionManager,
|
||||
useZIndexContext,
|
||||
@ -697,7 +698,7 @@ export const SchemaSettingsActionModalItem: FC<SchemaSettingsActionModalItemProp
|
||||
const upLevelActiveFields = useFormActiveFields();
|
||||
const parentZIndex = useZIndexContext();
|
||||
|
||||
const zIndex = parentZIndex + 10;
|
||||
const zIndex = getZIndex('modal', parentZIndex + 10, 0);
|
||||
|
||||
const form = useMemo(
|
||||
() =>
|
||||
|
@ -21,7 +21,7 @@ cli
|
||||
.option('--quickstart', 'quickstart app creation')
|
||||
.option('--skip-dev-dependencies')
|
||||
.option('-a, --all-db-dialect', 'install all database dialect dependencies')
|
||||
.option('-d, --db-dialect <dbDialect>', 'database dialect, current support sqlite/mysql/postgres', 'sqlite')
|
||||
.option('-d, --db-dialect <dbDialect>', 'database dialect, current support mysql/postgres', 'postgres')
|
||||
.option('-e, --env <env>', 'environment variables write into .env file', concat, [])
|
||||
.description('create a new application')
|
||||
.action(async (name, options) => {
|
||||
|
@ -61,7 +61,7 @@ class AppGenerator extends Generator {
|
||||
|
||||
checkDialect() {
|
||||
const dialect = this.args.dbDialect;
|
||||
const supportDialects = ['mysql', 'mariadb', 'sqlite', 'postgres'];
|
||||
const supportDialects = ['mysql', 'mariadb', 'postgres'];
|
||||
if (!supportDialects.includes(dialect)) {
|
||||
console.log(
|
||||
`dialect ${chalk.red(dialect)} is not supported, currently supported dialects are ${chalk.green(
|
||||
@ -76,27 +76,15 @@ class AppGenerator extends Generator {
|
||||
const env = this.env;
|
||||
const envs = [];
|
||||
const dependencies = [];
|
||||
const { dbDialect, allDbDialect } = this.args;
|
||||
const { dbDialect } = this.args;
|
||||
|
||||
if (allDbDialect) {
|
||||
dependencies.push(`"mysql2": "^3.11.0"`);
|
||||
dependencies.push(`"mariadb": "^2.5.6"`);
|
||||
dependencies.push(`"pg": "^8.7.3"`);
|
||||
dependencies.push(`"pg-hstore": "^2.3.4"`);
|
||||
dependencies.push(`"sqlite3": "^5.0.8"`);
|
||||
}
|
||||
dependencies.push(`"mysql2": "^3.14.0"`);
|
||||
dependencies.push(`"mariadb": "^3.4.1"`);
|
||||
dependencies.push(`"pg": "^8.14.1"`);
|
||||
dependencies.push(`"pg-hstore": "^2.3.4"`);
|
||||
|
||||
switch (dbDialect) {
|
||||
case 'sqlite':
|
||||
if (!allDbDialect) {
|
||||
dependencies.push(`"sqlite3": "^5.0.8"`);
|
||||
}
|
||||
envs.push(`DB_STORAGE=${env.DB_STORAGE || 'storage/db/nocobase.sqlite'}`);
|
||||
break;
|
||||
case 'mysql':
|
||||
if (!allDbDialect) {
|
||||
dependencies.push(`"mysql2": "^3.11.0"`);
|
||||
}
|
||||
envs.push(`DB_HOST=${env.DB_HOST || 'localhost'}`);
|
||||
envs.push(`DB_PORT=${env.DB_PORT || 3306}`);
|
||||
envs.push(`DB_DATABASE=${env.DB_DATABASE || ''}`);
|
||||
@ -104,9 +92,6 @@ class AppGenerator extends Generator {
|
||||
envs.push(`DB_PASSWORD=${env.DB_PASSWORD || ''}`);
|
||||
break;
|
||||
case 'mariadb':
|
||||
if (!allDbDialect) {
|
||||
dependencies.push(`"mariadb": "^2.5.6"`);
|
||||
}
|
||||
envs.push(`DB_HOST=${env.DB_HOST || 'localhost'}`);
|
||||
envs.push(`DB_PORT=${env.DB_PORT || 3306}`);
|
||||
envs.push(`DB_DATABASE=${env.DB_DATABASE || ''}`);
|
||||
@ -115,10 +100,6 @@ class AppGenerator extends Generator {
|
||||
break;
|
||||
case 'kingbase':
|
||||
case 'postgres':
|
||||
if (!allDbDialect) {
|
||||
dependencies.push(`"pg": "^8.7.3"`);
|
||||
dependencies.push(`"pg-hstore": "^2.3.4"`);
|
||||
}
|
||||
envs.push(`DB_HOST=${env.DB_HOST || 'localhost'}`);
|
||||
envs.push(`DB_PORT=${env.DB_PORT || 5432}`);
|
||||
envs.push(`DB_DATABASE=${env.DB_DATABASE || ''}`);
|
||||
@ -184,21 +165,27 @@ class AppGenerator extends Generator {
|
||||
console.log(`Creating a new NocoBase application at ${chalk.green(name)}`);
|
||||
console.log('Creating files');
|
||||
|
||||
const context = this.getContext();
|
||||
|
||||
this.copyDirectory({
|
||||
context: this.getContext(),
|
||||
context,
|
||||
path: join(__dirname, '../templates/app'),
|
||||
target: this.cwd,
|
||||
});
|
||||
|
||||
this.checkDbEnv();
|
||||
const json = {
|
||||
name: context.name,
|
||||
...(await fs.readJSON(join(this.cwd, 'package.json'), 'utf8')),
|
||||
};
|
||||
|
||||
const skipDevDependencies = this.args.skipDevDependencies;
|
||||
if (skipDevDependencies) {
|
||||
const json = await fs.readJSON(join(this.cwd, 'package.json'), 'utf8');
|
||||
delete json['devDependencies'];
|
||||
await fs.writeJSON(join(this.cwd, 'package.json'), json, { encoding: 'utf8', spaces: 2 });
|
||||
json['dependencies']['@nocobase/cli'] = context.version;
|
||||
|
||||
if (!this.args.skipDevDependencies) {
|
||||
json['devDependencies'] = json['devDependencies'] || {};
|
||||
json['devDependencies']['@nocobase/devtools'] = context.version;
|
||||
}
|
||||
|
||||
await fs.writeJSON(join(this.cwd, 'package.json'), json, { encoding: 'utf8', spaces: 2 });
|
||||
console.log('');
|
||||
console.log(chalk.green(`$ cd ${name}`));
|
||||
console.log(chalk.green(`$ yarn install`));
|
||||
|
@ -1,5 +1,4 @@
|
||||
{
|
||||
"name": "{{{name}}}",
|
||||
"private": true,
|
||||
"workspaces": [
|
||||
"packages/*/*",
|
||||
@ -29,14 +28,15 @@
|
||||
"react-router-dom": "6.28.1",
|
||||
"react-router": "6.28.1",
|
||||
"antd": "5.24.2",
|
||||
"async": "3.2.6",
|
||||
"rollup": "4.24.0"
|
||||
"async": "^3.2.6",
|
||||
"rollup": "4.24.0",
|
||||
"semver": "^7.7.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nocobase/cli": "{{{version}}}",
|
||||
{{{dependencies}}}
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nocobase/devtools": "{{{version}}}"
|
||||
"pm2": "^6.0.5",
|
||||
"mysql2": "^3.14.0",
|
||||
"mariadb": "^3.4.1",
|
||||
"pg": "^8.14.1",
|
||||
"pg-hstore": "^2.3.4"
|
||||
}
|
||||
}
|
@ -12,7 +12,7 @@
|
||||
"@nocobase/resourcer": "1.7.0-alpha.11",
|
||||
"@nocobase/utils": "1.7.0-alpha.11",
|
||||
"@types/jsonwebtoken": "^8.5.8",
|
||||
"jsonwebtoken": "^8.5.1"
|
||||
"jsonwebtoken": "^9.0.2"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -10,7 +10,7 @@
|
||||
"deepmerge": "^4.2.2",
|
||||
"koa-compose": "^4.1.0",
|
||||
"lodash": "^4.17.21",
|
||||
"path-to-regexp": "6.2.2",
|
||||
"path-to-regexp": "^6.3.0",
|
||||
"qs": "^6.9.4"
|
||||
},
|
||||
"repository": {
|
||||
|
@ -367,7 +367,7 @@ export class ResourceManager {
|
||||
: params.resourceName;
|
||||
ctx.action.params.filterByTk = params.resourceIndex;
|
||||
const query = parseQuery(ctx.request.querystring);
|
||||
if (pathToRegexp('/resourcer/{:associatedName.}?:resourceName{\\::actionName}').test(ctx.request.path)) {
|
||||
if (pathToRegexp('/resourcer/:rest(.*)').test(ctx.request.path)) {
|
||||
ctx.action.mergeParams({
|
||||
...query,
|
||||
...params,
|
||||
|
@ -67,17 +67,25 @@ export function parseRequest(request: ParseRequest, options: ParseOptions = {}):
|
||||
...(options.accessors || {}),
|
||||
};
|
||||
const keys = [];
|
||||
const regexp = pathToRegexp('/resourcer/{:associatedName.}?:resourceName{\\::actionName}', keys);
|
||||
|
||||
const regexp = pathToRegexp('/resourcer/:rest(.*)', keys);
|
||||
const reqPath = decodeURI(request.path);
|
||||
const matches = regexp.exec(reqPath);
|
||||
if (matches) {
|
||||
const params = {};
|
||||
keys.forEach((obj, index) => {
|
||||
if (matches[index + 1] === undefined) {
|
||||
return;
|
||||
const [resource, action] = matches[1].split(':');
|
||||
const [res1, res2] = resource.split('.');
|
||||
if (res1) {
|
||||
if (res2) {
|
||||
params['associatedName'] = res1;
|
||||
params['resourceName'] = res2;
|
||||
} else {
|
||||
params['resourceName'] = res1;
|
||||
}
|
||||
params[obj.name] = matches[index + 1];
|
||||
});
|
||||
}
|
||||
if (action) {
|
||||
params['actionName'] = action;
|
||||
}
|
||||
return params;
|
||||
}
|
||||
const defaults = {
|
||||
|
@ -8,8 +8,8 @@
|
||||
"@formily/json-schema": "2.x",
|
||||
"@hapi/topo": "^6.0.0",
|
||||
"@koa/cors": "^5.0.0",
|
||||
"@koa/multer": "^3.0.2",
|
||||
"@koa/router": "^9.4.0",
|
||||
"@koa/multer": "^3.1.0",
|
||||
"@koa/router": "^13.1.0",
|
||||
"@nocobase/acl": "1.7.0-alpha.11",
|
||||
"@nocobase/actions": "1.7.0-alpha.11",
|
||||
"@nocobase/auth": "1.7.0-alpha.11",
|
||||
@ -26,7 +26,7 @@
|
||||
"@types/decompress": "4.2.7",
|
||||
"@types/ini": "^1.3.31",
|
||||
"@types/koa-send": "^4.1.3",
|
||||
"@types/multer": "^1.4.5",
|
||||
"@types/multer": "^1.4.12",
|
||||
"async-mutex": "^0.5.0",
|
||||
"axios": "^1.7.0",
|
||||
"chalk": "^4.1.1",
|
||||
@ -45,7 +45,7 @@
|
||||
"koa-send": "^5.0.1",
|
||||
"koa-static": "^5.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"multer": "^1.4.2",
|
||||
"multer": "^1.4.5-lts.2",
|
||||
"nanoid": "^3.3.11",
|
||||
"semver": "^7.7.1",
|
||||
"serve-handler": "^6.1.6",
|
||||
|
@ -29,14 +29,13 @@ export default (app: Application) => {
|
||||
'migrations',
|
||||
`${dayjs().format('YYYYMMDDHHmmss')}-${name}.ts`,
|
||||
);
|
||||
const version = app.getVersion();
|
||||
// 匹配主版本号、次版本号、小版本号和后缀的正则表达式
|
||||
const version = app.getPackageVersion();
|
||||
const regex = /(\d+)\.(\d+)\.(\d+)(-[\w.]+)?/;
|
||||
const nextVersion = version.replace(regex, (match, major, minor, patch, suffix) => {
|
||||
// 将小版本号转换为整数并加1
|
||||
const newPatch = parseInt(patch) + 1;
|
||||
// 返回新的版本号
|
||||
return `${major}.${minor}.${newPatch}${suffix || ''}`;
|
||||
if (version.includes('beta') || version.includes('alpha')) {
|
||||
return `${major}.${minor}.${patch}`;
|
||||
}
|
||||
return `${major}.${1 + 1 * minor}.0`;
|
||||
});
|
||||
const from = pkg === '@nocobase/server' ? `../migration` : '@nocobase/server';
|
||||
const data = `import { Migration } from '${from}';
|
||||
|
@ -15,7 +15,7 @@ const deps: Record<string, string> = {
|
||||
'@formily': '2.x',
|
||||
|
||||
'@formily/antd-v5': '1.x',
|
||||
jsonwebtoken: '8.x',
|
||||
jsonwebtoken: '9.x',
|
||||
'cache-manager': '5.x',
|
||||
sequelize: '6.x',
|
||||
umzug: '3.x',
|
||||
@ -26,7 +26,7 @@ const deps: Record<string, string> = {
|
||||
'winston-daily-rotate-file': '4.x',
|
||||
koa: '2.x',
|
||||
'@koa/cors': '5.x',
|
||||
'@koa/router': '9.x',
|
||||
'@koa/router': '13.x',
|
||||
multer: '1.x',
|
||||
'@koa/multer': '3.x',
|
||||
'koa-bodyparser': '4.x',
|
||||
|
@ -69,7 +69,6 @@
|
||||
"mysql2": "^3.11.0",
|
||||
"pg": "^8.7.3",
|
||||
"pg-hstore": "^2.3.4",
|
||||
"sqlite3": "^5.0.8",
|
||||
"supertest": "^6.1.6",
|
||||
"vite": "^5.0.0",
|
||||
"vitest": "^1.5.0",
|
||||
|
@ -7,13 +7,13 @@
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import http from 'http';
|
||||
import url from 'url';
|
||||
import pg from 'pg';
|
||||
import dotenv from 'dotenv';
|
||||
import path from 'path';
|
||||
import mysql from 'mysql2/promise';
|
||||
import http from 'http';
|
||||
import mariadb from 'mariadb';
|
||||
import mysql from 'mysql2/promise';
|
||||
import path from 'path';
|
||||
import pg from 'pg';
|
||||
import url from 'url';
|
||||
|
||||
dotenv.config({ path: path.resolve(process.cwd(), '.env.test') });
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
"flat-to-nested": "^1.1.1",
|
||||
"graphlib": "^2.1.8",
|
||||
"handlebars": "^4.7.8",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"multer": "^1.4.5-lts.2",
|
||||
"object-path": "^0.11.8"
|
||||
},
|
||||
"gitHead": "d0b4efe4be55f8c79a98a331d99d9f8cf99021a1"
|
||||
|
@ -236,3 +236,13 @@ export const getDateTimeFormat = (picker, format, showTime, timeFormat) => {
|
||||
}
|
||||
return format;
|
||||
};
|
||||
|
||||
export function getFormatFromDateStr(dateStr: string): string | null {
|
||||
if (/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(dateStr)) return 'YYYY-MM-DD HH:mm:ss';
|
||||
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) return 'YYYY-MM-DD';
|
||||
if (/^\d{4}-\d{2}$/.test(dateStr)) return 'YYYY-MM';
|
||||
if (/^\d{4}$/.test(dateStr)) return 'YYYY';
|
||||
if (/^\d{4}Q[1-4]$/.test(dateStr)) return 'YYYY[Q]Q';
|
||||
if (/^\d{4}-\d{2}-\d{2}T/.test(dateStr)) return 'YYYY-MM-DDTHH:mm:ss.SSSZ';
|
||||
return null;
|
||||
}
|
||||
|
@ -13,8 +13,8 @@
|
||||
"Users & permissions"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@types/jsonwebtoken": "^8.5.8",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"@types/jsonwebtoken": "^9.0.9",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
|
@ -55,6 +55,7 @@ test.describe('direct duplicate & copy into the form and continue to fill in', (
|
||||
await page.getByRole('menuitem', { name: 'oneToMany' }).click();
|
||||
await page.getByRole('menuitem', { name: 'manyToOne', exact: true }).click();
|
||||
await page.getByRole('menuitem', { name: 'manyToMany' }).click();
|
||||
await page.mouse.move(300, 0);
|
||||
await page.getByLabel('schema-initializer-ActionBar-createForm:configureActions-general').click();
|
||||
await page.getByRole('menuitem', { name: 'Submit' }).click();
|
||||
await page.getByLabel('drawer-Action.Container-general-Duplicate-mask').click();
|
||||
|
@ -15,7 +15,7 @@
|
||||
"@formily/core": "2.x",
|
||||
"@formily/react": "2.x",
|
||||
"@formily/shared": "2.x",
|
||||
"@koa/multer": "^3.0.2",
|
||||
"@koa/multer": "^3.1.0",
|
||||
"@types/node-xlsx": "^0.15.1",
|
||||
"antd": "5.x",
|
||||
"async-mutex": "^0.5.0",
|
||||
|
@ -0,0 +1,182 @@
|
||||
/**
|
||||
* This file is part of the NocoBase (R) project.
|
||||
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
||||
* Authors: NocoBase Team.
|
||||
*
|
||||
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { SchemaSettingsItem, useAPIClient, useDesignable, useFormBlockProps } from '@nocobase/client';
|
||||
import { useFieldSchema, useForm, useField } from '@formily/react';
|
||||
import { App } from 'antd';
|
||||
import React from 'react';
|
||||
import _ from 'lodash';
|
||||
import { Schema } from '@formily/json-schema';
|
||||
import { useT } from '../locale';
|
||||
import { uid } from '@nocobase/utils/client';
|
||||
|
||||
const findInsertPosition = (parentSchema, uid) => {
|
||||
const postion = {
|
||||
insertPosition: 'beforeBegin',
|
||||
insertTarget: null,
|
||||
};
|
||||
const properties = Object.values(parentSchema.properties || {}).sort((a, b) => {
|
||||
return (a as any)['x-index'] - (b as any)['x-index'];
|
||||
});
|
||||
for (let i = 0; i < properties.length; i++) {
|
||||
const property = properties[i];
|
||||
if ((property as any)['x-uid'] === uid) {
|
||||
postion.insertPosition = 'beforeBegin';
|
||||
if (i === properties.length - 1) {
|
||||
postion.insertPosition = 'beforeEnd';
|
||||
postion.insertTarget = parentSchema['x-uid'];
|
||||
} else {
|
||||
postion.insertPosition = 'beforeBegin';
|
||||
postion.insertTarget = (properties[i + 1] as any)['x-uid'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return postion;
|
||||
};
|
||||
|
||||
const findParentRootTemplateSchema = (fieldSchema) => {
|
||||
if (!fieldSchema) {
|
||||
return null;
|
||||
}
|
||||
if (fieldSchema['x-template-root-uid']) {
|
||||
return fieldSchema;
|
||||
} else {
|
||||
return findParentRootTemplateSchema(fieldSchema.parent);
|
||||
}
|
||||
};
|
||||
|
||||
// Create a copy of the schema with all template associations removed
|
||||
const convertToNormalBlockSchema = (schema) => {
|
||||
const newSchema = _.cloneDeep(schema);
|
||||
|
||||
// Remove template associations from the schema
|
||||
const removeTemplateAssociations = (s) => {
|
||||
// Remove template-specific properties
|
||||
delete s['x-template-uid'];
|
||||
delete s['x-template-root-uid'];
|
||||
delete s['x-template-version'];
|
||||
delete s['x-block-template-key'];
|
||||
delete s['x-template-root-ref'];
|
||||
delete s['x-template-title'];
|
||||
delete s['x-virtual'];
|
||||
|
||||
if (s['x-toolbar-props']?.toolbarClassName?.includes('nb-in-template')) {
|
||||
s['x-toolbar-props'].toolbarClassName = s['x-toolbar-props'].toolbarClassName.replace('nb-in-template', '');
|
||||
}
|
||||
|
||||
if (s['x-uid']) {
|
||||
s['x-uid'] = uid();
|
||||
}
|
||||
// Process nested properties
|
||||
if (s.properties) {
|
||||
for (const key in s.properties) {
|
||||
if (!s.properties[key]['x-template-root-uid']) {
|
||||
removeTemplateAssociations(s.properties[key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
removeTemplateAssociations(newSchema);
|
||||
return newSchema;
|
||||
};
|
||||
|
||||
export const ConvertToNormalBlockSetting = () => {
|
||||
const { refresh } = useDesignable();
|
||||
const t = useT();
|
||||
const api = useAPIClient();
|
||||
const form = useForm();
|
||||
const field = useField();
|
||||
const { form: blockForm } = useFormBlockProps();
|
||||
const fieldSchema = useFieldSchema();
|
||||
const { modal, message } = App.useApp();
|
||||
const blockTemplatesResource = api.resource('blockTemplates');
|
||||
|
||||
const confirm = {
|
||||
okText: t('Yes'),
|
||||
cancelText: t('No'),
|
||||
};
|
||||
|
||||
return (
|
||||
<SchemaSettingsItem
|
||||
title={t('Convert to normal block')}
|
||||
onClick={() => {
|
||||
modal.confirm({
|
||||
title: t('Convert to normal block'),
|
||||
content: t('Are you sure you want to convert this template block to a normal block?'),
|
||||
...confirm,
|
||||
async onOk() {
|
||||
const newSchema = convertToNormalBlockSchema(fieldSchema.toJSON());
|
||||
const position = findInsertPosition(fieldSchema.parent, fieldSchema['x-uid']);
|
||||
// TODO: Remove old schema, and links
|
||||
|
||||
// Remove old schema
|
||||
await api.request({
|
||||
url: `/uiSchemas:remove/${fieldSchema['x-uid']}`,
|
||||
});
|
||||
|
||||
// Insert new schema
|
||||
const schema = new Schema(newSchema);
|
||||
await api.request({
|
||||
url: `/uiSchemas:insertAdjacent/${position.insertTarget}?position=${position.insertPosition}`,
|
||||
method: 'post',
|
||||
data: {
|
||||
schema,
|
||||
},
|
||||
});
|
||||
|
||||
// Update the UI to show the new schema
|
||||
fieldSchema.toJSON = () => {
|
||||
const ret = schema.toJSON();
|
||||
return ret;
|
||||
};
|
||||
|
||||
refresh({ refreshParentSchema: true });
|
||||
|
||||
// Update component properties
|
||||
field['componentProps'] = {
|
||||
...field['componentProps'],
|
||||
key: uid(),
|
||||
};
|
||||
|
||||
if (field.parent?.['componentProps']) {
|
||||
field.parent['componentProps'] = {
|
||||
...field.parent['componentProps'],
|
||||
key: uid(),
|
||||
};
|
||||
}
|
||||
|
||||
// Update decorator properties
|
||||
field['decoratorProps'] = {
|
||||
...field['decoratorProps'],
|
||||
key: uid(),
|
||||
};
|
||||
|
||||
if (field.parent?.['decoratorProps']) {
|
||||
field.parent['decoratorProps'] = {
|
||||
...field.parent['decoratorProps'],
|
||||
key: uid(),
|
||||
};
|
||||
}
|
||||
|
||||
// Reset forms
|
||||
form.reset();
|
||||
blockForm?.reset();
|
||||
form.clearFormGraph('*', false);
|
||||
blockForm?.clearFormGraph('*', false);
|
||||
|
||||
message.success(t('Converted successfully'), 0.2);
|
||||
},
|
||||
});
|
||||
}}
|
||||
>
|
||||
{t('Convert to normal block')}
|
||||
</SchemaSettingsItem>
|
||||
);
|
||||
};
|
@ -74,7 +74,7 @@ export const SaveAsTemplateSetting = () => {
|
||||
key: {
|
||||
type: 'string',
|
||||
'x-decorator': 'FormItem',
|
||||
title: t('Key'),
|
||||
title: t('Name'),
|
||||
'x-component': 'Input',
|
||||
'x-validator': 'uid',
|
||||
required: true,
|
||||
@ -298,6 +298,10 @@ function getTemplateSchemaFromPage(schema: ISchema) {
|
||||
}
|
||||
_.set(t, `properties.['${key}']`, {});
|
||||
traverseSchema(s.properties[key], t.properties[key]);
|
||||
// array's key will be set to number when render, so we need to set the name to the key
|
||||
if (s.type === 'array' && t['properties']?.[key]?.name) {
|
||||
_.set(t, `properties.['${key}'].name`, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -22,8 +22,9 @@ export const useIsPageBlock = () => {
|
||||
const isPage = location.pathname.startsWith('/admin/') || location.pathname.startsWith('/page/');
|
||||
const notInPopup = !location.pathname.includes('/popups/');
|
||||
const notInSetting = !location.pathname.startsWith('/admin/settings/');
|
||||
const notInWorkflow = !location.pathname.startsWith('/admin/workflow/workflows/');
|
||||
const notInBlockTemplate = !location.pathname.startsWith('/block-templates/');
|
||||
return isPage && notInPopup && notInSetting && notInBlockTemplate;
|
||||
return isPage && notInPopup && notInSetting && notInWorkflow && notInBlockTemplate;
|
||||
}, [location.pathname, fieldSchema]);
|
||||
|
||||
return isPageBlock;
|
||||
|
@ -28,6 +28,8 @@ import {
|
||||
import { BlockTemplateMenusProvider } from './components/BlockTemplateMenusProvider';
|
||||
import { disabledDeleteSettingItem } from './settings/disabledDeleteSetting';
|
||||
import { saveAsTemplateSetting } from './settings/saveAsTemplateSetting';
|
||||
import { convertToNormalBlockSettingItem } from './settings/convertToNormalBlockSetting';
|
||||
|
||||
export class PluginBlockTemplateClient extends Plugin {
|
||||
templateInfos = new Map();
|
||||
templateschemacache = {};
|
||||
@ -158,9 +160,10 @@ export class PluginBlockTemplateClient extends Plugin {
|
||||
deleteItemIndex !== -1 &&
|
||||
!schemaSetting.items.find((item) => item.name === 'template-revertSettingItem')
|
||||
) {
|
||||
schemaSetting.items.splice(deleteItemIndex, 0, revertSettingItem);
|
||||
schemaSetting.items.splice(deleteItemIndex, 0, revertSettingItem, convertToNormalBlockSettingItem);
|
||||
} else {
|
||||
schemaSetting.add('template-revertSettingItem', revertSettingItem);
|
||||
schemaSetting.add('template-convertToNormalBlockSettingItem', convertToNormalBlockSettingItem);
|
||||
}
|
||||
schemaSetting.add('template-disabledDeleteItem', disabledDeleteSettingItem);
|
||||
}
|
||||
|
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* This file is part of the NocoBase (R) project.
|
||||
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
||||
* Authors: NocoBase Team.
|
||||
*
|
||||
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||
*/
|
||||
|
||||
import { useFieldSchema } from '@formily/react';
|
||||
import { ConvertToNormalBlockSetting } from '../components/ConvertToNormalBlockSetting';
|
||||
import { tStr } from '../locale';
|
||||
import { useIsInTemplate } from '../hooks/useIsInTemplate';
|
||||
|
||||
export const convertToNormalBlockSettingItem = {
|
||||
name: 'template-convertToNormalBlockSettingItem',
|
||||
title: tStr('Convert to normal block'),
|
||||
Component: ConvertToNormalBlockSetting,
|
||||
useVisible: () => {
|
||||
const fieldSchema = useFieldSchema();
|
||||
return fieldSchema?.['x-template-root-uid'];
|
||||
},
|
||||
};
|
@ -12,7 +12,9 @@
|
||||
"Mobile": "Mobile",
|
||||
"Current": "Current record",
|
||||
"Revert to template": "Revert to template",
|
||||
"Convert to normal block": "Convert to normal block",
|
||||
"Are you sure you want to revert all changes from the template?": "Are you sure you want to revert all changes from the template?",
|
||||
"Are you sure you want to convert this template block to a normal block?": "Are you sure you want to convert this template block to a normal block?",
|
||||
"Templates": "Templates",
|
||||
"Block templates": "Block templates",
|
||||
"Submit": "Submit",
|
||||
@ -22,6 +24,7 @@
|
||||
"Saved successfully": "Saved successfully",
|
||||
"Block template": "Block template",
|
||||
"Reset successfully": "Reset successfully",
|
||||
"Converted successfully": "Converted successfully",
|
||||
"Delete successfully": "Delete successfully",
|
||||
"Template block settings": "Template block settings",
|
||||
"Filter": "Filter",
|
||||
|
@ -12,7 +12,9 @@
|
||||
"Mobile": "移动端",
|
||||
"Current": "当前记录",
|
||||
"Revert to template": "恢复到模板",
|
||||
"Convert to normal block": "转换成普通区块",
|
||||
"Are you sure you want to revert all changes from the template?": "您确定要恢复所有对模板的更改吗?",
|
||||
"Are you sure you want to convert this template block to a normal block?": "您确定要将此模板区块转换为普通区块吗?",
|
||||
"Templates": "模板",
|
||||
"Block templates": "区块模板",
|
||||
"Submit": "提交",
|
||||
@ -22,6 +24,7 @@
|
||||
"Saved successfully": "保存成功",
|
||||
"Block template": "区块模板",
|
||||
"Reset successfully": "重置成功",
|
||||
"Converted successfully": "转换成功",
|
||||
"Delete successfully": "删除成功",
|
||||
"Template block settings": "模板区块设置",
|
||||
"Filter": "筛选",
|
||||
|
@ -15,15 +15,15 @@
|
||||
"@formily/core": "2.x",
|
||||
"@formily/react": "2.x",
|
||||
"@formily/shared": "2.x",
|
||||
"@koa/multer": "^3.0.0",
|
||||
"@types/koa-multer": "^1.0.1",
|
||||
"@koa/multer": "^3.1.0",
|
||||
"@types/koa-multer": "^1.0.4",
|
||||
"@types/multer": "^1.4.5",
|
||||
"antd": "5.x",
|
||||
"cos-nodejs-sdk-v5": "^2.11.14",
|
||||
"koa-static": "^5.0.0",
|
||||
"mime-match": "^1.0.2",
|
||||
"mkdirp": "~0.5.4",
|
||||
"multer": "^1.4.2",
|
||||
"multer": "^1.4.5-lts.2",
|
||||
"multer-aliyun-oss": "2.1.3",
|
||||
"multer-cos": "^1.0.3",
|
||||
"multer-s3": "^3.0.1",
|
||||
|
@ -140,8 +140,8 @@ const MobileDateTimePicker = connect(
|
||||
}}
|
||||
precision={showTime && picker === 'date' ? getPrecision(timeFormat) : picker === 'date' ? 'day' : picker}
|
||||
renderLabel={labelRenderer}
|
||||
min={minDate || rest.min || new Date(1000, 0, 1)}
|
||||
max={maxDate || rest.max || new Date(9999, 11, 31)}
|
||||
min={minDate || rest.min || new Date(1950, 0, 1)}
|
||||
max={maxDate || rest.max || new Date(2050, 11, 31)}
|
||||
onConfirm={(val) => {
|
||||
handleConfirm(val);
|
||||
}}
|
||||
|
@ -29,6 +29,10 @@ export const useStyles = genStyleHook('nb-mobile-navigation-bar-action', (token)
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
|
||||
'& > span': {
|
||||
position: 'relative',
|
||||
},
|
||||
},
|
||||
'.nb-navigation-bar-action-title': {
|
||||
fontSize: 17,
|
||||
|
@ -199,7 +199,7 @@ export default {
|
||||
value: 'formula.js',
|
||||
label: 'Formula.js',
|
||||
tooltip: '{{t("Formula.js supports most Microsoft Excel formula functions.")}}',
|
||||
link: 'https://formulajs.info/functions/',
|
||||
link: 'https://docs.nocobase.com/handbook/calculation-engines/formula',
|
||||
},
|
||||
],
|
||||
default: 'formula.js',
|
||||
|
@ -10,8 +10,8 @@
|
||||
"homepage": "https://docs.nocobase.com/handbook/users",
|
||||
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/users",
|
||||
"devDependencies": {
|
||||
"@types/jsonwebtoken": "^8.5.8",
|
||||
"jsonwebtoken": "^8.5.1"
|
||||
"@types/jsonwebtoken": "^9.0.9",
|
||||
"jsonwebtoken": "^9.0.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@nocobase/actions": "1.x",
|
||||
|
@ -882,7 +882,7 @@ export const builtinExpression = {
|
||||
value: 'formula.js',
|
||||
label: 'Formula.js',
|
||||
tooltip: '{{t("Formula.js supports most Microsoft Excel formula functions.")}}',
|
||||
link: 'https://formulajs.info/functions/',
|
||||
link: 'https://docs.nocobase.com/handbook/calculation-engines/formula',
|
||||
},
|
||||
],
|
||||
default: 'formula.js',
|
||||
|
254
yarn.lock
254
yarn.lock
@ -5273,7 +5273,7 @@
|
||||
dependencies:
|
||||
vary "^1.1.2"
|
||||
|
||||
"@koa/multer@^3.0.0", "@koa/multer@^3.0.2":
|
||||
"@koa/multer@^3.0.2":
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmmirror.com/@koa/multer/-/multer-3.0.2.tgz#04ed1af502de5793a6052daf6c256e94ef13e3a4"
|
||||
integrity sha512-Q6WfPpE06mJWyZD1fzxM6zWywaoo+zocAn2YA9QYz4RsecoASr1h/kSzG0c5seDpFVKCMZM9raEfuM7XfqbRLw==
|
||||
@ -5296,11 +5296,20 @@
|
||||
resolved "https://registry.npmmirror.com/@koa/router/-/router-9.4.0.tgz#734b64c0ae566eb5af752df71e4143edc4748e48"
|
||||
integrity sha512-dOOXgzqaDoHu5qqMEPLKEgLz5CeIA7q8+1W62mCvFVCOqeC71UoTGJ4u1xUSOpIl2J1x2pqrNULkFteUeZW3/A==
|
||||
dependencies:
|
||||
debug "^4.1.1"
|
||||
http-errors "^1.7.3"
|
||||
debug "^4.3.4"
|
||||
http-errors "^2.0.0"
|
||||
koa-compose "^4.1.0"
|
||||
methods "^1.1.2"
|
||||
path-to-regexp "^6.1.0"
|
||||
path-to-regexp "^6.3.0"
|
||||
|
||||
"@koa/router@^13.1.0":
|
||||
version "13.1.0"
|
||||
resolved "https://registry.npmmirror.com/@koa/router/-/router-13.1.0.tgz#43f4c554444ea4f4a148a5735a9525c6d16fd1b5"
|
||||
integrity sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==
|
||||
dependencies:
|
||||
http-errors "^2.0.0"
|
||||
koa-compose "^4.1.0"
|
||||
path-to-regexp "^6.3.0"
|
||||
|
||||
"@langchain/core@^0.3.39":
|
||||
version "0.3.42"
|
||||
@ -6164,20 +6173,23 @@
|
||||
resolved "https://registry.npmmirror.com/@makotot/ghostui/-/ghostui-2.0.0.tgz#ae035d405a9ed5100436158e953ed9480f1c09a7"
|
||||
integrity sha512-LD6OeMv+yGjpYZNjh34yDTCIE1NegqOtJq5gm4wX6op3QL7K5psTVzMjkWzseBoYj0XOD4g+UJVIZTprfoOPGg==
|
||||
|
||||
"@mapbox/node-pre-gyp@^1.0.0":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.npmmirror.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz#417db42b7f5323d79e93b34a6d7a2a12c0df43fa"
|
||||
integrity sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==
|
||||
"@marijn/find-cluster-break@^1.0.0":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmmirror.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8"
|
||||
integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==
|
||||
|
||||
"@microsoft/microsoft-graph-client@^3.0.7":
|
||||
version "3.0.7"
|
||||
resolved "https://registry.npmmirror.com/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.7.tgz#535507df2db40bd7ed24a670dc68c87c628177a4"
|
||||
integrity sha512-/AazAV/F+HK4LIywF9C+NYHcJo038zEnWkteilcxC1FM/uK/4NVGDKGrxx7nNq1ybspAroRKT4I1FHfxQzxkUw==
|
||||
dependencies:
|
||||
detect-libc "^2.0.0"
|
||||
https-proxy-agent "^5.0.0"
|
||||
make-dir "^3.1.0"
|
||||
node-fetch "^2.6.7"
|
||||
nopt "^5.0.0"
|
||||
npmlog "^5.0.1"
|
||||
rimraf "^3.0.2"
|
||||
semver "^7.3.5"
|
||||
tar "^6.1.11"
|
||||
"@babel/runtime" "^7.12.5"
|
||||
tslib "^2.2.0"
|
||||
|
||||
"@microsoft/microsoft-graph-types@^2.40.0":
|
||||
version "2.40.0"
|
||||
resolved "https://registry.npmmirror.com/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.40.0.tgz#65f51600ab45ace97d7b1368c47f9e0f835fddca"
|
||||
integrity sha512-1fcPVrB/NkbNcGNfCy+Cgnvwxt6/sbIEEFgZHFBJ670zYLegENYJF8qMo7x3LqBjWX2/Eneq5BVVRCLTmlJN+g==
|
||||
|
||||
"@marijn/find-cluster-break@^1.0.0":
|
||||
version "1.0.2"
|
||||
@ -6264,6 +6276,23 @@
|
||||
xml2js "^0.5.0"
|
||||
xmlbuilder "^15.1.1"
|
||||
|
||||
"@node-saml/node-saml@^4.0.2":
|
||||
version "4.0.5"
|
||||
resolved "https://registry.npmmirror.com/@node-saml/node-saml/-/node-saml-4.0.5.tgz#039e387095b54639b06df62b1b4a6d8941c6d907"
|
||||
integrity sha512-J5DglElbY1tjOuaR1NPtjOXkXY5bpUhDoKVoeucYN98A3w4fwgjIOPqIGcb6cQsqFq2zZ6vTCeKn5C/hvefSaw==
|
||||
dependencies:
|
||||
"@types/debug" "^4.1.7"
|
||||
"@types/passport" "^1.0.11"
|
||||
"@types/xml-crypto" "^1.4.2"
|
||||
"@types/xml-encryption" "^1.2.1"
|
||||
"@types/xml2js" "^0.4.11"
|
||||
"@xmldom/xmldom" "^0.8.6"
|
||||
debug "^4.3.4"
|
||||
xml-crypto "^3.0.1"
|
||||
xml-encryption "^3.0.2"
|
||||
xml2js "^0.5.0"
|
||||
xmlbuilder "^15.1.1"
|
||||
|
||||
"@nodelib/fs.scandir@2.1.5":
|
||||
version "2.1.5"
|
||||
resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
|
||||
@ -8911,11 +8940,12 @@
|
||||
dependencies:
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/jsonwebtoken@^8.5.8":
|
||||
version "8.5.9"
|
||||
resolved "https://registry.npmmirror.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz#2c064ecb0b3128d837d2764aa0b117b0ff6e4586"
|
||||
integrity sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==
|
||||
"@types/jsonwebtoken@^9.0.9":
|
||||
version "9.0.9"
|
||||
resolved "https://registry.npmmirror.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz#a4c3a446c0ebaaf467a58398382616f416345fb3"
|
||||
integrity sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==
|
||||
dependencies:
|
||||
"@types/ms" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
"@types/keygrip@*":
|
||||
@ -8937,7 +8967,7 @@
|
||||
dependencies:
|
||||
"@types/koa" "*"
|
||||
|
||||
"@types/koa-multer@^1.0.1":
|
||||
"@types/koa-multer@^1.0.4":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmmirror.com/@types/koa-multer/-/koa-multer-1.0.4.tgz#5576cb7aea56926e4d48faaa7b510b87bdfcb3db"
|
||||
integrity sha512-Aty7k5W/bVgvCtyc7iwzjP1QXp1CPsQE3klmIEVBphK2bthjJjUpgkvFNChckA8DPxaatzFmnotWZnXLAAnLog==
|
||||
@ -9080,7 +9110,7 @@
|
||||
resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
|
||||
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
|
||||
|
||||
"@types/multer@^1.4.5":
|
||||
"@types/multer@^1.4.12", "@types/multer@^1.4.5":
|
||||
version "1.4.12"
|
||||
resolved "https://registry.npmmirror.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7"
|
||||
integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg==
|
||||
@ -10801,7 +10831,7 @@ aproba@^1.0.3, aproba@^1.1.1:
|
||||
resolved "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
|
||||
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
|
||||
|
||||
"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0:
|
||||
aproba@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmmirror.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
|
||||
integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
|
||||
@ -10886,22 +10916,6 @@ archy@^1.0.0:
|
||||
resolved "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
|
||||
integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
|
||||
|
||||
are-we-there-yet@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c"
|
||||
integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==
|
||||
dependencies:
|
||||
delegates "^1.0.0"
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
are-we-there-yet@^3.0.0:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
|
||||
integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
|
||||
dependencies:
|
||||
delegates "^1.0.0"
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
are-we-there-yet@~1.1.2:
|
||||
version "1.1.7"
|
||||
resolved "https://registry.npmmirror.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146"
|
||||
@ -12104,14 +12118,6 @@ bundle-require@^5.0.0:
|
||||
dependencies:
|
||||
load-tsconfig "^0.2.3"
|
||||
|
||||
busboy@^0.2.11:
|
||||
version "0.2.14"
|
||||
resolved "https://registry.npmmirror.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
|
||||
integrity sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==
|
||||
dependencies:
|
||||
dicer "0.2.5"
|
||||
readable-stream "1.1.x"
|
||||
|
||||
busboy@^1.0.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
|
||||
@ -13098,7 +13104,7 @@ color-string@^1.5.5, color-string@^1.6.0:
|
||||
color-name "^1.0.0"
|
||||
simple-swizzle "^0.2.2"
|
||||
|
||||
color-support@^1.1.2, color-support@^1.1.3:
|
||||
color-support@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.npmmirror.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
|
||||
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
|
||||
@ -13403,7 +13409,7 @@ console-browserify@^1.1.0:
|
||||
resolved "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
|
||||
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
|
||||
|
||||
console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0:
|
||||
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmmirror.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
|
||||
integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
|
||||
@ -15051,11 +15057,6 @@ detect-libc@^1.0.3:
|
||||
resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
|
||||
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
|
||||
|
||||
detect-libc@^2.0.0:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d"
|
||||
integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==
|
||||
|
||||
detect-newline@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.npmmirror.com/detect-newline/-/detect-newline-4.0.1.tgz#fcefdb5713e1fb8cb2839b8b6ee22e6716ab8f23"
|
||||
@ -15079,14 +15080,6 @@ dezalgo@^1.0.0, dezalgo@^1.0.4:
|
||||
asap "^2.0.0"
|
||||
wrappy "1"
|
||||
|
||||
dicer@0.2.5:
|
||||
version "0.2.5"
|
||||
resolved "https://registry.npmmirror.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
|
||||
integrity sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==
|
||||
dependencies:
|
||||
readable-stream "1.1.x"
|
||||
streamsearch "0.1.2"
|
||||
|
||||
diff-match-patch@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.npmmirror.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37"
|
||||
@ -17680,35 +17673,6 @@ functions-have-names@^1.2.3:
|
||||
resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
|
||||
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
|
||||
|
||||
gauge@^3.0.0:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmmirror.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395"
|
||||
integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==
|
||||
dependencies:
|
||||
aproba "^1.0.3 || ^2.0.0"
|
||||
color-support "^1.1.2"
|
||||
console-control-strings "^1.0.0"
|
||||
has-unicode "^2.0.1"
|
||||
object-assign "^4.1.1"
|
||||
signal-exit "^3.0.0"
|
||||
string-width "^4.2.3"
|
||||
strip-ansi "^6.0.1"
|
||||
wide-align "^1.1.2"
|
||||
|
||||
gauge@^4.0.3:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.npmmirror.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
|
||||
integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
|
||||
dependencies:
|
||||
aproba "^1.0.3 || ^2.0.0"
|
||||
color-support "^1.1.3"
|
||||
console-control-strings "^1.1.0"
|
||||
has-unicode "^2.0.1"
|
||||
signal-exit "^3.0.7"
|
||||
string-width "^4.2.3"
|
||||
strip-ansi "^6.0.1"
|
||||
wide-align "^1.1.5"
|
||||
|
||||
gauge@~2.7.3:
|
||||
version "2.7.4"
|
||||
resolved "https://registry.npmmirror.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
|
||||
@ -20792,7 +20756,7 @@ jsonwebtoken@^8.5.1:
|
||||
lodash.isstring "^4.0.1"
|
||||
lodash.once "^4.0.0"
|
||||
ms "^2.1.1"
|
||||
semver "^5.6.0"
|
||||
semver "^7.5.4"
|
||||
|
||||
jsonwebtoken@^9.0.0:
|
||||
version "9.0.2"
|
||||
@ -21917,7 +21881,7 @@ make-fetch-happen@^8.0.9:
|
||||
socks-proxy-agent "^5.0.0"
|
||||
ssri "^8.0.0"
|
||||
|
||||
make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0:
|
||||
make-fetch-happen@^9.0.1:
|
||||
version "9.1.0"
|
||||
resolved "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
|
||||
integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
|
||||
@ -23192,24 +23156,10 @@ multer-s3@^3.0.1:
|
||||
html-comment-regex "^1.1.2"
|
||||
run-parallel "^1.1.6"
|
||||
|
||||
multer@^1.4.2:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.npmmirror.com/multer/-/multer-1.4.4.tgz#e2bc6cac0df57a8832b858d7418ccaa8ebaf7d8c"
|
||||
integrity sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==
|
||||
dependencies:
|
||||
append-field "^1.0.0"
|
||||
busboy "^0.2.11"
|
||||
concat-stream "^1.5.2"
|
||||
mkdirp "^0.5.4"
|
||||
object-assign "^4.1.1"
|
||||
on-finished "^2.3.0"
|
||||
type-is "^1.6.4"
|
||||
xtend "^4.0.0"
|
||||
|
||||
multer@^1.4.5-lts.1:
|
||||
version "1.4.5-lts.1"
|
||||
resolved "https://registry.npmmirror.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac"
|
||||
integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==
|
||||
multer@^1.4.5-lts.2:
|
||||
version "1.4.5-lts.2"
|
||||
resolved "https://registry.npmmirror.com/multer/-/multer-1.4.5-lts.2.tgz#340af065d8685dda846ec9e3d7655fcd50afba2d"
|
||||
integrity sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==
|
||||
dependencies:
|
||||
append-field "^1.0.0"
|
||||
busboy "^1.0.0"
|
||||
@ -23423,11 +23373,6 @@ node-abort-controller@^3.0.1:
|
||||
resolved "https://registry.npmmirror.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548"
|
||||
integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==
|
||||
|
||||
node-addon-api@^4.2.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
|
||||
integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
|
||||
|
||||
node-domexception@1.0.0, node-domexception@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
|
||||
@ -23458,21 +23403,21 @@ node-fetch@^3.2.0:
|
||||
fetch-blob "^3.1.4"
|
||||
formdata-polyfill "^4.0.10"
|
||||
|
||||
node-gyp@8.x:
|
||||
version "8.4.1"
|
||||
resolved "https://registry.npmmirror.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
|
||||
integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==
|
||||
node-gyp@^10.2.0:
|
||||
version "10.3.1"
|
||||
resolved "https://registry.npmmirror.com/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a"
|
||||
integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==
|
||||
dependencies:
|
||||
env-paths "^2.2.0"
|
||||
glob "^7.1.4"
|
||||
exponential-backoff "^3.1.1"
|
||||
glob "^10.3.10"
|
||||
graceful-fs "^4.2.6"
|
||||
make-fetch-happen "^9.1.0"
|
||||
nopt "^5.0.0"
|
||||
npmlog "^6.0.0"
|
||||
rimraf "^3.0.2"
|
||||
make-fetch-happen "^13.0.0"
|
||||
nopt "^7.0.0"
|
||||
proc-log "^4.1.0"
|
||||
semver "^7.3.5"
|
||||
tar "^6.1.2"
|
||||
which "^2.0.2"
|
||||
tar "^6.2.1"
|
||||
which "^4.0.0"
|
||||
|
||||
node-gyp@^10.2.0:
|
||||
version "10.3.1"
|
||||
@ -23829,26 +23774,6 @@ npmlog@^4.1.2:
|
||||
gauge "~2.7.3"
|
||||
set-blocking "~2.0.0"
|
||||
|
||||
npmlog@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmmirror.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0"
|
||||
integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==
|
||||
dependencies:
|
||||
are-we-there-yet "^2.0.0"
|
||||
console-control-strings "^1.1.0"
|
||||
gauge "^3.0.0"
|
||||
set-blocking "^2.0.0"
|
||||
|
||||
npmlog@^6.0.0:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.npmmirror.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
|
||||
integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
|
||||
dependencies:
|
||||
are-we-there-yet "^3.0.0"
|
||||
console-control-strings "^1.1.0"
|
||||
gauge "^4.0.3"
|
||||
set-blocking "^2.0.0"
|
||||
|
||||
nprogress@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
|
||||
@ -24914,20 +24839,15 @@ path-to-regexp@3.3.0:
|
||||
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-3.3.0.tgz#f7f31d32e8518c2660862b644414b6d5c63a611b"
|
||||
integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==
|
||||
|
||||
path-to-regexp@6.2.2:
|
||||
version "6.2.2"
|
||||
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36"
|
||||
integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==
|
||||
|
||||
path-to-regexp@8.2.0:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4"
|
||||
integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
|
||||
|
||||
path-to-regexp@^6.1.0:
|
||||
version "6.2.1"
|
||||
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5"
|
||||
integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==
|
||||
path-to-regexp@^6.3.0:
|
||||
version "6.3.0"
|
||||
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz#2b6a26a337737a8e1416f9272ed0766b1c0389f4"
|
||||
integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
|
||||
|
||||
path-to-regexp@^6.3.0:
|
||||
version "6.3.0"
|
||||
@ -29366,17 +29286,6 @@ sprintf-js@~1.0.2:
|
||||
resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
|
||||
integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
|
||||
|
||||
sqlite3@^5.0.8:
|
||||
version "5.1.6"
|
||||
resolved "https://registry.npmmirror.com/sqlite3/-/sqlite3-5.1.6.tgz#1d4fbc90fe4fbd51e952e0a90fd8f6c2b9098e97"
|
||||
integrity sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==
|
||||
dependencies:
|
||||
"@mapbox/node-pre-gyp" "^1.0.0"
|
||||
node-addon-api "^4.2.0"
|
||||
tar "^6.1.11"
|
||||
optionalDependencies:
|
||||
node-gyp "8.x"
|
||||
|
||||
sqlstring@^2.3.2:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c"
|
||||
@ -29553,11 +29462,6 @@ stream-wormhole@^1.0.4:
|
||||
resolved "https://registry.npmmirror.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz#300aff46ced553cfec642a05251885417693c33d"
|
||||
integrity sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==
|
||||
|
||||
streamsearch@0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.npmmirror.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
|
||||
integrity sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==
|
||||
|
||||
streamsearch@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
|
||||
@ -30240,7 +30144,7 @@ tar@^4.4.12:
|
||||
safe-buffer "^5.2.1"
|
||||
yallist "^3.1.1"
|
||||
|
||||
tar@^6.0.2, tar@^6.1.0, tar@^6.1.11, tar@^6.1.2:
|
||||
tar@^6.0.2, tar@^6.1.0, tar@^6.1.11:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.npmmirror.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
|
||||
integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
|
||||
@ -32311,7 +32215,7 @@ why-is-node-running@^2.2.2:
|
||||
siginfo "^2.0.0"
|
||||
stackback "0.0.2"
|
||||
|
||||
wide-align@^1.1.0, wide-align@^1.1.2, wide-align@^1.1.5:
|
||||
wide-align@^1.1.0:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.npmmirror.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
|
||||
integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
|
||||
|
Loading…
x
Reference in New Issue
Block a user