diff --git a/.vscode/custom.code-snippets b/.vscode/custom.code-snippets new file mode 100644 index 00000000..b4bfbabc --- /dev/null +++ b/.vscode/custom.code-snippets @@ -0,0 +1,23 @@ +{ + "커스텀 스니펫 예시입니다.": { + "prefix": "tok_example1", + "description": "커스텀 스니펫 예시입니다.", + "body": [ + "console.log('Hello, world!');" + ] + }, + "커스텀 스니펫(var적용) 예시입니다.": { + "prefix": "tok_example2", + "description": "커스텀 스니펫(var적용) 예시입니다.", + "body": [ + "const handler${1:custom} = useCallback(()=>{},[]);" + ] + }, + "커스텀 스니펫(cursor적용) 예시입니다.": { + "prefix": "tok_example3", + "description": "커스텀 스니펫(cursor적용) 예시입니다.", + "body": [ + "console.log('Hello, $2');" + ] + } +} \ No newline at end of file diff --git a/customSnippets.ts b/customSnippets.ts new file mode 100644 index 00000000..89f6fd37 --- /dev/null +++ b/customSnippets.ts @@ -0,0 +1,34 @@ +export {}; +/* +사용법 설명 + - 기본적으로 아래 example 코드의 형태를 따릅니다. + - prefix : 호출명령어. + - description : 스니펫 설명. + - body : 생성 코드 + + - 위와 같은 형태로 사용할 스니펫 형태를 해당 파일에(customSnippet.ts)에 이어서 작성 해주시면 됩니다. + + - 작업 효율을 증가시키기위해 cursor위치 및 디스클로져 처럼 네이밍 지정이 필요한 경우 추가 기능을 사용할 수 있습니다. + - {cursor} : 스니펫 생성 이후 커서 위치를 지정하고 싶을때 사용합니다. + ex) console.log({cursor}); + - {var} : 스니펫 생성 이후 네이밍 수정을 해야하는 경우 사용합니다. + ex) const {isOpen:{var}IsOpen,onOpen:{var}OnOpen,onClose:{var}OnClose} = useDisclosure(); +*/ + +/** + * @prefix tok_example1 + * @description 커스텀 스니펫 예시입니다. + * @body console.log('Hello, world!'); + */ + +/** + * @prefix tok_example2 + * @description 커스텀 스니펫(var적용) 예시입니다. + * @body const handler{var} = useCallback(()=>{},[]); + */ + +/** + * @prefix tok_example3 + * @description 커스텀 스니펫(cursor적용) 예시입니다. + * @body console.log('Hello, {cursor}'); + */ diff --git a/package.json b/package.json index 5ce76f16..cff349bd 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "test:watch": "jest --watch", "clean-up": "node src/scripts/remove-unnecessary.js", "tokript": "tokript", + "tokriptTest": "tokript2", "theme": "chakra-cli tokens src/configs/theme/index.ts", "theme:open": "code -r node_modules/@chakra-ui/styled-system/dist/theming.types.d.ts", "gen:source": "tokript gen:source", @@ -42,9 +43,11 @@ "@hookform/resolvers": "^2.8.8", "@tanstack/react-query": "^4.2.3", "@tanstack/react-query-devtools": "^4.2.3", + "@toktokhan-fe/cli": "^1.4.3", "axios": "^1.3.4", "chakra-react-select": "^4.6.0", "dayjs": "^1.10.6", + "enquirer": "^2.4.1", "framer-motion": "^10.5.0", "globby": "^13.2.2", "immer": "^10.0.1", diff --git a/src/genSnippet/defaultSnippets.ts b/src/genSnippet/defaultSnippets.ts new file mode 100644 index 00000000..95837619 --- /dev/null +++ b/src/genSnippet/defaultSnippets.ts @@ -0,0 +1,24 @@ +export {}; +/** + * @prefix tok_useCallbackSnippet + * @description useCallback 자동생성 스니펫입니다. + * @body useCallback(()=>{{cursor}},[]); + */ + +/** + * @prefix tok_useEffectSnippet + * @description useEffect 자동생성 스니펫입니다. + * @body useEffect(()=>{{cursor}},[]); + */ + +/** + * @prefix tok_useRouterSnippet + * @description useRouter 자동생성 스니펫입니다. + * @body useRouter(); + */ + +/** + * @prefix tok_useDisclosureSnippet + * @description useDisclosure 자동생성 스니펫입니다. + * @body const {isOpen:{var}IsOpen,onOpen:{var}OnOpen,onClose:{var}OnClose} =useDisclosure(); + */ diff --git a/src/genSnippet/genSnippet.ts b/src/genSnippet/genSnippet.ts new file mode 100644 index 00000000..c2376848 --- /dev/null +++ b/src/genSnippet/genSnippet.ts @@ -0,0 +1,179 @@ +import { defineCommand } from '@toktokhan-fe/cli'; +import pkg from 'enquirer'; +import fs from 'fs'; +import path from 'path'; + +/** + * 플러그인의 config 타입을 정의합니다. + * + * - tok-cli.config.ts 에서 해당 플러그인의 option 을 정의할 때 사용됩니다. + * - config 파일은 js, ts 이기 때문에, 옵션 객체의 각 property 는 함수, 배열 등 어떤 타입이든 정의 가능합니다. + * - run 함수의 인자 type 으로 사용됩니다. + */ + +export type GenSnippetConfig = { + output: string; +}; + +type SnippetType = 'custom' | 'default'; + +interface SnippetItem { + prefix: string; + body: string[]; + description: string; +} + +function getBasePath(type: SnippetType) { + const projectRoot = process.cwd(); + const outputPath = path.join(projectRoot, '.vscode', `${type}.code-snippets`); + return outputPath; +} + +function createSnippet({ + type, + formattedSnippets, +}: { + type: SnippetType; + formattedSnippets: Record; +}) { + fs.mkdir(path.dirname(getBasePath(type)), { recursive: true }, (err) => { + if (err) throw err; + + fs.writeFile( + getBasePath(type), + JSON.stringify(formattedSnippets, null, 2), + (err) => { + if (err) throw err; + console.log('Snippets saved to .vscode/project.code-snippets'); + }, + ); + }); +} + +function parseSnippets(snippetString: string) { + const snippets = snippetString + .split('/**') + .filter((s) => s.trim().startsWith('* @prefix')); + return snippets.map((snippet) => { + const prefixMatch = snippet.match(/\* @prefix\s+(\w+)/); + const descriptionMatch = snippet.match(/\* @description\s+([^*]+)/); + const bodyMatch = snippet.match(/\* @body\s+([^*]+)/); + + const isCursor = bodyMatch + ? bodyMatch[1].trim().replaceAll('{cursor}', `$2`) + : ''; + const isVar = isCursor ? isCursor.replaceAll('{var}', '${1:custom}') : ''; + + return { + prefix: prefixMatch ? prefixMatch[1].trim() : '', + description: descriptionMatch ? descriptionMatch[1].trim() : '', + body: [isVar], + }; + }); +} + +function formatSnippets(snippetArray: SnippetItem[]) { + const formatted: Record = {}; + snippetArray.forEach((snippet: SnippetItem) => { + formatted[snippet.description] = { + ...snippet, + }; + }); + return formatted; +} + +async function getTypeSnippet() { + const { prompt } = pkg; + const type = await prompt<{ + snippetType: 'custom' | 'default'; + }>({ + type: 'autocomplete', + name: 'snippetType', + choices: ['default', 'custom'], + message: '스니펫 형태를 선택해 주세요', + required: true, + }); + return type.snippetType; +} + +export const genSnippet = defineCommand<'gen:snippet', GenSnippetConfig>({ + /** + * 플러그인의 이름을 정의합니다. + * + * - tokript {command} 로 실행됩니다. + * - tok-cli.config 에서 옵션 정의시 해당 옵션의 key 값으로 사용됩니다. + */ + name: 'gen:snippet', + /** + * 플러그인의 설명을 정의합니다. + * + * - tokript help 실행시 표기됩니다. + */ + description: '프로젝트별 커스텀 스니펫 생성을 자동생성해줍니다.', + /** + * 플러그인 실행시 사용할 config 의 기본값을 정의합니다. + * + * - 특정 옵션이 `--output` 과 같은 `cli option` 이나 `tok-cli.config.ts` 에 정의 되지 않았을 때 사용됩니다. + */ + default: { + output: path.resolve('generated', 'my.txt'), + }, + /** + * --output, -o 와 같은 cli option 을 정의합니다. + * + * - cli option 에 정의되지 않은 옵션은 오직 config 파일에서만 정의 가능합니다. + * - cli option 은 원시값, 원시값 배열과 같은 간단한 값만 사용 가능합니다. ex) string, string[] + * - tokript help {command} 시 정의한 alias, 설명, 기본값을 확인할 수 있습니다. + */ + cliOptions: [ + { + name: 'output', + alias: 'o', + description: '텍스트 파일 생성 경로', + type: 'string', + }, + ], + /** + * 플러그인 실행 함수를 정의합니다. + * + * - config: GenTxtConfig 타입의 config 객체가 인자로 넘어옵니다. + * - config 객체는 default, cli option, tok-cli.config.ts 에 정의된 값들이 합쳐진 값입니다. + * - config 우선순위는 cli option > tok-cli.config.ts > default 입니다. + * - run 함수는 플러그인의 실제 동작을 정의합니다. + */ + run: async () => { + const type = await getTypeSnippet(); + const isCustom = type === 'custom'; + const isCustomFile = fs.existsSync('customSnippets.ts'); + + if (isCustom && !isCustomFile) { + const projectRoot = process.cwd(); + const outputPath = path.join(projectRoot, `customSnippets.ts`); + + const initData = fs.readFileSync( + path.resolve(__dirname, 'initSnippets.ts'), + { + encoding: 'utf8', + }, + ); + fs.writeFile(outputPath, initData, (err) => { + if (err) throw err; + console.log('Snippets saved to .vscode/project.code-snippets'); + }); + } + + const data = isCustom + ? isCustomFile + ? fs.readFileSync('customSnippets.ts', { encoding: 'utf8' }) + : fs.readFileSync(path.resolve(__dirname, 'initSnippets.ts'), { + encoding: 'utf8', + }) + : fs.readFileSync(path.resolve(__dirname, 'defaultSnippets.ts'), { + encoding: 'utf8', + }); + + const formattedSnippets = formatSnippets(parseSnippets(data)); + + createSnippet({ type, formattedSnippets }); + }, +}); diff --git a/src/genSnippet/initSnippets.ts b/src/genSnippet/initSnippets.ts new file mode 100644 index 00000000..89f6fd37 --- /dev/null +++ b/src/genSnippet/initSnippets.ts @@ -0,0 +1,34 @@ +export {}; +/* +사용법 설명 + - 기본적으로 아래 example 코드의 형태를 따릅니다. + - prefix : 호출명령어. + - description : 스니펫 설명. + - body : 생성 코드 + + - 위와 같은 형태로 사용할 스니펫 형태를 해당 파일에(customSnippet.ts)에 이어서 작성 해주시면 됩니다. + + - 작업 효율을 증가시키기위해 cursor위치 및 디스클로져 처럼 네이밍 지정이 필요한 경우 추가 기능을 사용할 수 있습니다. + - {cursor} : 스니펫 생성 이후 커서 위치를 지정하고 싶을때 사용합니다. + ex) console.log({cursor}); + - {var} : 스니펫 생성 이후 네이밍 수정을 해야하는 경우 사용합니다. + ex) const {isOpen:{var}IsOpen,onOpen:{var}OnOpen,onClose:{var}OnClose} = useDisclosure(); +*/ + +/** + * @prefix tok_example1 + * @description 커스텀 스니펫 예시입니다. + * @body console.log('Hello, world!'); + */ + +/** + * @prefix tok_example2 + * @description 커스텀 스니펫(var적용) 예시입니다. + * @body const handler{var} = useCallback(()=>{},[]); + */ + +/** + * @prefix tok_example3 + * @description 커스텀 스니펫(cursor적용) 예시입니다. + * @body console.log('Hello, {cursor}'); + */ diff --git a/tok-cli.config.ts b/tok-cli.config.ts new file mode 100644 index 00000000..c7ce33c3 --- /dev/null +++ b/tok-cli.config.ts @@ -0,0 +1,23 @@ +import { RootConfig } from '@toktokhan-fe/cli'; + +import { genSnippet } from './src/genSnippet/genSnippet'; + +/** + * config 를 정의합니다. + * + * RootConfig 의 제네릭에 plugin 의 type 을 정의 함으로써 type safe 하게 option 을 정의할 수 있습니다. + */ +const config: RootConfig<{ plugins: [typeof genSnippet] }> = { + /** + * tokript 가 해당 플러그인을 실행시키기 위해 조회하는 플러그인 리스트입니다. + */ + plugins: [genSnippet], + /** + * 정의된 이름을 key 값으로 config type 을 value 로써 config 정의가 가능합니다. + */ + 'gen:snippet': { + output: 'custom/path/my.txt', + }, +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json index f3f2650f..4bfbc8e2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -35,6 +35,13 @@ "jsx": "preserve", "incremental": true }, - "include": ["next-env.d.ts", "app.d.ts", "**/*.ts", "**/*.tsx", "**/*.d.ts"], + "include": [ + "next-env.d.ts", + "app.d.ts", + "**/*.ts", + "**/*.tsx", + "**/*.d.ts", + "customSnippets" + ], "exclude": ["node_modules", "./public/mockServiceWorker.js"] } diff --git a/yarn.lock b/yarn.lock index 70655e78..f34b983f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2552,6 +2552,46 @@ "@testing-library/dom" "^9.0.0" "@types/react-dom" "^18.0.0" +"@toktokhan-fe/cli@^1.4.3": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@toktokhan-fe/cli/-/cli-1.4.3.tgz#8b6aca5ac43dc4e3a4ad60680c58a55f283177f9" + integrity sha512-kfyYg6a4vKIRKlaRfKPKfgn5HxurAXBm4TDTrcOfXN9rrWHO6Y2nXMxJxLAdmovmaw4xlFh1QmDHimxVt4Qr4Q== + dependencies: + "@toktokhan-fe/node" "1.3.1" + "@toktokhan-fe/universal" "1.3.1" + "@types/figlet" "^1.5.8" + bundle-require "^4.0.2" + chalk "^5.3.0" + clear "^0.1.0" + commander "^12.0.0" + enquirer "^2.4.1" + figlet "^1.7.0" + joycon "^3.1.1" + lodash "^4.17.21" + +"@toktokhan-fe/node@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@toktokhan-fe/node/-/node-1.3.1.tgz#d716a37b6abe903c74d91a2475759332539bd8ec" + integrity sha512-+aGatgRPvhkKrYN4eNDBupI2xY460xLjDmNu6VFMnyJBhvSERv6NGh5pIKUDAszKYsXRXF46w/FV+x9Edexr9Q== + dependencies: + "@toktokhan-fe/universal" "1.3.1" + chalk "^5.3.0" + eta "^3.4.0" + execa "^8.0.1" + lodash "^4.17.21" + minimatch "^9.0.3" + ora "^8.0.1" + prettier "^3.2.5" + yaml "^2.4.1" + +"@toktokhan-fe/universal@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@toktokhan-fe/universal/-/universal-1.3.1.tgz#67667d1c51a5cbf9df7226c8657d78283d1f2eaf" + integrity sha512-r/RotHb0yevpr0GcBan48zfI0SfyEmMvIWkDf7MCUBL2rgh/+DYL1X429FFrn2uavgg7XNC8TbNRBVXZ789QeA== + dependencies: + lodash "^4.17.21" + matcher "^5.0.0" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -2676,6 +2716,11 @@ resolved "https://registry.npmjs.org/@types/facebook-pixel/-/facebook-pixel-0.0.30.tgz#147d12f9c400f4e3f17c265ff17767c97eb68689" integrity sha512-zg/T6dmkcyzX4rj4MjnEUdijPjF7Fj1xw8CmYxz5MeoUuYU0iDbTL8qNdcbSTTkRrPTCtq3Db002Use4ikoNmw== +"@types/figlet@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@types/figlet/-/figlet-1.5.8.tgz#96b8186c7e2a388b4f8d09ee3276cba2af88bb0b" + integrity sha512-G22AUvy4Tl95XLE7jmUM8s8mKcoz+Hr+Xm9W90gJsppJq9f9tHvOGkrpn4gRX0q/cLtBdNkWtWCKDg2UDZoZvQ== + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" @@ -3633,6 +3678,13 @@ builtins@^5.0.0: dependencies: semver "^7.0.0" +bundle-require@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.2.1.tgz#4c450a5807381d20ade987bde8ac391544257919" + integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA== + dependencies: + load-tsconfig "^0.2.3" + busboy@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -3946,7 +3998,7 @@ cli-handle-unhandled@^1.1.1: dependencies: cli-handle-error "^4.1.0" -cli-spinners@^2.6.1: +cli-spinners@^2.6.1, cli-spinners@^2.9.2: version "2.9.2" resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== @@ -4065,6 +4117,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^12.0.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^6.2.0: version "6.2.1" resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" @@ -4626,6 +4683,11 @@ emittery@^0.13.1: resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4666,6 +4728,14 @@ enquirer@^2.3.6: ansi-colors "^4.1.1" strip-ansi "^6.0.1" +enquirer@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" @@ -5143,6 +5213,11 @@ eta@^2.0.0: resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== +eta@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eta/-/eta-3.4.0.tgz#0d519b9a3d5ea5eff5513ae5771b5a4c112a9087" + integrity sha512-tCsc7WXTjrTx4ZjYLplcqrI3o4mYJ+Z6YspeuGL8tbt/hHoMchwBwtKfwM09svEY86iRapY93vUqQttcNuIO5Q== + execa@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -5188,7 +5263,7 @@ execa@^7.0.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -execa@^8.0.0: +execa@^8.0.0, execa@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== @@ -5292,7 +5367,7 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" -figlet@^1.5.2: +figlet@^1.5.2, figlet@^1.7.0: version "1.7.0" resolved "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e" integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg== @@ -5541,6 +5616,11 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-east-asian-width@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz#5e6ebd9baee6fb8b7b6bd505221065f0cd91f64e" + integrity sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA== + get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -6404,11 +6484,16 @@ is-unicode-supported@^0.1.0: resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0: +is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0, is-unicode-supported@^1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== +is-unicode-supported@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz#fdf32df9ae98ff6ab2cedc155a5a6e895701c451" + integrity sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q== + is-weakmap@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" @@ -6915,6 +7000,11 @@ jest@^29.5.0: import-local "^3.0.2" jest-cli "^29.7.0" +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -7278,6 +7368,11 @@ load-json-file@^4.0.0: pify "^3.0.0" strip-bom "^3.0.0" +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -7415,6 +7510,14 @@ log-symbols@^5.1.0: chalk "^5.0.0" is-unicode-supported "^1.1.0" +log-symbols@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-6.0.0.tgz#bb95e5f05322651cac30c0feb6404f9f2a8a9439" + integrity sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw== + dependencies: + chalk "^5.3.0" + is-unicode-supported "^1.3.0" + log-update@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" @@ -7576,6 +7679,13 @@ marked@^5.0.0: resolved "https://registry.npmjs.org/marked/-/marked-5.1.2.tgz#62b5ccfc75adf72ca3b64b2879b551d89e77677f" integrity sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg== +matcher@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-5.0.0.tgz#cd82f1c7ae7ee472a9eeaf8ec7cac45e0fe0da62" + integrity sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw== + dependencies: + escape-string-regexp "^5.0.0" + mdast-util-find-and-replace@^1.1.0: version "1.1.1" resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" @@ -8527,6 +8637,21 @@ ora@^6.1.0: strip-ansi "^7.0.1" wcwidth "^1.0.1" +ora@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-8.0.1.tgz#6dcb9250a629642cbe0d2df3a6331ad6f7a2af3e" + integrity sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ== + dependencies: + chalk "^5.3.0" + cli-cursor "^4.0.0" + cli-spinners "^2.9.2" + is-interactive "^2.0.0" + is-unicode-supported "^2.0.0" + log-symbols "^6.0.0" + stdin-discarder "^0.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + p-each-series@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" @@ -8888,6 +9013,11 @@ prettier@^2.0.5, prettier@^2.6.2, prettier@^2.8.8: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.2.5: + version "3.3.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac" + integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg== + pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" @@ -9980,6 +10110,11 @@ stdin-discarder@^0.1.0: dependencies: bl "^5.0.0" +stdin-discarder@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be" + integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -10031,6 +10166,15 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string-width@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.1.0.tgz#d994252935224729ea3719c49f7206dc9c46550a" + integrity sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + string.prototype.matchall@^4.0.10: version "4.0.10" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" @@ -10103,7 +10247,7 @@ stringify-object@^3.3.0: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: +strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== @@ -11172,6 +11316,11 @@ yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.4.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.3.tgz#0777516b8c7880bcaa0f426a5410e8d6b0be1f3d" + integrity sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg== + yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"