diff --git a/packages/docs/package.json b/packages/docs/package.json index 672ff69784c..eb1ba17d14a 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -79,7 +79,8 @@ "markdown-it-meta": "^0.0.1", "markdown-it-prism": "^2.3.0", "markdownlint-cli": "^0.39.0", - "unplugin-auto-import": "0.17.5", + "unimport": "^3.13.1", + "unplugin-auto-import": "^0.18.3", "unplugin-fonts": "1.0.3", "unplugin-vue-components": "^0.27.4", "vite": "^5.4.3", diff --git a/packages/docs/vite.config.mts b/packages/docs/vite.config.mts index 3d35d4abdef..5b2d5e4a405 100644 --- a/packages/docs/vite.config.mts +++ b/packages/docs/vite.config.mts @@ -23,6 +23,7 @@ import { Examples } from './build/examples-plugin' import { genAppMetaInfo } from './src/utils/metadata' import { MdiJs } from './build/mdi-js' import { frontmatterBuilder, getRouteMeta, scriptFixer } from './build/markdownBuilders' +import { VuetifyComposables, VuetifyDirectives } from 'vuetify/unimport' const resolve = (file: string) => fileURLToPath(new URL(file, import.meta.url)) @@ -95,6 +96,8 @@ export default defineConfig(({ command, mode, isSsrBuild }) => { 'vue', 'vue-router', 'pinia', + VuetifyComposables(), + VuetifyDirectives(), { '@vuetify/one': [ 'createOne', @@ -108,12 +111,16 @@ export default defineConfig(({ command, mode, isSsrBuild }) => { ], 'lodash-es': ['camelCase', 'kebabCase', 'upperFirst'], vue: ['camelize', 'mergeProps'], - vuetify: ['useDate', 'useDisplay', 'useGoTo', 'useRtl', 'useTheme'], 'vue-gtag-next': ['useGtag'], 'vue-i18n': ['useI18n'], } ], vueTemplate: true, + // when this PR https://github.com/unplugin/unplugin-auto-import/pull/534 merged and released + // this option will create the `v` for Vuetify directives in vue module augmentation + // Volar will show Vuetify directives (VSCode only) + // check it here: packages/docs/src/examples/v-ripple/misc-custom-color.vue + // vueDirectives: true, }), // https://github.com/stafyniaksacha/vite-plugin-fonts diff --git a/packages/vuetify/.eslintignore b/packages/vuetify/.eslintignore index bb42ae50b64..393b6a4e83b 100644 --- a/packages/vuetify/.eslintignore +++ b/packages/vuetify/.eslintignore @@ -8,6 +8,8 @@ /lib/ /lib-temp/ /dist/ +/unimport/ +/unplugin-vue-components/ /cypress/ *.spec.cy.ts *.spec.cy.tsx diff --git a/packages/vuetify/.gitignore b/packages/vuetify/.gitignore index 1cdbaeaa2ed..5eb487329c9 100644 --- a/packages/vuetify/.gitignore +++ b/packages/vuetify/.gitignore @@ -9,6 +9,8 @@ /types-temp/ /dist/ /dev/dist/ +/unplugin-vue-components/ +/unimport/ # local env files .env.local diff --git a/packages/vuetify/build/constants.mjs b/packages/vuetify/build/constants.mjs new file mode 100644 index 00000000000..77be36c7be2 --- /dev/null +++ b/packages/vuetify/build/constants.mjs @@ -0,0 +1,17 @@ +import packageJson from '../package.json' with { type: 'json' } +import path from 'upath' +import { fileURLToPath } from 'url' + +export const banner = `/*! +* Vuetify v${packageJson.version} +* Forged by John Leider +* Released under the MIT License. +*/\n` + +export const root = path.resolve(fileURLToPath(import.meta.url), '../..') +export const srcDir = path.resolve(root, 'src') +export const libDir = path.resolve(root, 'lib') +export const unpluginLibDistDir = path.resolve(libDir, 'unplugin') +export const labsDir = path.resolve(srcDir, 'labs') + +export const externals = Array.from(Object.keys(packageJson.devDependencies)) diff --git a/packages/vuetify/build/rollup.config.js b/packages/vuetify/build/rollup.config.js index f79d4aad46e..7c14a2b9d68 100644 --- a/packages/vuetify/build/rollup.config.js +++ b/packages/vuetify/build/rollup.config.js @@ -2,32 +2,27 @@ import path from 'upath' import { mkdirp } from 'mkdirp' import { writeFile } from 'fs/promises' import { fileURLToPath } from 'url' - -import packageJson from '../package.json' with { type: 'json' } - import alias from '@rollup/plugin-alias' import sass from 'rollup-plugin-sass' import { babel } from '@rollup/plugin-babel' import { terser } from 'rollup-plugin-terser' import { nodeResolve } from '@rollup/plugin-node-resolve' - import autoprefixer from 'autoprefixer' import cssnano from 'cssnano' import postcss from 'postcss' import { simple as walk } from 'acorn-walk' +import { + banner, + labsDir, + libDir, + root, + srcDir, +} from './constants.mjs' +import { unpluginModules } from './unplugin-config.mjs' const extensions = ['.ts', '.tsx', '.js', '.jsx', '.es6', '.es', '.mjs'] -const banner = `/*! -* Vuetify v${packageJson.version} -* Forged by John Leider -* Released under the MIT License. -*/\n` - -const root = path.resolve(fileURLToPath(import.meta.url), '../..') -const srcDir = path.resolve(root, 'src') -const libDir = path.resolve(root, 'lib') -const labsDir = path.resolve(srcDir, 'labs') +/** @type {import("rollup").RollupOptions[]} */ export default [ { input: 'src/entry-bundler.ts', @@ -293,4 +288,5 @@ export default [ } ], }, + ...unpluginModules(), ] diff --git a/packages/vuetify/build/unplugin-config.mjs b/packages/vuetify/build/unplugin-config.mjs new file mode 100644 index 00000000000..fe71e44dbf9 --- /dev/null +++ b/packages/vuetify/build/unplugin-config.mjs @@ -0,0 +1,114 @@ +import { banner, externals, root, unpluginLibDistDir } from './constants.mjs' +import { nodeResolve } from "@rollup/plugin-node-resolve" +import { babel } from '@rollup/plugin-babel' +import { rm } from 'fs/promises' +import dts from 'rollup-plugin-dts' + +const extensions = ['.ts'] + +export function unpluginModules() { + return [ + unpluginModule('components'), + unpluginModule('unimport'), + ] +} + +export function unpluginTypes() { + return [ + unpluginDts('components'), + unpluginDts('unimport'), + ] +} + +/** + * @param name {'components' | 'unimport'} + * @returns {import("rollup").RollupOptions} + */ +function unpluginModule(name) { + const input = `src/unplugin/${name}.ts` + const file = `${name === 'components' ? 'unplugin-vue-components' : name}/index` + /** @type {import("rollup").RollupOptions} */ + const config = { + input, + external: [ + 'vuetify', + 'vuetify/directives', + 'vuetify/components', + 'vuetify/labs/components', + 'unplugin-vue-components/types', + ...externals, + ], + output: [{ + file: `${file}.mjs`, + format: 'esm', + generatedCode: { constBindings: true }, + externalLiveBindings: false, + freeze: false, + banner, + }, { + file: `${file}.cjs`, + format: 'cjs', + generatedCode: { constBindings: true }, + externalLiveBindings: false, + freeze: false, + banner, + }], + onwarn(warning, rollupWarn) { + if (!warning.code || !["CIRCULAR_DEPENDENCY"].includes(warning.code)) { + rollupWarn(warning); + } + }, + plugins: [ + nodeResolve({ extensions }), + babel({ + extensions, + }), + { + async buildEnd() { + // cleanup lib/unplugin + await rm(unpluginLibDistDir, { force: true, recursive: true }) + }, + }, + ], + } + return config +} + +/** + * @param name {'components' | 'unimport'} + * @returns {import("rollup").RollupOptions} + */ +function unpluginDts(name) { + const dir = `${root}/${name === 'components' ? 'unplugin-vue-components' : 'unimport'}` + /** @type {import("rollup").RollupOptions} */ + const config = { + input: `src/unplugin/${name}.ts`, + external: ['vuetify', 'unplugin-vue-components/types', ...externals], + output: [{ + dir, + entryFileNames: 'index.d.mts', + format: 'esm', + banner, + }, { + dir, + entryFileNames: 'index.d.ts', + format: 'esm', + banner, + }, { + dir, + entryFileNames: 'index.d.cts', + format: 'cjs', + banner, + }], + plugins: [ + dts({ + dir: `${root}/${name === 'components' ? 'unplugin-vue-components' : 'unimport'}`, + respectExternal: true, + compilerOptions: { + rootDir: root, + }, + }), + ], + } + return config +} diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index 9371ab71a60..35a806b778f 100755 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -46,6 +46,8 @@ "files": [ "dist/", "lib/", + "unplugin-vue-components/", + "unimport/", "_settings.scss", "_styles.scss", "_tools.scss", @@ -76,10 +78,30 @@ "./labs/components": "./lib/labs/components.js", "./labs/*": "./lib/labs/*/index.js", "./util/colors": "./lib/util/colors.js", - "./*": "./*" + "./*": "./*", + "./unplugin-vue-components": { + "import": "./unplugin-vue-components/index.mjs", + "require": "./unplugin-vue-components/index.cjs" + }, + "./unimport": { + "import": "./unimport/index.mjs", + "require": "./unimport/index.cjs" + } }, "typesVersions": { "*": { + "lib/framework.mjs": [ + "lib/index.d.mts" + ], + "framework": [ + "lib/index.d.mts" + ], + "unplugin-vue-components": [ + "unplugin-vue-components/index.d.ts" + ], + "unimport": [ + "unimport/index.d.ts" + ], "*": [ "*", "dist/*", @@ -98,7 +120,7 @@ "dev:ssr": "NODE_ENV=development VITE_SSR=true vite-ssr", "dev:prod": "concurrently \"vite build -w\" \"vite preview\"", "dev:typecheck": "vue-tsc --noEmit --skipLibCheck --project ./tsconfig.dev.json", - "build": "rimraf lib dist && concurrently \"pnpm run build:dist\" \"pnpm run build:lib\" -n \"dist,lib\" --kill-others-on-fail -r && pnpm run build:types", + "build": "rimraf lib dist unplugin-vue-components unimport && concurrently \"pnpm run build:dist\" \"pnpm run build:lib\" -n \"dist,lib\" --kill-others-on-fail -r && pnpm run build:types", "build:dist": "rollup --config build/rollup.config.js", "build:lib": "NODE_ENV=lib babel src --out-dir lib --source-maps --extensions \".ts\",\".tsx\",\".snap\" --copy-files --no-copy-ignored --out-file-extension .js", "build:types": "tspc --pretty --emitDeclarationOnly -p tsconfig.dist.json && node build/transform-types.js && rollup --config build/rollup.types.config.js", @@ -171,7 +193,8 @@ "ts-node": "^10.9.2", "ts-patch": "^3.2.1", "typescript-transform-paths": "^3.5.1", - "unplugin-auto-import": "0.17.5", + "unimport": "^3.13.1", + "unplugin-auto-import": "^0.18.3", "unplugin-vue-components": "^0.27.4", "upath": "^2.0.1", "vite": "^5.4.3", diff --git a/packages/vuetify/src/auto-imports.d.ts b/packages/vuetify/src/auto-imports.d.ts index 7e43e9a13f5..6f92e4eef36 100644 --- a/packages/vuetify/src/auto-imports.d.ts +++ b/packages/vuetify/src/auto-imports.d.ts @@ -3,6 +3,7 @@ // @ts-nocheck // noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import +// biome-ignore lint: disable export {} declare global { const afterAll: typeof import('vitest')['afterAll'] diff --git a/packages/vuetify/src/unplugin/components.ts b/packages/vuetify/src/unplugin/components.ts new file mode 100644 index 00000000000..92535ffc716 --- /dev/null +++ b/packages/vuetify/src/unplugin/components.ts @@ -0,0 +1,155 @@ +// Types +import type { ComponentResolver } from 'unplugin-vue-components/types' +import type { + ComponentName, + DirectiveName, + ImportComponents, + ImportMaps, + LabComponentName, +} from './types' +import { resolveVuetifyImportMap, resolveVuetifyImportMaps } from './utils' + +export interface VuetifyComponentResolverOptions { + /** + * Include labs components?. + * + * @default false + */ + labs?: boolean + /** + * Components to exclude. + */ + exclude?: (ComponentName | LabComponentName)[] + /** + * Paths to locate Vuetify package. + * + * @default [process.cwd()] + */ + paths?: string[] +} + +export interface VuetifyDirectivesResolverOptions { + /** + * Prefix Vuetify directives (to allow use other directives with the same name): + * - when prefix set to `true` will use `Vuetify` => `v-vuetify-: `v-vuetify-ripple`. + */ + prefix?: true + /** + * Directives to exclude. + */ + exclude?: DirectiveName[] + /** + * Paths to locate Vuetify package. + * + * @default [process.cwd()] + */ + paths?: string[] +} + +export interface VuetifyVueResolverOptions extends Omit { + /** + * Prefix Vuetify directives (to allow use other directives with the same name): + * - when prefix set to `true` will use `Vuetify` => `v-vuetify-: `v-vuetify-ripple`. + */ + prefixDirectives?: true + /** + * Directives to exclude. + */ + excludeDirectives?: DirectiveName[] + /** + * Components to exclude. + */ + excludeComponents?: (ComponentName | LabComponentName)[] +} + +export function VuetifyVueResolver (options: VuetifyVueResolverOptions = {}) { + const { + paths, + excludeDirectives, + labs, + excludeComponents, + prefixDirectives, + } = options + + const [componentsPromise, directivesPromise] = resolveVuetifyImportMaps(paths) + + const directives = createDirectivesResolver( + componentsPromise, + { exclude: excludeDirectives, paths, prefix: prefixDirectives } + ) + const components = createComponentsResolver( + [componentsPromise, directivesPromise], + { exclude: excludeComponents, labs, paths } + ) + + return { + VuetifyDirectiveResolver: directives, + VuetifyComponentResolver: components, + } +} + +export function VuetifyDirectiveResolver (options: VuetifyDirectivesResolverOptions = {}) { + return createDirectivesResolver(resolveVuetifyImportMap(options.paths), options) +} + +export function VuetifyComponentResolver (options: VuetifyComponentResolverOptions = {}) { + return createComponentsResolver(resolveVuetifyImportMaps(options.paths), options) +} + +function createComponentsResolver ( + promises: ImportMaps, + options: VuetifyComponentResolverOptions +) { + const { exclude, labs } = options + return { + type: 'component', + resolve: async name => { + if (exclude?.some(e => e === name)) return undefined + const [components, labsComponents] = await Promise.all(promises) + const component = name in components.components + ? components.components[name] + : labs && name in labsComponents + ? labsComponents[name] + : undefined + + if (!component) return undefined + return { + name, + from: `vuetify/lib/${component.from}`, + } + }, + } +} + +function createDirectivesResolver ( + promise: Promise, + options: VuetifyDirectivesResolverOptions +) { + const { exclude, prefix } = options + // Vue will transform v- to _resolveDirective('') + // If prefix enabled, Vue will transform v-vuetify- to _resolveDirective('vuetify-') + // unplugin-vue-components will provide the correct import when calling resolve: PascalCase() + // If prefix enabled, unplugin-vue-components will provide PascalCase(vuetify-) + return { + type: 'directive', + resolve: async resolvedName => { + let name = resolvedName + if (prefix) { + if (!name.startsWith('Vuetify')) { + return undefined + } + name = name.slice('Vuetify'.length) + } + if (exclude?.some(e => e === name)) return undefined + const { directives } = await promise + const directive = directives.includes(name as DirectiveName) + if (!directive) return undefined + + return { + name, + as: prefix ? resolvedName : undefined, + from: `vuetify/directives`, + } + }, + } +} diff --git a/packages/vuetify/src/unplugin/types.ts b/packages/vuetify/src/unplugin/types.ts new file mode 100644 index 00000000000..64780dacf4f --- /dev/null +++ b/packages/vuetify/src/unplugin/types.ts @@ -0,0 +1,20 @@ +export interface VuetifyComponent { + from: string +} +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +export type ComponentName = keyof typeof import('vuetify/components') +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +export type LabComponentName = keyof typeof import('vuetify/labs/components') +// eslint-disable-next-line @typescript-eslint/consistent-type-imports +export type DirectiveName = keyof typeof import('vuetify/directives') +export interface VuetifyComponents { + [key: string]: VuetifyComponent +} +export interface ImportComponents { + components: VuetifyComponents + directives: DirectiveName[] +} +export interface ImportLabsComponents { + [key: string]: VuetifyComponent +} +export type ImportMaps = [importMaps: Promise, importMapsLabs: Promise] diff --git a/packages/vuetify/src/unplugin/unimport.ts b/packages/vuetify/src/unplugin/unimport.ts new file mode 100644 index 00000000000..8ffd579bdb0 --- /dev/null +++ b/packages/vuetify/src/unplugin/unimport.ts @@ -0,0 +1,79 @@ +// Types +import type { InlinePreset, PresetImport } from 'unimport' +import type { DirectiveName } from './types' + +export interface VuetifyComposablesOptions { + /** + * Prefix Vuetify composables (to allow use other composables with the same name): + * - when prefix set to `true` will use `useV`: `useVDate`. + * - when prefix is a string will use `use`: `useVuetifyDate` with `prefix: 'Vuetify'`. + */ + prefix?: true | string +} + +export interface VuetifyDirectivesOptions { + /** + * Prefix Vuetify directives (to allow use other directives with the same name): + * - when prefix set to `true` will use `Vuetify` => `v-vuetify-: `v-vuetify-ripple`. + */ + prefix?: true + /** + * Directives to exclude. + */ + exclude?: DirectiveName[] +} + +export function VuetifyComposables (options: VuetifyComposablesOptions = {}) { + const { prefix } = options + const composableImports: [link: string, name: string][] = [ + ['use-date', 'useDate'], + ['use-defaults', 'useDefaults'], + ['use-display', 'useDisplay'], + ['use-go-to', 'useGoTo'], + ['use-layout', 'useLayout'], + ['use-locale', 'useLocale'], + ['use-rtl', 'useRtl'], + ['use-theme', 'useTheme'], + ] + const imports = typeof prefix === 'string' + ? composableImports.map(([l, n]) => [l, n, n.replace('use', `use${prefix}`)]) + : prefix + ? composableImports.map(([l, n]) => [l, n, n.replace('use', 'useV')]) + : composableImports + return { + from: 'vuetify', + imports: imports.map(([link, name, renamed]) => ({ + name, + as: renamed, + meta: { docsUrl: `https://vuetifyjs.com/en/api/${link}/` }, + })), + } +} + +export function VuetifyDirectives (options: VuetifyDirectivesOptions = {}) { + const { exclude, prefix } = options + const directivesImports: [link: string, name: DirectiveName][] = [ + ['click-outside', 'ClickOutside'], + ['intersect', 'Intersect'], + ['mutate', 'Mutate'], + ['resize', 'Resize'], + ['ripple', 'Ripple'], + ['scroll', 'Scroll'], + ['touch', 'Touch'], + ['tooltip', 'Tooltip'], + ] + + const directives = directivesImports.filter(entry => !exclude || !exclude.includes(entry[1])) + + return { + from: 'vuetify/directives', + meta: { + vueDirective: true, + }, + imports: directives.map(([link, name]) => ({ + name, + as: prefix ? `Vuetify${name}` : undefined, + meta: { docsUrl: `https://vuetifyjs.com/en/api/${link}/` }, + })), + } +} diff --git a/packages/vuetify/src/unplugin/utils.ts b/packages/vuetify/src/unplugin/utils.ts new file mode 100644 index 00000000000..1f4389b101c --- /dev/null +++ b/packages/vuetify/src/unplugin/utils.ts @@ -0,0 +1,35 @@ +import { readFile } from 'node:fs/promises' +import path from 'upath' +import { createRequire } from 'node:module' +import process from 'node:process' + +// Types +import type { ImportComponents, ImportLabsComponents, ImportMaps } from './types' + +const require = createRequire(import.meta.url) + +export function resolveVuetifyBase (paths = [process.cwd()]) { + return path.dirname(require.resolve('vuetify/package.json', { paths })) +} + +export function resolveVuetifyImportMaps ( + paths = [process.cwd()] +): ImportMaps { + const vuetifyBase = resolveVuetifyBase(paths) + return [importMap(vuetifyBase), importMapLabs(vuetifyBase)] +} + +export function resolveVuetifyImportMap (paths = [process.cwd()]) { + return importMap(resolveVuetifyBase(paths)) +} + +export function resolveVuetifyImportMapLabs (paths = [process.cwd()]) { + return importMapLabs(resolveVuetifyBase(paths)) +} + +async function importMap (vuetifyBase: string): Promise { + return JSON.parse(await readFile(path.resolve(vuetifyBase, 'dist/json/importMap.json'), 'utf-8')) +} +async function importMapLabs (vuetifyBase: string): Promise { + return JSON.parse(await readFile(path.resolve(vuetifyBase, 'dist/json/importMap-labs.json'), 'utf-8')) +} diff --git a/packages/vuetify/tsconfig.checks.json b/packages/vuetify/tsconfig.checks.json index 8ac8c684470..d93f785af95 100644 --- a/packages/vuetify/tsconfig.checks.json +++ b/packages/vuetify/tsconfig.checks.json @@ -1,6 +1,8 @@ { "extends": "./tsconfig.dev.json", "compilerOptions": { + "rootDir": ".", "skipLibCheck": true - } + }, + "exclude": ["types-temp", "**/*.spec.cy.ts", "**/*.spec.cy.tsx", "unimport/*", "src/unplugin/*.ts"] } diff --git a/packages/vuetify/tsconfig.dist.json b/packages/vuetify/tsconfig.dist.json index 999aa4f79ca..60c39d8f5d0 100644 --- a/packages/vuetify/tsconfig.dist.json +++ b/packages/vuetify/tsconfig.dist.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", - "exclude": ["dev", "**/*.spec.*", "test"], + "exclude": ["dev", "**/*.spec.*", "test", "src/unplugin/*.ts"], "compilerOptions": { "outDir": "./lib", "emitDeclarationOnly": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee38f6e0b8b..94a3c42898e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -400,9 +400,12 @@ importers: markdownlint-cli: specifier: ^0.39.0 version: 0.39.0 + unimport: + specifier: ^3.13.1 + version: 3.13.1(rollup@4.21.2)(webpack-sources@3.2.3) unplugin-auto-import: - specifier: 0.17.5 - version: 0.17.5(rollup@4.21.2) + specifier: ^0.18.3 + version: 0.18.3(rollup@4.21.2)(webpack-sources@3.2.3) unplugin-fonts: specifier: 1.0.3 version: 1.0.3(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.80.1)(sass@1.80.1)(terser@5.31.3)) @@ -604,9 +607,12 @@ importers: typescript-transform-paths: specifier: ^3.5.1 version: 3.5.1(typescript@5.5.4) + unimport: + specifier: ^3.13.1 + version: 3.13.1(rollup@3.29.4)(webpack-sources@3.2.3) unplugin-auto-import: - specifier: 0.17.5 - version: 0.17.5(rollup@3.29.4) + specifier: ^0.18.3 + version: 0.18.3(rollup@3.29.4)(webpack-sources@3.2.3) unplugin-vue-components: specifier: ^0.27.4 version: 0.27.4(@babel/parser@7.25.9)(rollup@3.29.4)(vue@3.5.12(typescript@5.5.4)) @@ -2423,6 +2429,15 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.1.2': + resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: '*' + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.21.2': resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] @@ -5929,6 +5944,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -7087,6 +7105,9 @@ packages: pkg-types@1.1.3: resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -7404,7 +7425,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.9.7: @@ -7889,8 +7909,8 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scule@1.2.0: - resolution: {integrity: sha512-CRCmi5zHQnSoeCik9565PONMg0kfkvYmcSqrbOJY4txFfy1wvVULV4FDaiXhUblUgahdqz3F2NwHZ8i4eBTwUw==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} search-insights@2.13.0: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} @@ -8226,8 +8246,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -8626,8 +8646,8 @@ packages: resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} engines: {node: '>=4'} - unimport@3.7.1: - resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} + unimport@3.13.1: + resolution: {integrity: sha512-nNrVzcs93yrZQOW77qnyOVHtb68LegvhYFwxFMfuuWScmwQmyVCG/NBuN8tYsaGzgQUVYv34E/af+Cc9u4og4A==} unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} @@ -8656,8 +8676,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin-auto-import@0.17.5: - resolution: {integrity: sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==} + unplugin-auto-import@0.18.3: + resolution: {integrity: sha512-q3FUtGQjYA2e+kb1WumyiQMjHM27MrTQ05QfVwtLRVhyYe+KF6TblBYaEX9L6Z0EibsqaXAiW+RFfkcQpfaXzg==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': ^3.2.2 @@ -8694,6 +8714,15 @@ packages: resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==} engines: {node: '>=14.0.0'} + unplugin@1.14.1: + resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} + engines: {node: '>=14.0.0'} + peerDependencies: + webpack-sources: ^3 + peerDependenciesMeta: + webpack-sources: + optional: true + upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -11687,6 +11716,22 @@ snapshots: optionalDependencies: rollup: 4.21.2 + '@rollup/pluginutils@5.1.2(rollup@3.29.4)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 3.29.4 + + '@rollup/pluginutils@5.1.2(rollup@4.21.2)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.2 + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true @@ -16028,6 +16073,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.0: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -17371,6 +17418,12 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 + pkg-types@1.2.0: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -18149,7 +18202,7 @@ snapshots: dependencies: xmlchars: 2.2.0 - scule@1.2.0: {} + scule@1.3.0: {} search-insights@2.13.0: {} @@ -18490,9 +18543,9 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@1.3.0: + strip-literal@2.1.0: dependencies: - acorn: 8.12.1 + js-tokens: 9.0.0 strnum@1.0.5: {} @@ -18901,9 +18954,9 @@ snapshots: unicode-property-aliases-ecmascript@2.0.0: {} - unimport@3.7.1(rollup@3.29.4): + unimport@3.13.1(rollup@3.29.4)(webpack-sources@3.2.3): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.2(rollup@3.29.4) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -18912,16 +18965,17 @@ snapshots: magic-string: 0.30.11 mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.3 - scule: 1.2.0 - strip-literal: 1.3.0 - unplugin: 1.12.1 + pkg-types: 1.2.0 + scule: 1.3.0 + strip-literal: 2.1.0 + unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - rollup + - webpack-sources - unimport@3.7.1(rollup@4.21.2): + unimport@3.13.1(rollup@4.21.2)(webpack-sources@3.2.3): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + '@rollup/pluginutils': 5.1.2(rollup@4.21.2) acorn: 8.12.1 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -18930,12 +18984,13 @@ snapshots: magic-string: 0.30.11 mlly: 1.7.1 pathe: 1.1.2 - pkg-types: 1.1.3 - scule: 1.2.0 - strip-literal: 1.3.0 - unplugin: 1.12.1 + pkg-types: 1.2.0 + scule: 1.3.0 + strip-literal: 2.1.0 + unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - rollup + - webpack-sources unique-filename@3.0.0: dependencies: @@ -18957,7 +19012,7 @@ snapshots: unpipe@1.0.0: {} - unplugin-auto-import@0.17.5(rollup@3.29.4): + unplugin-auto-import@0.18.3(rollup@3.29.4)(webpack-sources@3.2.3): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@3.29.4) @@ -18965,12 +19020,13 @@ snapshots: local-pkg: 0.5.0 magic-string: 0.30.11 minimatch: 9.0.5 - unimport: 3.7.1(rollup@3.29.4) - unplugin: 1.12.1 + unimport: 3.13.1(rollup@3.29.4)(webpack-sources@3.2.3) + unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - rollup + - webpack-sources - unplugin-auto-import@0.17.5(rollup@4.21.2): + unplugin-auto-import@0.18.3(rollup@4.21.2)(webpack-sources@3.2.3): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@4.21.2) @@ -18978,10 +19034,11 @@ snapshots: local-pkg: 0.5.0 magic-string: 0.30.11 minimatch: 9.0.5 - unimport: 3.7.1(rollup@4.21.2) - unplugin: 1.12.1 + unimport: 3.13.1(rollup@4.21.2)(webpack-sources@3.2.3) + unplugin: 1.14.1(webpack-sources@3.2.3) transitivePeerDependencies: - rollup + - webpack-sources unplugin-fonts@1.0.3(vite@5.4.3(@types/node@22.5.4)(sass-embedded@1.80.1)(sass@1.80.1)(terser@5.31.3)): dependencies: @@ -19034,6 +19091,13 @@ snapshots: webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.2 + unplugin@1.14.1(webpack-sources@3.2.3): + dependencies: + acorn: 8.12.1 + webpack-virtual-modules: 0.6.2 + optionalDependencies: + webpack-sources: 3.2.3 + upath@1.2.0: {} upath@2.0.1: {}