diff --git a/.changeset/stale-gorillas-cross.md b/.changeset/stale-gorillas-cross.md new file mode 100644 index 0000000..367de1c --- /dev/null +++ b/.changeset/stale-gorillas-cross.md @@ -0,0 +1,6 @@ +--- +"@lunariajs/core": patch +"create-lunaria": patch +--- + +Reworked core configuration system diff --git a/build.preset.ts b/build.preset.ts index 04f59f9..e7b4272 100644 --- a/build.preset.ts +++ b/build.preset.ts @@ -7,7 +7,6 @@ export default definePreset({ rollup: { esbuild: { target: 'es2022', - minify: true, }, }, }); diff --git a/examples/vitepress/lunaria.config.json b/examples/vitepress/lunaria.config.json new file mode 100644 index 0000000..4046be5 --- /dev/null +++ b/examples/vitepress/lunaria.config.json @@ -0,0 +1,51 @@ +{ + "repository": "https://github.com/Yan-Thomas/lunaria", + "rootDir": "./examples/vitepress", + "dashboard": { + "url": "https://localhost:3000/" + }, + "defaultLocale": { + "label": "English", + "lang": "en", + "content": { + "location": "**/*.md", + "ignore": ["pt/*.md", "es/*.md"] + }, + "dictionaries": { + "location": "ui/en/*.{js,cjs,mjs,ts,yml,json}", + "optionalKeys": { + "ui/nav.json": ["today"], + "ui/ui.cjs": ["type"], + "ui/ui.js": ["type"], + "ui/ui.mjs": ["type"], + "ui/ui.mts": ["type"], + "ui/ui.ts": ["type"], + "ui/ui.yml": ["here"] + } + } + }, + "locales": [ + { + "label": "Português", + "lang": "pt", + "content": { + "location": "pt/**/*.md" + }, + "dictionaries": { + "location": "ui/pt/*.{js,cjs,mjs,ts,yml,json}" + } + }, + { + "label": "Spanish", + "lang": "es", + "content": { + "location": "es/**/*.md" + }, + "dictionaries": { + "location": "ui/es/*.{js,cjs,mjs,ts,yml,json}" + } + } + ], + "translatableProperty": "i18nReady", + "renderer": "./renderer.config.js" +} diff --git a/examples/vitepress/lunaria.config.ts b/examples/vitepress/lunaria.config.ts deleted file mode 100644 index 71afc0f..0000000 --- a/examples/vitepress/lunaria.config.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { defineConfig } from '@lunariajs/core'; - -export default defineConfig({ - repository: 'https://github.com/Yan-Thomas/lunaria', - rootDir: './examples/vitepress', - dashboard: { - //title: "Estado da Tradução", - url: 'https://localhost:3000/', - /* ui: { - lang: 'pt-BR', - "heading.progressByLanguage": "Progresso da tradução por língua", - "heading.statusByContent": "Estado da tradução por conteúdo", - "status.done": "completo", - "status.missing": "faltando", - "status.outdated": "desatualizado", - "status.emojiDone": "⭕", - "statusByContent.tableRowPage": "Página", - "statusByLanguage.outdatedTranslationLink": "tradução desatualizada", - "statusByLanguage.sourceChangeHistoryLink": "histórico de mudanças do original" - - }, */ - }, - defaultLocale: { - label: 'English', - lang: 'en', - content: { - location: '**/*.md', - ignore: ['pt/*.md', 'es/*.md'], - }, - dictionaries: { - location: 'ui/en/*.{js,cjs,mjs,ts,yml,json}', - optionalKeys: { - 'ui/nav.json': ['today'], - 'ui/ui.cjs': ['type'], - 'ui/ui.js': ['type'], - 'ui/ui.mjs': ['type'], - 'ui/ui.mts': ['type'], - 'ui/ui.ts': ['type'], - 'ui/ui.yml': ['here'], - }, - }, - }, - locales: [ - { - label: 'Português', - lang: 'pt', - content: { - location: 'pt/**/*.md', - }, - dictionaries: { - location: 'ui/pt/*.{js,cjs,mjs,ts,yml,json}', - }, - }, - { - label: 'Spanish', - lang: 'es', - content: { - location: 'es/**/*.md', - }, - dictionaries: { - location: 'ui/es/*.{js,cjs,mjs,ts,yml,json}', - }, - }, - ], - translatableProperty: 'i18nReady', -}); diff --git a/examples/vitepress/renderer.config.ts b/examples/vitepress/renderer.config.ts new file mode 100644 index 0000000..0b7f2e4 --- /dev/null +++ b/examples/vitepress/renderer.config.ts @@ -0,0 +1,7 @@ +import { defineRendererConfig, html } from '@lunariajs/core'; + +export default defineRendererConfig({ + slots: { + afterTitle: () => html`

This is an example slotted component!

`, + }, +}); diff --git a/packages/core/README.md b/packages/core/README.md index c763167..92b09dc 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -23,51 +23,40 @@ yarn add @lunariajs/core ## Basic Usage -Start using `@lunariajs/core` by setting up your own `lunaria.config` file and adding a script to your `package.json` file. +Start using `@lunariajs/core` by setting up your own `lunaria.config.json` file and adding a script to your `package.json` file. The example below contains all of the **required** options to generate a dashboard tracking the status of both the Portuguese and Spanish translations of a site: -```js -// lunaria.config.ts -import { defineConfig } from '@lunariajs/core'; - -export default defineConfig({ - // Current repository of your content - repository: 'https://github.com/me/cool-docs', - dashboard: { - // Generated dashboard URL used in meta tags - url: 'https://tracker.cool-docs.com', +```json +// lunaria.config.json +{ + "repository": "https://github.com/me/cool-docs", + "dashboard": { + "url": "https://tracker.cool-docs.com" }, - // Information about the source locale of your content - defaultLocale: { - // User-friendly label/name of the language - label: 'English', - // BCP-47 tag of the language - lang: 'en', - content: { - // Glob pattern of where your content is - location: 'content/en/**/*.md', - }, + "defaultLocale": { + "label": "English", + "lang": "en", + "content": { + "location": "content/en/**/*.md" + } }, - // Array of objects of your translated locales. - locales: [ + "locales": [ { - label: 'Português', - lang: 'pt', - content: { - location: 'content/pt/**/*.md', - }, + "label": "Português", + "lang": "pt", + "content": { + "location": "content/pt/**/*.md" + } }, { - label: 'Spanish', - lang: 'es', - content: { - location: 'content/es/**/*.md', - }, - }, - ], - // Property to find in valid frontmatter files marking if a page should be translated or not - translatableProperty: 'i18nReady', + "label": "Spanish", + "lang": "es", + "content": { + "location": "content/es/**/*.md" + } + } + ] }); ``` diff --git a/packages/core/package.json b/packages/core/package.json index 9c5db64..bac8992 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -48,7 +48,7 @@ "typescript": "^5.2.2" }, "dependencies": { - "c12": "^1.5.1", + "destr": "^2.0.2", "fast-glob": "^3.3.1", "jiti": "^1.21.0", "lit-html": "^3.0.0", diff --git a/packages/core/src/cli.ts b/packages/core/src/cli.ts index 146bb34..6b45131 100644 --- a/packages/core/src/cli.ts +++ b/packages/core/src/cli.ts @@ -1,21 +1,22 @@ #!/usr/bin/env node -import { loadConfig } from 'c12'; -import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { destr } from 'destr'; +import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; import { dirname, resolve } from 'node:path'; -import { LunariaConfigSchema } from './schemas/config.js'; +import { LunariaConfigSchema, LunariaRendererConfigSchema } from './schemas/config.js'; import { generateDashboardHtml, getContentIndex, getTranslationStatus } from './tracker.js'; import { handleShallowRepo } from './utils/git.js'; +import { loadFile } from './utils/misc.js'; -const { config } = await loadConfig({ - name: 'lunaria', -}); +const configPath = './lunaria.config.json'; -if (config === null) { - console.error(new Error('Could not find a `lunaria.config.*` file, does it exist?')); - process.exit(1); +if (!existsSync(configPath)) { + console.error( + new Error(`Could not find a \`lunaria.config.json\` file in ${process.cwd()}, does it exist?`) + ); } -const parsedConfig = LunariaConfigSchema.safeParse(config); +const configContents = destr(readFileSync(configPath, 'utf-8')); +const parsedConfig = LunariaConfigSchema.safeParse(configContents); if (!parsedConfig.success) { console.error( @@ -28,6 +29,31 @@ if (!parsedConfig.success) { } const userConfig = parsedConfig.data; + +if (userConfig.renderer && !existsSync(userConfig.renderer)) { + console.error( + new Error( + `Could not find your specified renderer file at \`${userConfig.renderer}\`, does it exist?` + ) + ); + process.exit(1); +} + +const rendererConfigContents = userConfig.renderer ? loadFile(userConfig.renderer) : {}; +const parsedRendererConfig = LunariaRendererConfigSchema.safeParse(rendererConfigContents); + +if (!parsedRendererConfig.success) { + console.error( + new Error( + 'Invalid renderer configuration options passed to `@lunariajs/core`\n' + + parsedRendererConfig.error.issues.map((i) => i).join('\n') + ) + ); + process.exit(1); +} + +const userRendererConfig = parsedRendererConfig.data; + const isShallowRepo = await handleShallowRepo(userConfig); console.time('⌛ Building translation dashboard'); @@ -35,7 +61,7 @@ console.log(`➡️ Dashboard output path: ${resolve(userConfig.outDir)}`); const contentIndex = await getContentIndex(userConfig, isShallowRepo); const translationStatus = await getTranslationStatus(userConfig, contentIndex); -const html = await generateDashboardHtml(userConfig, translationStatus); +const html = await generateDashboardHtml(userConfig, userRendererConfig, translationStatus); const outputDir = dirname(userConfig.outDir); diff --git a/packages/core/src/dashboard/components.ts b/packages/core/src/dashboard/components.ts index 5504fdf..836daa5 100644 --- a/packages/core/src/dashboard/components.ts +++ b/packages/core/src/dashboard/components.ts @@ -4,27 +4,34 @@ import type { FileTranslationStatus, Locale, LunariaConfig, + LunariaRendererConfig, TranslationStatus, } from '../types.js'; import { getTextFromFormat } from '../utils/misc.js'; import { Styles } from './styles.js'; -export const Page = (opts: LunariaConfig, translationStatus: FileTranslationStatus[]) => { +export const Page = ( + opts: LunariaConfig, + rendererOpts: LunariaRendererConfig, + translationStatus: FileTranslationStatus[] +) => { const { dashboard } = opts; + const { slots, overrides } = rendererOpts; + return html` - ${dashboard.overrides.meta?.(opts) ?? Meta(dashboard)} + ${overrides.meta?.(opts) ?? Meta(dashboard)} - ${dashboard.slots.head?.(opts) ?? ''} + ${slots.head?.(opts) ?? ''} - ${dashboard.overrides.styles?.(opts) ?? Styles} + ${overrides.styles?.(opts) ?? Styles} - ${dashboard.overrides.body?.(opts, translationStatus) ?? Body(opts, translationStatus)} + ${overrides.body?.(opts, translationStatus) ?? Body(opts, rendererOpts, translationStatus)} `; @@ -42,18 +49,24 @@ export const Meta = (dashboard: Dashboard) => html` `; -export const Body = (opts: LunariaConfig, translationStatus: FileTranslationStatus[]) => { +export const Body = ( + opts: LunariaConfig, + rendererOpts: LunariaRendererConfig, + translationStatus: FileTranslationStatus[] +) => { const { dashboard } = opts; + const { slots, overrides } = rendererOpts; + return html`
- ${dashboard.slots.beforeTitle?.(opts) ?? ''} + ${slots.beforeTitle?.(opts) ?? ''}

${dashboard.title}

- ${dashboard.slots.afterTitle?.(opts) ?? ''} - ${dashboard.overrides.statusByLocale?.(opts, translationStatus) ?? + ${slots.afterTitle?.(opts) ?? ''} + ${overrides.statusByLocale?.(opts, translationStatus) ?? StatusByLocale(opts, translationStatus)}
- ${dashboard.overrides.statusByContent?.(opts, translationStatus) ?? + ${overrides.statusByContent?.(opts, translationStatus) ?? StatusByContent(opts, translationStatus)}
`; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 094854b..63e512a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,8 +1,8 @@ -import type { LunariaUserConfig } from './types.js'; +import type { LunariaUserRendererConfig } from './types.js'; export { html } from 'lit-html'; export type * from './types.js'; -export function defineConfig(opts: LunariaUserConfig) { +export function defineRendererConfig(opts: LunariaUserRendererConfig) { return opts; } diff --git a/packages/core/src/schemas/config.ts b/packages/core/src/schemas/config.ts index 96e4b70..03e35e6 100644 --- a/packages/core/src/schemas/config.ts +++ b/packages/core/src/schemas/config.ts @@ -3,6 +3,16 @@ import { z } from 'zod'; import { DashboardSchema } from '../schemas/dashboard.js'; import { LocaleSchema } from '../schemas/locale.js'; import { LocalePathConstructorSchema, SharedPathResolverSchema } from '../schemas/misc.js'; +import type { CustomComponent, CustomStatusComponent } from '../types.js'; + +function createComponentSchema() { + return z.custom((val) => { + if (typeof val === 'function' && typeof val() === 'object') { + return val()['_$litType$'] ? true : false; + } + return false; + }, 'Custom components need to be a function returning a valid `lit-html` template.'); +} export const LunariaConfigSchema = z.object({ /** Options about your generated dashboard. */ @@ -77,7 +87,35 @@ export const LunariaConfigSchema = z.object({ .describe( 'The relative directory path of your git history clone, exclusively made when running on a shallow repository, e.g. `"./dist/history"`' ), + /** The relative path to a valid `.(c/m)js` or `.(c/m)ts` file containing your dashboard renderer configuration. */ + renderer: z + .string() + .optional() + .describe( + 'The relative path to a valid `.(c/m)js` or `.(c/m)ts` file containing your dashboard renderer configuration.' + ), +}); + +export const LunariaRendererConfigSchema = z.object({ + slots: z + .object({ + head: createComponentSchema().optional(), + beforeTitle: createComponentSchema().optional(), + afterTitle: createComponentSchema().optional(), + }) + .default({}), + overrides: z + .object({ + meta: createComponentSchema().optional(), + styles: createComponentSchema().optional(), + body: createComponentSchema().optional(), + statusByLocale: createComponentSchema().optional(), + statusByContent: createComponentSchema().optional(), + }) + .default({}), }); export type LunariaConfig = z.infer; export type LunariaUserConfig = z.input; +export type LunariaRendererConfig = z.infer; +export type LunariaUserRendererConfig = z.input; diff --git a/packages/core/src/schemas/dashboard.ts b/packages/core/src/schemas/dashboard.ts index 05083c4..df97bbe 100644 --- a/packages/core/src/schemas/dashboard.ts +++ b/packages/core/src/schemas/dashboard.ts @@ -1,14 +1,4 @@ import { z } from 'zod'; -import type { CustomComponent, CustomStatusComponent } from '../types.js'; - -function createComponentSchema() { - return z.custom((val) => { - if (typeof val === 'function' && typeof val() === 'object') { - return val()['_$litType$'] ? true : false; - } - return false; - }, 'Custom components need to be a function returning a valid `lit-html` template.'); -} const DashboardUiSchema = z .object({ @@ -146,22 +136,6 @@ export const DashboardSchema = z.object({ .describe('The deployed URL of your translation dashboard, used in the meta tags of the page.'), /** UI dictionary of the dashboard, including the desired `lang` and `dir` attributes of the page. */ ui: DashboardUiSchema, - slots: z - .object({ - head: createComponentSchema().optional(), - beforeTitle: createComponentSchema().optional(), - afterTitle: createComponentSchema().optional(), - }) - .default({}), - overrides: z - .object({ - meta: createComponentSchema().optional(), - styles: createComponentSchema().optional(), - body: createComponentSchema().optional(), - statusByLocale: createComponentSchema().optional(), - statusByContent: createComponentSchema().optional(), - }) - .default({}), }); export type Dashboard = z.output; diff --git a/packages/core/src/tracker.ts b/packages/core/src/tracker.ts index 1f68d27..eff6565 100644 --- a/packages/core/src/tracker.ts +++ b/packages/core/src/tracker.ts @@ -1,3 +1,4 @@ +import destr from 'destr'; import glob from 'fast-glob'; import micromatch from 'micromatch'; import { readFileSync } from 'node:fs'; @@ -17,6 +18,7 @@ import type { FileTranslationStatus, IndexData, LunariaConfig, + LunariaRendererConfig, OptionalKeys, RegExpGroups, } from './types.js'; @@ -210,11 +212,12 @@ export async function getContentIndex(opts: LunariaConfig, isShallowRepo: boolea export async function generateDashboardHtml( opts: LunariaConfig, + rendererOpts: LunariaRendererConfig, translationStatus: FileTranslationStatus[] ) { const html = await rehype() .use(rehypeFormat) - .process(renderToString(Page(opts, translationStatus))); + .process(renderToString(Page(opts, rendererOpts, translationStatus))); return String(html); } @@ -391,9 +394,9 @@ async function getDictionaryFilesData( const sourceDictionaryFile = readFileSync(resolve(sourceFilePath), 'utf-8'); const translationDictionaryFile = readFileSync(resolve(translationFilePath), 'utf-8'); - const sourceDictionaryData = parseDictionary(JSON.parse(sourceDictionaryFile), sourceFilePath); + const sourceDictionaryData = parseDictionary(destr(sourceDictionaryFile), sourceFilePath); const translationDictionaryData = parseDictionary( - JSON.parse(translationDictionaryFile), + destr(translationDictionaryFile), translationFilePath ); diff --git a/packages/create-lunaria/package.json b/packages/create-lunaria/package.json index 272277f..5e3d2a4 100644 --- a/packages/create-lunaria/package.json +++ b/packages/create-lunaria/package.json @@ -23,8 +23,7 @@ "scripts": { "dev": "node ./dist/create-lunaria.mjs", "build": "unbuild", - "lint": "tsc", - "lunaria": "lunaria" + "lint": "tsc" }, "devDependencies": { "@types/node": "^20.8.9", diff --git a/packages/create-lunaria/src/create-lunaria.ts b/packages/create-lunaria/src/create-lunaria.ts index 3239075..1999201 100644 --- a/packages/create-lunaria/src/create-lunaria.ts +++ b/packages/create-lunaria/src/create-lunaria.ts @@ -6,10 +6,8 @@ import { join, resolve } from 'node:path'; import { addDependency, detectPackageManager, installDependencies } from 'nypm'; import color from 'picocolors'; -const cleanConfigContent = (pkg: string) => - `import { defineConfig } from "${pkg}"; - -export default defineConfig({});`; +// TODO: Add JSON Schema here! +const cleanConfigContent = '{\n \n}'; async function main() { console.clear(); @@ -18,12 +16,6 @@ async function main() { const project = await p.group( { - package: () => - p.select({ - message: `Which ${color.bold('@lunariajs')} package would you like to set up?`, - initialValue: '@lunariajs/core', - options: [{ value: '@lunariajs/core', label: '@lunariajs/core' }], - }), path: () => p.text({ message: 'Where should we set up Lunaria?', @@ -32,14 +24,9 @@ async function main() { if (value[0] !== '.') return 'Please enter a relative path.'; }, }), - typed: () => - p.confirm({ - message: 'Does your project use TypeScript?', - initialValue: false, - }), install: ({ results }) => p.confirm({ - message: `Do you wish to install ${color.bold(results.package)} and its dependencies?`, + message: 'Install dependencies?', initialValue: false, }), }, @@ -65,15 +52,15 @@ async function main() { const spinner = p.spinner(); - spinner.start(`Adding ${color.bold(project.package)}`); + spinner.start(`Adding packages`); - await addDependency(project.package, { + await addDependency('@lunariajs/core', { cwd: projectPath, packageManager: packageManager, silent: true, }); - spinner.stop(`Added ${color.bold(project.package)}.`); + spinner.stop(`Added packages.`); if (existsSync(packageJsonPath)) { spinner.start(`Adding ${color.bold('lunaria')} script`); @@ -114,11 +101,11 @@ async function main() { ); } - const configFilename = `lunaria.config.${project.typed ? 'ts' : 'js'}`; + const configFilename = `lunaria.config.json`; const configFilePath = join(projectPath, configFilename); if (!existsSync(configFilePath)) { - writeFileSync(configFilePath, cleanConfigContent(project.package)); + writeFileSync(configFilePath, cleanConfigContent); p.log.message(`${color.bold(configFilename)} created at ${color.italic(configFilePath)}`); } else { p.log.warn( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d470b3c..acb21c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,9 +51,9 @@ importers: packages/core: dependencies: - c12: - specifier: ^1.5.1 - version: 1.5.1 + destr: + specifier: ^2.0.2 + version: 2.0.2 fast-glob: specifier: ^3.3.1 version: 3.3.1 @@ -2132,6 +2132,7 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.11.2: resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} @@ -2139,15 +2140,6 @@ packages: hasBin: true dev: false - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /algoliasearch@4.20.0: resolution: {integrity: sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==} dependencies: @@ -2486,24 +2478,6 @@ packages: engines: {node: '>=6'} dev: true - /c12@1.5.1: - resolution: {integrity: sha512-BWZRJgDEveT8uI+cliCwvYSSSSvb4xKoiiu5S0jaDbKBopQLQF7E+bq9xKk1pTcG+mUa3yXuFO7bD9d8Lr9Xxg==} - dependencies: - chokidar: 3.5.3 - defu: 6.1.3 - dotenv: 16.3.1 - giget: 1.1.3 - jiti: 1.21.0 - mlly: 1.4.2 - ohash: 1.1.3 - pathe: 1.1.1 - perfect-debounce: 1.0.0 - pkg-types: 1.0.3 - rc9: 2.1.1 - transitivePeerDependencies: - - supports-color - dev: false - /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -2597,11 +2571,6 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: false - /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} @@ -2693,10 +2662,6 @@ packages: color-string: 1.9.1 dev: false - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false - /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false @@ -2867,6 +2832,7 @@ packages: /defu@6.1.3: resolution: {integrity: sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ==} + dev: true /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -2927,11 +2893,6 @@ packages: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - /dset@3.1.3: resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} engines: {node: '>=4'} @@ -3307,11 +3268,6 @@ packages: micromatch: 4.0.5 pkg-dir: 4.2.0 - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - dev: false - /focus-trap@7.5.3: resolution: {integrity: sha512-7UsT/eSJcTPF0aZp73u7hBRTABz26knRRTJfoTGFCQD5mUImLIIOwWWCrtoQdmWa7dykBi6H+Cp5i3S/kvsMeA==} dependencies: @@ -3355,13 +3311,6 @@ packages: universalify: 0.1.2 dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true @@ -3421,21 +3370,6 @@ packages: get-intrinsic: 1.2.2 dev: true - /giget@1.1.3: - resolution: {integrity: sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q==} - hasBin: true - dependencies: - colorette: 2.0.20 - defu: 6.1.3 - https-proxy-agent: 7.0.2 - mri: 1.2.0 - node-fetch-native: 1.4.1 - pathe: 1.1.1 - tar: 6.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false @@ -3853,16 +3787,6 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true @@ -4217,6 +4141,7 @@ packages: /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -5027,30 +4952,10 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: false - /minisearch@6.1.0: resolution: {integrity: sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==} dev: true - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: false - /mixme@0.5.9: resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} engines: {node: '>= 8.0.0'} @@ -5060,12 +4965,6 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - /mkdist@1.3.0(typescript@5.2.2): resolution: {integrity: sha512-ZQrUvcL7LkRdzMREpDyg9AT18N9Tl5jc2qeKAUeEw0KGsgykbHbuRvysGAzTuGtwuSg0WQyNit5jh/k+Er3JEg==} hasBin: true @@ -5097,6 +4996,7 @@ packages: pathe: 1.1.1 pkg-types: 1.0.3 ufo: 1.3.1 + dev: true /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -5151,10 +5051,6 @@ packages: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} dev: false - /node-fetch-native@1.4.1: - resolution: {integrity: sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w==} - dev: false - /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} @@ -5219,10 +5115,6 @@ packages: object-keys: 1.1.1 dev: true - /ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} - dev: false - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -5407,10 +5299,6 @@ packages: /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - /perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - dev: false - /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -5442,6 +5330,7 @@ packages: jsonc-parser: 3.2.0 mlly: 1.4.2 pathe: 1.1.1 + dev: true /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} @@ -5580,14 +5469,6 @@ packages: engines: {node: '>=8'} dev: true - /rc9@2.1.1: - resolution: {integrity: sha512-lNeOl38Ws0eNxpO3+wD1I9rkHGQyj1NU1jlzv4go2CtEnEQEUfqnIvZG7W+bC/aXdJ27n5x/yUjb6RoT9tko+Q==} - dependencies: - defu: 6.1.3 - destr: 2.0.2 - flat: 5.0.2 - dev: false - /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -6396,18 +6277,6 @@ packages: streamx: 2.15.1 dev: false - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'}