limina 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,386 +1,29 @@
1
1
  # limina
2
2
 
3
+ <p align="center">
4
+ <a href="https://docs.senao.me/docs-islands/limina" target="_blank" rel="noopener noreferrer">
5
+ <img width="180" src="https://docs.senao.me/docs-islands/limina/logo.svg" alt="limina logo">
6
+ </a>
7
+ </p>
3
8
  <p align="center">
4
9
  <a href="https://npmjs.com/package/limina"><img src="https://img.shields.io/npm/v/limina.svg" alt="npm package"></a>
5
10
  <a href="https://nodejs.org/en/about/previous-releases"><img src="https://img.shields.io/node/v/limina.svg" alt="node compatibility"></a>
6
- <a href="https://github.com/XiSenao/docs-islands/actions/workflows/ci.yml"><img src="https://github.com/XiSenao/docs-islands/actions/workflows/ci.yml/badge.svg?branch=main" alt="build status"></a>
7
- <a href="https://github.com/XiSenao/docs-islands/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/limina.svg" alt="license"></a>
11
+ <a href="https://github.com/XiSenao/docs-islands/blob/main/packages/limina/LICENSE.md"><img src="https://img.shields.io/npm/l/limina.svg" alt="license"></a>
8
12
  </p>
9
13
 
10
14
  English | [简体中文](./README.zh-CN.md)
11
15
 
12
- `limina` is a configurable governance CLI for TypeScript monorepos. It keeps TypeScript project references, source typechecks, compatibility paths, package export policy, and publish-time package checks in one explicit `limina.config.mjs` file.
13
-
14
- Limina is not a bundler and does not replace `tsc`, `vue-tsc`, tests, or release tooling. It coordinates them and verifies that the architecture they depend on stays consistent.
15
-
16
- ## Why Limina?
17
-
18
- Large TypeScript workspaces often need more than `tsc --noEmit`:
19
-
20
- - project references must match real cross-project imports;
21
- - production graph projects should not depend on tools or tests;
22
- - browser/runtime output should not import Node builtins;
23
- - `workspace:*` dependencies should resolve to source during graph checks;
24
- - generated compatibility `paths` should not silently drift;
25
- - built package outputs need consumer-facing checks before release;
26
- - Vue, docs, playground, and smoke checks may need checker-specific tooling outside native `tsc -b`.
27
-
28
- Limina makes these rules reviewable, runnable, and suitable for CI.
29
-
30
- ## Features
31
-
32
- - **Project graph validation**: checks reachable TypeScript declaration leaves, references, graph-owned imports, package boundaries, and label-based deny rules.
33
- - **Typecheck coverage proof**: verifies that reachable declaration leaves match strict local typecheck companions and that source files are covered by checker entries or allowlist entries.
34
- - **Compatibility path generation**: writes opt-in `tsconfig.dts.paths.generated.json` files for `workspace:*` dependencies whose package exports still point at build artifacts.
35
- - **Checker target runner**: runs configured TypeScript and UI-framework checker entries in `typecheck` or `build` execution mode.
36
- - **Published package checks**: validates built package outputs with `publint`, Are The Types Wrong, and a runtime import boundary audit.
37
- - **Release checks**: verifies npm tarball hygiene, source/packed manifest consistency, and registry-backed workspace publish order.
38
- - **Composable pipelines**: combines built-in checks and shell commands into named workflows such as `typecheck`, `package`, and `publish`.
39
- - **Typed configuration**: ships `defineConfig(...)` for editor hints and typed user configs.
40
-
41
- ## Requirements
42
-
43
- - Node.js `^20.19.0 || >=22.12.0`
44
- - pnpm workspace with `pnpm-workspace.yaml`
45
- - TypeScript installed in the consuming repository
46
- - ESM-compatible `limina.config.mjs`
47
-
48
- ## Installation
49
-
50
- ```sh
51
- pnpm add -D limina typescript
52
- ```
53
-
54
- ## Quick start
55
-
56
- Create `limina.config.mjs` at the workspace root:
57
-
58
- ```js
59
- import { defineConfig } from 'limina';
60
-
61
- export default defineConfig({
62
- config: {
63
- checkers: {
64
- typescript: {
65
- preset: 'tsc',
66
- entry: 'tsconfig.build.json',
67
- },
68
- vue: {
69
- preset: 'vue-tsc',
70
- entry: 'tsconfig.vue.build.json',
71
- },
72
- },
73
- },
74
-
75
- graph: {
76
- rules: {
77
- 'runtime-client': {
78
- deny: {
79
- refs: [
80
- {
81
- path: 'packages/app/src/node/tsconfig.lib.dts.json',
82
- reason: 'client runtime must not depend on the Node runtime',
83
- },
84
- ],
85
- },
86
- },
87
- },
88
- },
89
-
90
- proof: {
91
- allowlist: [
92
- {
93
- file: 'src/generated/runtime.d.ts',
94
- reason: 'Generated declaration stub covered by the runtime build process.',
95
- },
96
- ],
97
- },
98
-
99
- package: {
100
- entries: [
101
- {
102
- name: '@acme/core',
103
- outDir: 'packages/core/dist',
104
- },
105
- ],
106
- },
107
-
108
- pipelines: {
109
- package: ['package:check'],
110
- publish: ['graph:check', 'proof:check', 'package:check', 'release:check'],
111
- },
112
- });
113
- ```
114
-
115
- Add scripts:
116
-
117
- ```json
118
- {
119
- "scripts": {
120
- "typecheck": "limina check",
121
- "lint:package": "limina package check",
122
- "prepublishOnly": "limina check publish"
123
- }
124
- }
125
- ```
126
-
127
- Run checks:
128
-
129
- ```sh
130
- pnpm typecheck
131
- pnpm exec limina graph check
132
- pnpm exec limina package check --package @acme/core
133
- ```
134
-
135
- ## Concepts
136
-
137
- ### Checker entry
138
-
139
- Each checker has one required `config.checkers.<name>.entry`, usually a `tsconfig*.build.json` graph aggregator. Built-in first-class presets (`tsc` and `vue-tsc`) participate in graph, source, proof, and build checks. Source-only presets such as `svelte-check` prove source coverage and run direct checker execution through `limina checker typecheck`.
140
-
141
- ### Declaration leaf and local companion
142
-
143
- Declaration leaves should have strict local companions. For example, `tsconfig.lib.dts.json` pairs with `tsconfig.lib.json`, and `tsconfig.dts.json` pairs with `tsconfig.json`.
144
-
145
- The default `tsconfig.json` is the IDE/typecheck entry for its directory. A single-environment directory should use it as the local leaf; a multi-environment directory should make it a pure aggregator with `files: []` and `references`.
146
-
147
- ### Source dependencies and artifact dependencies
148
-
149
- A dependency declared as `workspace:*` is considered a source dependency. It should be represented by project references and source-facing package exports.
150
-
151
- A dependency declared as `link:`, `file:`, `catalog:`, or normal semver is treated as an artifact dependency. It should not be modeled as a project reference unless it is intentionally consumed as source.
152
-
153
- ### Package checks
154
-
155
- Source graph checks do not prove that an installed package works for consumers. `limina package check` inspects built package outputs under `package.entries[].outDir` and checks the actual package manifest, exports, type resolution, and runtime imports with `publint`, `attw`, and `boundary`. `limina release check` owns npm publish hygiene: private-output rejection, required README/license files, source map bans, source/packed manifest consistency, and registry-backed workspace publish order.
156
-
157
- ## CLI
158
-
159
- ```sh
160
- limina [--config limina.config.mjs] [--mode mode] <command>
161
- ```
162
-
163
- | Command | Description |
164
- | ----------------------------------------------- | ------------------------------------------------------------------------------------- |
165
- | `limina check` | Run the built-in default check pipeline. |
166
- | `limina check <pipeline>` | Run a named user pipeline from `pipelines`. |
167
- | `limina graph check` | Validate project references and architecture import rules. |
168
- | `limina proof check` | Prove declaration configs, local typecheck configs, and source coverage stay aligned. |
169
- | `limina paths generate` | Generate compatibility source `paths` configs for artifact-facing workspace exports. |
170
- | `limina paths apply` | Compatibility alias for `paths generate`. |
171
- | `limina paths check` | Fail when generated path files are stale. |
172
- | `limina checker build` | Run build execution for checker entries that support it. |
173
- | `limina checker typecheck` | Run source-only checker entries such as `svelte-check`. |
174
- | `limina package check` | Run configured package output checks. |
175
- | `limina package check --package <name>` | Check one configured package entry. |
176
- | `limina package check --tool <tool>` | Run only `publint`, `attw`, or `boundary`. |
177
- | `limina package check --attw-profile <profile>` | Override the ATTW profile: `strict`, `node16`, or `esm-only`. |
178
- | `limina release check` | Check release hygiene and dependency consistency for the cwd package entry. |
179
- | `limina release check --package <name>` | Check release hygiene and dependency consistency for one or more package entries. |
180
-
181
- ## Configuration reference
182
-
183
- ### `config`
184
-
185
- ```js
186
- config: {
187
- checkers: {
188
- typescript: {
189
- preset: 'tsc',
190
- entry: 'tsconfig.build.json',
191
- },
192
- vue: {
193
- preset: 'vue-tsc',
194
- entry: 'tsconfig.vue.build.json',
195
- },
196
- },
197
- source: {
198
- exclude: ['node_modules', 'dist', '.tsbuild'],
199
- },
200
- }
201
- ```
202
-
203
- `config.checkers` defines checker entries. Every configured checker must declare a non-empty `entry` and use a built-in preset. Checker `extensions` are fixed by Limina and cannot be configured; if `source.include` is omitted, Limina derives the source boundary from configured checker extensions, then applies `source.exclude`.
204
-
205
- ### `graph`
206
-
207
- ```js
208
- graph: {
209
- rules: {
210
- 'runtime-client': {
211
- deny: {
212
- refs: [
213
- {
214
- path: 'packages/app/src/node/tsconfig.lib.dts.json',
215
- reason: 'client runtime must stay independent from Node runtime',
216
- },
217
- ],
218
- deps: [
219
- {
220
- name: '@acme/internal-node',
221
- reason: 'client runtime must not consume Node-only packages',
222
- },
223
- {
224
- name: 'node:*',
225
- reason: 'client runtime must not import Node builtins',
226
- },
227
- {
228
- name: '#server/*',
229
- reason: 'client runtime must not use server-only package imports',
230
- },
231
- ],
232
- },
233
- },
234
- },
235
- }
236
- ```
237
-
238
- A declaration leaf opts into a rule by adding a `limina` label:
239
-
240
- ```jsonc
241
- {
242
- "limina": "runtime-client",
243
- "extends": ["./tsconfig.json", "../../tsconfig.dts.base.json"],
244
- "references": [],
245
- }
246
- ```
247
-
248
- ### `paths`
249
-
250
- ```js
251
- paths: {
252
- generatedFileName: 'tsconfig.dts.paths.generated.json',
253
- conditionPriority: ['source', 'development', 'types'],
254
- artifactDirectories: ['dist', 'build', 'lib', 'esm', 'cjs', 'out'],
255
- }
256
- ```
257
-
258
- Use generated paths only when a workspace package must keep artifact-facing exports while still being consumed as a graph-owned source dependency.
259
-
260
- ### `proof`
261
-
262
- ```js
263
- proof: {
264
- allowlist: [
265
- {
266
- file: 'src/generated/runtime.d.ts',
267
- reason: 'Generated file validated by the build pipeline.',
268
- },
269
- ],
270
- }
271
- ```
272
-
273
- Checker entries cover files validated by TypeScript or framework-aware tools. Allowlist entries are the final fallback after all configured checker entries fail to cover a source file; they should be rare and must include a reason.
274
-
275
- ### `package`
276
-
277
- ```js
278
- package: {
279
- entries: [
280
- {
281
- name: '@acme/core',
282
- outDir: 'packages/core/dist',
283
- checks: ['publint', 'attw', 'boundary'],
284
- publint: { strict: true },
285
- attw: { profile: 'esm-only' },
286
- boundary: {
287
- environment: (file) => file.startsWith('node/') ? 'node' : 'browser',
288
- ignoredExternalPackages: ['@acme/runtime-shim'],
289
- },
290
- },
291
- ],
292
- }
293
- ```
294
-
295
- `outDir` must point at the built package directory that contains the publish-ready `package.json`. `package:check` uses this output for consumer-facing resolver and runtime checks; `release:check` packs the same output and verifies publish hygiene such as README/license files and source map bans.
296
-
297
- ### `pipelines`
298
-
299
- ```js
300
- pipelines: {
301
- package: [
302
- { type: 'command', command: 'pnpm', args: ['build'] },
303
- 'package:check',
304
- ],
305
- }
306
- ```
307
-
308
- `limina check` runs the built-in default pipeline: `graph:check`, `source:check`, `proof:check`, `checker:build`, and `checker:typecheck`. `limina check <pipeline>` only runs user pipelines from `limina.config.mjs#pipelines`; if the name is missing, Limina reports the missing pipeline and asks you to define it there.
309
-
310
- String steps can be built-in task names or simple commands. Use object command steps when arguments, `cwd`, or `env` need to be explicit.
311
-
312
- ## CI example
313
-
314
- ```yaml
315
- name: Typecheck
316
-
317
- on:
318
- pull_request:
319
- push:
320
- branches: [main]
321
-
322
- jobs:
323
- typecheck:
324
- runs-on: ubuntu-latest
325
- steps:
326
- - uses: actions/checkout@v4
327
- - uses: pnpm/action-setup@v4
328
- - uses: actions/setup-node@v4
329
- with:
330
- node-version: 20.19.0
331
- cache: pnpm
332
- - run: pnpm install --frozen-lockfile
333
- - run: pnpm exec limina check
334
- ```
335
-
336
- ## Programmatic API
337
-
338
- ```ts
339
- import { defineConfig, loadConfig } from 'limina';
340
-
341
- export default defineConfig({
342
- pipelines: {
343
- typecheck: ['graph:check'],
344
- },
345
- });
346
-
347
- const config = await loadConfig();
348
- ```
349
-
350
- Most users only need `defineConfig(...)`. `loadConfig(...)` is available for custom wrappers and tests.
351
-
352
- ## Troubleshooting
353
-
354
- ### `Unable to find limina config`
355
-
356
- Run the command from inside the workspace, or pass `--config ./limina.config.mjs`.
357
-
358
- ### `no pnpm-workspace.yaml was found`
359
-
360
- Limina infers the workspace root from `pnpm-workspace.yaml`. Place the config inside the workspace or pass a config path located under the workspace root.
361
-
362
- ### `package.entries[x].outDir` is invalid
363
-
364
- Set `outDir` to the built package directory, not the source package directory, unless that directory is itself the publish-ready package output.
365
-
366
- ### Generated paths are stale
367
-
368
- Run:
369
-
370
- ```sh
371
- pnpm exec limina paths generate
372
- ```
373
-
374
- Then add the generated file to the first position of the listed `extends` arrays and commit the generated file if your repository policy requires reproducible `tsc -b` without a pre-generation step.
16
+ > Architecture governance CLI for TypeScript monorepos
375
17
 
376
- ## Design principles
18
+ - Keep source dependency graphs aligned with type build graphs
19
+ - Guard package, runtime, and workspace boundaries
20
+ - Cover TypeScript and framework-specific checkers
21
+ - Keep source manifests and built package outputs aligned
22
+ - Validate package outputs before release
23
+ - Compose checks for local development, CI, and publishing
377
24
 
378
- - Explicit policy is better than hidden presets.
379
- - Source graph checks and package artifact checks validate different surfaces.
380
- - Build graph configs should be strict, small, and directly referenced.
381
- - Generated compatibility paths should be transitional, not the default architecture.
382
- - Limina should fail with actionable messages instead of silently accepting graph drift.
25
+ Limina helps teams turn drifting TypeScript monorepo constraints into explicit, reviewable, runnable checks. It keeps source relationships, type coverage, build coordination, package metadata, and publishable outputs aligned across everyday development, code review, and pre-release workflows.
383
26
 
384
- ## License
27
+ Limina is not a bundler, test runner, or release tool, and it does not replace TypeScript or framework checkers. It runs those existing tools and verifies that the monorepo structure they rely on is still trustworthy.
385
28
 
386
- MIT
29
+ [Read the Docs to Learn More](https://docs.senao.me/docs-islands/limina/)
@@ -0,0 +1,29 @@
1
+ # limina
2
+
3
+ <p align="center">
4
+ <a href="https://docs.senao.me/docs-islands/limina/zh" target="_blank" rel="noopener noreferrer">
5
+ <img width="180" src="https://docs.senao.me/docs-islands/limina/logo.svg" alt="limina logo">
6
+ </a>
7
+ </p>
8
+ <p align="center">
9
+ <a href="https://npmjs.com/package/limina"><img src="https://img.shields.io/npm/v/limina.svg" alt="npm package"></a>
10
+ <a href="https://nodejs.org/en/about/previous-releases"><img src="https://img.shields.io/node/v/limina.svg" alt="node compatibility"></a>
11
+ <a href="https://github.com/XiSenao/docs-islands/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/limina.svg" alt="license"></a>
12
+ </p>
13
+
14
+ [English](./README.md) | 简体中文
15
+
16
+ > TypeScript monorepo 的架构治理 CLI
17
+
18
+ - 保持源码依赖图与类型构建图一致
19
+ - 守住 package、运行时与工程边界
20
+ - 覆盖 TypeScript 与框架专属 checker
21
+ - 让源码 manifest 与构建产物 manifest 保持一致
22
+ - 验证发布前 package 产物
23
+ - 组合适合本地、CI 与发布流程的检查
24
+
25
+ Limina 帮助团队把 TypeScript monorepo 中容易漂移的工程约束变成显式、可审查、可运行的检查。它让源码关系、类型覆盖、构建协作、package metadata 和发布产物保持一致,适合放进日常开发、代码审查和发布前流程。
26
+
27
+ Limina 不是 bundler、测试框架或发布工具,也不会替代 TypeScript / framework checker。它调用这些已有工具,并验证它们依赖的 monorepo 结构是否仍然可靠。
28
+
29
+ [阅读文档了解更多](https://docs.senao.me/docs-islands/limina/zh/)
package/bin/limina.js CHANGED
@@ -1,25 +1,36 @@
1
1
  #!/usr/bin/env node
2
- import "../chunks/dep-lkQg1P9Q.js";
3
- import { existsSync } from "node:fs";
4
- import path from "node:path";
5
- import { fileURLToPath, pathToFileURL } from "node:url";
6
- import { spawnSync } from "node:child_process";
2
+ import { spawnSync } from 'node:child_process';
3
+ import { existsSync } from 'node:fs';
4
+ import path from 'node:path';
5
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
+
7
+ const packageDir = path.resolve(fileURLToPath(new URL('..', import.meta.url)));
8
+ const distCliPath = path.join(packageDir, 'cli.js');
9
+ const sourceCliPath = path.join(packageDir, 'src/cli.ts');
10
+ const tsxBinName = process.platform === 'win32' ? 'tsx.cmd' : 'tsx';
11
+ const tsxCliPath =
12
+ [
13
+ path.join(packageDir, 'node_modules/.bin', tsxBinName),
14
+ path.join(packageDir, '../../node_modules/.bin', tsxBinName),
15
+ ].find((candidate) => existsSync(candidate)) ?? 'tsx';
7
16
 
8
- //#region bin/limina.js
9
- const packageDir = path.resolve(fileURLToPath(new URL("..", import.meta.url)));
10
- const distCliPath = path.join(packageDir, "cli.js");
11
- const sourceCliPath = path.join(packageDir, "src/cli.ts");
12
- const tsxBinName = process.platform === "win32" ? "tsx.cmd" : "tsx";
13
- const tsxCliPath = [path.join(packageDir, "node_modules/.bin", tsxBinName), path.join(packageDir, "../../node_modules/.bin", tsxBinName)].find((candidate) => existsSync(candidate)) ?? "tsx";
14
17
  if (existsSync(sourceCliPath)) {
15
- const result = spawnSync(tsxCliPath, [sourceCliPath, ...process.argv.slice(2)], {
16
- stdio: "inherit",
17
- shell: process.platform === "win32"
18
- });
19
- if (result.error) throw result.error;
20
- process.exit(result.status ?? 1);
21
- } else if (existsSync(distCliPath)) await import(pathToFileURL(distCliPath).href);
22
- else throw new Error(`Unable to find limina CLI entry. Expected ${distCliPath}.`);
18
+ const result = spawnSync(
19
+ tsxCliPath,
20
+ [sourceCliPath, ...process.argv.slice(2)],
21
+ {
22
+ stdio: 'inherit',
23
+ shell: process.platform === 'win32',
24
+ },
25
+ );
26
+
27
+ if (result.error) {
28
+ throw result.error;
29
+ }
23
30
 
24
- //#endregion
25
- export { };
31
+ process.exit(result.status ?? 1);
32
+ } else if (existsSync(distCliPath)) {
33
+ await import(pathToFileURL(distCliPath).href);
34
+ } else {
35
+ throw new Error(`Unable to find limina CLI entry. Expected ${distCliPath}.`);
36
+ }
@@ -0,0 +1,114 @@
1
+ import { createRequire } from "node:module";
2
+
3
+ //#region \0rolldown/runtime.js
4
+ var __create = Object.create;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
11
+ var __exportAll = (all, no_symbols) => {
12
+ let target = {};
13
+ for (var name in all) {
14
+ __defProp(target, name, {
15
+ get: all[name],
16
+ enumerable: true
17
+ });
18
+ }
19
+ if (!no_symbols) {
20
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
21
+ }
22
+ return target;
23
+ };
24
+ var __copyProps = (to, from, except, desc) => {
25
+ if (from && typeof from === "object" || typeof from === "function") {
26
+ for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
27
+ key = keys[i];
28
+ if (!__hasOwnProp.call(to, key) && key !== except) {
29
+ __defProp(to, key, {
30
+ get: ((k) => from[k]).bind(null, key),
31
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
32
+ });
33
+ }
34
+ }
35
+ }
36
+ return to;
37
+ };
38
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
39
+ value: mod,
40
+ enumerable: true
41
+ }) : target, mod));
42
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
43
+
44
+ //#endregion
45
+ //#region ../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js
46
+ var require_picocolors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
47
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
48
+ let isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
49
+ let formatter = (open, close, replace = open) => (input) => {
50
+ let string = "" + input, index = string.indexOf(close, open.length);
51
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
52
+ };
53
+ let replaceClose = (string, close, replace, index) => {
54
+ let result = "", cursor = 0;
55
+ do {
56
+ result += string.substring(cursor, index) + replace;
57
+ cursor = index + close.length;
58
+ index = string.indexOf(close, cursor);
59
+ } while (~index);
60
+ return result + string.substring(cursor);
61
+ };
62
+ let createColors = (enabled = isColorSupported) => {
63
+ let f = enabled ? formatter : () => String;
64
+ return {
65
+ isColorSupported: enabled,
66
+ reset: f("\x1B[0m", "\x1B[0m"),
67
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
68
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
69
+ italic: f("\x1B[3m", "\x1B[23m"),
70
+ underline: f("\x1B[4m", "\x1B[24m"),
71
+ inverse: f("\x1B[7m", "\x1B[27m"),
72
+ hidden: f("\x1B[8m", "\x1B[28m"),
73
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
74
+ black: f("\x1B[30m", "\x1B[39m"),
75
+ red: f("\x1B[31m", "\x1B[39m"),
76
+ green: f("\x1B[32m", "\x1B[39m"),
77
+ yellow: f("\x1B[33m", "\x1B[39m"),
78
+ blue: f("\x1B[34m", "\x1B[39m"),
79
+ magenta: f("\x1B[35m", "\x1B[39m"),
80
+ cyan: f("\x1B[36m", "\x1B[39m"),
81
+ white: f("\x1B[37m", "\x1B[39m"),
82
+ gray: f("\x1B[90m", "\x1B[39m"),
83
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
84
+ bgRed: f("\x1B[41m", "\x1B[49m"),
85
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
86
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
87
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
88
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
89
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
90
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
91
+ blackBright: f("\x1B[90m", "\x1B[39m"),
92
+ redBright: f("\x1B[91m", "\x1B[39m"),
93
+ greenBright: f("\x1B[92m", "\x1B[39m"),
94
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
95
+ blueBright: f("\x1B[94m", "\x1B[39m"),
96
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
97
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
98
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
99
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
100
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
101
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
102
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
103
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
104
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
105
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
106
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
107
+ };
108
+ };
109
+ module.exports = createColors();
110
+ module.exports.createColors = createColors;
111
+ }));
112
+
113
+ //#endregion
114
+ export { __toESM as a, __require as i, __commonJSMin as n, __exportAll as r, require_picocolors as t };