feat: add silent flag
This commit is contained in:
parent
80d4a808d3
commit
11b2342da0
@ -60,6 +60,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@emotion/react": "^11.4.1",
|
"@emotion/react": "^11.4.1",
|
||||||
"@types/memoizee": "^0.4.7",
|
"@types/memoizee": "^0.4.7",
|
||||||
|
"@types/minimist": "^1.2.2",
|
||||||
"@types/node": "^17.0.25",
|
"@types/node": "^17.0.25",
|
||||||
"@types/react": "18.0.9",
|
"@types/react": "18.0.9",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
@ -78,6 +79,7 @@
|
|||||||
"evt": "^2.4.0",
|
"evt": "^2.4.0",
|
||||||
"memoizee": "^0.4.15",
|
"memoizee": "^0.4.15",
|
||||||
"minimal-polyfills": "^2.2.2",
|
"minimal-polyfills": "^2.2.2",
|
||||||
|
"minimist": "^1.2.6",
|
||||||
"path-browserify": "^1.0.1",
|
"path-browserify": "^1.0.1",
|
||||||
"powerhooks": "^0.20.15",
|
"powerhooks": "^0.20.15",
|
||||||
"react-markdown": "^5.0.3",
|
"react-markdown": "^5.0.3",
|
||||||
|
@ -6,11 +6,15 @@ import { join as pathJoin, basename as pathBasename } from "path";
|
|||||||
import { transformCodebase } from "./tools/transformCodebase";
|
import { transformCodebase } from "./tools/transformCodebase";
|
||||||
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
|
import { getCliOptions } from "./tools/cliOptions";
|
||||||
|
import { getLogger } from "./tools/logger";
|
||||||
|
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
(async () => {
|
(async () => {
|
||||||
|
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||||
|
const logger = getLogger({ isSilent });
|
||||||
if (fs.existsSync(keycloakThemeEmailDirPath)) {
|
if (fs.existsSync(keycloakThemeEmailDirPath)) {
|
||||||
console.log(`There is already a ./${pathBasename(keycloakThemeEmailDirPath)} directory in your project. Aborting.`);
|
logger.warn(`There is already a ./${pathBasename(keycloakThemeEmailDirPath)} directory in your project. Aborting.`);
|
||||||
|
|
||||||
process.exit(-1);
|
process.exit(-1);
|
||||||
}
|
}
|
||||||
@ -21,7 +25,8 @@ if (require.main === module) {
|
|||||||
|
|
||||||
downloadBuiltinKeycloakTheme({
|
downloadBuiltinKeycloakTheme({
|
||||||
keycloakVersion,
|
keycloakVersion,
|
||||||
"destDirPath": builtinKeycloakThemeTmpDirPath
|
"destDirPath": builtinKeycloakThemeTmpDirPath,
|
||||||
|
"isSilent": isSilent
|
||||||
});
|
});
|
||||||
|
|
||||||
transformCodebase({
|
transformCodebase({
|
||||||
@ -29,7 +34,7 @@ if (require.main === module) {
|
|||||||
"destDirPath": keycloakThemeEmailDirPath
|
"destDirPath": keycloakThemeEmailDirPath
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`./${pathBasename(keycloakThemeEmailDirPath)} ready to be customized`);
|
logger.log(`./${pathBasename(keycloakThemeEmailDirPath)} ready to be customized`);
|
||||||
|
|
||||||
fs.rmSync(builtinKeycloakThemeTmpDirPath, { "recursive": true, "force": true });
|
fs.rmSync(builtinKeycloakThemeTmpDirPath, { "recursive": true, "force": true });
|
||||||
})();
|
})();
|
||||||
|
@ -4,31 +4,37 @@ import { keycloakThemeBuildingDirPath } from "./keycloakify";
|
|||||||
import { join as pathJoin } from "path";
|
import { join as pathJoin } from "path";
|
||||||
import { downloadAndUnzip } from "./tools/downloadAndUnzip";
|
import { downloadAndUnzip } from "./tools/downloadAndUnzip";
|
||||||
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
import { promptKeycloakVersion } from "./promptKeycloakVersion";
|
||||||
|
import { getCliOptions } from "./tools/cliOptions";
|
||||||
|
import { getLogger } from "./tools/logger";
|
||||||
|
|
||||||
export function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string }) {
|
export function downloadBuiltinKeycloakTheme(params: { keycloakVersion: string; destDirPath: string; isSilent: boolean }) {
|
||||||
const { keycloakVersion, destDirPath } = params;
|
const { keycloakVersion, destDirPath, isSilent } = params;
|
||||||
|
|
||||||
for (const ext of ["", "-community"]) {
|
for (const ext of ["", "-community"]) {
|
||||||
downloadAndUnzip({
|
downloadAndUnzip({
|
||||||
"destDirPath": destDirPath,
|
"destDirPath": destDirPath,
|
||||||
"url": `https://github.com/keycloak/keycloak/archive/refs/tags/${keycloakVersion}.zip`,
|
"url": `https://github.com/keycloak/keycloak/archive/refs/tags/${keycloakVersion}.zip`,
|
||||||
"pathOfDirToExtractInArchive": `keycloak-${keycloakVersion}/themes/src/main/resources${ext}/theme`,
|
"pathOfDirToExtractInArchive": `keycloak-${keycloakVersion}/themes/src/main/resources${ext}/theme`,
|
||||||
"cacheDirPath": pathJoin(keycloakThemeBuildingDirPath, ".cache")
|
"cacheDirPath": pathJoin(keycloakThemeBuildingDirPath, ".cache"),
|
||||||
|
"isSilent": isSilent
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
(async () => {
|
(async () => {
|
||||||
|
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||||
|
const logger = getLogger({ isSilent });
|
||||||
const { keycloakVersion } = await promptKeycloakVersion();
|
const { keycloakVersion } = await promptKeycloakVersion();
|
||||||
|
|
||||||
const destDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme");
|
const destDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme");
|
||||||
|
|
||||||
console.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
logger.log(`Downloading builtins theme of Keycloak ${keycloakVersion} here ${destDirPath}`);
|
||||||
|
|
||||||
downloadBuiltinKeycloakTheme({
|
downloadBuiltinKeycloakTheme({
|
||||||
keycloakVersion,
|
keycloakVersion,
|
||||||
destDirPath
|
destDirPath,
|
||||||
|
isSilent
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ import { crawl } from "./tools/crawl";
|
|||||||
import { downloadBuiltinKeycloakTheme } from "./download-builtin-keycloak-theme";
|
import { downloadBuiltinKeycloakTheme } from "./download-builtin-keycloak-theme";
|
||||||
import { getProjectRoot } from "./tools/getProjectRoot";
|
import { getProjectRoot } from "./tools/getProjectRoot";
|
||||||
import { rm_rf, rm_r } from "./tools/rm";
|
import { rm_rf, rm_r } from "./tools/rm";
|
||||||
|
import { getCliOptions } from "./tools/cliOptions";
|
||||||
|
import { getLogger } from "./tools/logger";
|
||||||
|
|
||||||
//NOTE: To run without argument when we want to generate src/i18n/generated_kcMessages files,
|
//NOTE: To run without argument when we want to generate src/i18n/generated_kcMessages files,
|
||||||
// update the version array for generating for newer version.
|
// update the version array for generating for newer version.
|
||||||
@ -12,8 +14,11 @@ import { rm_rf, rm_r } from "./tools/rm";
|
|||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
const propertiesParser = require("properties-parser");
|
const propertiesParser = require("properties-parser");
|
||||||
|
|
||||||
|
const { isSilent } = getCliOptions(process.argv.slice(2));
|
||||||
|
const logger = getLogger({ isSilent });
|
||||||
|
|
||||||
for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
|
for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
|
||||||
console.log({ keycloakVersion });
|
logger.log(JSON.stringify({ keycloakVersion }));
|
||||||
|
|
||||||
const tmpDirPath = pathJoin(getProjectRoot(), "tmp_xImOef9dOd44");
|
const tmpDirPath = pathJoin(getProjectRoot(), "tmp_xImOef9dOd44");
|
||||||
|
|
||||||
@ -21,7 +26,8 @@ for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
|
|||||||
|
|
||||||
downloadBuiltinKeycloakTheme({
|
downloadBuiltinKeycloakTheme({
|
||||||
keycloakVersion,
|
keycloakVersion,
|
||||||
"destDirPath": tmpDirPath
|
"destDirPath": tmpDirPath,
|
||||||
|
"isSilent": isSilent
|
||||||
});
|
});
|
||||||
|
|
||||||
type Dictionary = { [idiomId: string]: string };
|
type Dictionary = { [idiomId: string]: string };
|
||||||
@ -75,7 +81,7 @@ for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
console.log(`${filePath} wrote`);
|
logger.log(`${filePath} wrote`);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ export type BuildOptions = BuildOptions.Standalone | BuildOptions.ExternalAssets
|
|||||||
|
|
||||||
export namespace BuildOptions {
|
export namespace BuildOptions {
|
||||||
export type Common = {
|
export type Common = {
|
||||||
|
isSilent: boolean;
|
||||||
version: string;
|
version: string;
|
||||||
themeName: string;
|
themeName: string;
|
||||||
extraPages?: string[];
|
extraPages?: string[];
|
||||||
@ -71,8 +72,9 @@ export function readBuildOptions(params: {
|
|||||||
packageJson: string;
|
packageJson: string;
|
||||||
CNAME: string | undefined;
|
CNAME: string | undefined;
|
||||||
isExternalAssetsCliParamProvided: boolean;
|
isExternalAssetsCliParamProvided: boolean;
|
||||||
|
isSilent: boolean;
|
||||||
}): BuildOptions {
|
}): BuildOptions {
|
||||||
const { packageJson, CNAME, isExternalAssetsCliParamProvided } = params;
|
const { packageJson, CNAME, isExternalAssetsCliParamProvided, isSilent } = params;
|
||||||
|
|
||||||
const parsedPackageJson = zParsedPackageJson.parse(JSON.parse(packageJson));
|
const parsedPackageJson = zParsedPackageJson.parse(JSON.parse(packageJson));
|
||||||
|
|
||||||
@ -130,7 +132,8 @@ export function readBuildOptions(params: {
|
|||||||
})(),
|
})(),
|
||||||
"version": version,
|
"version": version,
|
||||||
extraPages,
|
extraPages,
|
||||||
extraThemeProperties
|
extraThemeProperties,
|
||||||
|
isSilent
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import { isInside } from "../tools/isInside";
|
|||||||
import type { BuildOptions } from "./BuildOptions";
|
import type { BuildOptions } from "./BuildOptions";
|
||||||
import { assert } from "tsafe/assert";
|
import { assert } from "tsafe/assert";
|
||||||
import { Reflect } from "tsafe/Reflect";
|
import { Reflect } from "tsafe/Reflect";
|
||||||
|
import { getLogger } from "../tools/logger";
|
||||||
|
|
||||||
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
export type BuildOptionsLike = BuildOptionsLike.Standalone | BuildOptionsLike.ExternalAssets;
|
||||||
|
|
||||||
@ -19,6 +20,7 @@ export namespace BuildOptionsLike {
|
|||||||
themeName: string;
|
themeName: string;
|
||||||
extraPages?: string[];
|
extraPages?: string[];
|
||||||
extraThemeProperties?: string[];
|
extraThemeProperties?: string[];
|
||||||
|
isSilent: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type Standalone = Common & {
|
export type Standalone = Common & {
|
||||||
@ -60,6 +62,7 @@ export function generateKeycloakThemeResources(params: {
|
|||||||
}): { doBundlesEmailTemplate: boolean } {
|
}): { doBundlesEmailTemplate: boolean } {
|
||||||
const { reactAppBuildDirPath, keycloakThemeBuildingDirPath, keycloakThemeEmailDirPath, keycloakVersion, buildOptions } = params;
|
const { reactAppBuildDirPath, keycloakThemeBuildingDirPath, keycloakThemeEmailDirPath, keycloakVersion, buildOptions } = params;
|
||||||
|
|
||||||
|
const logger = getLogger({ isSilent: buildOptions.isSilent });
|
||||||
const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", buildOptions.themeName, "login");
|
const themeDirPath = pathJoin(keycloakThemeBuildingDirPath, "src", "main", "resources", "theme", buildOptions.themeName, "login");
|
||||||
|
|
||||||
let allCssGlobalsToDefine: Record<string, string> = {};
|
let allCssGlobalsToDefine: Record<string, string> = {};
|
||||||
@ -117,7 +120,7 @@ export function generateKeycloakThemeResources(params: {
|
|||||||
|
|
||||||
email: {
|
email: {
|
||||||
if (!fs.existsSync(keycloakThemeEmailDirPath)) {
|
if (!fs.existsSync(keycloakThemeEmailDirPath)) {
|
||||||
console.log(
|
logger.log(
|
||||||
[
|
[
|
||||||
`Not bundling email template because ${pathBasename(keycloakThemeEmailDirPath)} does not exist`,
|
`Not bundling email template because ${pathBasename(keycloakThemeEmailDirPath)} does not exist`,
|
||||||
`To start customizing the email template, run: 👉 npx create-keycloak-email-directory 👈`
|
`To start customizing the email template, run: 👉 npx create-keycloak-email-directory 👈`
|
||||||
@ -154,7 +157,8 @@ export function generateKeycloakThemeResources(params: {
|
|||||||
|
|
||||||
downloadBuiltinKeycloakTheme({
|
downloadBuiltinKeycloakTheme({
|
||||||
keycloakVersion,
|
keycloakVersion,
|
||||||
"destDirPath": tmpDirPath
|
"destDirPath": tmpDirPath,
|
||||||
|
isSilent: buildOptions.isSilent
|
||||||
});
|
});
|
||||||
|
|
||||||
const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
|
const themeResourcesDirPath = pathJoin(themeDirPath, "resources");
|
||||||
|
@ -5,6 +5,8 @@ import * as child_process from "child_process";
|
|||||||
import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer";
|
import { generateStartKeycloakTestingContainer } from "./generateStartKeycloakTestingContainer";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { readBuildOptions } from "./BuildOptions";
|
import { readBuildOptions } from "./BuildOptions";
|
||||||
|
import { getLogger } from "../tools/logger";
|
||||||
|
import { getCliOptions } from "../tools/cliOptions";
|
||||||
|
|
||||||
const reactProjectDirPath = process.cwd();
|
const reactProjectDirPath = process.cwd();
|
||||||
|
|
||||||
@ -12,7 +14,9 @@ export const keycloakThemeBuildingDirPath = pathJoin(reactProjectDirPath, "build
|
|||||||
export const keycloakThemeEmailDirPath = pathJoin(keycloakThemeBuildingDirPath, "..", "keycloak_email");
|
export const keycloakThemeEmailDirPath = pathJoin(keycloakThemeBuildingDirPath, "..", "keycloak_email");
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
console.log("🔏 Building the keycloak theme...⌚");
|
const { isSilent, hasExternalAssets } = getCliOptions(process.argv.slice(2));
|
||||||
|
const logger = getLogger({ isSilent });
|
||||||
|
logger.log("🔏 Building the keycloak theme...⌚");
|
||||||
|
|
||||||
const buildOptions = readBuildOptions({
|
const buildOptions = readBuildOptions({
|
||||||
"packageJson": fs.readFileSync(pathJoin(reactProjectDirPath, "package.json")).toString("utf8"),
|
"packageJson": fs.readFileSync(pathJoin(reactProjectDirPath, "package.json")).toString("utf8"),
|
||||||
@ -25,7 +29,8 @@ export function main() {
|
|||||||
|
|
||||||
return fs.readFileSync(cnameFilePath).toString("utf8");
|
return fs.readFileSync(cnameFilePath).toString("utf8");
|
||||||
})(),
|
})(),
|
||||||
"isExternalAssetsCliParamProvided": process.argv[2]?.toLowerCase() === "--external-assets"
|
"isExternalAssetsCliParamProvided": hasExternalAssets,
|
||||||
|
"isSilent": isSilent
|
||||||
});
|
});
|
||||||
|
|
||||||
const { doBundlesEmailTemplate } = generateKeycloakThemeResources({
|
const { doBundlesEmailTemplate } = generateKeycloakThemeResources({
|
||||||
@ -59,7 +64,7 @@ export function main() {
|
|||||||
buildOptions
|
buildOptions
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(
|
logger.log(
|
||||||
[
|
[
|
||||||
"",
|
"",
|
||||||
`✅ Your keycloak theme has been generated and bundled into ./${pathRelative(reactProjectDirPath, jarFilePath)} 🚀`,
|
`✅ Your keycloak theme has been generated and bundled into ./${pathRelative(reactProjectDirPath, jarFilePath)} 🚀`,
|
||||||
|
15
src/bin/tools/cliOptions.ts
Normal file
15
src/bin/tools/cliOptions.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import parseArgv from "minimist";
|
||||||
|
|
||||||
|
export type CliOptions = {
|
||||||
|
isSilent: boolean;
|
||||||
|
hasExternalAssets: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getCliOptions = (processArgv: string[]): CliOptions => {
|
||||||
|
const argv = parseArgv(processArgv);
|
||||||
|
|
||||||
|
return {
|
||||||
|
isSilent: typeof argv["silent"] === "boolean" ? argv["silent"] : false,
|
||||||
|
hasExternalAssets: argv["external-assets"] !== undefined
|
||||||
|
};
|
||||||
|
};
|
@ -6,7 +6,13 @@ import { rm, rm_rf } from "./rm";
|
|||||||
import * as crypto from "crypto";
|
import * as crypto from "crypto";
|
||||||
|
|
||||||
/** assert url ends with .zip */
|
/** assert url ends with .zip */
|
||||||
export function downloadAndUnzip(params: { url: string; destDirPath: string; pathOfDirToExtractInArchive?: string; cacheDirPath: string }) {
|
export function downloadAndUnzip(params: {
|
||||||
|
isSilent: boolean;
|
||||||
|
url: string;
|
||||||
|
destDirPath: string;
|
||||||
|
pathOfDirToExtractInArchive?: string;
|
||||||
|
cacheDirPath: string;
|
||||||
|
}) {
|
||||||
const { url, destDirPath, pathOfDirToExtractInArchive, cacheDirPath } = params;
|
const { url, destDirPath, pathOfDirToExtractInArchive, cacheDirPath } = params;
|
||||||
|
|
||||||
const extractDirPath = pathJoin(
|
const extractDirPath = pathJoin(
|
||||||
@ -54,7 +60,7 @@ export function downloadAndUnzip(params: { url: string; destDirPath: string; pat
|
|||||||
|
|
||||||
const zipFileBasename = pathBasename(url);
|
const zipFileBasename = pathBasename(url);
|
||||||
|
|
||||||
execSync(`curl -L ${url} -o ${zipFileBasename}`, { "cwd": extractDirPath });
|
execSync(`curl -L ${url} -o ${zipFileBasename} ${params.isSilent ? "-s" : ""}`, { "cwd": extractDirPath });
|
||||||
|
|
||||||
execSync(`unzip -o ${zipFileBasename}${pathOfDirToExtractInArchive === undefined ? "" : ` "${pathOfDirToExtractInArchive}/**/*"`}`, {
|
execSync(`unzip -o ${zipFileBasename}${pathOfDirToExtractInArchive === undefined ? "" : ` "${pathOfDirToExtractInArchive}/**/*"`}`, {
|
||||||
"cwd": extractDirPath
|
"cwd": extractDirPath
|
||||||
|
27
src/bin/tools/logger.ts
Normal file
27
src/bin/tools/logger.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
type LoggerOpts = {
|
||||||
|
force?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
type Logger = {
|
||||||
|
log: (message: string, opts?: LoggerOpts) => void;
|
||||||
|
warn: (message: string) => void;
|
||||||
|
error: (message: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getLogger = ({ isSilent }: { isSilent?: boolean } = {}): Logger => {
|
||||||
|
return {
|
||||||
|
log: (message, { force } = {}) => {
|
||||||
|
if (isSilent && !force) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(message);
|
||||||
|
},
|
||||||
|
warn: message => {
|
||||||
|
console.warn(message);
|
||||||
|
},
|
||||||
|
error: message => {
|
||||||
|
console.error(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
10
yarn.lock
10
yarn.lock
@ -265,6 +265,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.8.tgz#04adc0c266a0f5d72db0556fdda2ba17dad9b519"
|
resolved "https://registry.yarnpkg.com/@types/memoizee/-/memoizee-0.4.8.tgz#04adc0c266a0f5d72db0556fdda2ba17dad9b519"
|
||||||
integrity sha512-qDpXKGgwKywnQt/64fH1O0LiPA++QGIYeykEUiZ51HymKVRLnUSGcRuF60IfpPeeXiuRwiR/W4y7S5VzbrgLCA==
|
integrity sha512-qDpXKGgwKywnQt/64fH1O0LiPA++QGIYeykEUiZ51HymKVRLnUSGcRuF60IfpPeeXiuRwiR/W4y7S5VzbrgLCA==
|
||||||
|
|
||||||
|
"@types/minimist@^1.2.2":
|
||||||
|
version "1.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
|
||||||
|
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
|
||||||
|
|
||||||
"@types/node@^17.0.25":
|
"@types/node@^17.0.25":
|
||||||
version "17.0.45"
|
version "17.0.45"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
|
||||||
@ -1188,6 +1193,11 @@ minimatch@^3.0.3, minimatch@^3.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
brace-expansion "^1.1.7"
|
brace-expansion "^1.1.7"
|
||||||
|
|
||||||
|
minimist@^1.2.6:
|
||||||
|
version "1.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
|
||||||
|
integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
|
||||||
|
|
||||||
mkdirp@^1.0.4:
|
mkdirp@^1.0.4:
|
||||||
version "1.0.4"
|
version "1.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user