diff --git a/.gitignore b/.gitignore index d45de5ca..787a0004 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ engine/bin/ /engine/configs/ci_checker.yml engine/meta + +ui/packages/shared/dist/ diff --git a/ui/.gitlab-ci.yml b/ui/.gitlab-ci.yml index 22008ecf..71774968 100644 --- a/ui/.gitlab-ci.yml +++ b/ui/.gitlab-ci.yml @@ -1,5 +1,6 @@ include: - local: 'ui/packages/ce/.gitlab-ci.yml' + - local: 'ui/packages/shared/.gitlab-ci.yml' .ui_checks: &ui_checks rules: diff --git a/ui/packages/ce/package.json b/ui/packages/ce/package.json index f2608d22..b63ae9c0 100644 --- a/ui/packages/ce/package.json +++ b/ui/packages/ce/package.json @@ -1,6 +1,6 @@ { "name": "@postgres.ai/ce", - "version": "1.0.0", + "version": "3.5.0", "private": true, "dependencies": { "@craco/craco": "^6.4.3", diff --git a/ui/packages/shared/.gitlab-ci.yml b/ui/packages/shared/.gitlab-ci.yml new file mode 100644 index 00000000..4a3c37dc --- /dev/null +++ b/ui/packages/shared/.gitlab-ci.yml @@ -0,0 +1,65 @@ +.only_ui_feature: &only_ui_feature + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + +.only_ui_tag_release: &only_ui_tag_release + rules: + - if: $CI_COMMIT_TAG =~ /^v[a-zA-Z0-9_.-]*/ + +.shared_base: &shared_base + image: node:lts-alpine + allow_failure: true + cache: + key: "$CI_COMMIT_REF_SLUG" + paths: + - .pnpm-store + before_script: + - apk add --no-cache rsync jq + - corepack enable + - corepack prepare pnpm@8.9.2 --activate + - pnpm config set store-dir .pnpm-store + - pnpm --dir ui/packages/shared install --frozen-lockfile + +publish-shared-preview: + <<: [*shared_base, *only_ui_feature] + stage: build + script: + - cd ui/packages/shared + - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN"> .npmrc + + # Get base version from package.json (strip any -pr or other suffix) + - BASE_VERSION=$(jq -r .version package.json) + - BASE_VERSION=${BASE_VERSION%%-*} + - export PREID="pr-${CI_MERGE_REQUEST_IID:-preview}" + + # Detect next available patch for same PR + - EXISTING_TAGS=$(npm view @postgres.ai/shared versions --json | jq -r '.[]' | grep "^${BASE_VERSION}-${PREID}" || true) + - COUNT=$(echo "$EXISTING_TAGS" | wc -l | xargs) + - if [ "$COUNT" -eq 0 ]; then VERSION="${BASE_VERSION}-${PREID}"; else VERSION="${BASE_VERSION}-${PREID}.${COUNT}"; fi + - echo "Publishing version $VERSION" + - npm version "$VERSION" --no-git-tag-version + + # Build and pack + - pnpm run pack + + # Publish .tgz archive + - TARBALL=$(ls postgres.ai-shared-*.tgz) + - pnpm publish "$TARBALL" --no-git-checks --tag "$PREID" + +publish-shared-release: + <<: [*shared_base, *only_ui_tag_release] + stage: build + script: + - cd ui/packages/shared + - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN"> .npmrc + + # Extract version from tag (remove leading "v") + - export VERSION=${CI_COMMIT_TAG#"v"} + + # Build and pack + - npm version "$VERSION" --no-git-tag-version + - pnpm run pack + + # Publish + - TARBALL=$(ls postgres.ai-shared-*.tgz) + - pnpm publish "$TARBALL" --no-git-checks \ No newline at end of file diff --git a/ui/packages/shared/package.json b/ui/packages/shared/package.json index 954a1638..fbb6cc2f 100644 --- a/ui/packages/shared/package.json +++ b/ui/packages/shared/package.json @@ -1,7 +1,13 @@ { "name": "@postgres.ai/shared", - "version": "1.0.0", - "private": true, + "version": "3.5.0", + "scripts": { + "build": "tsc -p tsconfig.build.json && node scripts/copy-assets.js", + "pack": "node scripts/pack.js" + }, + "publishConfig": { + "access": "public" + }, "dependencies": { "@babel/core": "^7.13.0", "@craco/craco": "^7.0.0-alpha.7", @@ -13,8 +19,6 @@ "@material-ui/styles": "^4.11.4", "@monaco-editor/react": "^4.4.5", "@mui/material": "^5.10.12", - "@postgres.ai/shared": "link:../shared", - "@postgres.ai/ce": "link:../ce", "@types/node": "^12.20.33", "@types/react": "^17.0.30", "@types/react-dom": "^17.0.10", @@ -41,5 +45,11 @@ "typescript": "^4.8.3", "use-timer": "^2.0.1", "yup": "^0.32.11" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "glob": "^11.0.2" } } diff --git a/ui/packages/shared/scripts/copy-assets.js b/ui/packages/shared/scripts/copy-assets.js new file mode 100644 index 00000000..9f0f30fa --- /dev/null +++ b/ui/packages/shared/scripts/copy-assets.js @@ -0,0 +1,30 @@ +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); + +const OUT_DIR = 'dist'; + +const PATTERNS = [ + '**/*.scss', + '**/*.module.scss', + '**/*.json', + 'react-app-env.d.ts', +]; + +const files = PATTERNS.flatMap(pattern => + glob.sync(pattern, { + cwd: '.', + ignore: ['node_modules/**', 'dist/**'], + nodir: true, + }) +); + +files.forEach((file) => { + const from = path.resolve(file); + const to = path.join(OUT_DIR, file); + const dir = path.dirname(to); + fs.mkdirSync(dir, { recursive: true }); + fs.copyFileSync(from, to); +}); + +console.log(`✅ Copied ${files.length} assets to dist`); \ No newline at end of file diff --git a/ui/packages/shared/scripts/pack.js b/ui/packages/shared/scripts/pack.js new file mode 100644 index 00000000..e7ab2f6e --- /dev/null +++ b/ui/packages/shared/scripts/pack.js @@ -0,0 +1,70 @@ +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +const TMP_DIR = 'build-tmp'; +const DIST_DIR = 'dist'; +const PACKAGE_JSON = 'package.json'; + +function cleanTmp() { + if (fs.existsSync(TMP_DIR)) { + fs.rmSync(TMP_DIR, { recursive: true, force: true }); + } +} + +function run(cmd, options = {}) { + console.log(`$ ${cmd}`); + execSync(cmd, { stdio: 'inherit', ...options }); +} + +function copyDistToTmp() { + run(`rsync -a ${DIST_DIR}/ ${TMP_DIR}/`); +} + +function copyExtraFiles() { + const extras = ['react-app-env.d.ts']; + extras.forEach((file) => { + if (fs.existsSync(file)) { + fs.copyFileSync(file, path.join(TMP_DIR, file)); + } + }); +} + +function sanitizePackageJson() { + const original = JSON.parse(fs.readFileSync(PACKAGE_JSON, 'utf8')); + const cleaned = { + name: original.name, + version: original.version, + description: original.description, + author: original.author, + license: original.license, + main: original.main || 'index.js', + types: original.types || 'index.d.ts', + peerDependencies: original.peerDependencies, + dependencies: original.dependencies, + }; + + fs.writeFileSync( + path.join(TMP_DIR, 'package.json'), + JSON.stringify(cleaned, null, 2), + 'utf8' + ); +} + +function pack() { + run('npm pack', { cwd: TMP_DIR }); + const tarball = fs.readdirSync(TMP_DIR).find(f => f.endsWith('.tgz')); + fs.renameSync(path.join(TMP_DIR, tarball), path.join('.', tarball)); + console.log(`✅ Packed to ./${tarball}`); +} + +function buildTmpAndPack() { + cleanTmp(); + run('pnpm run build'); + copyDistToTmp(); + sanitizePackageJson(); + pack(); + cleanTmp(); +} + +buildTmpAndPack(); \ No newline at end of file diff --git a/ui/packages/shared/styles/styles.ts b/ui/packages/shared/styles/styles.ts index b2f01098..e26e30d4 100644 --- a/ui/packages/shared/styles/styles.ts +++ b/ui/packages/shared/styles/styles.ts @@ -8,11 +8,11 @@ import { colors } from './colors' import { theme } from './theme' -export const styles = { +export const styles: Record = { root: { - 'min-height': '100%', + 'minHeight': '100%', width: '100%', - 'z-index': 1, + 'zIndex': 1, position: 'relative', [theme.breakpoints.down('sm')]: { maxWidth: '100vw', diff --git a/ui/packages/shared/tsconfig.build.json b/ui/packages/shared/tsconfig.build.json new file mode 100644 index 00000000..ef287c42 --- /dev/null +++ b/ui/packages/shared/tsconfig.build.json @@ -0,0 +1,37 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "declaration": true, + "emitDeclarationOnly": false, + "noEmit": false, + "module": "esnext", + "target": "es2019", + "moduleResolution": "node", + "jsx": "react-jsx", + "resolveJsonModule": true, + "esModuleInterop": true + }, + "include": [ + "components/**/*", + "config/**/*", + "helpers/**/*", + "hooks/**/*", + "icons/**/*", + "pages/**/*", + "stores/**/*", + "styles/**/*", + "types/**/*", + "utils/**/*", + "react-app-env.d.ts", + ], + "exclude": [ + "node_modules", + "dist", + "meta.json", + "craco.config.js", + "**/*.test.ts", + "**/*.test.tsx" + ] + } \ No newline at end of file diff --git a/ui/packages/shared/tsconfig.json b/ui/packages/shared/tsconfig.json index 69995a95..e47a16e2 100644 --- a/ui/packages/shared/tsconfig.json +++ b/ui/packages/shared/tsconfig.json @@ -19,9 +19,12 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - "baseUrl": "." + "baseUrl": ".", + "paths": { + "@postgres.ai/shared/*": ["./*"] + } }, "include": [ - ".", + "." ] } diff --git a/ui/pnpm-lock.yaml b/ui/pnpm-lock.yaml index 67e74c7d..fa7ea0ba 100644 --- a/ui/pnpm-lock.yaml +++ b/ui/pnpm-lock.yaml @@ -252,12 +252,6 @@ importers: '@mui/material': specifier: ^5.10.12 version: 5.10.12(@emotion/react@11.10.5)(@emotion/styled@11.10.5)(@types/react@17.0.39)(react-dom@17.0.2)(react@17.0.2) - '@postgres.ai/ce': - specifier: link:../ce - version: link:../ce - '@postgres.ai/shared': - specifier: link:../shared - version: 'link:' '@types/node': specifier: ^12.20.33 version: 12.20.33 @@ -336,6 +330,10 @@ importers: yup: specifier: ^0.32.11 version: 0.32.11 + devDependencies: + glob: + specifier: ^11.0.2 + version: 11.0.2 packages: @@ -2357,6 +2355,18 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -3987,7 +3997,6 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: false /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -4006,6 +4015,11 @@ packages: engines: {node: '>=10'} dev: false + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /anymatch@3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -4453,7 +4467,6 @@ packages: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - dev: false /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -5112,6 +5125,15 @@ packages: shebang-command: 2.0.0 which: 2.0.2 + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + /crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} dependencies: @@ -5837,6 +5859,10 @@ packages: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: false + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + /ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} dependencies: @@ -5886,7 +5912,6 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} @@ -6714,6 +6739,14 @@ packages: optional: true dev: false + /foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + dev: true + /forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} dev: false @@ -6959,8 +6992,22 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false + /glob@11.0.2: + resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} + engines: {node: 20 ||>=22} + hasBin: true + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.0 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7783,6 +7830,13 @@ packages: istanbul-lib-report: 3.0.0 dev: false + /jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 ||>=22} + dependencies: + '@isaacs/cliui': 8.0.2 + dev: true + /jake@10.8.5: resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} engines: {node: '>=10'} @@ -8729,6 +8783,11 @@ packages: highlight.js: 10.7.3 dev: false + /lru-cache@11.1.0: + resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + engines: {node: 20 ||>=22} + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -8915,6 +8974,13 @@ packages: resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} dev: false + /minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 ||>=22} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -8940,6 +9006,11 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14>=14.17'} + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -9295,6 +9366,10 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + dev: true + /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: @@ -9388,6 +9463,14 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 ||>=22} + dependencies: + lru-cache: 11.1.0 + minipass: 7.1.2 + dev: true + /path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} dev: false @@ -11271,6 +11354,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false @@ -11505,6 +11593,15 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + /string.prototype.matchall@4.0.7: resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: @@ -11566,7 +11663,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: false /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -12797,7 +12893,15 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.0.1 + dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}

AltStyle によって変換されたページ (->オリジナル) /