From 6e4583dd29b571561dccc46a777c2cb63e348a55 Mon Sep 17 00:00:00 2001 From: Adam Matthiesen Date: Thu, 25 Jan 2024 23:01:27 -0800 Subject: [PATCH] up --- package.json | 8 +- packages/astro-ghostcms/index.ts | 118 ++++-- packages/astro-ghostcms/package.json | 16 +- .../src/api/content-api/content-api.test.ts | 84 ++++ .../schemas/authors/authors.test.ts | 146 +++++++ .../schemas/{ => authors}/authors.ts | 0 .../api/content-api/schemas/authors/index.ts | 1 + .../api/content-api/schemas/pages/index.ts | 1 + .../content-api/schemas/{ => pages}/pages.ts | 4 +- .../api/content-api/schemas/posts/index.ts | 1 + .../content-api/schemas/posts/posts.test.ts | 57 +++ .../content-api/schemas/{ => posts}/posts.ts | 4 +- .../api/content-api/schemas/settings/index.ts | 1 + .../schemas/{ => settings}/settings.ts | 0 .../src/api/content-api/schemas/tags/index.ts | 1 + .../content-api/schemas/{ => tags}/tags.ts | 0 .../api/content-api/schemas/tiers/index.ts | 1 + .../content-api/schemas/{ => tiers}/tiers.ts | 0 packages/astro-ghostcms/src/api/invariant.ts | 14 - packages/astro-ghostcms/vitest.config.ts | 15 + pnpm-lock.yaml | 397 +++++------------- vitest.workspace.json | 3 + 22 files changed, 497 insertions(+), 375 deletions(-) create mode 100644 packages/astro-ghostcms/src/api/content-api/content-api.test.ts create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.test.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => authors}/authors.ts (100%) create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/authors/index.ts create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/pages/index.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => pages}/pages.ts (94%) create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/posts/index.ts create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.test.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => posts}/posts.ts (94%) create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/settings/index.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => settings}/settings.ts (100%) create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/tags/index.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => tags}/tags.ts (100%) create mode 100644 packages/astro-ghostcms/src/api/content-api/schemas/tiers/index.ts rename packages/astro-ghostcms/src/api/content-api/schemas/{ => tiers}/tiers.ts (100%) create mode 100644 packages/astro-ghostcms/vitest.config.ts create mode 100644 vitest.workspace.json diff --git a/package.json b/package.json index 21c6e41e..8bf1e0ef 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,14 @@ "demo:dev": "pnpm --filter demo dev", "lint": "biome check .", "lint:fix": "biome check --apply .", - "base": "pnpm i --frozen-lockfile" + "base": "pnpm i --frozen-lockfile", + "test:api": "vitest run --project astro-ghostcms", + "test:api:watch": "vitest --project astro-ghostcms" }, "devDependencies": { "@biomejs/biome": "1.5.3", - "@changesets/cli": "^2.27.1" + "@changesets/cli": "^2.27.1", + "vitest": "^1.1.0", + "vitest-fetch-mock": "^0.2.2" } } diff --git a/packages/astro-ghostcms/index.ts b/packages/astro-ghostcms/index.ts index 98a9bf8c..859f8f81 100644 --- a/packages/astro-ghostcms/index.ts +++ b/packages/astro-ghostcms/index.ts @@ -55,7 +55,7 @@ const ENV = loadEnv(IC.MODE, process.cwd(), IC.PREFIXES); * @ For more information and to see the docs check * @see https://astro-ghostcms.xyz */ -export default function GhostCMS(options: UserConfig): AstroIntegration { +export default function GhostCMS(options?: UserConfig): AstroIntegration { return { name: IC.PKG, hooks: { @@ -68,28 +68,23 @@ export default function GhostCMS(options: UserConfig): AstroIntegration { // CHECK USER CONFIG AND MAKE AVAILBLE TO INTEGRATIONS logger.info("Checking Config...") - const o = UserConfigSchema.safeParse(options || {}) as SafeParseSuccess; - if (!o.success) { - const validationError = fromZodError((o as unknown as SafeParseError).error); + const GhostUserConfig = UserConfigSchema.safeParse(options || {}) as SafeParseSuccess; + if (!GhostUserConfig.success) { + const validationError = fromZodError((GhostUserConfig as unknown as SafeParseError).error); logger.error(`Config Error - ${ validationError }`); throw validationError; } - - /** INTERNAL USERCONFIG ALIAS */ - const uconf = o.data; - /** CONFIG OPTION: ROUTE INJECTION */ - const injection = uconf.disableRouteInjection; - /** CONFIG OPTION: THEME */ - const entry = uconf.theme; - /** CONFIG OPTION: CONSOLE OUTPUT */ - const logs = uconf.disableConsoleOutput; - /** SITEMAP CONFIG */ - const smconf = uconf.sitemap; - /** ROBOTS-TXT CONFIG */ - const rtxtconf = uconf.robotstxt; + const GhostConfig = GhostUserConfig.data; + const GCD = { + theme: GhostConfig.theme, + dRI: GhostConfig.disableRouteInjection, + dCO: GhostConfig.disableConsoleOutput, + SM: GhostConfig.sitemap, + RTXT: GhostConfig.robotstxt, + } // Check For ENV Variables - if(!logs) {logger.info(IC.CHECK_ENV)} + if(!GCD.dCO) {logger.info(IC.CHECK_ENV)} // CHECK FOR API KEY if(ENV.CONTENT_API_KEY === undefined){ @@ -102,72 +97,103 @@ export default function GhostCMS(options: UserConfig): AstroIntegration { throw IC.URL_MISSING; } - if(!injection){ + if(!GCD.dRI){ // THEME SELECTOR - if ( entry === IC.DT ) { - if( !logs ) { logger.info( IC.IT + IC.DT )} + if ( GCD.theme === IC.DT ) { + if( !GCD.dCO ) { logger.info( IC.IT + IC.DT )} } else { - if( !logs ) { logger.info( IC.IT + entry )} + if( !GCD.dCO ) { logger.info( IC.IT + GCD.theme )} } // INJECT ROUTES // DEFAULT PROGRAM ROUTES - if( !logs ) { logger.info( IC.IDR )} + if( !GCD.dCO ) { logger.info( IC.IDR )} - if( !logs ) { logger.info( IC.F0FR )} - injectRoute({ pattern: '/404', entrypoint: `${IC.PKG}/404.astro` }); + if( !GCD.dCO ) { logger.info( IC.F0FR )} + injectRoute({ + pattern: '/404', + entrypoint: `${IC.PKG}/404.astro` + }); - if( !logs ) { logger.info( IC.RSS )} - injectRoute({ pattern: '/rss.xml', entrypoint: `${IC.PKG}/rss.xml.ts` }); + if( !GCD.dCO ) { logger.info( IC.RSS )} + injectRoute({ + pattern: '/rss.xml', + entrypoint: `${IC.PKG}/rss.xml.ts` + }); // THEME ROUTES - if( !logs ) { logger.info( IC.ITR )} + if( !GCD.dCO ) { logger.info( IC.ITR )} - injectRoute({ pattern: '/', entrypoint: `${entry}/index.astro` }); + injectRoute({ + pattern: '/', + entrypoint: `${GCD.theme}/index.astro` + }); - injectRoute({ pattern: '/[slug]', entrypoint: `${entry}/[slug].astro` }); + injectRoute({ + pattern: '/[slug]', + entrypoint: `${GCD.theme}/[slug].astro` + }); - injectRoute({ pattern: '/tags', entrypoint: `${entry}/tags.astro` }); + injectRoute({ + pattern: '/tags', + entrypoint: `${GCD.theme}/tags.astro` + }); - injectRoute({ pattern: '/authors', entrypoint: `${entry}/authors.astro` }); + injectRoute({ + pattern: '/authors', + entrypoint: `${GCD.theme}/authors.astro` + }); - injectRoute({ pattern: '/tag/[slug]', entrypoint: `${entry}/tag/[slug].astro` }); + injectRoute({ + pattern: '/tag/[slug]', + entrypoint: `${GCD.theme}/tag/[slug].astro` + }); - injectRoute({ pattern: '/author/[slug]', entrypoint: `${entry}/author/[slug].astro` }); + injectRoute({ + pattern: '/author/[slug]', + entrypoint: `${GCD.theme}/author/[slug].astro` + }); - injectRoute({ pattern: '/archives/[...page]', entrypoint: `${entry}/archives/[...page].astro` }); + injectRoute({ + pattern: '/archives/[...page]', + entrypoint: `${GCD.theme}/archives/[...page].astro` + }); - } else { if( !logs ) { logger.info( IC.IRD )} } + } else { if( !GCD.dCO ) { logger.info( IC.IRD )} } // IMPORT INTEGRATIONS & INTEGRATION ROUTES const integrations = [...config.integrations]; // IMPORT INTEGRATION: @ASTROJS/SITEMAP - if( !logs ) { logger.info( `${IC.CF}@astrojs/sitemap` )} + if( !GCD.dCO ) { logger.info( `${IC.CF}@astrojs/sitemap` )} if (!integrations.find(({ name }) => name === '@astrojs/sitemap' )) { - if( !logs ) { logger.info( `${IC.II}@astrojs/sitemap` )} - integrations.push(ghostSitemap(smconf)); + if( !GCD.dCO ) { logger.info( `${IC.II}@astrojs/sitemap` )} + integrations.push(ghostSitemap(GCD.SM)); - } else { if( !logs ) { logger.info( `${IC.AIbU}@astrojs/sitemap` )} + } else { if( !GCD.dCO ) { logger.info( `${IC.AIbU}@astrojs/sitemap` )} }; // IMPORT INTEGRATION: ASTRO-ROBOTS-TXT - if( !logs ) { logger.info( `${IC.CF}astro-robots-txt` )} + if( !GCD.dCO ) { logger.info( `${IC.CF}astro-robots-txt` )} if (!integrations.find(({ name }) => name === 'astro-robots-txt' )) { - if( !logs ) { logger.info( `${IC.II}astro-robots-txt` )} - integrations.push(ghostRobots(rtxtconf)); + if( !GCD.dCO ) { logger.info( `${IC.II}astro-robots-txt` )} + integrations.push(ghostRobots(GCD.RTXT)); } else { - if( !logs ) { logger.info( `${IC.AIbU}astro-robots-txt` )} + if( !GCD.dCO ) { logger.info( `${IC.AIbU}astro-robots-txt` )} }; // FINAL STEP TO KEEP INTEGRATION LIVE try { updateConfig( { // UPDATE ASTRO CONFIG WITH INTEGRATED INTEGRATIONS - integrations: [ ghostSitemap( smconf ), ghostRobots( rtxtconf ) ], + integrations: [ ghostSitemap( GCD.SM ), ghostRobots( GCD.RTXT ) ], // LOAD VITE AND SETUP viteGhostCMS Configs - vite: { plugins: [ viteGhostCMS( uconf, config ) ]}, + vite: { + plugins: [ + viteGhostCMS( GhostConfig, config ) + ] + }, }) } catch ( e ) { logger.error( e as string ); throw e; diff --git a/packages/astro-ghostcms/package.json b/packages/astro-ghostcms/package.json index 95e2e716..4807ce56 100644 --- a/packages/astro-ghostcms/package.json +++ b/packages/astro-ghostcms/package.json @@ -1,7 +1,7 @@ { "name": "@matthiesenxyz/astro-ghostcms", "description": "Astro GhostCMS integration to allow easier importing of GhostCMS Content", - "version": "3.1.3", + "version": "3.1.4", "homepage": "https://astro-ghostcms.xyz/", "type": "module", "license": "MIT", @@ -53,12 +53,12 @@ "./types": "./types.ts" }, "scripts": { - "dev": "astro dev", - "build": "astro build", - "typecheck": "astro check && tsc --noEmit", - "preview": "astro preview", - "format": "prettier --write .", - "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint ." + "test": "vitest run", + "test:watch": "vitest", + "test:coverage": "vitest run --coverage", + "test:integration": "vitest run -c ./vitest.config.integration.ts", + "test:integration:watch": "vitest -c ./vitest.config.integration.ts", + "test-ci": "vitest run --coverage.enabled --coverage.reporter='text-summary'" }, "peerDependencies": { "astro": "^4.2.3" @@ -74,10 +74,8 @@ "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-astro": "^0.31.3", - "jiti": "^1.21.0", "prettier": "^3.2.4", "prettier-plugin-astro": "^0.13.0", - "tsup": "^8.0.0", "typescript": "^5.3.3", "vitest": "^1.1.0", "vitest-fetch-mock": "^0.2.2" diff --git a/packages/astro-ghostcms/src/api/content-api/content-api.test.ts b/packages/astro-ghostcms/src/api/content-api/content-api.test.ts new file mode 100644 index 00000000..9cba5089 --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/content-api.test.ts @@ -0,0 +1,84 @@ +import { assert, beforeEach, describe, expect, test } from "vitest"; + +import { TSGhostContentAPI } from "./content-api"; + +describe("content-api", () => { + let api: TSGhostContentAPI; + beforeEach(() => { + api = new TSGhostContentAPI("https://ghost.org", "59d4bf56c73c04a18c867dc3ba", "v5.0"); + }); + + test("content-api", () => { + expect(api).toBeDefined(); + }); + + test("content-api shouldn't instantiate with an incorrect url", () => { + assert.throws(() => { + const api = new TSGhostContentAPI("ghost.org", "59d4bf56c73c04a18c867dc3ba", "v5.0"); + api.settings; + }); + }); + + test("content-api shouldn't instantiate with an incorrect key", () => { + assert.throws(() => { + const api = new TSGhostContentAPI("https://ghost.org", "a", "v5.0"); + api.settings; + }); + }); + + test("content-api shouldn't instantiate with an incorrect version", () => { + assert.throws(() => { + const api = new TSGhostContentAPI( + "https://ghost.org", + "1efedd9db174adee2d23d982:4b74dca0219bad629852191af326a45037346c2231240e0f7aec1f9371cc14e8", + // @ts-expect-error + "v4.0" + ); + api.settings; + }); + }); + + test("content-api.posts", () => { + expect(api.posts).toBeDefined(); + expect(api.posts.browse).toBeDefined(); + expect(api.posts.read).toBeDefined(); + }); + + test("content-api.pages", () => { + expect(api.pages).toBeDefined(); + expect(api.pages.browse).toBeDefined(); + expect(api.pages.read).toBeDefined(); + }); + + test("content-api.tags", () => { + expect(api.tags).toBeDefined(); + expect(api.tags.browse).toBeDefined(); + expect(api.tags.read).toBeDefined(); + }); + + test("content-api.tiers", () => { + expect(api.tiers).toBeDefined(); + expect(api.tiers.browse).toBeDefined(); + expect(api.tiers.read).toBeDefined(); + }); + + test("content-api.authors", () => { + expect(api.authors).toBeDefined(); + expect(api.authors.browse).toBeDefined(); + expect(api.authors.read).toBeDefined(); + // @ts-expect-error + expect(api.authors.add).toBeUndefined(); + // @ts-expect-error + expect(api.authors.edit).toBeUndefined(); + expect(api.authors).toBeDefined(); + }); + + test("content-api.settings", () => { + expect(api.settings).toBeDefined(); + expect(api.settings.fetch).toBeDefined(); + // @ts-expect-error + expect(api.settings.read).toBeUndefined(); + // @ts-expect-error + expect(api.settings.browse).toBeUndefined(); + }); +}); \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.test.ts b/packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.test.ts new file mode 100644 index 00000000..64412dee --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.test.ts @@ -0,0 +1,146 @@ +import createFetchMock from "vitest-fetch-mock"; +import { afterEach, beforeEach, describe, expect, test, vi } from "vitest"; + +import { TSGhostContentAPI } from "../../content-api"; + +const fetchMocker = createFetchMock(vi); + +describe("authors api .browse() Args Type-safety", () => { + const url = process.env.VITE_GHOST_URL || "https://my-ghost-blog.com"; + const key = process.env.VITE_GHOST_CONTENT_API_KEY || "59d4bf56c73c04a18c867dc3ba"; + const api = new TSGhostContentAPI(url, key, "v5.0"); + test(".browse() params shouldnt accept invalid params", () => { + // @ts-expect-error - shouldnt accept invalid params + const browse = api.authors.browse({ pp: 2 }); + expect(browse.getParams().browseParams).toStrictEqual({}); + }); + + test(".browse() 'order' params should ony accept fields values", () => { + // @ts-expect-error - order should ony contain field + expect(() => api.authors.browse({ order: "foo ASC" })).toThrow(); + // valid + expect(api.authors.browse({ order: "name ASC" }).getParams().browseParams).toStrictEqual({ + order: "name ASC", + }); + expect(api.authors.browse({ order: "name ASC,slug DESC" }).getParams().browseParams).toStrictEqual({ + order: "name ASC,slug DESC", + }); + expect( + api.authors.browse({ order: "name ASC,slug DESC,location ASC" }).getParams().browseParams + ).toStrictEqual({ + order: "name ASC,slug DESC,location ASC", + }); + // @ts-expect-error - order should ony contain field (There is a typo in location) + expect(() => api.authors.browse({ order: "name ASC,slug DESC,locaton ASC" })).toThrow(); + }); + + test(".browse() 'filter' params should ony accept valid field", () => { + expect(() => + api.authors.browse({ + // @ts-expect-error - order should ony contain field + filter: "foo:bar", + }) + ).toThrow(); + expect( + api.authors + .browse({ + filter: "name:bar", + }) + .getParams().browseParams + ).toStrictEqual({ + filter: "name:bar", + }); + expect( + api.authors + .browse({ + filter: "name:bar+slug:-test", + }) + .getParams().browseParams + ).toStrictEqual({ + filter: "name:bar+slug:-test", + }); + }); + + test(".browse 'fields' argument should ony accept valid fields", () => { + expect( + api.authors + .browse() + .fields({ + // @ts-expect-error - order should ony contain field + foo: true, + }) + .getOutputFields() + ).toEqual([]); + + expect(api.authors.browse().fields({ location: true }).getOutputFields()).toEqual(["location"]); + expect(api.authors.browse().fields({ name: true, website: true }).getOutputFields()).toEqual([ + "name", + "website", + ]); + }); +}); + +describe("authors resource mocked", () => { + let api: TSGhostContentAPI; + + beforeEach(() => { + api = new TSGhostContentAPI("https://my-ghost-blog.com", "59d4bf56c73c04a18c867dc3ba", "v5.0"); + fetchMocker.enableMocks(); + }); + afterEach(() => { + vi.restoreAllMocks(); + }); + + test("aouthors should be fetched correctly", async () => { + const authors = api.authors; + expect(authors).not.toBeUndefined(); + const browseQuery = authors + .browse({ + page: 2, + }) + .fields({ + name: true, + id: true, + }); + expect(browseQuery).not.toBeUndefined(); + expect(browseQuery.getOutputFields()).toStrictEqual(["name", "id"]); + + fetchMocker.doMockOnce( + JSON.stringify({ + authors: [ + { + name: "foo", + id: "eaoizdjoa1321123", + }, + ], + meta: { + pagination: { + page: 1, + limit: 15, + pages: 1, + total: 1, + next: null, + prev: null, + }, + }, + }) + ); + const result = await browseQuery.fetch(); + expect(fetchMocker).toHaveBeenCalledTimes(1); + expect(fetchMocker).toHaveBeenCalledWith( + "https://my-ghost-blog.com/ghost/api/content/authors/?page=2&fields=name%2Cid&key=59d4bf56c73c04a18c867dc3ba", + { + headers: { + "Content-Type": "application/json", + "Accept-Version": "v5.0", + }, + } + ); + expect(result).not.toBeUndefined(); + if (result.success) { + expect(result.data.length).toBe(1); + expect(result.data[0].name).toBe("foo"); + expect(result.data[0].id).toBe("eaoizdjoa1321123"); + } + }); +}); \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/authors.ts b/packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.ts similarity index 100% rename from packages/astro-ghostcms/src/api/content-api/schemas/authors.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/authors/authors.ts diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/authors/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/authors/index.ts new file mode 100644 index 00000000..186002e0 --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/authors/index.ts @@ -0,0 +1 @@ +export * from './authors'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/pages/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/pages/index.ts new file mode 100644 index 00000000..a75a18fb --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/pages/index.ts @@ -0,0 +1 @@ +export * from './pages'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/pages.ts b/packages/astro-ghostcms/src/api/content-api/schemas/pages/pages.ts similarity index 94% rename from packages/astro-ghostcms/src/api/content-api/schemas/pages.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/pages/pages.ts index a6bc608a..d6f33018 100644 --- a/packages/astro-ghostcms/src/api/content-api/schemas/pages.ts +++ b/packages/astro-ghostcms/src/api/content-api/schemas/pages/pages.ts @@ -7,8 +7,8 @@ import { ghostVisibilitySchema, } from "@ts-ghost/core-api"; -import { authorsSchema } from "./authors"; -import { tagsSchema } from "./tags"; +import { authorsSchema } from "../authors"; +import { tagsSchema } from "../tags"; const postsAuthorSchema = authorsSchema.extend({ url: z.string().nullish(), diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/posts/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/posts/index.ts new file mode 100644 index 00000000..537f3a05 --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/posts/index.ts @@ -0,0 +1 @@ +export * from './posts'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.test.ts b/packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.test.ts new file mode 100644 index 00000000..1c75665d --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.test.ts @@ -0,0 +1,57 @@ +import { describe, expect, test } from "vitest"; + +import { TSGhostContentAPI } from "../../content-api"; +import type { Post } from "./posts"; + +const url = process.env.VITE_GHOST_URL || "https://my-ghost-blog.com"; +const key = process.env.VITE_GHOST_CONTENT_API_KEY || "59d4bf56c73c04a18c867dc3ba"; + +describe("posts api .browse() Args Type-safety", () => { + const api = new TSGhostContentAPI(url, key, "v5.0"); + test(".browse() params shouldnt accept invalid params", () => { + // @ts-expect-error - shouldnt accept invalid params + const browse = api.posts.browse({ pp: 2 }); + expect(browse.getParams().browseParams).toStrictEqual({}); + + const outputFields = { + slug: true, + title: true, + // @ts-expect-error - shouldnt accept invalid params + foo: true, + } satisfies { [k in keyof Post]?: true | undefined }; + + // biome-ignore lint/style/useConst: +let test = api.posts + .browse() + // @ts-expect-error - shouldnt accept invalid params + .fields(outputFields); + expect(test.getOutputFields()).toEqual(["slug", "title"]); + + const fields = ["slug", "title", "foo"] as const; + const unknownOriginFields = fields.reduce((acc, k) => { + acc[k as keyof Post] = true; + return acc; + }, {} as { [k in keyof Post]?: true | undefined }); + const result = api.posts.browse().fields(unknownOriginFields); + expect(result.getOutputFields()).toEqual(["slug", "title"]); + }); + test(".browse() params, output fields declare const", () => { + const outputFields = { + slug: true, + title: true, + } satisfies { [k in keyof Post]?: true | undefined }; + + // biome-ignore lint/style/useConst: +let test = api.posts.browse().fields(outputFields); + expect(test.getOutputFields()).toEqual(["slug", "title"]); + + // @ts-expect-error - shouldnt accept invalid params + expect(() => api.posts.browse({ filter: "slugg:test" })).toThrow(); + // @ts-expect-error - shouldnt accept invalid params + expect(() => api.posts.browse({ filter: "slug:test,foo:-[bar,baz]" })).toThrow(); + expect(api.posts.browse({ filter: "slug:test,tags:-[bar,baz]" })).toBeDefined(); + expect(api.posts.browse({ filter: "slug:test,tags:[bar,baz]" })).toBeDefined(); + // @ts-expect-error - shouldnt accept invalid params + expect(() => api.posts.browse({ filter: "slug:test,food:-[bar,baz]" })).toThrow(); + }); +}); \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/posts.ts b/packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.ts similarity index 94% rename from packages/astro-ghostcms/src/api/content-api/schemas/posts.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.ts index e867989c..37205569 100644 --- a/packages/astro-ghostcms/src/api/content-api/schemas/posts.ts +++ b/packages/astro-ghostcms/src/api/content-api/schemas/posts/posts.ts @@ -7,8 +7,8 @@ import { ghostVisibilitySchema, } from "@ts-ghost/core-api"; -import { authorsSchema } from "./authors"; -import { tagsSchema } from "./tags"; +import { authorsSchema } from "../authors"; +import { tagsSchema } from "../tags"; const postsAuthorSchema = authorsSchema.extend({ url: z.string().nullish(), diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/settings/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/settings/index.ts new file mode 100644 index 00000000..a397ac1f --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/settings/index.ts @@ -0,0 +1 @@ +export * from './settings'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/settings.ts b/packages/astro-ghostcms/src/api/content-api/schemas/settings/settings.ts similarity index 100% rename from packages/astro-ghostcms/src/api/content-api/schemas/settings.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/settings/settings.ts diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/tags/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/tags/index.ts new file mode 100644 index 00000000..15f0b350 --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/tags/index.ts @@ -0,0 +1 @@ +export * from './tags'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/tags.ts b/packages/astro-ghostcms/src/api/content-api/schemas/tags/tags.ts similarity index 100% rename from packages/astro-ghostcms/src/api/content-api/schemas/tags.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/tags/tags.ts diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/tiers/index.ts b/packages/astro-ghostcms/src/api/content-api/schemas/tiers/index.ts new file mode 100644 index 00000000..14144f16 --- /dev/null +++ b/packages/astro-ghostcms/src/api/content-api/schemas/tiers/index.ts @@ -0,0 +1 @@ +export * from './tiers'; \ No newline at end of file diff --git a/packages/astro-ghostcms/src/api/content-api/schemas/tiers.ts b/packages/astro-ghostcms/src/api/content-api/schemas/tiers/tiers.ts similarity index 100% rename from packages/astro-ghostcms/src/api/content-api/schemas/tiers.ts rename to packages/astro-ghostcms/src/api/content-api/schemas/tiers/tiers.ts diff --git a/packages/astro-ghostcms/src/api/invariant.ts b/packages/astro-ghostcms/src/api/invariant.ts index fcafba2e..2c71611b 100644 --- a/packages/astro-ghostcms/src/api/invariant.ts +++ b/packages/astro-ghostcms/src/api/invariant.ts @@ -1,9 +1,6 @@ const isProduction: boolean = process.env.NODE_ENV === 'production'; const prefix: string = 'Invariant failed'; -// Throw an error if the condition fails -// Strip out error messages for production -// > Not providing an inline default argument for message as the result is smaller /** Throw an error if the condition is false * @example * import { invariant } from '@matthiesenxyz/astro-ghostcms/api'; @@ -12,28 +9,17 @@ const prefix: string = 'Invariant failed'; export function invariant( // biome-ignore lint/suspicious/noExplicitAny: we know what we are doing condition: any, - // Can provide a string, or a function that returns a string for cases where - // the message takes a fair amount of effort to compute message?: string | (() => string), ): asserts condition { if (condition) { return; } - // Condition not passed - - // In production we strip the message but still throw if (isProduction) { throw new Error(prefix); } - // When not in production we allow the message to pass through - // *This block will be removed in production builds* - const provided: string | undefined = typeof message === 'function' ? message() : message; - // Options: - // 1. message provided: `${prefix}: ${provided}` - // 2. message not provided: prefix const value: string = provided ? `${prefix}: ${provided}` : prefix; throw new Error(value); } \ No newline at end of file diff --git a/packages/astro-ghostcms/vitest.config.ts b/packages/astro-ghostcms/vitest.config.ts new file mode 100644 index 00000000..8f3c30e3 --- /dev/null +++ b/packages/astro-ghostcms/vitest.config.ts @@ -0,0 +1,15 @@ +/// +/// + +import { defineProject } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineProject({ + plugins: [tsconfigPaths()], + test: { + globals: true, + include: ["./**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], + watchExclude: [".*\\/node_modules\\/.*", ".*\\/build\\/.*"], + exclude: ["node_modules", "dist", ".idea", ".git", ".cache"], + }, +}); \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8334255..701c781f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,12 @@ importers: '@changesets/cli': specifier: ^2.27.1 version: 2.27.1 + vitest: + specifier: ^1.1.0 + version: 1.2.1 + vitest-fetch-mock: + specifier: ^0.2.2 + version: 0.2.2(vitest@1.2.1) demo: dependencies: @@ -91,18 +97,12 @@ importers: eslint-plugin-astro: specifier: ^0.31.3 version: 0.31.3(eslint@8.56.0) - jiti: - specifier: ^1.21.0 - version: 1.21.0 prettier: specifier: ^3.2.4 version: 3.2.4 prettier-plugin-astro: specifier: ^0.13.0 version: 0.13.0 - tsup: - specifier: ^8.0.0 - version: 8.0.1(typescript@5.3.3) typescript: specifier: ^5.3.3 version: 5.3.3 @@ -1349,18 +1349,6 @@ packages: dev: false optional: true - /@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.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true - /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1375,14 +1363,17 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 + dev: false /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + dev: false /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: false /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -1392,6 +1383,7 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: false /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1505,13 +1497,6 @@ packages: dev: false optional: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: true - optional: true - /@pkgr/core@0.1.1: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -2052,6 +2037,7 @@ 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==} @@ -2073,10 +2059,7 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + dev: false /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -2593,16 +2576,6 @@ packages: ieee754: 1.2.1 dev: false - /bundle-require@4.0.2(esbuild@0.19.12): - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.17' - dependencies: - esbuild: 0.19.12 - load-tsconfig: 0.2.5 - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2823,11 +2796,6 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} dev: false @@ -3076,6 +3044,7 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false /electron-to-chromium@1.4.642: resolution: {integrity: sha512-M4+u22ZJGpk4RY7tne6W+APkZhnnhmAH48FNl8iEFK2lEgob+U5rUQsIqQhvAwCXYpfd3H20pHK/ENsCvwTbsA==} @@ -3096,6 +3065,7 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -3422,21 +3392,6 @@ packages: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} dev: false - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -3593,14 +3548,6 @@ packages: is-callable: 1.2.7 dev: true - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - dev: true - /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} requiresBuild: true @@ -3680,11 +3627,6 @@ packages: hasown: 2.0.0 dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - /get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3720,18 +3662,6 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - dev: true - /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -4122,11 +4052,6 @@ packages: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} @@ -4148,7 +4073,6 @@ packages: /immutable@4.3.4: resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} - dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -4372,11 +4296,6 @@ packages: call-bind: 1.0.5 dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4439,29 +4358,10 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true - /jose@5.2.0: resolution: {integrity: sha512-oW3PCnvyrcm1HMvGTzqjxxfnEs9EoFOFWi2HsEGhlFVOXxTE3K9GKWVMFoFw06yPUqwpvEWic1BmtUZBI/tIjw==} dev: false - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4546,20 +4446,10 @@ packages: type-check: 0.4.0 dev: true - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true - /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /load-yaml-file@0.2.0: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} @@ -4592,10 +4482,6 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true - /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -4618,11 +4504,6 @@ packages: get-func-name: 2.0.2 dev: true - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: true - /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: @@ -5270,6 +5151,7 @@ packages: /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + dev: false /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} @@ -5315,11 +5197,6 @@ packages: dev: false optional: true - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: true - /mixme@0.5.10: resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} engines: {node: '>= 8.0.0'} @@ -5354,14 +5231,6 @@ packages: /muggle-string@0.3.1: resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5443,13 +5312,6 @@ packages: resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} dev: false - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - /npm-run-path@5.2.0: resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5462,11 +5324,6 @@ packages: boolbase: 1.0.0 dev: false - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true @@ -5496,6 +5353,7 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: false /onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} @@ -5680,14 +5538,6 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - dev: true - /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: false @@ -5724,11 +5574,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -5743,22 +5588,6 @@ packages: pathe: 1.1.2 dev: true - /postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.0.0 - yaml: 2.3.4 - dev: true - /postcss-nested@6.0.1(postcss@8.4.33): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -6251,7 +6080,6 @@ packages: chokidar: 3.5.3 immutable: 4.3.4 source-map-js: 1.0.2 - dev: false /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -6478,13 +6306,6 @@ packages: engines: {node: '>= 8'} dev: false - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - dependencies: - whatwg-url: 7.1.0 - dev: true - /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false @@ -6574,6 +6395,7 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: false /string-width@6.1.0: resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} @@ -6642,6 +6464,7 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: false /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} @@ -6652,11 +6475,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -6702,20 +6520,6 @@ packages: inline-style-parser: 0.2.2 dev: false - /sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 10.3.10 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - /suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} dependencies: @@ -6799,19 +6603,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /tinybench@2.6.0: resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true @@ -6848,17 +6639,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - dependencies: - punycode: 2.3.1 - dev: true - - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true - /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -6881,10 +6661,6 @@ packages: typescript: 5.3.3 dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - /tsconfck@3.0.1(typescript@5.3.3): resolution: {integrity: sha512-7ppiBlF3UEddCLeI1JRx5m2Ryq+xk4JrZuq4EuYXykipebaq1dV0Fhgr1hb7CkmHt32QSgOZlcqVLEtHBG4/mg==} engines: {node: ^18 || >=20} @@ -6901,45 +6677,6 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@8.0.1(typescript@5.3.3): - resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' - peerDependenciesMeta: - '@microsoft/api-extractor': - optional: true - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - dependencies: - bundle-require: 4.0.2(esbuild@0.19.12) - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.19.12 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 4.0.2 - resolve-from: 5.0.0 - rollup: 4.9.6 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tree-kill: 1.2.2 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true - /tty-table@4.2.3: resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} engines: {node: '>=8.0.0'} @@ -7278,6 +7015,27 @@ packages: vfile-message: 4.0.2 dev: false + /vite-node@1.2.1: + resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.0.12(sass@1.70.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-node@1.2.1(@types/node@20.11.6): resolution: {integrity: sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -7385,7 +7143,6 @@ packages: sass: 1.70.0 optionalDependencies: fsevents: 2.3.3 - dev: false /vitefu@0.2.5(vite@5.0.12): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} @@ -7405,11 +7162,67 @@ packages: vitest: '>=0.16.0' dependencies: cross-fetch: 3.1.8 - vitest: 1.2.1(@types/node@20.11.6) + vitest: 1.2.1 transitivePeerDependencies: - encoding dev: true + /vitest@1.2.1: + resolution: {integrity: sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': ^1.0.0 + '@vitest/ui': ^1.0.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@vitest/expect': 1.2.1 + '@vitest/runner': 1.2.1 + '@vitest/snapshot': 1.2.1 + '@vitest/spy': 1.2.1 + '@vitest/utils': 1.2.1 + acorn-walk: 8.3.2 + cac: 6.7.14 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.5 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 1.3.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.0.12(sass@1.70.0) + vite-node: 1.2.1 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vitest@1.2.1(@types/node@20.11.6): resolution: {integrity: sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -7606,10 +7419,6 @@ packages: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: true - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true - /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -7617,14 +7426,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: true - /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: @@ -7724,6 +7525,7 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: false /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -7747,11 +7549,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - /yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} diff --git a/vitest.workspace.json b/vitest.workspace.json new file mode 100644 index 00000000..a7ed6e93 --- /dev/null +++ b/vitest.workspace.json @@ -0,0 +1,3 @@ +[ + "packages/*" +] \ No newline at end of file