From 1700c9ef24b814b50059bce5087b11fe54bbd0a7 Mon Sep 17 00:00:00 2001 From: Alec Chernicki Date: Wed, 27 Dec 2023 18:09:10 -0500 Subject: [PATCH] Studio debounce (#158) --- .editorconfig | 12 + .vscode/settings.json | 3 + apps/documentation/components/disallowed.svg | 21 + apps/documentation/components/subtext.tsx | 16 + apps/documentation/logo.tsx | 34 -- apps/documentation/next.config.js | 5 +- apps/documentation/package.json | 8 +- apps/documentation/pages/_app.tsx | 23 + apps/documentation/pages/_meta.json | 18 +- apps/documentation/pages/about.mdx | 3 - apps/documentation/pages/checks.mdx | 5 - apps/documentation/pages/checks/_meta.json | 6 - apps/documentation/pages/checks/examples.mdx | 0 .../pages/checks/sharing-checks.mdx | 28 -- apps/documentation/pages/constraints.mdx | 3 - apps/documentation/pages/docs/_meta.json | 25 + .../pages/{reference => docs/api}/checks.mdx | 423 ++++++++++------ .../{reference => docs/api}/configuration.mdx | 19 +- .../{reference => docs/api}/constraints.mdx | 19 +- apps/documentation/pages/docs/checks.mdx | 20 + .../pages/docs/checks/_meta.json | 6 + .../checks/creating-checks.mdx} | 16 +- .../pages/docs/checks/organizing-checks.mdx | 7 + .../pages/docs/checks/recipes.mdx | 217 ++++++++ .../{ => docs}/checks/testing-checks.mdx | 49 +- .../pages/docs/ci/github-actions.mdx | 140 ++++++ .../documentation/pages/docs/ci/gitlab-ci.mdx | 79 +++ apps/documentation/pages/docs/cli.mdx | 126 +++++ apps/documentation/pages/docs/codeowners.mdx | 10 + apps/documentation/pages/docs/constraints.mdx | 48 ++ .../pages/docs/constraints/recipes.mdx | 58 +++ .../pages/docs/getting-started.mdx | 165 +++++++ .../documentation/pages/docs/installation.mdx | 57 +++ apps/documentation/pages/docs/overview.mdx | 71 +++ apps/documentation/pages/docs/sharing.mdx | 45 ++ apps/documentation/pages/getting-started.mdx | 48 -- apps/documentation/pages/globals.css | 2 + apps/documentation/pages/index.mdx | 64 --- apps/documentation/pages/installation.mdx | 27 - apps/documentation/postcss.config.js | 6 + .../public/disallow-constraint.png | Bin 0 -> 244668 bytes .../public/disallowed-constraint.svg | 21 + apps/documentation/tailwind.config.js | 13 + apps/documentation/theme.config.tsx | 11 +- apps/studio/src/app/globals.css | 8 + apps/studio/src/app/last-update-time.tsx | 14 +- apps/workshop/tailwind.config.js | 2 +- .../src/dev-peer-dependency-range.ts | 16 +- .../src/ensure-readme.ts | 14 +- .../src/multiple-dependency-types.ts | 14 +- .../src/no-external-mismatch.ts | 24 +- .../src/respository-field.ts | 24 +- .../src/sorted-dependencies.ts | 10 +- .../src/valid-package-name.ts | 8 +- .../test/sorted-dependencies.test.ts | 2 +- .../conformance/data-conformance/src/json.ts | 14 +- .../src/create-test-check.ts | 16 +- .../utils-conformance/src/define-check.ts | 4 +- .../src/get-conformance-results.test.ts | 6 +- .../src/get-conformance-results.ts | 12 +- .../utils-conformance/src/run-fixes.test.ts | 8 +- .../utils-conformance/src/run-fixes.ts | 6 +- packages/shared/ui-core/package.json | 18 +- packages/shared/ui-core/src/index.ts | 2 + packages/shared/ui-core/src/logo.tsx | 4 +- .../shared/ui-core/src/word-logo-full.tsx | 75 +++ packages/shared/ui-core/src/word-logo.tsx | 63 +++ packages/shared/ui-design-system/package.json | 26 +- packages/shared/utils-core/src/constants.ts | 12 +- pnpm-lock.yaml | 464 ++++++++++++++---- tooling/config-tailwind/globals.css | 118 +++-- tooling/config-tailwind/tailwind.config.js | 4 - 72 files changed, 2233 insertions(+), 732 deletions(-) create mode 100644 .editorconfig create mode 100644 .vscode/settings.json create mode 100644 apps/documentation/components/disallowed.svg create mode 100644 apps/documentation/components/subtext.tsx delete mode 100644 apps/documentation/logo.tsx create mode 100644 apps/documentation/pages/_app.tsx delete mode 100644 apps/documentation/pages/about.mdx delete mode 100644 apps/documentation/pages/checks.mdx delete mode 100644 apps/documentation/pages/checks/_meta.json delete mode 100644 apps/documentation/pages/checks/examples.mdx delete mode 100644 apps/documentation/pages/checks/sharing-checks.mdx delete mode 100644 apps/documentation/pages/constraints.mdx create mode 100644 apps/documentation/pages/docs/_meta.json rename apps/documentation/pages/{reference => docs/api}/checks.mdx (58%) rename apps/documentation/pages/{reference => docs/api}/configuration.mdx (91%) rename apps/documentation/pages/{reference => docs/api}/constraints.mdx (72%) create mode 100644 apps/documentation/pages/docs/checks.mdx create mode 100644 apps/documentation/pages/docs/checks/_meta.json rename apps/documentation/pages/{checks/building-checks.mdx => docs/checks/creating-checks.mdx} (90%) create mode 100644 apps/documentation/pages/docs/checks/organizing-checks.mdx create mode 100644 apps/documentation/pages/docs/checks/recipes.mdx rename apps/documentation/pages/{ => docs}/checks/testing-checks.mdx (73%) create mode 100644 apps/documentation/pages/docs/ci/github-actions.mdx create mode 100644 apps/documentation/pages/docs/ci/gitlab-ci.mdx create mode 100644 apps/documentation/pages/docs/cli.mdx create mode 100644 apps/documentation/pages/docs/codeowners.mdx create mode 100644 apps/documentation/pages/docs/constraints.mdx create mode 100644 apps/documentation/pages/docs/constraints/recipes.mdx create mode 100644 apps/documentation/pages/docs/getting-started.mdx create mode 100644 apps/documentation/pages/docs/installation.mdx create mode 100644 apps/documentation/pages/docs/overview.mdx create mode 100644 apps/documentation/pages/docs/sharing.mdx delete mode 100644 apps/documentation/pages/getting-started.mdx create mode 100644 apps/documentation/pages/globals.css delete mode 100644 apps/documentation/pages/installation.mdx create mode 100644 apps/documentation/postcss.config.js create mode 100644 apps/documentation/public/disallow-constraint.png create mode 100644 apps/documentation/public/disallowed-constraint.svg create mode 100644 apps/documentation/tailwind.config.js create mode 100644 packages/shared/ui-core/src/word-logo-full.tsx create mode 100644 packages/shared/ui-core/src/word-logo.tsx diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..4039ff11 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..25fa6215 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/apps/documentation/components/disallowed.svg b/apps/documentation/components/disallowed.svg new file mode 100644 index 00000000..bad2a6e0 --- /dev/null +++ b/apps/documentation/components/disallowed.svg @@ -0,0 +1,21 @@ + + + + + + + + ["app", "high-availability"]["utility"]["data"]["config"]["config"]["utility", "beta"] \ No newline at end of file diff --git a/apps/documentation/components/subtext.tsx b/apps/documentation/components/subtext.tsx new file mode 100644 index 00000000..29693b78 --- /dev/null +++ b/apps/documentation/components/subtext.tsx @@ -0,0 +1,16 @@ +export function Subtext({ + children, + requirementLevel = 'optional', +}: { + children?: React.ReactNode; + requirementLevel?: 'optional' | 'required'; +}) { + return ( +
+ + {requirementLevel} + + {children} +
+ ); +} diff --git a/apps/documentation/logo.tsx b/apps/documentation/logo.tsx deleted file mode 100644 index c60f09bc..00000000 --- a/apps/documentation/logo.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client'; - -export function Logo(props: JSX.IntrinsicElements['svg']) { - return ( - - - - - - - - - - - - ); -} diff --git a/apps/documentation/next.config.js b/apps/documentation/next.config.js index adf6ca9f..bfc3331f 100644 --- a/apps/documentation/next.config.js +++ b/apps/documentation/next.config.js @@ -1,7 +1,10 @@ const withNextra = require('nextra')({ theme: 'nextra-theme-docs', themeConfig: './theme.config.tsx', - transpilePackages: ['@commonalityco/ui-design-system'], + transpilePackages: [ + '@commonalityco/ui-design-system', + '@commonalityco/ui-core', + ], }); module.exports = withNextra(); diff --git a/apps/documentation/package.json b/apps/documentation/package.json index 8ecabd15..5ee0f4ba 100644 --- a/apps/documentation/package.json +++ b/apps/documentation/package.json @@ -18,17 +18,21 @@ }, "homepage": "https://github.com/shuding/nextra-docs-template#readme", "dependencies": { + "@commonalityco/ui-core": "workspace:*", "@commonalityco/ui-design-system": "workspace:*", - "next": "^13.0.6", + "next": "^14.0.4", "nextra": "latest", "nextra-theme-docs": "latest", "react": "^18.2.0", "react-dom": "^18.2.0", - "tailwindcss": "^3.3.3" + "sharp": "^0.33.1" }, "devDependencies": { "@commonalityco/config-tailwind": "workspace:*", "@types/node": "18.11.10", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.30", + "tailwindcss": "^3.4.0", "typescript": "^4.9.3" } } diff --git a/apps/documentation/pages/_app.tsx b/apps/documentation/pages/_app.tsx new file mode 100644 index 00000000..b9ef927c --- /dev/null +++ b/apps/documentation/pages/_app.tsx @@ -0,0 +1,23 @@ +import './globals.css'; +import type { AppProps } from 'next/app'; +import { Inter, Fira_Code } from 'next/font/google'; + +export const inter = Inter({ + subsets: ['latin'], + variable: '--font-inter', +}); + +export const firaCode = Fira_Code({ + subsets: ['latin'], + variable: '--font-fira-code', +}); + +export default function MyApp({ Component, pageProps }: AppProps) { + return ( +
+ +
+ ); +} diff --git a/apps/documentation/pages/_meta.json b/apps/documentation/pages/_meta.json index 0c7f89d9..36f54908 100644 --- a/apps/documentation/pages/_meta.json +++ b/apps/documentation/pages/_meta.json @@ -1,18 +1,10 @@ { - "index": "Overview", - "installation": "Installation", - "getting-started": "Getting Started", - "checks": "Checks", - "constraints": "Constraints", - "reference": "API Reference", - "about": { - "title": "About", + "index": { + "title": "Home", "type": "page" }, - "contact": { - "title": "Contact ↗", - "type": "page", - "href": "https://twitter.com/shuding_", - "newWindow": true + "docs": { + "title": "Documentation", + "type": "page" } } diff --git a/apps/documentation/pages/about.mdx b/apps/documentation/pages/about.mdx deleted file mode 100644 index ec6faed8..00000000 --- a/apps/documentation/pages/about.mdx +++ /dev/null @@ -1,3 +0,0 @@ -# About - -This is the about page! This page is shown on the navbar. diff --git a/apps/documentation/pages/checks.mdx b/apps/documentation/pages/checks.mdx deleted file mode 100644 index 84ade5ed..00000000 --- a/apps/documentation/pages/checks.mdx +++ /dev/null @@ -1,5 +0,0 @@ -import { Tabs } from 'nextra/components'; - -# What is a check? - -Checks are responsible for validating that the structure of packages within your project meet a criteria that you define. Checks allow you to maintain a consistenly amazing developer experience, whether your project has one package or one-hundred. diff --git a/apps/documentation/pages/checks/_meta.json b/apps/documentation/pages/checks/_meta.json deleted file mode 100644 index 3bcb71e9..00000000 --- a/apps/documentation/pages/checks/_meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "building-checks": "Building Checks", - "testing-checks": "Testing Checks", - "sharing-checks": "Organizing and Sharing Checks", - "examples": "Examples" -} diff --git a/apps/documentation/pages/checks/examples.mdx b/apps/documentation/pages/checks/examples.mdx deleted file mode 100644 index e69de29b..00000000 diff --git a/apps/documentation/pages/checks/sharing-checks.mdx b/apps/documentation/pages/checks/sharing-checks.mdx deleted file mode 100644 index 80b04a27..00000000 --- a/apps/documentation/pages/checks/sharing-checks.mdx +++ /dev/null @@ -1,28 +0,0 @@ -# Organizing checks - -While you definitely can define checks directly within a project configuration file, we recommend using packages to organize your checks. -This has the added benefit of making your checks ready to share with teams external to your project when you're ready to publish. - -## Exporting checks - -We recommend exporting checks as named exports from your checks package. -This encourages consumers to explicitly import the checks they want to apply to their project. -If you want to apply checks from multiple checks packages you can namespace your import to make it clearer. - -```ts filename="packages/platform-checks/src/index.ts" -import { defineCheck } from 'commonality/checks'; - -export ensureESLintConfig = defineCheck(() => { - return { - // ...check definition - } -}) -``` - -```ts filename="commonality.config.ts" -import * platform from '@scope/commonality-checks-platform'; - -export default { - checks: [], -}; -``` diff --git a/apps/documentation/pages/constraints.mdx b/apps/documentation/pages/constraints.mdx deleted file mode 100644 index a1a5148e..00000000 --- a/apps/documentation/pages/constraints.mdx +++ /dev/null @@ -1,3 +0,0 @@ -# Advanced - -This is the index page for the Advanced folder! diff --git a/apps/documentation/pages/docs/_meta.json b/apps/documentation/pages/docs/_meta.json new file mode 100644 index 00000000..a8501872 --- /dev/null +++ b/apps/documentation/pages/docs/_meta.json @@ -0,0 +1,25 @@ +{ + "-- Getting Started": { + "type": "separator", + "title": "Getting Started" + }, + "overview": "", + "installation": "", + "getting-started": "Getting Started", + + "-- Guides": { + "type": "separator", + "title": "Guides" + }, + "checks": "Checks", + "constraints": "Constraints", + "codeowners": "", + "sharing": "", + "ci": "CI", + + "-- Reference": { + "type": "separator", + "title": "Reference" + }, + "api": "API" +} diff --git a/apps/documentation/pages/reference/checks.mdx b/apps/documentation/pages/docs/api/checks.mdx similarity index 58% rename from apps/documentation/pages/reference/checks.mdx rename to apps/documentation/pages/docs/api/checks.mdx index 1160d742..8528bc10 100644 --- a/apps/documentation/pages/reference/checks.mdx +++ b/apps/documentation/pages/docs/api/checks.mdx @@ -1,25 +1,28 @@ import { Callout } from 'nextra/components'; +import { Subtext } from '../../../components/subtext.tsx'; # Checks Checks are best created using the `defineCheck` function and are passed to the `checks` property in you [project's configuration](/reference/configuration#project-configuration). This function will provide type-safety and intellisense for properties. -## Properties - -### `name` - -| Default | Required | -| :------ | :------- | -| None | true | +```ts +const check = { + name: 'my-team/my-check', + validate: () => {}, + fix: () => {}, + message: 'My check failed', +}; +``` -**Type** +## Check properties -`string{:ts}` +### `name` -**Description** +`string` -A unique identifier for the check. This will be used to parallelize checks and prevent write conflicts when running fix functions. +A unique identifier for the check. This will be +used to parallelize checks and prevent write conflicts when running fix functions. When creating sharable checks, we recommend using a namespace to prevent @@ -35,34 +38,13 @@ const ensureCodeowner = defineCheck(() => { }); ``` -### `level` - -| Default | Required | -| :--------------- | :------- | -| `"warning"{:ts}` | false | - -**Type** - -`'warning' | 'error'{:ts}` - -**Description** - -By default the level will be set to `"warning"`. -If set to `"error"`, the CLI will exit with a non-zero exit code if this check is ever invalid. - ### `message` -| Default | Required | -| :------ | :------- | -| None | true | - -**Type** - -`"string" | (options: CheckOptions) => Message | Promise{:ts}` - -**Description** + +`"string" | (options: CheckContext) => Message | Promise{:ts}` + -The `message` property can be a string for simple checks or dynamically created using a function. +You can pass a static string for simple checks or dynamically return a Message with a function that is passed [CheckContext](#checkoptions). #### Simple message @@ -105,9 +87,9 @@ import path from 'node:path'; const ensureTSConfigExtends = defineCheck((base: string) => { return { // ... - message: async ({ workspace }) => { + message: async (ctx) => { const tsConfig = await json( - path.join(workspace.path, 'tsconfig.json'), + path.join(ctx.package.path, 'tsconfig.json'), ).get(); if (!tsConfig) { @@ -138,36 +120,15 @@ The following output will be shown when running the check: │ } ``` -### `validate` - -| Default | Required | -| :------ | :------- | -| None | true | - -**Type** +--- -`"string" | (options: CheckOptions) => ValidationResult | Promise{:ts}` +### `validate` -```ts -type CheckOptions = { - workspace: { - path: string; - relativePath: string; - }; - allWorkspaces: Array<{ - path: string; - relativePath: string; - }>; - rootWorkspace: { - path: string; - relativePath: string; - }; - codeowners: string[]; - tags: string[]; -}; -``` + +`"string" | (options: CheckContext) => ValidationResult | Promise{:ts}` + -**Description** +If set to `"error"`, the CLI will exit with a non-zero exit code if the `validate` function returns a falsey value. Default is `"warning"`. The `validate` function is the primary mechanism for determining if a package is valid or not and will run against all packages in your project. A returned truthy value will be considered a `pass`, while a falsy value will mark the check as `warn` or `fail` based on the configured [level](#level). @@ -183,38 +144,15 @@ const ensureCodeowner = defineCheck(() => { }); ``` -### `fix` - -| Default | Required | -| :------ | :------- | -| None | false | - -**Type** - -`"string" | (options: CheckOptions) => void | Promise{:ts}` +--- -```ts -type CheckOptions = { - workspace: { - path: string; - relativePath: string; - }; - allWorkspaces: Array<{ - path: string; - relativePath: string; - }>; - rootWorkspace: { - path: string; - relativePath: string; - }; - codeowners: string[]; - tags: string[]; -}; -``` +### `fix` -**Description** + +`(options: CheckContext) => void | Promise{:ts}` + -A check's `fix` function will only run on packages that are not [valid](#validate). This function should update packages so that they pass the check's [validate](#validate) function. +A check's `fix` function will only run on packages that where the check's [validate](#validate) has returned a falsey value. This function should update packages so that they pass the check's [validate](#validate) function. We provide helper utilities like [`json`](#json) and [`text`](#text) to make @@ -227,9 +165,9 @@ import { defineCheck, json } from 'commonality/checks'; const ensureTSConfigExtends = defineCheck((base: string) => { return { // ... - fix: async ({ workspace }) => { + fix: async (ctx) => { const tsConfig = await json( - path.join(workspace.path, 'tsconfig.json'), + path.join(ctx.package.path, 'tsconfig.json'), ).get(); if (!tsConfig) { @@ -242,16 +180,46 @@ const ensureTSConfigExtends = defineCheck((base: string) => { }); ``` +--- + +### `level` + + +`"warning" | "error"{:ts}` + + +If set to `"error"`, the CLI will exit with a non-zero exit code if this check is ever invalid. Default is `"warning"`. + +## `CheckContext` + +The `validate`, `fix`, and `message` functions are all passed a `CheckContext` object that contains metadata about the package the check is being run against. +The `codeowners` and `tags` that correspond to the package from the [project metadata](/docs/project-metadata) is also included. + +```ts +type CheckContext = { + package: { + path: string; + relativePath: string; + }; + allPackages: { + path: string; + relativePath: string; + }[]; + rootPackage: { + path: string; + relativePath: string; + }; + codeowners: string[]; + tags: string[]; +}; +``` + ## Utilities ### `defineCheck` -**Type** - `(check: () => Check) => () => Check{:ts}` -**Description** - This utility provides type-safety and intellisense for check options. Checks are not required to be wrapped with this utility, however doing so will provide a better developer experience and encourage re-usable checks. @@ -267,6 +235,92 @@ const ensureCodeowner = defineCheck(() => { }); ``` +--- + +### `createTestCheck` + +`(check: Check, context?: TestCheckContext) => Check{:ts}` + +`createTestCheck` wraps your checks and decorates these functions with sensible defaults for [CheckContext](/docs/api/checks#checkcontext) that you can override. +This cuts down on repetitive boilerplate when writing tests for your checks. + + +**Parameters** + +`check` + +`Check{:ts}` + +A valid [check](/api/checks#check-properties) object + +`context` + +`TestCheckContext{:ts}` + +Pass options that will be used as the check's [`CheckContext`](/docs/api/checks#checkcontext). +If a property is not explicitly passed, the check will be passed a default from the table below. + +| Name | Default | +| :---------------------- | :---------------------------------------- | +| `context.tags` | `[]{:ts}` | +| `context.codeowners` | `[]{:ts}` | +| `context.workspace` | `{relativePath: './', path: './'}{:ts}` | +| `context.rootWorkspace` | `{relativePath: './', path: './'}{:ts}` | +| `context.allWorkspaces` | `[{relativePath: './', path: './'}]{:ts}` | + +**Returns** +Returns the original check function, however the `validate`, `fix`, and `message` functions +will be passed the `TestCheckContext` rather than requiring that `CheckContext` be passed. + +**Example** + +```ts +// Without createTestCheck +test('validate - returns true when valid', () => { + mockFs({ + 'package.json': JSON.stringify({ + name: 'foo', + description: 'bar', + }), + }); + + const check = myCheck(); + const result = myCheck.validate({ + package: { + path: './', + relativePath: './', + }, + + allPackages: [{ + path: './', + relativePath: './', + }], + codeowners: [], + tags: [] + }); + + expect(result).toEqual(true); +}) + +// With createTestCheck +test('validate - returns true when valid', () => { + mockFs({ + 'package.json': JSON.stringify({ + name: 'foo', + description: 'bar', + }), + }); + + const check = createTestCheck(myCheck()); + const result = myCheck.validate(); + + expect(result).toEqual(true); +}) +``` + + +--- + ### `json` The `json` utility makes it easier to read and write to JSON files within in your checks. The `json` helper expects an absolute path to a JSON file and returns an object with helper methods. @@ -282,13 +336,13 @@ const packageJson = json<{ name: string; version: string }>( ); ``` -#### `exists` +--- -**Type** +#### `exists` `() => Promise{:ts}` -**Description** +**Returns** Returns a boolean value indicating whether or not the file exists on disk. @@ -301,13 +355,13 @@ console.log(exists); // true ``` -#### `get` +--- -**Type** +#### `get` `() => Promise | undefined>{:ts}` -**Description** +**Returns** Returns the contents of a JSON file as an object. If the file does not exist or is not valid JSON, `undefined` will be returned. @@ -323,15 +377,25 @@ console.log(packageJson); // } ``` -#### `contains` +--- -**Type** +#### `contains` `(value: Record) => Promise{:ts}` -**Description** +**Parameters** + +`value` -Returns a boolean value indicating whether or not an object is a subset of the JSON file's contents. If the file does not exist or is not valid JSON, `false` will be returned. + +`Record{:ts}` + + +An object to check against the JSON file's contents. + +**Returns** + +Returns a boolean value indicating whether or not the object is a subset of the JSON file's contents. If the file does not exist or is not valid JSON, `false` will be returned. **Example** @@ -344,16 +408,24 @@ console.log(containsValue); // true ``` -#### `set` +--- -**Type** +#### `set` `(value: Record) => Promise{:ts}` -**Description** - Overwrites the entire contents of a JSON file with the provided value. If the file does not exist, it will be created. +**Parameters** + +`value` + + +`Record{:ts}` + + +An object that will be used to overwrite the JSON file's contents. + **Example** ```ts @@ -363,18 +435,26 @@ await json('/path/from/root/package.json').set({ }); ``` -#### `merge` +--- -**Type** +#### `merge` `(value: Record) => Promise{:ts}` -**Description** - Merges an object with the contents of a JSON file. If the file has the same keys as the passed-in object, the values for those keys will be overwritten. If the file does not exist, it will be created. +**Parameters** + +`value` + + +`Record{:ts}` + + +An object that will be deeply merged with the JSON file's contents. + **Example** ```ts @@ -383,16 +463,24 @@ await json('/path/from/root/package.json').merge({ }); ``` -#### `remove` +--- -**Type** +#### `remove` `(path: string) => Promise{:ts}` -**Description** - Removes a property from a JSON file using a lodash style object path. +**Parameters** + +`path` + + +`string{:ts}` + + +A lodash-style path object that will be used to determine which property to remove. + **Example** ```ts @@ -403,14 +491,12 @@ await json('/path/from/root/package.json').remove( ); ``` -#### `delete` +--- -**Type** +#### `delete` `() => Promise{:ts}` -**Description** - Deletes a JSON file from disk. **Example** @@ -433,13 +519,13 @@ import { json } from 'commonality/checks'; const readme = text('/path/from/root/README.md'); ``` -#### `exists` +--- -**Type** +#### `exists` `() => Promise{:ts}` -**Description** +**Returns** Returns a boolean value indicating whether or not the file exists on disk. @@ -454,11 +540,9 @@ console.log(exists); #### `get` -**Type** - `() => Promise{:ts}` -**Description** +**Returns** Returns the contents of a file as an array of strings representing each line. If the file does not exist, `undefined` will be returned. @@ -477,11 +561,19 @@ console.log(readme); #### `contains` -**Type** - `(value: string[]) => Promise{:ts}` -**Description** +**Parameters** + +`value` + + +`string[]{:ts}` + + +An object that will be deeply merged with the JSON file's contents. + +**Returns** Returns a boolean value indicating whether specified lines exist in the file. If the file does not exist, `false` will be returned. @@ -500,13 +592,19 @@ console.log(containsValue); #### `set` -**Type** +`(lines: string[]) => Promise{:ts}` -`(value: string[]) => Promise{:ts}` +Overwrites the entire contents of a file with the provided lines of text. If the file does not exist, it will be created. -**Description** +**Parameters** -Overwrites the entire contents of a file with the provided lines of text. If the file does not exist, it will be created. +`lines` + + +`string[]{:ts}` + + +An array of strings, representing lines of text, that will be used to overwrite the file's contents. **Example** @@ -520,13 +618,19 @@ await text('/path/from/root/README.md').set([ #### `remove` -**Type** +`(lines: string[]) => Promise{:ts}` -`(value: string[]) => Promise{:ts}` +Removes lines of text from a file. -**Description** +**Parameters** -Removes lines of text from a file. +`lines` + + +`string[]{:ts}` + + +An array of strings, representing lines of text, that will be removed from the file's contents. **Example** @@ -540,8 +644,6 @@ await text('/path/from/root/README.md').remove(['# My Package']); `() => Promise{:ts}` -**Description** - Deletes a file from disk. **Example** @@ -554,14 +656,35 @@ await text('/path/from/root/README.md').delete(); ### `diff` -**Type** +`(source: unknown, target: unknown) => string{:ts}` -`(a: unknown, b: unknown) => string{:ts}` +The `diff` utility makes it easier to provide a helpful `suggestion` for check [messages](#message). +The `diff` helper expects two objects and returns a string representing the diff between the two objects. -**Description** +**Parameters** -The `diff` utility makes it easier to provide helpful `context` for check [messages](#message). -The `diff` helper expects two objects and returns a string representing the diff between the two objects. +`source` + + +`unknown{:ts}` + + +An array of strings, representing lines of text, that will be removed from the file's contents. + +`target` + + +`unknown{:ts}` + + +An array of strings, representing lines of text, that will be removed from the file's contents. + +**Returns** + +A string representing the diff between the two objects. +Lines that appear in `target` but not `source` will appear in red with a `+` prefix. + +**Example** ```ts diff('first', 'second'); diff --git a/apps/documentation/pages/reference/configuration.mdx b/apps/documentation/pages/docs/api/configuration.mdx similarity index 91% rename from apps/documentation/pages/reference/configuration.mdx rename to apps/documentation/pages/docs/api/configuration.mdx index cf77ecdb..c46c3b07 100644 --- a/apps/documentation/pages/reference/configuration.mdx +++ b/apps/documentation/pages/docs/api/configuration.mdx @@ -1,4 +1,5 @@ import { Callout } from 'nextra/components'; +import { Subtext } from '../../../components/subtext.tsx'; # Configuration @@ -21,9 +22,11 @@ export default defineConfig({ }); ``` +--- + ### `checks` -`type: Check[]` +`Record{:ts}` The `checks` property expects an object whose keys are [tag filters](#tag-filters) and whose value are all the checks to run for packages that match. @@ -43,9 +46,13 @@ export default defineConfig({ }); ``` +--- + ### `constraints` -`type: Constraint[]` + +`Record{:ts}` + The `constraints` property expects an object whose keys are [tag filters](#tag-filters) and whose value are all the constraints to run for packages that match. @@ -72,6 +79,10 @@ Package configuration should be located the package directory. ### `tags` + +`string[]{:ts}` + + The labels that categorize the package. These tags can be used with tag filters in the project configuration. **Example** @@ -115,8 +126,8 @@ import { defineConfig } from 'commonality'; export default defineConfig({ constraints: { - '*': [ - disallow: ['deployable'], + 'config': [ + disallow: ['application'], ], }, }); diff --git a/apps/documentation/pages/reference/constraints.mdx b/apps/documentation/pages/docs/api/constraints.mdx similarity index 72% rename from apps/documentation/pages/reference/constraints.mdx rename to apps/documentation/pages/docs/api/constraints.mdx index 5ca90991..8a1bc03d 100644 --- a/apps/documentation/pages/reference/constraints.mdx +++ b/apps/documentation/pages/docs/api/constraints.mdx @@ -1,21 +1,16 @@ +import { Subtext } from '../../../components/subtext.tsx'; + # Constraints Constraints are used to limit which packages can depend on one another. -Constraints are applied to dependencies where there both the source and target are in the same workspace. -This means that constraints cannot be applied to external dependencies. - -A constraint can have both `allow` and `disallow` properties, however any dependency that matches a `disallow` constraint will cause a constraint to fail regardless of whether it matches an `allow` constraint. - ## Properties ### `disallow` -**Type** - + `"*" | string[]{:ts}` - -**Description** + Disallow constraints are applied to all direct and transitive dependencies. @@ -41,11 +36,9 @@ Commonality will only allow direct dependencies that have the `api` or `internal ### `allow` -**Type** - + `"*" | string[]{:ts}` - -**Description** + Constraints may allow all direct dependencies or a list of tags that all direct dependencies must have. diff --git a/apps/documentation/pages/docs/checks.mdx b/apps/documentation/pages/docs/checks.mdx new file mode 100644 index 00000000..3c12a1e1 --- /dev/null +++ b/apps/documentation/pages/docs/checks.mdx @@ -0,0 +1,20 @@ +# Checks +Checks help you scale a consistently amazing developer experience with dynamic conformance checks that are run like tests and shared like lint rules. + +Platform teams can roll out checks that deliver a consistent developer experience for an entire organization. + +Tooling authors can create checks that enforce best practices for the tools they create for their entire user base. + +**Powerful plug and play conformance** + +Quickly create custom conformance rules that validate file existence, file contents, even relationships between different files in your project, all backed by an easy to use API. + +**Enforce with confidence** + +No one wants a tool that blocks their workflow with flaky failures. +We provide [testing utilities and guidance](/docs/checks/testing-checks) so you can guarantee that checks only fail when you expect them to. + +**Sharable by default** + +No resolution magic and no new conventions to learn. Checks are just JavaScript functions so you can share them as you would with any other package. + diff --git a/apps/documentation/pages/docs/checks/_meta.json b/apps/documentation/pages/docs/checks/_meta.json new file mode 100644 index 00000000..f113e48d --- /dev/null +++ b/apps/documentation/pages/docs/checks/_meta.json @@ -0,0 +1,6 @@ +{ + "creating-checks": "", + "organizing-checks": "", + "testing-checks": "", + "recipes": "" +} diff --git a/apps/documentation/pages/checks/building-checks.mdx b/apps/documentation/pages/docs/checks/creating-checks.mdx similarity index 90% rename from apps/documentation/pages/checks/building-checks.mdx rename to apps/documentation/pages/docs/checks/creating-checks.mdx index c0bb3168..ff27725f 100644 --- a/apps/documentation/pages/checks/building-checks.mdx +++ b/apps/documentation/pages/docs/checks/creating-checks.mdx @@ -1,22 +1,22 @@ import { Callout } from 'nextra/components'; -# Building checks +# Creating checks -## Building your first check +## Creating your first check Checks are defined in the configuration file at the root of your project. You can use matchers to run checks against all the packages in your project or a subset of packages. All checks have three required properties: -**`name`** A unique identifier for the check, we use this to parallelize checks and avoid write collisions. +**`name`** A unique identifier for the check, we use this to parallelize checks and prevent write collisions. **`validate`** A function that should return either a truthy or falsey value indicating whether or not the check is valid. -**`message`** A string or function that that gives a developer more context about the check. +**`message`** A string or function that that provides more context about the check. - You can view all available properties in our [reference - documentation](/api/checks). + You can view all available check properties and more examples in our + [reference documentation](/reference/checks). Here's an example of a simple check that ensures every package has at least one codeowner. @@ -45,7 +45,7 @@ commonality check ## Auto-fixable checks -It's great to be notified that something isn't right, but it's even better when you can fix it with a single command. +It's great to be notified that something isn't right, but it's even better when you can fix it with a single key press. To make a check fixable just add a `fix` property to your check. This function will only run against the package if the result of `validate` is falsey. @@ -86,7 +86,7 @@ export default defineConfig({ }); ``` -## Composable checks +## Composing checks While basic checks go a long way, you may want to pass options to your checks to make them re-usable in a variety of different scenarios. diff --git a/apps/documentation/pages/docs/checks/organizing-checks.mdx b/apps/documentation/pages/docs/checks/organizing-checks.mdx new file mode 100644 index 00000000..db624218 --- /dev/null +++ b/apps/documentation/pages/docs/checks/organizing-checks.mdx @@ -0,0 +1,7 @@ +# Organizing checks + +While you can certainly define checks directly within a project configuration file, we recommend using packages to organize your checks. + +This approach has the added benefit of preparing your checks for sharing with teams external to your project when you're ready to publish. + +For a more detailed approach on how to do this check out sharing checks. \ No newline at end of file diff --git a/apps/documentation/pages/docs/checks/recipes.mdx b/apps/documentation/pages/docs/checks/recipes.mdx new file mode 100644 index 00000000..85114f48 --- /dev/null +++ b/apps/documentation/pages/docs/checks/recipes.mdx @@ -0,0 +1,217 @@ +import { Callout } from 'nextra/components'; + +## Recipes + +We believe that Commonality's strength lies in the ability to easily create powerful conformance tests. +While you can enforce almost anything we wanted to examples to spark inspiration for what you might build checks for. + +### Check that a package has a CODEOWNER + +The `validate`, `fix`, and `message` functions are all passed a `CheckContext` object that contains metadata about the package the check is being run against. +We can use the `codeowners` property to check if the package is covered by a pattern [in the project's CODEOWNERS file](/docs/project-metadata#codeowners). + +#### Example + +```ts +import { defineCheck } from 'commonality'; + +const hasCodeowner = defineCheck({ + name: 'has-codeowner', + + message: 'Package must have a CODEOWNER', + + validate: async (ctx) => ctx.codeowners.length, +}); +``` + +#### Usage + +```ts filename="commonality.config.ts" +export default defineConfig({ + checks: { + '*': [hasReadme()], + }, +}); +``` + +### Check that a package has a `README.md` + +#### Example + +```ts +import { defineCheck, text, json } from 'commonality'; + +const hasReadme = defineCheck(() => ({ + name: 'has-readme', + + validate: async (ctx) => { + return text(ctx.package.path, 'README.md').exists(); + }, + + fix: async (ctx) => { + const packageJson = await json( + ctx.package.path, + 'package.json', + ).get(); + + if (!packageJson) { + return; + } + + await text(ctx.package.path, 'README.md').set([ + `# ${packageJson.name}`, + `> ${packageJson.description}`, + ]); + }, + + message: `Package must have a README.md`, +})); +``` + +#### Usage + +```ts filename="commonality.config.ts" +export default defineConfig({ + checks: { + '*': [hasReadme()], + }, +}); +``` + +### Check that a package has certain NPM scripts + +#### Example + +```ts +const FILE_NAME = 'package.json'; + +type PackageJson = { + scripts: Record +} + +const hasScript = defineCheck((name: string, value: string) => ({ + name: 'has-script', + + validate: async (ctx) => { + const packageJson = await json(ctx.package.path, FILE_NAME).get(); + + if(!packageJson) { + return false; + } + + return packageJson.scripts[name] === value; + }, + + fix: async (ctx) => { + const packageJson = await json(ctx.package.path, FILE_NAME).get(); + + if (!packageJson) { + return; + } + + await json(ctx.package.path, FILE_NAME).merge({ + scripts: { + [name]: value, + }, + }); + }, + + message: async (ctx) => { + const packageJson = await json(ctx.package.path, FILE_NAME).get(); + + return { + title: `Package must have a "${name}" script with value "${value}"`, + filePath: FILE_NAME, + // Provide a diff for better contextual information when the check fails + suggestion: diff(packageJson?.scripts, { scripts: { [name]: value } }), + }; + }, +})); +``` + +#### Usage + +```ts filename="commonality.config.ts" +export default defineConfig({ + checks: { + buildable: [ + hasScript('build', 'tsc'), + hasScript('dev', 'tsc --watch'), + hasScript('clean', 'rimraf dist'), + ], + }, +}); +``` + + + Creating checks with parameters makes them reusable for a variety use cases. + + +### Check that a package extends a certain base config + +#### Example + +```ts filename="extends-eslint-config.ts" +import { defineCheck, json, diff } from 'commonality'; + +const FILE_NAME = '.eslintrc.json'; + +type Config = { + extends?: string[]; +}; + +export const extendsESLintConfig = defineCheck((baseConfig?: string) => ({ + name: 'extends-eslint-config', + + validate: async (ctx) => { + const eslintConfig = await json(ctx.package.path, FILE_NAME).get(); + + if (!eslintConfig) { + return false; + } + + return eslintConfig.extends?.includes('base-config'); + }, + + fix: async (ctx) => { + const eslintConfig = await json(ctx.package.path, FILE_NAME).get(); + + if (!eslintConfig) { + return; + } + + const existingExtends = eslintConfig.extends ?? []; + + await json(ctx.package.path, FILE_NAME).merge({ + extends: [...existingExtends, baseConfig], + }); + }, + + message: async (ctx) => { + const eslintConfig = await json(ctx.package.path, FILE_NAME).get(); + + const existingExtends = eslintConfig?.extends ?? []; + + return { + title: `ESLint configuration must extend "${baseConfig}"`, + filePath: FILE_NAME, + suggestion: diff( + { extends: eslintConfig?.extends }, + { extends: { extends: [...existingExtends, baseConfig] } }, + ), + }; + }, +})); +``` + +#### Usage + +```ts filename="commonality.config.ts" +export default defineConfig({ + checks: { + app: [extendsESLintConfig('next')], + ui: [extendsESLintConfig('react')], + utility: [extendsESLintConfig('node')], + }, +}); +``` diff --git a/apps/documentation/pages/checks/testing-checks.mdx b/apps/documentation/pages/docs/checks/testing-checks.mdx similarity index 73% rename from apps/documentation/pages/checks/testing-checks.mdx rename to apps/documentation/pages/docs/checks/testing-checks.mdx index f59fef49..15cf4ea3 100644 --- a/apps/documentation/pages/checks/testing-checks.mdx +++ b/apps/documentation/pages/docs/checks/testing-checks.mdx @@ -1,10 +1,12 @@ +import { Callout } from 'nextra/components'; + # Testing checks For more complex checks you may want to make sure that your validation -and fix logic is what you would expect it to be. We recommend using -`mock-fs` along with our [`createTestCheck`](#createtestcheck) utility to mock the file system to ensure that your read and write -logic is correct. +and fix logic is what you would expect it to be. +We recommend using [`mock-fs`](https://github.com/tschaub/mock-fs) along with our [`createTestCheck`](/docs/api/checks#createtestcheck) utility to mock the file system. +This combination will test your checks end-to-end to ensure that your checks never create unexpected changes. ## Example ```ts filename="packages/checks/ensure-license.ts" @@ -149,44 +151,3 @@ describe('ensureLicense', () => { }); }); ``` - -## Utilities - -### `createTestCheck` - -**Type** - -`(check: Check, options?: TestCheckOptions) => Check{:ts}` - -```ts -interface TestCheckOptions { - workspace?: { - path: string; - relativePath: string; - }; - rootWorkspace?: { - path: string; - relativePath: string; - }; - allWorkspaces?: Array<{ - path: string; - relativePath: string; - }>; - codeowners?: string[]; - tags?: string[]; -} -``` - -**Description** - -The `validate`, `fix` and `message` check functions all receive metadata about the current package that it is running against. -`createTestCheck` wraps your checks and decorates these functions with sensible defaults that you can override. This cuts down -on repetitive boilerplate when writing tests for your checks. - -| Default | Required | -| :---------------------- | :---------------------------------------- | -| `options.tags` | `[]{:ts}` | -| `options.codeowners` | `[]{:ts}` | -| `options.workspace` | `{relativePath: './', path: './'}{:ts}` | -| `options.rootWorkspace` | `{relativePath: './', path: './'}{:ts}` | -| `options.allWorkspaces` | `[{relativePath: './', path: './'}]{:ts}` | diff --git a/apps/documentation/pages/docs/ci/github-actions.mdx b/apps/documentation/pages/docs/ci/github-actions.mdx new file mode 100644 index 00000000..5c27df98 --- /dev/null +++ b/apps/documentation/pages/docs/ci/github-actions.mdx @@ -0,0 +1,140 @@ +import { Tabs, Tab } from 'nextra/components'; + +# Running Commonality in Github Actions + +Ensure that you have `commonality` installed as a dependency at the root of your project. +Given a `package.json` with the following scripts: + +```json filename="package.json" +{ + "name": "my-project", + "scripts": { + "check": "commonality check", + "constrain": "commonality constrain" + }, + "dependencies": { + "commonality": "" + } +} +``` + +Create a workflow file for CI at `.github/workflows/ci.yml` if not already present and add the `check` and `constrain` scripts as a step. + + + + ```yaml copy filename=".github/workflows/ci.yml" + name: CI + + on: + push: + branches: ["main"] + pull_request: + types: [opened, synchronize] + + jobs: + validate: + name: Validate + timeout-minutes: 15 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'npm' + + - name: Install dependencies + run: npm install + + - name: Check + run: npm run check + + - name: Constrain + run: npm run constrain + ```` + + + + ```yaml copy filename=".github/workflows/ci.yml" + name: CI + + on: + push: + branches: ["main"] + pull_request: + types: [opened, synchronize] + + jobs: + validate: + name: Validate + timeout-minutes: 15 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'yarn' + + - name: Install dependencies + run: yarn + + - name: Check + run: yarn check + + - name: Constrain + run: yarn check + ``` + + + ```yaml copy filename=".github/workflows/ci.yml" + name: CI + + on: + push: + branches: ["main"] + pull_request: + types: [opened, synchronize] + + jobs: + validate: + name: Validate + timeout-minutes: 15 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 2 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Check + run: pnpm check + + - name: Constrain + run: pnpm constrain + ``` + + + diff --git a/apps/documentation/pages/docs/ci/gitlab-ci.mdx b/apps/documentation/pages/docs/ci/gitlab-ci.mdx new file mode 100644 index 00000000..8a240b11 --- /dev/null +++ b/apps/documentation/pages/docs/ci/gitlab-ci.mdx @@ -0,0 +1,79 @@ +import { Tabs, Tab } from 'nextra/components'; + +# Running Commonality in Github Actions + +Ensure that you have `commonality` installed as a dependency at the root of your project. +Given a `package.json` with the following scripts: + +```json filename="package.json" +{ + "name": "my-project", + "scripts": { + "check": "commonality check", + "constrain": "commonality constrain" + }, + "dependencies": { + "commonality": "" + } +} +``` + +Create a workflow file for CI at `.gitlab-ci.yml` if not already present and add the `check` and `constrain` scripts as a step. + + + + ```yaml copy filename=".gitlab-ci.yml" + image: node:latest + stages: + - build + build: + stage: build + script: + - npm install + - npm run check + - npm run constrain + ```` + + + + ```yaml copy filename=".gitlab-ci.yml" + image: node:latest + stages: + - build + build: + stage: build + script: + - yarn install + - yarn check + - yarn constrain + cache: + paths: + - node_modules/ + - .yarn + ``` + + + ```yaml copy filename=".gitlab-ci.yml" + image: node:latest + stages: + - build + build: + stage: build + before_script: + - corepack enable + - corepack prepare pnpm@latest-8 --activate + - pnpm config set store-dir .pnpm-store + script: + - pnpm install + - pnpm check + - pnpm constrain + cache: + key: + files: + - pnpm-lock.yaml + paths: + - .pnpm-store + ``` + + + diff --git a/apps/documentation/pages/docs/cli.mdx b/apps/documentation/pages/docs/cli.mdx new file mode 100644 index 00000000..8c015bc3 --- /dev/null +++ b/apps/documentation/pages/docs/cli.mdx @@ -0,0 +1,126 @@ +import { Subtext } from '../../components/subtext'; + +# CLI + +## Option Syntax +Options that accept a value can be passed with or without an equals sign. + +```bash +--option=value +--option="value" + +--option value +--option "value" +``` + +Options that accept a boolean value be `true` if no value is passed. +Options can explicitly be set to `false` by passed it as a value. +```bash +# Set as true +--option +--option=true + +# Set as false +--option=false +``` + + +## Global Options +These options can be used with any command. + +### `--color` +Force color in output when running Commonality CLI commands. +You can also use the `FORCE_COLOR` environment variable to control which colors should be output. +This flag hooks into [supports-color](https://github.com/chalk/supports-color) under the hood. + +```bash copy +commonality check --color +``` + +```bash copy +declare -x FORCE_COLOR=1 +commonality check --color +``` + +### `--no-color` +Suppress all color in output when running Commonality CLI commands. +This flag hooks into [supports-color](https://github.com/chalk/supports-color) under the hood. + +```bash copy +commonality check --no-color +``` + +```bash copy +declare -x FORCE_COLOR=0 +commonality check +``` + +## Commands +### `check` +Run configured checks against the current project. If there are invalid checks that are [fixable](/docs/checks/creating-checks#auto-fixable-checks), +a prompt will appear asking if you would like to automatically fix them. This prompt will not appear if `process.env.CI` is set to `true` or if Commonality +detects a CI provider. Process will exit with a status code of `1` if any checks are invalid. + +```bash copy +commonality check +``` + +#### Options + +##### `--verbose` +Show the status of all checks regardless of status. By default, only invalid checks will be shown. Default is `false`. + +```bash copy +commonality check --verbose +``` + +--- + +### `constrain` +Show the status of configured constraints in the current project. Process will exit with a status code of `1` if any constraints are invalid. + +```bash copy +commonality constrain +``` + +#### Options + +##### `--verbose` +Show the status of all constraints regardless of status. By default, only invalid constraints will be shown. Default is `false`. + +```bash copy +commonality constrain --verbose +``` + +--- + +### `studio` +Start Commonality Studio for the current project. +If `@commonality/studio` is not already installed you will be prompted to install it when running this command. + +```bash copy +commonality studio +``` + +#### Options + +#### `--install` +Automatically install `@commonalityco/studio` if it is not already installed in the project. Default is `false`. + +```bash copy +commonality studio --install +``` + +##### `--port` +The port that Commonality Studio should run on. By default, Commonality Studio will run on port `8888`. + +```bash copy +commonality studio --port 1234 +``` + +##### `--debug` +Show the server logs from the Commonality Studio application. + +```bash copy +commonality studio --debug +``` diff --git a/apps/documentation/pages/docs/codeowners.mdx b/apps/documentation/pages/docs/codeowners.mdx new file mode 100644 index 00000000..216ee730 --- /dev/null +++ b/apps/documentation/pages/docs/codeowners.mdx @@ -0,0 +1,10 @@ +# Codeowners +Commonality will automatically detect a `CODEOWNERS` file and correlate ownership rules to packages in your project. +An array of `codeowners` will be available within [`CheckContext`]() and visible within [Commonality Studio](). + +Packages may be at any of the locations below: +* `CODEOWNERS` +* `.github/CODEOWNERS` +* `.gitlab/CODEOWNERS` +* `docs/CODEOWNERS` + diff --git a/apps/documentation/pages/docs/constraints.mdx b/apps/documentation/pages/docs/constraints.mdx new file mode 100644 index 00000000..6abce6d7 --- /dev/null +++ b/apps/documentation/pages/docs/constraints.mdx @@ -0,0 +1,48 @@ +# Constraints + +Constraints help you maintain a dependency graph that's easy to reason about by limiting which packages can depend on each other. + +Constraints are applied to dependencies where there both the source and target package are in the same workspace. +This means that constraints cannot be applied to external dependencies. + +A constraint can `allow` and `disallow` packages using [tag filters](), however if a dependency matches a `disallow` filter the constraint will fail even if it is allowed by an `allow` filter. + +## `allow` vs `disallow` + +Commonality provides two different ways to enforce constraints, each with varying degrees of strictness. + +### `disallow` matches direct and transitive dependencies +`disallow` constraints will evaluate the entire upstream dependency graph for a package. +If any direct or transitive dependency matches a tag filter within the `disallow` array, then the constraint will fail. + +The following constraint... +```ts filename="commonality.config.ts" +import { defineConfig } from 'commonality'; + +export default defineConfig({ + constraints: { + 'high-availability': { + disallow: ['beta'], + }, + }, +}); +``` + +...will fail for the following dependency graph. + +![Hello](/disallow-constraint.png) + +This is due to the fact that a transient dependency contains the matching `beta` tag. + +A constraint with the `disallow` property will evaluate the entire upstream dependency graph for a package. +If any direct or transitive dependency matches a tag filter within the `disallow` array, then the constraint will fail. + +`disallow` constraints should be used when a subset of packages should never have a dependency on another package. + +### `allow` only matches direct dependencies + +`allow` constraints will only evaluate direct dependencies for a package, transitive dependencies will never be evaluated. + +These constraints are most helpful when constructing a hierarchy of packages within your project. + +### diff --git a/apps/documentation/pages/docs/constraints/recipes.mdx b/apps/documentation/pages/docs/constraints/recipes.mdx new file mode 100644 index 00000000..f54b651a --- /dev/null +++ b/apps/documentation/pages/docs/constraints/recipes.mdx @@ -0,0 +1,58 @@ +# Use cases + +## Create a dependency hierarchy + +In larger projects, it can be helpful to create a logical hierarchy for package dependencies. +This structure can help guide developers toward a clean separation of concerns. + +```ts filename="commonality.config.ts" +import { defineConfig } from 'commonality'; + +export default defineConfig({ + constraints: { + '*': { + disallow: ['deployable'], + }, + deployable: { + allow: ['ui', 'data', 'utility', 'config'], + }, + ui: { + allow: ['utility', 'config'], + }, + state: { + allow: ['utility', 'config'], + }, + data: { + allow: ['utility', 'config'], + }, + utility: { + allow: ['utility', 'config'], + }, + config: { + disallow: '*', + }, + }, +}); +``` + +## Create private local packages + +Limit packages to a specific business vertical and explicitly tag packages as `shared` to allow their use across teams. + +```ts filename="commonality.config.ts" +import { defineConfig } from 'commonality'; + +export default defineConfig({ + constraints: { + '*': { + allow: ['shared'], + }, + commerce: { + allow: ['commerce'], + }, + marketing: { + allow: ['marketing'], + }, + }, +}); +``` diff --git a/apps/documentation/pages/docs/getting-started.mdx b/apps/documentation/pages/docs/getting-started.mdx new file mode 100644 index 00000000..35cd560f --- /dev/null +++ b/apps/documentation/pages/docs/getting-started.mdx @@ -0,0 +1,165 @@ +import { Steps, Callout, Tabs, Tab, Cards, Card } from 'nextra/components'; + +# Getting Started + +You can run `npx commonality studio` in any monorepo to get started without installing any dependencies. +However, Commonality is most useful when it becomes a part of your daily workflow. + +All features are designed to be adopted incrementally. +Here's how we recommend getting up an running in a repostitory that has multiple collaborators. + + + +### Install dependencies + +If you're working on a project with others, you'll want to locally install `commonality` at the root of your project +to get a consistent developer experience. We're also going to install the `commonality-recommended` package +to set up some initial [checks](/docs/checks). + + + + ```bash copy + npm install commonality commonality-recommended --save-dev + ``` + + + ```bash copy + yarn add commonality commonality-recommended --dev --ignore-workspace-root-check + ``` + + + ```bash copy + pnpm add commonality commonality-recommended --save-dev --ignore-workspace-root-check + ``` + + + + +### Set up checks + +You'll be able to get value from Commonality right away by installing our `commonality-recommended` +package which includes common checks useful in any monorepo. + +Create a `commonality.config.ts` or `commonality.config.js` at the root of your repository and apply +checks that you feel make the most sense for your project. Alternatively, you can [create your own +checks](/docs/checks/creating-checks) or use checks from other packages. + + + For documentation on all rules in the `commonality-recommended` package check + out the README + + +```ts filename="commonality.config.ts" +import { defineConfig } from 'commonality'; +import * as recommended from 'commonality-recommended'; + +export default defineConfig({ + checks: { + '*': [ + recommended.devPeerDependencyRange(), + recommended.ensureCodeowner(), + recommended.ensureLicense(), + recommended.ensureReadme(), + recommended.multipleDependencyTypes(), + recommended.noExternalMismatch(), + recommended.repositoryField(), + recommended.sortedDependencies(), + recommended.validPackageName(), + ], + }, +}); +``` + +Let's try running these checks against your project with: +```bash copy +commonality check +``` + +### Categorize your packages + +Commonality helps you scale a consistent developer experience across your monorepo and organization. +[Tag filters](/docs/api/configuration#tag-filters) help you achieve this by helping you codify best +practices for groups or categories of packages in your project. Let's define those categories now. + +Open Commonality Studio to see all the packages within your monorepo. + +```bash copy +commonality studio +``` + +Next, try and find common groups of packages that have similar needs. Some examples of categories are: + +- **Tooling:** packages that require common boilerplate or configuration files for tooling. + I.e. `buildable`, `deployable`, `testable` + +- **Concern:** packages that have a common concern or purpose + I.e. `ui`, `data`, `config` + +- **Domain:** packages that have a common product vertical or feature + I.e. `checkout`, `marketing`, `ai` + +Attach tags that match categories found in your project to packages directly in Commonality Studio. + + + Editing tags in Commonality Studio will update or create a `commonality.json` + in each package directories automatically. This saves you from manually + managing many configuration files across your monorepo. + + +### Add constraints + +Now let's leverage the tags we just created to add [constraints](/docs/constraints) to the dependency graph. + +You may find that there are certain packages that should never depend on each other. For example: + +- All packages should never depend on `deployable` packages. + +- `ui` packages should only depend on `utility`, and `config` packages. + +- `config` packages should only depend on other `config` packages. + +Adding constraints allows you to codify these rules and prevent your dependency graph from becoming spaghetti. +This saves you from endless dependency debugging and increased mental overhead. + +Let's add some of these rules to our project configuration file + +```ts filename="commonality.config.ts" +import { defineConfig } from 'commonality'; +import * as recommended from 'commonality-recommended'; + +export default defineConfig({ + checks: { + // ... + }, + constraints: { + "*": { + disallow: ["deployable"] + }, + "ui": { + allow: ["utility", "config"] + }, + "config": { + "allow": ["config"] + } + } +}); +``` + +Let's check the validity of the constraints we just created with: +```bash copy +commonality check +``` + +### Next steps +Now that you've learned the basics of checks and constraints you can further customize Commonality to your own workflows +by creating custom checks or integrate Commonality into your CI pipeline to prevent regressions. + + + + + + + + + + diff --git a/apps/documentation/pages/docs/installation.mdx b/apps/documentation/pages/docs/installation.mdx new file mode 100644 index 00000000..170112c5 --- /dev/null +++ b/apps/documentation/pages/docs/installation.mdx @@ -0,0 +1,57 @@ +import { Tabs, Tab } from 'nextra/components'; + +# Installation + +Commonality works with any existing JavaScript project. + +## Install globally + +A global installation of Commonality will automatically detect the structure of your project based on the directory that the command is run in. + + + + ```bash copy + npm install commonality --global + ``` + + + ```bash copy + yarn global add commonality + ``` + + + ```bash copy + pnpm install commonality --global + ``` + + + +Navigate to any JavaScript project and open Commonality Studio to get started. + +```bash copy +commonality studio +``` + +## Install in your project + +If you're collaborating with others on the same project or if you're planning on running Commonality in CI you may want to add `commonality` as a dev dependency at the root of your project. + + + + ```bash copy + npm install commonality --save-dev + ``` + + + ```bash copy + yarn add commonality --dev --ignore-workspace-root-check + ``` + + + ```bash copy + pnpm add commonality --save-dev --ignore-workspace-root-check + ``` + + + +Your global installation of Commonality will continue to work in other projects but your local installation will always take precedence. diff --git a/apps/documentation/pages/docs/overview.mdx b/apps/documentation/pages/docs/overview.mdx new file mode 100644 index 00000000..93f6ace8 --- /dev/null +++ b/apps/documentation/pages/docs/overview.mdx @@ -0,0 +1,71 @@ +# Introduction + +> Commonality helps you scale large JavaScript projects with the tools you already love. + +We believe that modern monorepo tooling unlocks next generation workflows and efficiencies that help you ship faster at bigger a scale. +But working with large monorepos can be difficult, and almost everyone has a horror story about working in one. + +We want to change that. + +## What is Commonality? + +Commonality is an open-source tool that gives you a few new superpowers to help scale [multi-package workspaces](https://vercel.com/docs/vercel-platform/glossary#multi-package-workspace) and large package ecosystems. + + + +### Scale best practices with checks + +Every package is a possible point of toolchain fragmentation and it can start to feel like playing whack-a-mole to maintain a consistent developer experience. +[Checks](/docs/checks) allow you to standardize tooling and codify best practices for subsets of packages, without wrapping your tools or creating lock-in. + +[Checks](/docs/checks) help you scale a consistently amazing developer experience with dynamic conformance checks that are run like tests and shared like lint rules. + +### Wrangle dependencies with constraints +In workspaces that contain more than a handful of packages there are often unwritten rules for dependencies. + +Config packages shouldn't depend on UI libraries. + +UI libraries shouldn't depend on applications. + +[Constraints](/docs/constraints) help you maintain a dependency graph that's easy to reason about by limiting which packages can depend on each other. + +## What makes us different? + +### Zero lock-in + +Commonality helps you scale your existing workflows, not replace them. Choose whatever tools work best for you and we'll help you get the most out of them. + +We will never wrap your tools or lock you in to ours. You'll be able to delete Commonality from your project at any point without ever affecting any of your existing tools. + +### Strongly opinionated about anything + +We make no assumptions about how your monorepo should be structured, which rules should be enforced, or the tools you should use. + +Instead, we make it easy to create your own best practices and help you scale them across your project or organization. +You'll always have full control over how strongly rules are enforced. + +### Opt-in by default + +Every feature in Commonality is designed to be adopted incrementally. You can start using it with a single package and scale it to an entire organization. + +Selectively apply [checks](/docs/checks) and [constraints](/docs/constraints) to groups of packages at your own pace. Adopt our rules or incrementally enforce your own best practices as you create them. + +## Why now? + +There has been a wave of new tooling over the past few years that has made it drastically easier to create and manage many packages within a single repository. +Tools like `pnpm`, `turbo`, `lerna`, `plop`, and `nx` have been the catalyst for an explosion of growth in JavaScript monorepos. + +However, every new package added to a project introduces additional overhead. +Every `package.json` becomes a possible point of toolchain fragmentation, making it difficult to guarantee a consistent developer experience across a project. +Dependency graphs can quickly become spaghetti, leading to a debugging nightmare. + +Instead of choosing between scale and ease-of-use, Commonality gives you tools that allow you to have both. + +## What are your plans for the future? + +We believe that building composable software with package-based architecture is the future. +We want to build tools to make it easier to work with multi-package monorepos at scale and we want those tools to be free and open source. + +We also believe that there are new workflows that come with multi-package workspace architecture that make large teams more efficient. +We plan on building a platform that will automate common workflows when working with package ecosystems. +That future platform will have distinct features built on a foundation of community and free open source tooling. diff --git a/apps/documentation/pages/docs/sharing.mdx b/apps/documentation/pages/docs/sharing.mdx new file mode 100644 index 00000000..31f521bc --- /dev/null +++ b/apps/documentation/pages/docs/sharing.mdx @@ -0,0 +1,45 @@ +import { Callout } from 'nextra/components'; + +# Sharing +Commonality makes it easy to utilize checks and workflows created by other teams and the open-source community. +Share your best practices with the broader community and make an even bigger impact. + + +## Sharing checks + +Organizing checks into a package local to your project not only keeps your project configuration file tidy, but also makes them easily sharable. + +We recommend exporting checks as named exports from your checks package. This encourages consumers to explicitly import the checks they want to apply to their project. + + +If you intend on sharing checks package publicly, we recommend prefixing your package name with `commonality-checks-` to make discoverability easier. + + +```ts filename="packages/commonality-checks-myteam/src/index.ts" +import { defineCheck } from 'commonality/checks'; + +export const hasScript = defineCheck(() => { + return { + name: 'my-team/has-script' + // ...check definition + } +}) +``` + +```ts filename="commonality.config.ts" +import * myTeam from 'commonality-checks-myteam'; + +export default { + checks: { + "buildable": [ + myTeam.hasScript('dev', 'tsc --watch'), + ] + } +}; +``` + +## Sharing configuration + + +Coming soon... + diff --git a/apps/documentation/pages/getting-started.mdx b/apps/documentation/pages/getting-started.mdx deleted file mode 100644 index 33e006e1..00000000 --- a/apps/documentation/pages/getting-started.mdx +++ /dev/null @@ -1,48 +0,0 @@ -import { Steps, Callout } from 'nextra/components'; - -# How to adopt Commonality - -Every feature in Commonality is opt-in and designed to be adopted incrementally but here's how we recommended getting started. - - -### Categorize your packages - -Commonality helps you scale a consistent developer experience across your monorepo and organization. -To do this, it helps you codify best practices for groups of packages in your project. - -Open Commonality Studio to see all the packages within your monorepo. - -```bash copy -commonality studio -``` - -Next, try and find common groups of packages that have similar needs. Some examples are: - -- **Tooling:** packages that require common boilerplate or configuration files for tooling. - I.e. `buildable`, `deployable`, `testable` - -- **Concern:** packages that have a common concern or purpose - I.e. `ui`, `data`, `config` - -- **Domain:** packages that have a common product vertical or feature - I.e. `checkout`, `marketing`, `ai` - -Finally, attach tags that match your categories to packages directly in Commonality Studio. - - - Editing tags in Commonality Studio will update or create a `commonality.json` - in each package directories automatically. This saves you from manually - managing many configuration files across your monorepo. - - -### Add constraints - -Now let's leverage the tags we just created to add constraints to your dependency graph. - -You may find that there are certain packages that should never depend on each other. For example: - -- `config` packages shouldn't depend on `deployable` packages. - -- `high-stability` packages shouldn't depend on `beta` packages - - diff --git a/apps/documentation/pages/globals.css b/apps/documentation/pages/globals.css new file mode 100644 index 00000000..088a7a70 --- /dev/null +++ b/apps/documentation/pages/globals.css @@ -0,0 +1,2 @@ +@import '@commonalityco/config-tailwind/globals.css'; + diff --git a/apps/documentation/pages/index.mdx b/apps/documentation/pages/index.mdx index e6f4ac76..e69de29b 100644 --- a/apps/documentation/pages/index.mdx +++ b/apps/documentation/pages/index.mdx @@ -1,64 +0,0 @@ -# Introduction - -> Commonality helps you scale large JavaScript projects with the tools you already love. - -We believe that modern monorepo tooling unlocks next generation workflows that help you deliver faster at bigger a scale. -But working with large monorepos can be difficult, and almost everyone has a horror story about working in one. - -We want to change that. - -## What is Commonality? - -Commonality gives you a few new tools to help you tame the chaos of working in monorepos. - -### CLI - -Commonality works out-of-the-box with any JavaScript project and any package manager. - -#### Checks - -Every package is a possible point of fragmentation and it can start to feel like playing whack-a-mole to maintain a consistent developer experience. - -Commonality helps you scale best practices with dynamic conformance checks that are run like tests and shared like lint rules. - -#### Constraints - -Config packages shouldn't depend on UI libraries. - -UI libraries shouldn't depend on applications. - -Commonality helps you maintain a dependency graph that doesn't look like spaghetti by limiting which packages can depend on each other. - -### Studio - -Sometimes you just need to visualize your monorepo to understand what's going on. - -Commonality Studio is a local application that gives you a live view your dependency graph and the status of your conformance checks. - -## What makes us different? - -### Zero lock-in - -Choose whatever tools work best for you and we'll help you get the most out of them. Commonality helps you scale your existing workflows, not replace them. - -Rather than wrapping your tools to get a standardized experience, we'll guarantee your existing tools work exactly how you expect them to for every package in your monorepo. - -### Strongly opinionated about anything - -We make no assumptions about how your monorepo should be structured, the best practices that should be enforced, or the tools you should use. - -Instead, we make it easy to create your own best practices and help you scale them across your organization. - -### Always iterative - -Commonality is designed to be adopted incrementally. You can start using it with a single package and scale it to your entire organization. - -You can selectively apply features to groups of packages that you define, allowing you to not only incrementally adopt Commonality, but apply migrations and enforce your own incrementally as well. - -## Do you have plans to monetize? - -We want to build tools to make it easier to work with monorepos at scale and we want those tools to be free and open source, period. - -However, we also believe that monorepo architecture unlocks new forms of workflow automation and we want to build that future. -We plan on building a paid platform that will enable some of those workflows at scale for medium to large teams. That platform will -have distinct features built on a foundation of open source tooling. diff --git a/apps/documentation/pages/installation.mdx b/apps/documentation/pages/installation.mdx deleted file mode 100644 index 2fafec24..00000000 --- a/apps/documentation/pages/installation.mdx +++ /dev/null @@ -1,27 +0,0 @@ -# Installation - -Commonality is designed to be adopted incrementally and works with any existing JavaScript project. - -## Install globally - -A global installation of Commonality will automatically detect the structure of your project based on the directory that the command is run in. - -```bash npm2yarn -npm install -g commonality -``` - -Navigate to any JavaScript project and open Commonality Studio to get started. - -```bash -commonality studio -``` - -## Install in your project - -If you're collaborating with others on the same project or if you're planning on running Commonality in CI you may want to add `commonality` as a dev dependency at the root of your project. - -```bash npm2yarn -npm install -D commonality -``` - -Your global installation of Commonality will continue to work in other projects but your local installation will always take precedence. diff --git a/apps/documentation/postcss.config.js b/apps/documentation/postcss.config.js new file mode 100644 index 00000000..12a703d9 --- /dev/null +++ b/apps/documentation/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/documentation/public/disallow-constraint.png b/apps/documentation/public/disallow-constraint.png new file mode 100644 index 0000000000000000000000000000000000000000..8fe14d39cf8ce983d8bd4b4a4c5cff87cc226ba2 GIT binary patch literal 244668 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%0DCvU`_xIOqMO{iC8x1CqyC z6W5|FG;;9+>Aj0HJ)IB1Cye(8rNheFUSD*hPDfr+Nc5Zp6-#Y-(cwC})woe_*JnkY+UDCehYW(2ellef&V^o8NJ2?gyK<;S~wRm-nB) z&i_H*x}rU6i|Z;-$0wkX=Rw?@@1V>6++%@ApT|ml=j6FMjO&Inn@^T)^D8=YwN>C@ zQBMEDWaPBngW;1a6R@yQz`%OrusE0~Y`wn)e^I2a-&+{{2S6Qg^L%`v!0>Zp+MMh<=h8acW(Z7cy6{4*G4p zK@EO6z_JS9|NlqBmNN5(HToYt#M%`NF<+$&F}44leCo10HnBGPKOe~d3xh?^{|^a6 arq0w@@wIM$8dw?|FuzzCJu-Cu?Y{x8HAVUW literal 0 HcmV?d00001 diff --git a/apps/documentation/public/disallowed-constraint.svg b/apps/documentation/public/disallowed-constraint.svg new file mode 100644 index 00000000..53824350 --- /dev/null +++ b/apps/documentation/public/disallowed-constraint.svg @@ -0,0 +1,21 @@ + + + + + + + + ["app", "high-availability"]["utility"]["data"]["config"]["config"]["utility", "beta"] diff --git a/apps/documentation/tailwind.config.js b/apps/documentation/tailwind.config.js new file mode 100644 index 00000000..fe5dfa01 --- /dev/null +++ b/apps/documentation/tailwind.config.js @@ -0,0 +1,13 @@ +import baseConfig from '@commonalityco/config-tailwind'; + +/** @type {import('tailwindcss').Config} */ +export default { + ...baseConfig, + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + './src/**/*.{js,ts,jsx,tsx,mdx}', + 'theme.config.tsx', + ], +}; diff --git a/apps/documentation/theme.config.tsx b/apps/documentation/theme.config.tsx index 8229becc..262455fb 100644 --- a/apps/documentation/theme.config.tsx +++ b/apps/documentation/theme.config.tsx @@ -1,21 +1,24 @@ import React from 'react'; import { DocsThemeConfig } from 'nextra-theme-docs'; -import { Logo } from './logo'; +import { Logo, WordLogo } from '@commonalityco/ui-core'; const config: DocsThemeConfig = { logo: ( - + - Commonality + ), project: { link: 'https://github.com/commonalityco/commonality', }, - docsRepositoryBase: 'https://github.com/shuding/nextra-docs-template', + docsRepositoryBase: + 'https://github.com/commonalityco/commonality/tree/main/apps/documentation', footer: { text: 'Nextra Docs Template', }, + // primaryHue: 180, + // primarySaturation: 40, }; export default config; diff --git a/apps/studio/src/app/globals.css b/apps/studio/src/app/globals.css index 64559c55..dd39f77e 100644 --- a/apps/studio/src/app/globals.css +++ b/apps/studio/src/app/globals.css @@ -1 +1,9 @@ +@tailwind base; + @import '@commonalityco/config-tailwind/globals.css'; + +@layer base { + body { + @apply text-sm; + } +} diff --git a/apps/studio/src/app/last-update-time.tsx b/apps/studio/src/app/last-update-time.tsx index d6523e85..49bc7122 100644 --- a/apps/studio/src/app/last-update-time.tsx +++ b/apps/studio/src/app/last-update-time.tsx @@ -2,6 +2,7 @@ import { formatRelative } from 'date-fns'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { io } from 'socket.io-client'; +import debounce from 'lodash/debounce'; function LastUpdateTime() { const router = useRouter(); @@ -16,12 +17,15 @@ function LastUpdateTime() { console.log('Watching for updates...'); }); - socket.on('project-updated', async () => { - console.log('Project updated'); - router.refresh(); + socket.on( + 'project-updated', + debounce(() => { + console.log('project updated'); + router.refresh(); - setLastUpdated(new Date()); - }); + setLastUpdated(new Date()); + }, 500), + ); socket.on('disconnect', () => { console.log('Stopped watching for updates...'); }); diff --git a/apps/workshop/tailwind.config.js b/apps/workshop/tailwind.config.js index 12e9eb2f..c7e88776 100644 --- a/apps/workshop/tailwind.config.js +++ b/apps/workshop/tailwind.config.js @@ -12,7 +12,7 @@ module.exports = { ...baseConfig, content: [ './src/**/*.{js,ts,jsx,tsx}', - getPkgPattern('@commonalityco/feature-constraints'), + getPkgPattern('@commonalityco/ui-constraints'), getPkgPattern('@commonalityco/ui-conformance'), getPkgPattern('@commonalityco/ui-design-system'), getPkgPattern('@commonalityco/ui-package'), diff --git a/packages/commonality/commonality-recommended/src/dev-peer-dependency-range.ts b/packages/commonality/commonality-recommended/src/dev-peer-dependency-range.ts index 024df8fa..2ec721db 100644 --- a/packages/commonality/commonality-recommended/src/dev-peer-dependency-range.ts +++ b/packages/commonality/commonality-recommended/src/dev-peer-dependency-range.ts @@ -52,9 +52,9 @@ export const devPeerDependencyRange = defineCheck(() => { return { name: 'commonality/dev-peer-dependency-range', level: 'warning', - validate: async ({ workspace }) => { + validate: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -91,9 +91,9 @@ export const devPeerDependencyRange = defineCheck(() => { return true; }, - fix: async ({ workspace }) => { + fix: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -103,11 +103,13 @@ export const devPeerDependencyRange = defineCheck(() => { const devDependencies = getExpectedDevDependencies(packageJson); - await json(workspace.path, 'package.json').merge({ devDependencies }); + await json(context.package.path, 'package.json').merge({ + devDependencies, + }); }, - message: async ({ workspace }) => { + message: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); diff --git a/packages/commonality/commonality-recommended/src/ensure-readme.ts b/packages/commonality/commonality-recommended/src/ensure-readme.ts index 02a9bc05..34c53801 100644 --- a/packages/commonality/commonality-recommended/src/ensure-readme.ts +++ b/packages/commonality/commonality-recommended/src/ensure-readme.ts @@ -1,15 +1,15 @@ -import { defineCheck, json, text, PackageJson } from 'commonality'; +import { defineCheck, json, text, PackageJson, diff } from 'commonality'; export const ensureReadme = defineCheck(() => ({ name: 'commonality/ensure-readme', - validate: async ({ workspace }) => { - return text(workspace.path, 'README.md').exists(); + validate: async (context) => { + return text(context.package.path, 'README.md').exists(); }, - fix: async ({ workspace }) => { + fix: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -17,7 +17,7 @@ export const ensureReadme = defineCheck(() => ({ return; } - await text(workspace.path, 'README.md').set([ + await text(context.package.path, 'README.md').set([ `# ${packageJson.name}`, `> ${packageJson.description}`, ]); @@ -25,3 +25,5 @@ export const ensureReadme = defineCheck(() => ({ message: `Package must have a README.md file`, })); + + diff --git a/packages/commonality/commonality-recommended/src/multiple-dependency-types.ts b/packages/commonality/commonality-recommended/src/multiple-dependency-types.ts index 0647c401..b05db883 100644 --- a/packages/commonality/commonality-recommended/src/multiple-dependency-types.ts +++ b/packages/commonality/commonality-recommended/src/multiple-dependency-types.ts @@ -44,9 +44,9 @@ export const multipleDependencyTypes = defineCheck(() => { return { name: 'commonality/multiple-dependency-types', - validate: async ({ workspace }) => { + validate: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -65,9 +65,9 @@ export const multipleDependencyTypes = defineCheck(() => { return multipleDependencyTypes.length === 0; }, - fix: async ({ workspace }) => { + fix: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -77,12 +77,12 @@ export const multipleDependencyTypes = defineCheck(() => { const newPackageJson = getExpectedPackageJson(packageJson); - await json(workspace.path, 'package.json').set(newPackageJson); + await json(context.package.path, 'package.json').set(newPackageJson); }, - message: async ({ workspace }) => { + message: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); diff --git a/packages/commonality/commonality-recommended/src/no-external-mismatch.ts b/packages/commonality/commonality-recommended/src/no-external-mismatch.ts index 7efd525a..2cbfedd3 100644 --- a/packages/commonality/commonality-recommended/src/no-external-mismatch.ts +++ b/packages/commonality/commonality-recommended/src/no-external-mismatch.ts @@ -59,9 +59,9 @@ const getExpectedPackageJson = async ({ export const noExternalMismatch = defineCheck(() => { return { name: 'commonality/external-mismatch', - validate: async ({ allWorkspaces, workspace }) => { + validate: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -70,9 +70,7 @@ export const noExternalMismatch = defineCheck(() => { } const packageJsonsWithFalsey = await Promise.all( - allWorkspaces.map((workspace) => - json(workspace.path, 'package.json').get(), - ), + context.allPackages.map((pkg) => json(pkg.path, 'package.json').get()), ); const packageJsons = packageJsonsWithFalsey.filter( @@ -115,24 +113,24 @@ export const noExternalMismatch = defineCheck(() => { return true; }, - fix: async ({ allWorkspaces, workspace }) => { + fix: async (context) => { const expectedPackageJson = await getExpectedPackageJson({ - workspace, - allWorkspaces, + workspace: context.package, + allWorkspaces: context.allPackages, }); - await json(workspace.path, 'package.json').set(expectedPackageJson); + await json(context.package.path, 'package.json').set(expectedPackageJson); }, - message: async ({ workspace, allWorkspaces }) => { + message: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); const expectedPackageJson = await getExpectedPackageJson({ - workspace, - allWorkspaces, + workspace: context.package, + allWorkspaces: context.allPackages, }); return { diff --git a/packages/commonality/commonality-recommended/src/respository-field.ts b/packages/commonality/commonality-recommended/src/respository-field.ts index 4c9cc3be..33afdc55 100644 --- a/packages/commonality/commonality-recommended/src/respository-field.ts +++ b/packages/commonality/commonality-recommended/src/respository-field.ts @@ -73,13 +73,13 @@ const getExpectedProperties = async ({ export const repositoryField = defineCheck(() => { return { name: 'commonality/repository-field', - validate: async ({ rootWorkspace, workspace }): Promise => { + validate: async (context): Promise => { const rootPackageJson = await json( - rootWorkspace.path, + context.rootPackage.path, 'package.json', ).get(); const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -88,7 +88,7 @@ export const repositoryField = defineCheck(() => { } const workspacePath = path - .normalize(workspace.relativePath) + .normalize(context.package.relativePath) .replace(/^[/\\]+/, ''); const expectedUrl = rootPackageJson.repository + '/' + workspacePath; @@ -107,27 +107,27 @@ export const repositoryField = defineCheck(() => { return true; }, - fix: async ({ rootWorkspace, workspace }) => { + fix: async (context) => { const newConfig = await getExpectedProperties({ - rootWorkspace, - workspace, + rootWorkspace: context.rootPackage, + workspace: context.package, }); if (!newConfig) { return; } - return json(workspace.path, 'package.json').merge(newConfig); + return json(context.package.path, 'package.json').merge(newConfig); }, - message: async ({ workspace, rootWorkspace }) => { + message: async (context) => { const newConfig = await getExpectedProperties({ - rootWorkspace, - workspace, + rootWorkspace: context.rootPackage, + workspace: context.package, }); const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); diff --git a/packages/commonality/commonality-recommended/src/sorted-dependencies.ts b/packages/commonality/commonality-recommended/src/sorted-dependencies.ts index d7b706ee..e2f3197c 100644 --- a/packages/commonality/commonality-recommended/src/sorted-dependencies.ts +++ b/packages/commonality/commonality-recommended/src/sorted-dependencies.ts @@ -36,9 +36,9 @@ const getExpectedPackageJson = (packageJson: PackageJson) => { export const sortedDependencies = defineCheck(() => { return { name: 'commonality/ensure-sorted-dependencies', - validate: async ({ workspace }) => { + validate: async (ctx) => { const packageJson = await json( - workspace.path, + ctx.package.path, 'package.json', ).get(); @@ -57,9 +57,9 @@ export const sortedDependencies = defineCheck(() => { return deps && hasSortedKeys; }); }, - fix: async ({ workspace }) => { + fix: async (ctx) => { const packageJson = await json( - workspace.path, + ctx.package.path, 'package.json', ).get(); @@ -69,7 +69,7 @@ export const sortedDependencies = defineCheck(() => { const expectedPackageJson = getExpectedPackageJson(packageJson); - await json(workspace.path, 'package.json').set(expectedPackageJson); + await json(ctx.package.path, 'package.json').set(expectedPackageJson); }, message: () => { return { diff --git a/packages/commonality/commonality-recommended/src/valid-package-name.ts b/packages/commonality/commonality-recommended/src/valid-package-name.ts index 081a9898..87afe830 100644 --- a/packages/commonality/commonality-recommended/src/valid-package-name.ts +++ b/packages/commonality/commonality-recommended/src/valid-package-name.ts @@ -3,9 +3,9 @@ import validateNpmPackageName from 'validate-npm-package-name'; export const validPackageName = defineCheck(() => ({ name: 'commonality/valid-package-name', - validate: async ({ workspace }) => { + validate: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); @@ -25,9 +25,9 @@ export const validPackageName = defineCheck(() => ({ return true; }, type: 'error', - message: async ({ workspace }) => { + message: async (context) => { const packageJson = await json( - workspace.path, + context.package.path, 'package.json', ).get(); diff --git a/packages/commonality/commonality-recommended/test/sorted-dependencies.test.ts b/packages/commonality/commonality-recommended/test/sorted-dependencies.test.ts index 5494750f..05d7da7b 100644 --- a/packages/commonality/commonality-recommended/test/sorted-dependencies.test.ts +++ b/packages/commonality/commonality-recommended/test/sorted-dependencies.test.ts @@ -86,7 +86,7 @@ describe('sortedDependencies', () => { const conformer = createTestCheck(sortedDependencies()); const result = await conformer.message(); - console.log({ result }); + expect(result.title).toEqual( 'Dependencies in package.json must be sorted alphabetically', ); diff --git a/packages/conformance/data-conformance/src/json.ts b/packages/conformance/data-conformance/src/json.ts index ac1da679..fb0ede15 100644 --- a/packages/conformance/data-conformance/src/json.ts +++ b/packages/conformance/data-conformance/src/json.ts @@ -4,17 +4,15 @@ import { isMatch, merge, omit } from 'lodash-es'; import detectIndent from 'detect-indent'; import path from 'pathe'; -type Data = Record; - -export interface JsonFile extends Omit { +export interface JsonFile> extends Omit { get: () => Promise; - contains(value: Partial): Promise; - set(value: Data): Promise; - merge(value: Partial): Promise; + contains(value: Partial>): Promise; + set(value: Record): Promise; + merge(value: Partial>): Promise; remove(path: string): Promise; } -export function json( +export function json>( rootPath: string, filePath: string, ): JsonFile { @@ -30,7 +28,7 @@ export function json( const _text = getText(); - const writeFile = async (json: Data) => { + const writeFile = async (json: Record) => { const text = await _text; const defaultIndent = ' '; const indent = text diff --git a/packages/conformance/utils-conformance/src/create-test-check.ts b/packages/conformance/utils-conformance/src/create-test-check.ts index 1ae61212..55425525 100644 --- a/packages/conformance/utils-conformance/src/create-test-check.ts +++ b/packages/conformance/utils-conformance/src/create-test-check.ts @@ -1,10 +1,10 @@ import { Tag, Codeowner, Workspace } from '@commonalityco/types'; import stripAnsi from 'strip-ansi'; -import { Message, Check, CheckOptions } from '@commonalityco/utils-core'; +import { Message, Check, CheckContext } from '@commonalityco/utils-core'; type Awaitable = T | PromiseLike; -type FunctionType = (options: CheckOptions) => Awaitable; +type FunctionType = (options: CheckContext) => Awaitable; type TestConformer = { [P in keyof T]: P extends 'fix' | 'message' | 'validate' @@ -14,7 +14,7 @@ type TestConformer = { : T[P]; }; -interface TestCheckOptions { +interface TestCheckContext { workspace?: Workspace; rootWorkspace?: Workspace; allWorkspaces?: Workspace[]; @@ -24,7 +24,7 @@ interface TestCheckOptions { export function createTestCheck( conformer: T, - options?: TestCheckOptions, + options?: TestCheckContext, ): TestConformer { const defaultWorkspace = { path: './', @@ -38,10 +38,10 @@ export function createTestCheck( const testFixtures = { tags: options?.tags ?? [], codeowners: options?.codeowners ?? [], - workspace: options?.workspace ?? defaultWorkspace, - rootWorkspace: options?.rootWorkspace ?? defaultRootWorkspace, - allWorkspaces: options?.allWorkspaces ?? [defaultWorkspace], - }; + package: options?.workspace ?? defaultWorkspace, + rootPackage: options?.rootWorkspace ?? defaultRootWorkspace, + allPackages: options?.allWorkspaces ?? [defaultWorkspace], + } satisfies CheckContext; return { ...conformer, diff --git a/packages/conformance/utils-conformance/src/define-check.ts b/packages/conformance/utils-conformance/src/define-check.ts index b5b245f2..c85af0ec 100644 --- a/packages/conformance/utils-conformance/src/define-check.ts +++ b/packages/conformance/utils-conformance/src/define-check.ts @@ -1,8 +1,8 @@ import { Check } from '@commonalityco/utils-core'; -type CheckCreator = (options?: O) => C; +type CheckCreator = (...args: O) => C; -export function defineCheck( +export function defineCheck( checkCreator: CheckCreator, ): CheckCreator { return checkCreator; diff --git a/packages/conformance/utils-conformance/src/get-conformance-results.test.ts b/packages/conformance/utils-conformance/src/get-conformance-results.test.ts index 6bd373ce..f3ea9be5 100644 --- a/packages/conformance/utils-conformance/src/get-conformance-results.test.ts +++ b/packages/conformance/utils-conformance/src/get-conformance-results.test.ts @@ -193,8 +193,8 @@ describe('getConformanceResults', () => { { name: 'MessageFunctionConformer', validate: () => true, - message: ({ workspace }) => ({ - title: `Valid workspace for ${workspace.relativePath}`, + message: (context) => ({ + title: `Valid package for ${context.package.relativePath}`, }), }, ], @@ -221,7 +221,7 @@ describe('getConformanceResults', () => { expect(results).toHaveLength(1); expect(results[0].status).toBe(Status.Pass); expect(results[0].message.title).toBe( - 'Valid workspace for /path/to/workspace', + 'Valid package for /path/to/workspace', ); expect(results[0].filter).toBe('*'); expect(results[0].package).toEqual(packages[0]); diff --git a/packages/conformance/utils-conformance/src/get-conformance-results.ts b/packages/conformance/utils-conformance/src/get-conformance-results.ts index c0aed295..ac6c6ec8 100644 --- a/packages/conformance/utils-conformance/src/get-conformance-results.ts +++ b/packages/conformance/utils-conformance/src/get-conformance-results.ts @@ -52,15 +52,15 @@ export const getConformanceResults = async ({ const getStatus = async (): Promise => { try { const result = await conformer.validate({ - workspace: Object.freeze({ + package: Object.freeze({ path: path.join(rootDirectory, pkg.path), relativePath: pkg.path, }), - allWorkspaces: packages.map((innerPkg) => ({ + allPackages: packages.map((innerPkg) => ({ path: path.join(rootDirectory, innerPkg.path), relativePath: innerPkg.path, })), - rootWorkspace: { + rootPackage: { path: rootDirectory, relativePath: '.', }, @@ -87,15 +87,15 @@ export const getConformanceResults = async ({ try { const message = await conformer.message({ - workspace: Object.freeze({ + package: Object.freeze({ path: path.join(rootDirectory, pkg.path), relativePath: pkg.path, }), - allWorkspaces: packages.map((innerPkg) => ({ + allPackages: packages.map((innerPkg) => ({ path: path.join(rootDirectory, innerPkg.path), relativePath: innerPkg.path, })), - rootWorkspace: { + rootPackage: { path: rootDirectory, relativePath: '.', }, diff --git a/packages/conformance/utils-conformance/src/run-fixes.test.ts b/packages/conformance/utils-conformance/src/run-fixes.test.ts index d185abf1..006dd081 100644 --- a/packages/conformance/utils-conformance/src/run-fixes.test.ts +++ b/packages/conformance/utils-conformance/src/run-fixes.test.ts @@ -55,17 +55,17 @@ describe('runFixes', () => { }); expect(mockFix).toHaveBeenCalledWith({ - workspace: Object.freeze({ + package: { path: 'root/directory/path/to/test-package', relativePath: 'path/to/test-package', - }), - allWorkspaces: [ + }, + allPackages: [ { path: 'root/directory/path/to/test-package', relativePath: 'path/to/test-package', }, ], - rootWorkspace: { + rootPackage: { path: 'root/directory', relativePath: '.', }, diff --git a/packages/conformance/utils-conformance/src/run-fixes.ts b/packages/conformance/utils-conformance/src/run-fixes.ts index a7ac502d..33defb8b 100644 --- a/packages/conformance/utils-conformance/src/run-fixes.ts +++ b/packages/conformance/utils-conformance/src/run-fixes.ts @@ -42,15 +42,15 @@ export const runFixes = async ({ if (result.fix) { await result.fix({ - workspace: Object.freeze({ + package: Object.freeze({ path: path.join(rootDirectory, result.package.path), relativePath: result.package.path, }), - allWorkspaces: allPackages.map((pkg) => ({ + allPackages: allPackages.map((pkg) => ({ path: path.join(rootDirectory, pkg.path), relativePath: pkg.path, })), - rootWorkspace: { + rootPackage: { path: rootDirectory, relativePath: '.', }, diff --git a/packages/shared/ui-core/package.json b/packages/shared/ui-core/package.json index 250e3b0a..dd49bf2d 100644 --- a/packages/shared/ui-core/package.json +++ b/packages/shared/ui-core/package.json @@ -4,15 +4,14 @@ "type": "module", "version": "0.0.16", "publishConfig": { - "access": "public", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": "./dist/index.js" - } + "access": "public" + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js" }, "sideEffects": false, - "types": "./src/index.ts", "dependencies": { "@radix-ui/react-slot": "^1.0.2", "class-variance-authority": "^0.7.0", @@ -48,11 +47,6 @@ "test": "vitest", "type-check": "tsc --noEmit" }, - "exports": { - ".": "./src/index.ts", - "./*": "./dist/*.js" - }, - "main": "./src/index.ts", "engines": { "node": ">=16" }, diff --git a/packages/shared/ui-core/src/index.ts b/packages/shared/ui-core/src/index.ts index 94888b96..65316af5 100644 --- a/packages/shared/ui-core/src/index.ts +++ b/packages/shared/ui-core/src/index.ts @@ -10,3 +10,5 @@ export { NavigationLogo } from './navigation-logo'; export { Divider } from './divider'; export { ThemeButtonLoading } from './theme-button-loading'; export { NavigationButton } from './navigation-button'; +export { WordLogo } from './word-logo'; +export { WordLogoFull } from './word-logo-full'; \ No newline at end of file diff --git a/packages/shared/ui-core/src/logo.tsx b/packages/shared/ui-core/src/logo.tsx index 01cee250..59fa15b3 100644 --- a/packages/shared/ui-core/src/logo.tsx +++ b/packages/shared/ui-core/src/logo.tsx @@ -15,13 +15,13 @@ export function Logo(properties: JSX.IntrinsicElements['svg']) { fillRule="evenodd" clipRule="evenodd" d="M20.7294 4.37464C21.047 4.77185 20.5792 5.28719 20.1033 5.10782C18.8272 4.62686 17.4443 4.36372 16 4.36372C9.57342 4.36372 4.36364 9.57349 4.36364 16.0001C4.36364 17.4443 4.62676 18.8271 5.10768 20.1032C5.28704 20.5791 4.77169 21.0469 4.37449 20.7292C1.70802 18.5969 0 15.3161 0 11.6364C0 5.20978 5.20978 0 11.6364 0C15.3162 0 18.597 1.70808 20.7294 4.37464Z" - className="fill-primary" + fill="currentColor" /> diff --git a/packages/shared/ui-core/src/word-logo-full.tsx b/packages/shared/ui-core/src/word-logo-full.tsx new file mode 100644 index 00000000..05957c07 --- /dev/null +++ b/packages/shared/ui-core/src/word-logo-full.tsx @@ -0,0 +1,75 @@ +export function WordLogoFull() { + return ( + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/shared/ui-core/src/word-logo.tsx b/packages/shared/ui-core/src/word-logo.tsx new file mode 100644 index 00000000..0b789382 --- /dev/null +++ b/packages/shared/ui-core/src/word-logo.tsx @@ -0,0 +1,63 @@ +export function WordLogo() { + return ( + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/packages/shared/ui-design-system/package.json b/packages/shared/ui-design-system/package.json index 3d1de0eb..1a5b6bd5 100644 --- a/packages/shared/ui-design-system/package.json +++ b/packages/shared/ui-design-system/package.json @@ -3,16 +3,23 @@ "description": "UI primitives built with shadcn", "version": "0.0.14", "publishConfig": { - "access": "public", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": "./dist/index.js" - } + "access": "public" }, "sideEffects": false, "type": "module", - "types": "./src/index.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js", + "./cn": "./dist/cn.js", + "./tooltip": "./dist/tooltip.js", + "./button": "./dist/button.js", + "./toaster": "./dist/toaster.js", + "./dropdown-menu": "./dist/dropdown-menu.js" + }, + "files": [ + "dist" + ], "dependencies": { "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-checkbox": "^1.0.4", @@ -54,16 +61,11 @@ "react": ">=18", "react-dom": ">=18" }, - "exports": { - ".": "./src/index.ts", - "./*": "./dist/*.js" - }, "scripts": { "lint": "eslint .", "lint:fix": "eslint . --fix", "build": "tsc --build", "type-check": "tsc --noEmit" }, - "main": "./src/index.ts", "repository": "https://github.com/commonalityco/commonality/packages/shared/ui-design-system" } diff --git a/packages/shared/utils-core/src/constants.ts b/packages/shared/utils-core/src/constants.ts index 1e9ef861..ed1ca83f 100644 --- a/packages/shared/utils-core/src/constants.ts +++ b/packages/shared/utils-core/src/constants.ts @@ -49,15 +49,15 @@ const packagePaths = z.object({ relativePath: z.string(), }); -const checkOptionsSchema = z.object({ - workspace: packagePaths, - allWorkspaces: z.array(packagePaths), - rootWorkspace: packagePaths, +const checkContextSchema = z.object({ + package: packagePaths, + allPackages: z.array(packagePaths), + rootPackage: packagePaths, codeowners: z.array(z.string()), tags: z.array(z.string()), }); -const checkFn = z.function().args(checkOptionsSchema); +const checkFn = z.function().args(checkContextSchema); const wildcard = z.literal('*'); @@ -101,7 +101,7 @@ export const projectConfigSchema = z.object({ export type ProjectConfig = z.infer; export type Check = z.infer; -export type CheckOptions = z.infer; +export type CheckContext = z.infer; export type Message = z.infer; export type Constraint = z.infer; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ab83b4eb..e8e34187 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -211,27 +211,30 @@ importers: apps/documentation: dependencies: + '@commonalityco/ui-core': + specifier: workspace:* + version: link:../../packages/shared/ui-core '@commonalityco/ui-design-system': specifier: workspace:* version: link:../../packages/shared/ui-design-system next: - specifier: ^13.0.6 - version: 13.5.6(react-dom@18.2.0)(react@18.2.0) + specifier: ^14.0.4 + version: 14.0.4(react-dom@18.2.0)(react@18.2.0) nextra: specifier: latest - version: 2.13.2(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) + version: 2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) nextra-theme-docs: specifier: latest - version: 2.13.2(next@13.5.6)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) + version: 2.13.2(next@14.0.4)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) - tailwindcss: - specifier: ^3.3.3 - version: 3.4.0(ts-node@10.9.2) + sharp: + specifier: ^0.33.1 + version: 0.33.1 devDependencies: '@commonalityco/config-tailwind': specifier: workspace:* @@ -239,6 +242,15 @@ importers: '@types/node': specifier: 18.11.10 version: 18.11.10 + autoprefixer: + specifier: ^10.4.16 + version: 10.4.16(postcss@8.4.32) + postcss: + specifier: ^8.4.30 + version: 8.4.32 + tailwindcss: + specifier: ^3.4.0 + version: 3.4.0(ts-node@10.9.2) typescript: specifier: ^4.9.3 version: 4.9.5 @@ -1473,6 +1485,7 @@ packages: /@alloc/quick-lru@5.2.0: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + dev: true /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} @@ -3006,6 +3019,14 @@ packages: engines: {node: '>=10.0.0'} dev: true + /@emnapi/runtime@0.44.0: + resolution: {integrity: sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + /@emotion/babel-plugin@11.11.0: resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} dependencies: @@ -3586,6 +3607,194 @@ packages: /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@img/sharp-darwin-arm64@0.33.1: + resolution: {integrity: sha512-esr2BZ1x0bo+wl7Gx2hjssYhjrhUsD88VQulI0FrG8/otRQUOxLWHMBd1Y1qo2Gfg2KUvXNpT0ASnV9BzJCexw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.0 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.1: + resolution: {integrity: sha512-YrnuB3bXuWdG+hJlXtq7C73lF8ampkhU3tMxg5Hh+E7ikxbUVOU9nlNtVTloDXz6pRHt2y2oKJq7DY/yt+UXYw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.0 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.0: + resolution: {integrity: sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.0: + resolution: {integrity: sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.0: + resolution: {integrity: sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.0: + resolution: {integrity: sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.0: + resolution: {integrity: sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.0: + resolution: {integrity: sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.0: + resolution: {integrity: sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.0: + resolution: {integrity: sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.1: + resolution: {integrity: sha512-59B5GRO2d5N3tIfeGHAbJps7cLpuWEQv/8ySd9109ohQ3kzyCACENkFVAnGPX00HwPTQcaBNF7HQYEfZyZUFfw==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.0 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.1: + resolution: {integrity: sha512-Ii4X1vnzzI4j0+cucsrYA5ctrzU9ciXERfJR633S2r39CiD8npqH2GMj63uFZRCFt3E687IenAdbwIpQOJ5BNA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.0 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.1: + resolution: {integrity: sha512-tRGrb2pHnFUXpOAj84orYNxHADBDIr0J7rrjwQrTNMQMWA4zy3StKmMvwsI7u3dEZcgwuMMooIIGWEWOjnmG8A==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.0 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.1: + resolution: {integrity: sha512-4y8osC0cAc1TRpy02yn5omBeloZZwS62fPZ0WUAYQiLhSFSpWJfY/gMrzKzLcHB9ulUV6ExFiu2elMaixKDbeg==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.1: + resolution: {integrity: sha512-D3lV6clkqIKUizNS8K6pkuCKNGmWoKlBGh5p0sLO2jQERzbakhu4bVX1Gz+RS4vTZBprKlWaf+/Rdp3ni2jLfA==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.1: + resolution: {integrity: sha512-LOGKNu5w8uu1evVqUAUKTix2sQu1XDRIYbsi5Q0c/SrXhvJ4QyOx+GaajxmOg5PZSsSnCYPSmhjHHsRBx06/wQ==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.1: + resolution: {integrity: sha512-vWI/sA+0p+92DLkpAMb5T6I8dg4z2vzCUnp8yvxHlwBpzN8CIcO3xlSXrLltSvK6iMsVMNswAv+ub77rsf25lA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 0.44.0 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.1: + resolution: {integrity: sha512-/xhYkylsKL05R+NXGJc9xr2Tuw6WIVl2lubFJaFYfW4/MQ4J+dgjIo/T4qjNRizrqs/szF/lC9a5+updmY9jaQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.1: + resolution: {integrity: sha512-XaM69X0n6kTEsp9tVYYLhXdg7Qj32vYJlAKRutxUsm1UlgQNx6BOhHwZPwukCGXBU2+tH87ip2eV1I/E8MQnZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -4081,28 +4290,19 @@ packages: - utf-8-validate dev: true - /@next/env@13.5.6: - resolution: {integrity: sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==} - dev: false - /@next/env@14.0.1: resolution: {integrity: sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A==} + /@next/env@14.0.4: + resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} + dev: false + /@next/eslint-plugin-next@14.0.4: resolution: {integrity: sha512-U3qMNHmEZoVmHA0j/57nRfi3AscXNvkOnxDmle/69Jz/G0o/gWjXTDdlgILZdrxQ0Lw/jv2mPW8PGy0EGIHXhQ==} dependencies: glob: 7.1.7 dev: true - /@next/swc-darwin-arm64@13.5.6: - resolution: {integrity: sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - /@next/swc-darwin-arm64@14.0.1: resolution: {integrity: sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==} engines: {node: '>= 10'} @@ -4111,10 +4311,10 @@ packages: requiresBuild: true optional: true - /@next/swc-darwin-x64@13.5.6: - resolution: {integrity: sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==} + /@next/swc-darwin-arm64@14.0.4: + resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [darwin] requiresBuild: true dev: false @@ -4128,11 +4328,11 @@ packages: requiresBuild: true optional: true - /@next/swc-linux-arm64-gnu@13.5.6: - resolution: {integrity: sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==} + /@next/swc-darwin-x64@14.0.4: + resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [darwin] requiresBuild: true dev: false optional: true @@ -4145,8 +4345,8 @@ packages: requiresBuild: true optional: true - /@next/swc-linux-arm64-musl@13.5.6: - resolution: {integrity: sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==} + /@next/swc-linux-arm64-gnu@14.0.4: + resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -4162,10 +4362,10 @@ packages: requiresBuild: true optional: true - /@next/swc-linux-x64-gnu@13.5.6: - resolution: {integrity: sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==} + /@next/swc-linux-arm64-musl@14.0.4: + resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [linux] requiresBuild: true dev: false @@ -4179,8 +4379,8 @@ packages: requiresBuild: true optional: true - /@next/swc-linux-x64-musl@13.5.6: - resolution: {integrity: sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==} + /@next/swc-linux-x64-gnu@14.0.4: + resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -4196,11 +4396,11 @@ packages: requiresBuild: true optional: true - /@next/swc-win32-arm64-msvc@13.5.6: - resolution: {integrity: sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==} + /@next/swc-linux-x64-musl@14.0.4: + resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [linux] requiresBuild: true dev: false optional: true @@ -4213,10 +4413,10 @@ packages: requiresBuild: true optional: true - /@next/swc-win32-ia32-msvc@13.5.6: - resolution: {integrity: sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==} + /@next/swc-win32-arm64-msvc@14.0.4: + resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} engines: {node: '>= 10'} - cpu: [ia32] + cpu: [arm64] os: [win32] requiresBuild: true dev: false @@ -4230,10 +4430,10 @@ packages: requiresBuild: true optional: true - /@next/swc-win32-x64-msvc@13.5.6: - resolution: {integrity: sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==} + /@next/swc-win32-ia32-msvc@14.0.4: + resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} engines: {node: '>= 10'} - cpu: [x64] + cpu: [ia32] os: [win32] requiresBuild: true dev: false @@ -4247,6 +4447,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-x64-msvc@14.0.4: + resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -7964,6 +8173,7 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -7988,6 +8198,7 @@ packages: /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -8612,6 +8823,7 @@ packages: /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} + dev: true /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} @@ -8914,6 +9126,21 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: true @@ -8944,6 +9171,7 @@ packages: /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + dev: true /commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} @@ -9231,6 +9459,7 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + dev: true /cssom@0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} @@ -9891,6 +10120,11 @@ packages: engines: {node: '>=12.20'} dev: false + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -9924,6 +10158,7 @@ packages: /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} @@ -9946,6 +10181,7 @@ packages: /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -11510,6 +11746,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} @@ -12153,6 +12390,10 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -13368,10 +13609,12 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + dev: true /lilconfig@3.0.0: resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} engines: {node: '>=14'} + dev: true /line-column-path@3.0.0: resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} @@ -14524,6 +14767,7 @@ packages: 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==} @@ -14571,44 +14815,44 @@ packages: - supports-color dev: false - /next-seo@6.4.0(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + /next-seo@6.4.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-XQFxkOL2hw0YE+P100HbI3EAvcludlHPxuzMgaIjKb7kPK0CvjGvLFjd9hszZFEDc5oiQkGFA8+cuWcnip7eYA==} peerDependencies: next: ^8.1.1-canary.54 || >=9.0.0 react: '>=16.0.0' react-dom: '>=16.0.0' dependencies: - next: 13.5.6(react-dom@18.2.0)(react@18.2.0) + next: 14.0.4(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /next-themes@0.2.1(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + /next-themes@0.2.1(next@14.0.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 13.5.6(react-dom@18.2.0)(react@18.2.0) + next: 14.0.1(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - dev: false - /next-themes@0.2.1(next@14.0.1)(react-dom@18.2.0)(react@18.2.0): + /next-themes@0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 14.0.1(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0) + next: 14.0.4(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + dev: false - /next@13.5.6(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==} - engines: {node: '>=16.14.0'} + /next@14.0.1(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==} + engines: {node: '>=18.17.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -14621,7 +14865,7 @@ packages: sass: optional: true dependencies: - '@next/env': 13.5.6 + '@next/env': 14.0.1 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001565 @@ -14631,22 +14875,21 @@ packages: styled-jsx: 5.1.1(@babel/core@7.23.6)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 13.5.6 - '@next/swc-darwin-x64': 13.5.6 - '@next/swc-linux-arm64-gnu': 13.5.6 - '@next/swc-linux-arm64-musl': 13.5.6 - '@next/swc-linux-x64-gnu': 13.5.6 - '@next/swc-linux-x64-musl': 13.5.6 - '@next/swc-win32-arm64-msvc': 13.5.6 - '@next/swc-win32-ia32-msvc': 13.5.6 - '@next/swc-win32-x64-msvc': 13.5.6 + '@next/swc-darwin-arm64': 14.0.1 + '@next/swc-darwin-x64': 14.0.1 + '@next/swc-linux-arm64-gnu': 14.0.1 + '@next/swc-linux-arm64-musl': 14.0.1 + '@next/swc-linux-x64-gnu': 14.0.1 + '@next/swc-linux-x64-musl': 14.0.1 + '@next/swc-win32-arm64-msvc': 14.0.1 + '@next/swc-win32-ia32-msvc': 14.0.1 + '@next/swc-win32-x64-msvc': 14.0.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /next@14.0.1(@babel/core@7.23.6)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==} + /next@14.0.4(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -14660,30 +14903,32 @@ packages: sass: optional: true dependencies: - '@next/env': 14.0.1 + '@next/env': 14.0.4 '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001565 + graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) styled-jsx: 5.1.1(@babel/core@7.23.6)(react@18.2.0) watchpack: 2.4.0 optionalDependencies: - '@next/swc-darwin-arm64': 14.0.1 - '@next/swc-darwin-x64': 14.0.1 - '@next/swc-linux-arm64-gnu': 14.0.1 - '@next/swc-linux-arm64-musl': 14.0.1 - '@next/swc-linux-x64-gnu': 14.0.1 - '@next/swc-linux-x64-musl': 14.0.1 - '@next/swc-win32-arm64-msvc': 14.0.1 - '@next/swc-win32-ia32-msvc': 14.0.1 - '@next/swc-win32-x64-msvc': 14.0.1 + '@next/swc-darwin-arm64': 14.0.4 + '@next/swc-darwin-x64': 14.0.4 + '@next/swc-linux-arm64-gnu': 14.0.4 + '@next/swc-linux-arm64-musl': 14.0.4 + '@next/swc-linux-x64-gnu': 14.0.4 + '@next/swc-linux-x64-musl': 14.0.4 + '@next/swc-win32-arm64-msvc': 14.0.4 + '@next/swc-win32-ia32-msvc': 14.0.4 + '@next/swc-win32-x64-msvc': 14.0.4 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros + dev: false - /nextra-theme-docs@2.13.2(next@13.5.6)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): + /nextra-theme-docs@2.13.2(next@14.0.4)(nextra@2.13.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yE4umXaImp1/kf/sFciPj2+EFrNSwd9Db26hi98sIIiujzGf3+9eUgAz45vF9CwBw50FSXxm1QGRcY+slQ4xQQ==} peerDependencies: next: '>=9.5.3' @@ -14700,17 +14945,17 @@ packages: git-url-parse: 13.1.1 intersection-observer: 0.12.2 match-sorter: 6.3.1 - next: 13.5.6(react-dom@18.2.0)(react@18.2.0) - next-seo: 6.4.0(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) - next-themes: 0.2.1(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) - nextra: 2.13.2(next@13.5.6)(react-dom@18.2.0)(react@18.2.0) + next: 14.0.4(react-dom@18.2.0)(react@18.2.0) + next-seo: 6.4.0(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + next-themes: 0.2.1(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) + nextra: 2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) scroll-into-view-if-needed: 3.1.0 zod: 3.22.4 dev: false - /nextra@2.13.2(next@13.5.6)(react-dom@18.2.0)(react@18.2.0): + /nextra@2.13.2(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-pIgOSXNUqTz1laxV4ChFZOU7lzJAoDHHaBPj8L09PuxrLKqU1BU/iZtXAG6bQeKCx8EPdBsoXxEuENnL9QGnGA==} engines: {node: '>=16'} peerDependencies: @@ -14730,7 +14975,7 @@ packages: gray-matter: 4.0.3 katex: 0.16.9 lodash.get: 4.4.2 - next: 13.5.6(react-dom@18.2.0)(react@18.2.0) + next: 14.0.4(react-dom@18.2.0)(react@18.2.0) next-mdx-remote: 4.4.1(react-dom@18.2.0)(react@18.2.0) p-limit: 3.1.0 react: 18.2.0 @@ -14865,6 +15110,7 @@ packages: /object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + dev: true /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -15307,6 +15553,7 @@ packages: /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + dev: true /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} @@ -15367,6 +15614,7 @@ packages: /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + dev: true /pkg-dir@3.0.0: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} @@ -15417,6 +15665,7 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 + dev: true /postcss-js@4.0.1(postcss@8.4.32): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} @@ -15426,6 +15675,7 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.32 + dev: true /postcss-load-config@4.0.2(postcss@8.4.32)(ts-node@10.9.2): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} @@ -15443,6 +15693,7 @@ packages: postcss: 8.4.32 ts-node: 10.9.2(@types/node@20.10.5)(typescript@5.3.3) yaml: 2.3.4 + dev: true /postcss-loader@7.3.3(postcss@8.4.32)(typescript@5.3.3)(webpack@5.89.0): resolution: {integrity: sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==} @@ -15509,6 +15760,7 @@ packages: dependencies: postcss: 8.4.32 postcss-selector-parser: 6.0.13 + dev: true /postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -15524,9 +15776,11 @@ packages: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} @@ -16065,6 +16319,7 @@ packages: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 + dev: true /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -16747,6 +17002,36 @@ packages: kind-of: 6.0.3 dev: true + /sharp@0.33.1: + resolution: {integrity: sha512-iAYUnOdTqqZDb3QjMneBKINTllCJDZ3em6WaWy7NPECM4aHncvqHRm0v0bN9nqJxMiwamv5KIdauJ6lUzKDpTQ==} + engines: {libvips: '>=8.15.0', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + semver: 7.5.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.1 + '@img/sharp-darwin-x64': 0.33.1 + '@img/sharp-libvips-darwin-arm64': 1.0.0 + '@img/sharp-libvips-darwin-x64': 1.0.0 + '@img/sharp-libvips-linux-arm': 1.0.0 + '@img/sharp-libvips-linux-arm64': 1.0.0 + '@img/sharp-libvips-linux-s390x': 1.0.0 + '@img/sharp-libvips-linux-x64': 1.0.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.0 + '@img/sharp-libvips-linuxmusl-x64': 1.0.0 + '@img/sharp-linux-arm': 0.33.1 + '@img/sharp-linux-arm64': 0.33.1 + '@img/sharp-linux-s390x': 0.33.1 + '@img/sharp-linux-x64': 0.33.1 + '@img/sharp-linuxmusl-arm64': 0.33.1 + '@img/sharp-linuxmusl-x64': 0.33.1 + '@img/sharp-wasm32': 0.33.1 + '@img/sharp-win32-ia32': 0.33.1 + '@img/sharp-win32-x64': 0.33.1 + dev: false + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -16796,6 +17081,12 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -17366,6 +17657,7 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 + dev: true /superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} @@ -17454,6 +17746,7 @@ packages: sucrase: 3.34.0 transitivePeerDependencies: - ts-node + dev: true /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -17589,11 +17882,13 @@ packages: 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 /thread-stream@2.4.1: resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} @@ -17746,6 +18041,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true /ts-node@10.9.2(@types/node@20.10.5)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} diff --git a/tooling/config-tailwind/globals.css b/tooling/config-tailwind/globals.css index ce1f0140..2f881273 100644 --- a/tooling/config-tailwind/globals.css +++ b/tooling/config-tailwind/globals.css @@ -2,92 +2,90 @@ @tailwind components; @tailwind utilities; -@layer base { - :root { - --font-sans: 'Inter'; - --font-serif: 'Vollkorn'; - --font-mono: 'Fira Code'; +:root { + --font-sans: 'Inter'; + --font-serif: 'Vollkorn'; + --font-mono: 'Fira Code'; - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; + --background: 0 0% 100%; + --foreground: 240 10% 3.9%; - --muted: 0 0% 98%; - --muted-foreground: 240 3.8% 46.1%; + --muted: 0 0% 98%; + --muted-foreground: 240 3.8% 46.1%; - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 240 10% 3.9%; - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; + --card: 0 0% 100%; + --card-foreground: 240 10% 3.9%; - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; + --border: 240 5.9% 90%; + --input: 240 5.9% 90%; - --primary: 240 5.9% 10%; - --primary-foreground: 0 0% 98%; + --primary: 240 5.9% 10%; + --primary-foreground: 0 0% 98%; - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; + --secondary: 240 4.8% 95.9%; + --secondary-foreground: 240 5.9% 10%; - --interactive: 240 4.8% 95.9%; - --interactive-foreground: 240 5.9% 10%; + --interactive: 240 4.8% 95.9%; + --interactive-foreground: 240 5.9% 10%; - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.2% 33.9%; + --accent: 240 4.8% 95.9%; + --accent-foreground: 240 5.2% 33.9%; - --destructive: 0 72.2% 50.6%; - --destructive-foreground: 0 0% 98%; + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 0 0% 98%; - --success: 161.4, 93.5%, 30.4%; - --success-foreground: 0 0% 98%; + --success: 161.4, 93.5%, 30.4%; + --success-foreground: 0 0% 98%; - --warning: 40.6, 96.1%, 40.4%; - --warning-foreground: 0 0% 98%; + --warning: 40.6, 96.1%, 40.4%; + --warning-foreground: 0 0% 98%; - --ring: 240 5% 64.9%; + --ring: 240 5% 64.9%; - --radius: 0.5rem; - } + --radius: 0.5rem; +} - .dark { - --background: 240 5.9% 10%; - --foreground: 0 0% 98%; +.dark { + --background: 240 5.9% 10%; + --foreground: 0 0% 98%; - --muted: 240 3.7% 12%; - --muted-foreground: 240 5% 64.9%; + --muted: 240 3.7% 12%; + --muted-foreground: 240 5% 64.9%; - --popover: 240 5.9% 10%; - --popover-foreground: 0 0% 98%; + --popover: 240 5.9% 10%; + --popover-foreground: 0 0% 98%; - --card: 240 5.9% 10%; - --card-foreground: 0 0% 98%; + --card: 240 5.9% 10%; + --card-foreground: 0 0% 98%; - --border: 240 5.3% 26.1%; - --input: 240 5.3% 26.1%; + --border: 240 5.3% 26.1%; + --input: 240 5.3% 26.1%; - --primary: 0 0% 98%; - --primary-foreground: 240 5.9% 10%; + --primary: 0 0% 98%; + --primary-foreground: 240 5.9% 10%; - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; + --secondary: 240 3.7% 15.9%; + --secondary-foreground: 0 0% 98%; - --interactive: 0 0%, 3.92%; - --interactive-foreground: 0 0% 98%; + --interactive: 0 0%, 3.92%; + --interactive-foreground: 0 0% 98%; - --accent: 240 3.7% 15.9%; - --accent-foreground: 0 0% 98%; + --accent: 240 3.7% 15.9%; + --accent-foreground: 0 0% 98%; - --destructive: 0, 84.2%, 60.2%; - --destructive-foreground: 0 85.7% 97.3%; + --destructive: 0, 84.2%, 60.2%; + --destructive-foreground: 0 85.7% 97.3%; - --warning: 45.4, 93.4%, 47.5%; - --warning-foreground: 0 0% 98%; + --warning: 45.4, 93.4%, 47.5%; + --warning-foreground: 0 0% 98%; - --success: 160.1, 84.1%, 39.4%; - --success-foreground: 0 0% 98%; + --success: 160.1, 84.1%, 39.4%; + --success-foreground: 0 0% 98%; - --ring: 240 3.7% 15.9%; - } + --ring: 240 3.7% 15.9%; } @layer base { @@ -95,6 +93,6 @@ @apply border-border; } body { - @apply bg-background text-foreground text-sm; + @apply bg-background text-foreground; } } diff --git a/tooling/config-tailwind/tailwind.config.js b/tooling/config-tailwind/tailwind.config.js index 083087d8..697a7ff6 100644 --- a/tooling/config-tailwind/tailwind.config.js +++ b/tooling/config-tailwind/tailwind.config.js @@ -43,10 +43,6 @@ module.exports = { DEFAULT: 'hsl(var(--interactive))', foreground: 'hsl(var(--interactive-foreground))', }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: 'hsl(var(--destructive-foreground))', - }, warning: { DEFAULT: 'hsl(var(--warning))', foreground: 'hsl(var(--warning-foreground))',