@trohde/earos 1.2.0 → 1.3.1
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/assets/init/docs/getting-started.md +1 -1
- package/assets/init/docs/onboarding/agent-assisted.md +19 -19
- package/assets/init/docs/onboarding/first-assessment.md +18 -18
- package/assets/init/docs/onboarding/governed-review.md +10 -10
- package/assets/init/docs/onboarding/overview.md +15 -15
- package/assets/init/docs/onboarding/scaling-optimization.md +13 -13
- package/assets/init/docs/plans/2026-03-23-001-refactor-site-review-findings-plan.md +195 -0
- package/assets/init/docs/plans/2026-03-23-002-refactor-cli-review-findings-plan.md +736 -0
- package/assets/init/docs/solutions/security-issues/cli-comprehensive-code-review-security-perf-architecture.md +210 -0
- package/assets/init/docs/terminology.md +1 -1
- package/bin.js +156 -36
- package/dist/assets/{_basePickBy-PmSUrUsK.js → _basePickBy-BlC_TeV6.js} +1 -1
- package/dist/assets/{_baseUniq-HuZouVIz.js → _baseUniq-CVy7rcC1.js} +1 -1
- package/dist/assets/{arc-CJFxtF3d.js → arc-Cd8wvd7z.js} +1 -1
- package/dist/assets/{architectureDiagram-2XIMDMQ5-XA-oU2UG.js → architectureDiagram-2XIMDMQ5-D_f4_aMp.js} +1 -1
- package/dist/assets/{blockDiagram-WCTKOSBZ-Oxp-wAST.js → blockDiagram-WCTKOSBZ-B-y6N5--.js} +1 -1
- package/dist/assets/{c4Diagram-IC4MRINW-D8m5hQH9.js → c4Diagram-IC4MRINW-C3-v3oNT.js} +1 -1
- package/dist/assets/channel-BSC0F15G.js +1 -0
- package/dist/assets/{chunk-4BX2VUAB-D2kBTn2O.js → chunk-4BX2VUAB-CMPwQN83.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-Dxqrf5oZ.js → chunk-55IACEB6-Bdkfhvrr.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-DoOEFFQC.js → chunk-FMBD7UC4-ptKQX5uF.js} +1 -1
- package/dist/assets/{chunk-JSJVCQXG-BerphV2K.js → chunk-JSJVCQXG-DO0UU_OX.js} +1 -1
- package/dist/assets/{chunk-KX2RTZJC-CxUAqT05.js → chunk-KX2RTZJC-DRj2OZnD.js} +1 -1
- package/dist/assets/{chunk-NQ4KR5QH-fCqZgFkU.js → chunk-NQ4KR5QH-C4Nsf7ww.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-HlpHnJEy.js → chunk-QZHKN3VN-B1GO0Nwy.js} +1 -1
- package/dist/assets/{chunk-WL4C6EOR-D9yxAHyd.js → chunk-WL4C6EOR-lFR6fjR8.js} +1 -1
- package/dist/assets/classDiagram-VBA2DB6C-BHDWMOEz.js +1 -0
- package/dist/assets/classDiagram-v2-RAHNMMFH-BHDWMOEz.js +1 -0
- package/dist/assets/clone-BdN-3iAD.js +1 -0
- package/dist/assets/{cose-bilkent-S5V4N54A-F5xOBvqW.js → cose-bilkent-S5V4N54A-IpR9mVIO.js} +1 -1
- package/dist/assets/{dagre-KLK3FWXG-CD3BTpHv.js → dagre-KLK3FWXG-B4YA6T7N.js} +1 -1
- package/dist/assets/{diagram-E7M64L7V-C3D9MCay.js → diagram-E7M64L7V-Do5l6es_.js} +1 -1
- package/dist/assets/{diagram-IFDJBPK2-zJBVM-GK.js → diagram-IFDJBPK2-D5MxfKVv.js} +1 -1
- package/dist/assets/{diagram-P4PSJMXO-BrmFZOLB.js → diagram-P4PSJMXO-Djr28EgW.js} +1 -1
- package/dist/assets/{erDiagram-INFDFZHY-aSMhKiV2.js → erDiagram-INFDFZHY-BuM-rbCL.js} +1 -1
- package/dist/assets/{flowDiagram-PKNHOUZH-DwgX7l8F.js → flowDiagram-PKNHOUZH-By3WGI7Q.js} +1 -1
- package/dist/assets/{ganttDiagram-A5KZAMGK-C57Hz6QW.js → ganttDiagram-A5KZAMGK-GLmBfK72.js} +1 -1
- package/dist/assets/{gitGraphDiagram-K3NZZRJ6-CuchqqGh.js → gitGraphDiagram-K3NZZRJ6-BN0iXeIv.js} +1 -1
- package/dist/assets/{graph-CPFGBV5J.js → graph-CDzuMtjV.js} +1 -1
- package/dist/assets/{index-DMt1cpG6.js → index-DoeSN_Oe.js} +130 -130
- package/dist/assets/{infoDiagram-LFFYTUFH-Dd_5tfX7.js → infoDiagram-LFFYTUFH-C888gaFw.js} +1 -1
- package/dist/assets/{ishikawaDiagram-PHBUUO56-DwosSEvT.js → ishikawaDiagram-PHBUUO56-ChIO9DG-.js} +1 -1
- package/dist/assets/{journeyDiagram-4ABVD52K-BuCxcsX0.js → journeyDiagram-4ABVD52K-CufMUDcs.js} +1 -1
- package/dist/assets/{kanban-definition-K7BYSVSG-DF_1UCkW.js → kanban-definition-K7BYSVSG-BpsSVpX8.js} +1 -1
- package/dist/assets/{layout-DIcS6m1g.js → layout-B8RWVBSF.js} +1 -1
- package/dist/assets/{linear-BXkwBhoJ.js → linear-BJwxtq9r.js} +1 -1
- package/dist/assets/{mindmap-definition-YRQLILUH-DcDvYagd.js → mindmap-definition-YRQLILUH-C6WPimbf.js} +1 -1
- package/dist/assets/{pieDiagram-SKSYHLDU-BmeDeWDM.js → pieDiagram-SKSYHLDU-DeCGMWf8.js} +1 -1
- package/dist/assets/{quadrantDiagram-337W2JSQ-3zfjULUM.js → quadrantDiagram-337W2JSQ-D9TWaS83.js} +1 -1
- package/dist/assets/{requirementDiagram-Z7DCOOCP-B2wQMJpq.js → requirementDiagram-Z7DCOOCP-DTnuXlAq.js} +1 -1
- package/dist/assets/{sankeyDiagram-WA2Y5GQK-__kKlCTq.js → sankeyDiagram-WA2Y5GQK-B2dplCgD.js} +1 -1
- package/dist/assets/{sequenceDiagram-2WXFIKYE-B7O81Vih.js → sequenceDiagram-2WXFIKYE-cBvgSSju.js} +1 -1
- package/dist/assets/{stateDiagram-RAJIS63D-CcJaDrAK.js → stateDiagram-RAJIS63D-Cwr7VtSX.js} +1 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-B59h7VTZ.js +1 -0
- package/dist/assets/{timeline-definition-YZTLITO2-DSaQQqIU.js → timeline-definition-YZTLITO2-Dkp163fK.js} +1 -1
- package/dist/assets/{treemap-KZPCXAKY-9Hcrd8XD.js → treemap-KZPCXAKY-BUWHa5xU.js} +1 -1
- package/dist/assets/{vennDiagram-LZ73GAT5-BqHNyca2.js → vennDiagram-LZ73GAT5-BihD66ma.js} +1 -1
- package/dist/assets/{xychartDiagram-JWTSCODW-BqeYf6Fk.js → xychartDiagram-JWTSCODW-Cw4lPbuZ.js} +1 -1
- package/dist/index.html +1 -1
- package/export-docx.js +12 -4
- package/init.js +19 -14
- package/manifest-cli.mjs +32 -3
- package/package.json +3 -2
- package/serve.js +44 -19
- package/utils/export-markdown.js +486 -0
- package/dist/assets/channel-SoktpVBQ.js +0 -1
- package/dist/assets/classDiagram-VBA2DB6C-BT2AdZTe.js +0 -1
- package/dist/assets/classDiagram-v2-RAHNMMFH-BT2AdZTe.js +0 -1
- package/dist/assets/clone-DOjIfi5r.js +0 -1
- package/dist/assets/stateDiagram-v2-FVOUBMTO-B2goOPt-.js +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "EaROS CLI comprehensive code review: 28 findings across security, performance, architecture, type safety, agent parity"
|
|
3
|
+
category: security-issues
|
|
4
|
+
date: 2026-03-23
|
|
5
|
+
tags:
|
|
6
|
+
- code-review
|
|
7
|
+
- path-traversal
|
|
8
|
+
- typescript-strict-mode
|
|
9
|
+
- dead-code-removal
|
|
10
|
+
- performance-optimization
|
|
11
|
+
- cli-architecture
|
|
12
|
+
- express-server
|
|
13
|
+
- agent-parity
|
|
14
|
+
- type-safety
|
|
15
|
+
- earos-cli
|
|
16
|
+
severity: high
|
|
17
|
+
component:
|
|
18
|
+
- tools/editor/src/serve.ts
|
|
19
|
+
- tools/editor/bin.js
|
|
20
|
+
- tools/editor/src/init.ts
|
|
21
|
+
- tools/editor/src/export-docx.ts
|
|
22
|
+
- tools/editor/manifest-cli.mjs
|
|
23
|
+
- tools/editor/src/utils/validate.ts
|
|
24
|
+
- tools/editor/src/utils/export-markdown.ts
|
|
25
|
+
- tools/editor/src/components/AssessmentSummary.tsx
|
|
26
|
+
- tools/editor/package.json
|
|
27
|
+
- tools/editor/tsconfig.server.json
|
|
28
|
+
root_cause_type: accumulated-tech-debt
|
|
29
|
+
resolution_type: multi-phase-refactor
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# EaROS CLI Comprehensive Code Review — 28 Findings
|
|
33
|
+
|
|
34
|
+
## Problem
|
|
35
|
+
|
|
36
|
+
A 6-agent code review of the EaROS CLI (`tools/editor/`, ~3300 lines TypeScript/JavaScript) identified 28 findings across security, performance, architecture, type safety, agent parity, and code simplification. The CLI had grown organically with no prior comprehensive review, accumulating technical debt across multiple concern areas.
|
|
37
|
+
|
|
38
|
+
**Key symptoms:**
|
|
39
|
+
- Path traversal bypass in `safeRepoPath()` — `startsWith` without trailing separator allowed access to sibling directories
|
|
40
|
+
- Express server bound to `0.0.0.0`, exposing file read/write API to the local network
|
|
41
|
+
- Dead TypeScript source files (`cli.ts`, `manifest-cli.ts`) that were never compiled, creating contributor confusion
|
|
42
|
+
- CLI export command hardcoded to artifact kind only — rubrics and evaluations rejected
|
|
43
|
+
- No structured JSON output for any CLI command, blocking agent/CI integration
|
|
44
|
+
- Sequential icon downloads in `earos init --icons` (3 cloud packages one-at-a-time)
|
|
45
|
+
- `strict: false` in TypeScript configs with 49+ `any` usages
|
|
46
|
+
- Silent validation bypass — schema compilation failure returned `valid: true`
|
|
47
|
+
|
|
48
|
+
## Root Cause
|
|
49
|
+
|
|
50
|
+
Six independent root causes identified:
|
|
51
|
+
|
|
52
|
+
1. **Security:** `safeRepoPath` used `abs.startsWith(repoRoot)` without appending a path separator. On a system where `repoRoot = /projects/EAROS`, the path `/projects/EAROS-evil/secret.yaml` would pass the check. The server's `app.listen(port)` call omitted the host parameter, defaulting to `0.0.0.0`. The `resolveLocalMermaidImage` function had no containment check for `..` segments after the `/icons/` prefix.
|
|
53
|
+
|
|
54
|
+
2. **Dead code:** `src/cli.ts` (78 lines) was described as a "TypeScript source reference for bin.js" but was never in any `tsconfig.json` files array. It had diverged from `bin.js` (missing `init`, `export`, `manifest`, `dev` commands). Similarly, `manifest-cli.ts` existed alongside `manifest-cli.mjs` but was never compiled.
|
|
55
|
+
|
|
56
|
+
3. **Agent parity:** The `earos export` command checked `if (artifactData?.kind !== 'artifact')` and rejected all other kinds. No `--json` flag existed on any command.
|
|
57
|
+
|
|
58
|
+
4. **Performance:** The `for (const config of ICON_PACKAGES)` loop in `init.ts` awaited each download sequentially. The `createIconAliases` function used `.sort()[0]` (O(n log n)) instead of a linear max-scan (O(n)).
|
|
59
|
+
|
|
60
|
+
5. **Type safety:** Both `tsconfig.json` and `tsconfig.server.json` had `strict: false`. The `getGateSeverity` function was duplicated in `AssessmentSummary.tsx` and `score-helpers.tsx`.
|
|
61
|
+
|
|
62
|
+
6. **Silent fail-open:** In `validate.ts`, when `ajv.compile(schema)` threw an error, the catch block returned `null`, and the caller treated `null` as "valid" — meaning a broken schema silently validated everything.
|
|
63
|
+
|
|
64
|
+
## Solution
|
|
65
|
+
|
|
66
|
+
Implemented across 5 phases, published as `@trohde/earos@1.3.0`.
|
|
67
|
+
|
|
68
|
+
### Phase 1 — Security Hardening
|
|
69
|
+
|
|
70
|
+
**Path traversal fix** (the most critical finding):
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// BEFORE (vulnerable)
|
|
74
|
+
function safeRepoPath(repoRoot: string, rawPath: string): string | null {
|
|
75
|
+
const decoded = decodeURIComponent(rawPath)
|
|
76
|
+
const abs = resolve(repoRoot, decoded)
|
|
77
|
+
if (!abs.startsWith(repoRoot)) return null // EAROS-evil passes!
|
|
78
|
+
return abs
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// AFTER (fixed)
|
|
82
|
+
import { sep } from 'path'
|
|
83
|
+
|
|
84
|
+
function safeRepoPath(repoRoot: string, rawPath: string): string | null {
|
|
85
|
+
const decoded = decodeURIComponent(rawPath)
|
|
86
|
+
const abs = resolve(repoRoot, decoded)
|
|
87
|
+
if (abs !== repoRoot && !abs.startsWith(repoRoot + sep)) return null
|
|
88
|
+
return abs
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Other security fixes:**
|
|
93
|
+
- Bound Express to `127.0.0.1` with `EAROS_HOST` env var override for Docker/WSL2
|
|
94
|
+
- Added `X-Content-Type-Options: nosniff` and `X-Frame-Options: DENY` headers
|
|
95
|
+
- Sanitized 500 error responses — no more filesystem path leaks
|
|
96
|
+
- Scoped body limits: 1MB default, 5MB for file writes, 25MB for exports
|
|
97
|
+
- Restricted `POST /api/file/*` to `.yaml`/`.yml` extensions only
|
|
98
|
+
- Added containment check to `resolveLocalMermaidImage` with `baseDir + sep`
|
|
99
|
+
|
|
100
|
+
### Phase 2 — Dead Code Removal
|
|
101
|
+
|
|
102
|
+
- Deleted `src/cli.ts` (78 lines)
|
|
103
|
+
- Deleted `manifest-cli.ts` (diverged from `manifest-cli.mjs`)
|
|
104
|
+
- Updated `manifest-cli.mjs` header comment
|
|
105
|
+
|
|
106
|
+
### Phase 3 — Agent Parity
|
|
107
|
+
|
|
108
|
+
- Extended `earos export` to handle `artifact`, `evaluation`, `core_rubric`, `profile`, and `overlay` kinds
|
|
109
|
+
- Added `--format md` for Markdown export (artifact and rubric)
|
|
110
|
+
- Added `--json` flag to `earos validate` and `earos manifest check`
|
|
111
|
+
- Added `earos manifest list [--json]` command
|
|
112
|
+
- Added `earos list evaluations [--json]` command
|
|
113
|
+
|
|
114
|
+
### Phase 4 — Performance
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// BEFORE: sequential icon downloads
|
|
118
|
+
for (const config of ICON_PACKAGES) {
|
|
119
|
+
const result = await downloadIconPackage(target, config)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// AFTER: parallel with Promise.allSettled
|
|
123
|
+
const settled = await Promise.allSettled(
|
|
124
|
+
ICON_PACKAGES.map(config => downloadIconPackage(target, config))
|
|
125
|
+
)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- Replaced `sort()[0]` with linear max-scan in alias matching
|
|
129
|
+
- Lazy-loaded `ARTIFACT_SCHEMA` via `getArtifactSchema()` function
|
|
130
|
+
|
|
131
|
+
### Phase 5 — Code Quality
|
|
132
|
+
|
|
133
|
+
- Enabled `strict: true` in `tsconfig.server.json` (compiled with zero errors)
|
|
134
|
+
- De-duplicated `getGateSeverity` — `AssessmentSummary.tsx` now imports from `score-helpers.tsx`
|
|
135
|
+
- Moved `mermaid` from `dependencies` to `devDependencies` (Vite bundles it into dist/)
|
|
136
|
+
- Fixed silent validation bypass to fail-closed:
|
|
137
|
+
```typescript
|
|
138
|
+
// BEFORE: catch returns null → caller treats as valid
|
|
139
|
+
} catch { return null }
|
|
140
|
+
|
|
141
|
+
// AFTER: catch returns a validator that always fails
|
|
142
|
+
} catch (e) {
|
|
143
|
+
console.warn('[validate] Schema compilation failed:', e)
|
|
144
|
+
const failValidator = Object.assign(
|
|
145
|
+
() => false,
|
|
146
|
+
{ errors: [{ instancePath: '', message: 'Schema compilation failed' }] }
|
|
147
|
+
) as unknown as ReturnType<typeof ajv.compile>
|
|
148
|
+
cache.set(key, failValidator)
|
|
149
|
+
return failValidator
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
- Added 5-second TTL cache for evaluation file endpoint scans
|
|
153
|
+
|
|
154
|
+
## Verification Steps
|
|
155
|
+
|
|
156
|
+
1. **Build:** `npm run build` completed with zero errors under `strict: true`
|
|
157
|
+
2. **CLI commands:** Tested `earos validate` (human + `--json`), `earos export` (all 3 kinds + `--format md`), `earos manifest check --json`, `earos manifest list`, `earos list evaluations --json`
|
|
158
|
+
3. **Browser tests:** Verified home screen, rubric editor (load EAROS-REFARCH-001), assessment wizard (4-step flow), evaluation viewer (19 criteria loaded), security headers present in HTTP responses, path traversal blocked (`../EAROS-evil/` returns 403), YAML-only write restriction enforced
|
|
159
|
+
4. **Published** as `@trohde/earos@1.3.0` via CI pipeline (GitHub Actions)
|
|
160
|
+
|
|
161
|
+
## Prevention Strategies
|
|
162
|
+
|
|
163
|
+
### Path Traversal Prevention
|
|
164
|
+
- **Canonical pattern:** Always append `path.sep` before `startsWith` comparison. Wrap in a single `assertWithinDirectory(base, candidate)` utility.
|
|
165
|
+
- **CI check:** Grep for `.startsWith(` on path variables without adjacent `path.sep` concatenation.
|
|
166
|
+
|
|
167
|
+
### Server Binding
|
|
168
|
+
- **Rule:** Every `app.listen()` must specify an explicit bind address. Single-argument `listen()` calls should fail linting.
|
|
169
|
+
|
|
170
|
+
### Fail-Closed Validation
|
|
171
|
+
- **Rule:** Validation functions must never return "valid" on error. Every `catch` block in a validation path must either re-throw or return a failure result.
|
|
172
|
+
- **Test requirement:** Every validation function needs a test with a corrupt/missing schema asserting failure.
|
|
173
|
+
|
|
174
|
+
### Agent Parity
|
|
175
|
+
- **Design principle:** Every CLI command must support `--json`. This is non-negotiable for agent-native tools.
|
|
176
|
+
- **Test:** Parameterized test asserting `--json` produces valid JSON for every registered command.
|
|
177
|
+
|
|
178
|
+
### TypeScript Strict Mode
|
|
179
|
+
- **CI guardrail:** Verify `strict: true` stays enabled in `tsconfig.json`:
|
|
180
|
+
```bash
|
|
181
|
+
node -e "const c = require('./tsconfig.json'); if (!c.compilerOptions.strict) process.exit(1)"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Dead Code Detection
|
|
185
|
+
- **CI check:** Compare `.ts` files on disk against `tsc --listFiles` output. Any uncompiled `.ts` under `src/` fails the build.
|
|
186
|
+
|
|
187
|
+
## Code Review Checklist (Express + CLI)
|
|
188
|
+
|
|
189
|
+
### Express Server
|
|
190
|
+
- [ ] Every `app.listen()` specifies an explicit bind address
|
|
191
|
+
- [ ] File path validation uses `resolve()` + separator-appended `startsWith`
|
|
192
|
+
- [ ] Error handlers do not leak stack traces or internal paths
|
|
193
|
+
- [ ] Security headers set (`X-Content-Type-Options`, `X-Frame-Options`)
|
|
194
|
+
- [ ] Body parser limits scoped per route based on actual need
|
|
195
|
+
|
|
196
|
+
### CLI Tool
|
|
197
|
+
- [ ] Every command supports `--json` for structured output
|
|
198
|
+
- [ ] Validation failures produce structured error output
|
|
199
|
+
- [ ] No `catch` block silently swallows errors in validation paths
|
|
200
|
+
|
|
201
|
+
### TypeScript / Build
|
|
202
|
+
- [ ] `tsconfig.json` has `strict: true`
|
|
203
|
+
- [ ] Every `.ts` file under `src/` is included in compilation
|
|
204
|
+
- [ ] Shared logic lives in `utils/`, not duplicated across files
|
|
205
|
+
|
|
206
|
+
## Related Documents
|
|
207
|
+
|
|
208
|
+
- **Prior art:** [Site review findings plan](../../docs/plans/2026-03-23-001-refactor-site-review-findings-plan.md) — same review-then-fix methodology applied to the `site/` frontend (26 findings, 8 agents)
|
|
209
|
+
- **Implementation plan:** [CLI review findings plan](../../docs/plans/2026-03-23-002-refactor-cli-review-findings-plan.md) — the detailed 5-phase plan for this work
|
|
210
|
+
- **Review agents used:** Security Sentinel, Performance Oracle, Architecture Strategist, Kieran TypeScript Reviewer, Agent-Native Reviewer, Code Simplicity Reviewer
|
|
@@ -47,7 +47,7 @@ An artifact-type extension that inherits the core meta-rubric and adds criteria
|
|
|
47
47
|
A set of cross-cutting criteria injected on top of any core+profile combination, independent of artifact type. Overlays address concerns that recur across artifact types (security, data governance, regulatory compliance). They use `kind: overlay`, `artifact_type: any`, and `scoring.method: append_to_base_rubric`. Applied by context, not artifact type; they cannot remove or weaken base gates. Used in: Section 5.3, `overlays/` directory.
|
|
48
48
|
|
|
49
49
|
**Gate**
|
|
50
|
-
A criterion-level enforcement mechanism that prevents a poor score on a critical criterion being masked by high scores elsewhere. Gates are evaluated before any weighted average is computed. Gate severities: `none`, `advisory`, `major`, `critical` — a critical gate failure blocks a passing status regardless of the average
|
|
50
|
+
A criterion-level enforcement mechanism that prevents a poor score on a critical criterion being masked by high scores elsewhere. Gates are evaluated before any weighted average is computed. Gate severities: `none`, `advisory`, `major`, `critical` — a critical gate failure blocks a passing status regardless of the average — the specific outcome (`Reject` or `Not Reviewable`) depends on the criterion's `failure_effect`. Used in: Section 7.3, all rubric YAML `gate` fields.
|
|
51
51
|
|
|
52
52
|
**Evidence anchor**
|
|
53
53
|
A direct pointer to the specific excerpt, diagram, section, or reference in the artifact that supports a score. Required for every scored criterion under the RULERS protocol. Anchors are classified as `observed`, `inferred`, or `external`. "The artifact seems to address this" is not a valid evidence anchor. Used in: Section 10.1, all evaluation record `evidence_anchor` fields.
|
package/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync, existsSync } from 'fs'
|
|
2
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync } from 'fs'
|
|
3
3
|
import { resolve, dirname } from 'path'
|
|
4
4
|
import { fileURLToPath } from 'url'
|
|
5
5
|
import { spawnSync } from 'child_process'
|
|
@@ -28,13 +28,17 @@ function findSchemasDir() {
|
|
|
28
28
|
|
|
29
29
|
// ─── validate command ─────────────────────────────────────────────────────────
|
|
30
30
|
|
|
31
|
-
async function validateFile(filePath) {
|
|
31
|
+
async function validateFile(filePath, jsonMode) {
|
|
32
32
|
const absPath = resolve(filePath)
|
|
33
33
|
let content
|
|
34
34
|
try {
|
|
35
35
|
content = readFileSync(absPath, 'utf8')
|
|
36
36
|
} catch {
|
|
37
|
-
|
|
37
|
+
if (jsonMode) {
|
|
38
|
+
process.stdout.write(JSON.stringify({ valid: false, file: filePath, errors: [{ path: '(root)', message: `Cannot read file: ${absPath}` }] }) + '\n')
|
|
39
|
+
} else {
|
|
40
|
+
console.error(`Cannot read file: ${absPath}`)
|
|
41
|
+
}
|
|
38
42
|
process.exit(1)
|
|
39
43
|
}
|
|
40
44
|
|
|
@@ -42,7 +46,11 @@ async function validateFile(filePath) {
|
|
|
42
46
|
try {
|
|
43
47
|
data = yaml.load(content)
|
|
44
48
|
} catch (e) {
|
|
45
|
-
|
|
49
|
+
if (jsonMode) {
|
|
50
|
+
process.stdout.write(JSON.stringify({ valid: false, file: filePath, errors: [{ path: '(root)', message: `YAML parse error: ${e.message}` }] }) + '\n')
|
|
51
|
+
} else {
|
|
52
|
+
console.error(`YAML parse error: ${e.message}`)
|
|
53
|
+
}
|
|
46
54
|
process.exit(1)
|
|
47
55
|
}
|
|
48
56
|
|
|
@@ -64,40 +72,81 @@ async function validateFile(filePath) {
|
|
|
64
72
|
const valid = validate(data)
|
|
65
73
|
|
|
66
74
|
if (valid) {
|
|
67
|
-
|
|
75
|
+
if (jsonMode) {
|
|
76
|
+
process.stdout.write(JSON.stringify({ valid: true, file: filePath, kind: kind ?? 'unknown' }) + '\n')
|
|
77
|
+
} else {
|
|
78
|
+
console.log(`✓ ${filePath} is valid (kind: ${kind ?? 'unknown'})`)
|
|
79
|
+
}
|
|
68
80
|
process.exit(0)
|
|
69
81
|
} else {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
82
|
+
const result = {
|
|
83
|
+
valid: false,
|
|
84
|
+
file: filePath,
|
|
85
|
+
kind: kind ?? 'unknown',
|
|
86
|
+
errors: validate.errors.map(err => ({
|
|
87
|
+
path: err.instancePath || '(root)',
|
|
88
|
+
message: err.message
|
|
89
|
+
}))
|
|
90
|
+
}
|
|
91
|
+
if (jsonMode) {
|
|
92
|
+
process.stdout.write(JSON.stringify(result) + '\n')
|
|
93
|
+
} else {
|
|
94
|
+
console.error(`✗ ${filePath} — ${validate.errors.length} error(s):`)
|
|
95
|
+
for (const err of validate.errors) {
|
|
96
|
+
console.error(` ${err.instancePath || '(root)'} ${err.message}`)
|
|
97
|
+
}
|
|
73
98
|
}
|
|
74
99
|
process.exit(1)
|
|
75
100
|
}
|
|
76
101
|
}
|
|
77
102
|
|
|
103
|
+
// ─── list evaluations helper ────────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
function findEvaluationFiles(baseDir, prefix) {
|
|
106
|
+
const found = []
|
|
107
|
+
if (!existsSync(baseDir)) return found
|
|
108
|
+
try {
|
|
109
|
+
for (const entry of readdirSync(baseDir, { withFileTypes: true })) {
|
|
110
|
+
if (entry.isDirectory()) {
|
|
111
|
+
found.push(...findEvaluationFiles(resolve(baseDir, entry.name), `${prefix}${entry.name}/`))
|
|
112
|
+
} else if (entry.name.endsWith('.evaluation.yaml') || entry.name === 'evaluation.yaml') {
|
|
113
|
+
found.push({ path: `${prefix}${entry.name}`, name: entry.name })
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
} catch { /* skip unreadable dirs */ }
|
|
117
|
+
return found
|
|
118
|
+
}
|
|
119
|
+
|
|
78
120
|
// ─── CLI dispatch ──────────────────────────────────────────────────────────────
|
|
79
121
|
|
|
80
122
|
if (args[0] === '--help' || args[0] === '-h') {
|
|
81
|
-
console.log(`earos —
|
|
123
|
+
console.log(`earos — EaROS editor and CLI
|
|
82
124
|
|
|
83
125
|
Usage:
|
|
84
126
|
earos Open the editor in your browser
|
|
85
127
|
earos <file.yaml> Open the editor with a file pre-loaded
|
|
86
|
-
earos init [dir] [--icons] Scaffold a new
|
|
87
|
-
earos validate <file.yaml>
|
|
88
|
-
earos export <file.yaml>
|
|
128
|
+
earos init [dir] [--icons] Scaffold a new EaROS workspace (default: current dir)
|
|
129
|
+
earos validate <file.yaml> [--json] Validate any EaROS YAML (exit 0/1)
|
|
130
|
+
earos export <file.yaml> [--format docx|md] Export YAML as Word or Markdown (default: docx)
|
|
131
|
+
earos list evaluations [--json] List evaluation files with summary metadata
|
|
89
132
|
earos manifest Regenerate earos.manifest.yaml
|
|
90
133
|
earos manifest add <file> Add a file to the manifest
|
|
91
|
-
earos manifest check
|
|
92
|
-
earos
|
|
134
|
+
earos manifest check [--json] Verify manifest matches filesystem
|
|
135
|
+
earos manifest list [--json] List manifest contents
|
|
136
|
+
earos dev Start Vite dev server (development only)
|
|
137
|
+
|
|
138
|
+
Environment: EAROS_HOST=0.0.0.0 earos Bind to all interfaces (default: 127.0.0.1)`)
|
|
93
139
|
process.exit(0)
|
|
94
140
|
} else if (args[0] === 'export') {
|
|
95
|
-
// Export
|
|
141
|
+
// Export YAML → Word document or Markdown
|
|
96
142
|
if (!args[1]) {
|
|
97
|
-
console.error('Usage: earos export <file.yaml>')
|
|
143
|
+
console.error('Usage: earos export <file.yaml> [--format docx|md]')
|
|
98
144
|
process.exit(1)
|
|
99
145
|
}
|
|
100
|
-
const
|
|
146
|
+
const formatArg = args.indexOf('--format')
|
|
147
|
+
const format = formatArg >= 0 && args[formatArg + 1] ? args[formatArg + 1] : 'docx'
|
|
148
|
+
const fileArg = args.find((a, i) => i > 0 && a !== '--format' && (i < formatArg || i > formatArg + 1 || formatArg < 0)) ?? args[1]
|
|
149
|
+
const inputPath = resolve(fileArg)
|
|
101
150
|
if (!existsSync(inputPath)) {
|
|
102
151
|
console.error(`File not found: ${inputPath}`)
|
|
103
152
|
process.exit(1)
|
|
@@ -107,27 +156,97 @@ Usage:
|
|
|
107
156
|
console.error(`Cannot read file: ${e.message}`)
|
|
108
157
|
process.exit(1)
|
|
109
158
|
}
|
|
110
|
-
let
|
|
111
|
-
try {
|
|
159
|
+
let exportData
|
|
160
|
+
try { exportData = yaml.load(exportContent) } catch (e) {
|
|
112
161
|
console.error(`YAML parse error: ${e.message}`)
|
|
113
162
|
process.exit(1)
|
|
114
163
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
164
|
+
|
|
165
|
+
const kind = exportData?.kind
|
|
166
|
+
|
|
167
|
+
if (format === 'md') {
|
|
168
|
+
// Markdown export
|
|
169
|
+
const { exportArtifactToMarkdown, exportRubricToMarkdown } = await import('./utils/export-markdown.js')
|
|
170
|
+
let md
|
|
171
|
+
if (kind === 'artifact' || !kind) {
|
|
172
|
+
md = exportArtifactToMarkdown(exportData)
|
|
173
|
+
} else if (kind === 'core_rubric' || kind === 'profile' || kind === 'overlay') {
|
|
174
|
+
md = exportRubricToMarkdown(exportData)
|
|
175
|
+
} else if (kind === 'evaluation') {
|
|
176
|
+
// Evaluation markdown requires assembled dimensions — export as YAML-derived summary
|
|
177
|
+
md = exportRubricToMarkdown(exportData)
|
|
178
|
+
} else {
|
|
179
|
+
console.error(`Unsupported kind for Markdown export: ${kind}`)
|
|
180
|
+
process.exit(1)
|
|
181
|
+
}
|
|
182
|
+
const outputPath = inputPath.replace(/\.(yaml|yml)$/i, '') + '.md'
|
|
183
|
+
writeFileSync(outputPath, md, 'utf8')
|
|
126
184
|
console.log(`✓ Exported → ${outputPath}`)
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
185
|
+
} else {
|
|
186
|
+
// DOCX export — route by kind
|
|
187
|
+
const { exportToDocx, exportRubricToDocx, exportEvaluationToDocx } = await import('./export-docx.js')
|
|
188
|
+
let buf, outputPath
|
|
189
|
+
if (kind === 'artifact' || !kind) {
|
|
190
|
+
outputPath = inputPath.replace(/\.(yaml|yml)$/i, '') + '.docx'
|
|
191
|
+
console.log('Rendering diagrams and building Word document…')
|
|
192
|
+
buf = await exportToDocx(exportData)
|
|
193
|
+
} else if (kind === 'evaluation') {
|
|
194
|
+
outputPath = inputPath.replace(/\.(yaml|yml)$/i, '') + '-assessment.docx'
|
|
195
|
+
console.log('Building evaluation Word document…')
|
|
196
|
+
buf = await exportEvaluationToDocx(exportData)
|
|
197
|
+
} else if (kind === 'core_rubric' || kind === 'profile' || kind === 'overlay') {
|
|
198
|
+
outputPath = inputPath.replace(/\.(yaml|yml)$/i, '') + '.docx'
|
|
199
|
+
console.log('Building rubric Word document…')
|
|
200
|
+
buf = await exportRubricToDocx(exportData)
|
|
201
|
+
} else {
|
|
202
|
+
console.error(`Unsupported kind for export: ${kind}`)
|
|
203
|
+
process.exit(1)
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
writeFileSync(outputPath, buf)
|
|
207
|
+
console.log(`✓ Exported → ${outputPath}`)
|
|
208
|
+
} catch (e) {
|
|
209
|
+
console.error(`Export failed: ${e.message}`)
|
|
210
|
+
process.exit(1)
|
|
211
|
+
}
|
|
130
212
|
}
|
|
213
|
+
} else if (args[0] === 'list' && args[1] === 'evaluations') {
|
|
214
|
+
// List evaluation files with summary metadata
|
|
215
|
+
const REPO_ROOT = findRepoRoot()
|
|
216
|
+
const jsonMode = args.includes('--json')
|
|
217
|
+
const files = []
|
|
218
|
+
for (const dir of ['examples', 'evaluations']) {
|
|
219
|
+
files.push(...findEvaluationFiles(resolve(REPO_ROOT, dir), `${dir}/`))
|
|
220
|
+
}
|
|
221
|
+
const summaries = files.map(f => {
|
|
222
|
+
const absPath = resolve(REPO_ROOT, f.path)
|
|
223
|
+
try {
|
|
224
|
+
const data = yaml.load(readFileSync(absPath, 'utf8'))
|
|
225
|
+
return {
|
|
226
|
+
path: f.path,
|
|
227
|
+
overall_status: data?.overall_status ?? undefined,
|
|
228
|
+
overall_score: data?.overall_score ?? undefined,
|
|
229
|
+
evaluation_date: data?.evaluation_date ?? undefined,
|
|
230
|
+
title: data?.artifact_ref?.title ?? data?.artifact_id ?? f.name.replace(/\.evaluation\.yaml$|\.yaml$/, ''),
|
|
231
|
+
}
|
|
232
|
+
} catch {
|
|
233
|
+
return { path: f.path, title: f.name }
|
|
234
|
+
}
|
|
235
|
+
})
|
|
236
|
+
if (jsonMode) {
|
|
237
|
+
process.stdout.write(JSON.stringify({ summaries }, null, 2) + '\n')
|
|
238
|
+
} else {
|
|
239
|
+
if (summaries.length === 0) {
|
|
240
|
+
console.log('No evaluation files found in examples/ or evaluations/')
|
|
241
|
+
} else {
|
|
242
|
+
for (const s of summaries) {
|
|
243
|
+
const score = s.overall_score != null ? ` (${s.overall_score.toFixed(2)})` : ''
|
|
244
|
+
const status = s.overall_status ? ` [${s.overall_status}]` : ''
|
|
245
|
+
console.log(` ${s.path} ${s.title}${score}${status}`)
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
process.exit(0)
|
|
131
250
|
} else if (args[0] === 'init') {
|
|
132
251
|
const initArgs = args.slice(1)
|
|
133
252
|
let targetDir = '.'
|
|
@@ -153,11 +272,12 @@ Usage:
|
|
|
153
272
|
const { initWorkspace } = await import('./init.js')
|
|
154
273
|
await initWorkspace(targetDir, { downloadIcons })
|
|
155
274
|
} else if (args[0] === 'validate') {
|
|
156
|
-
|
|
157
|
-
|
|
275
|
+
const valFile = args.find((a, i) => i > 0 && a !== '--json')
|
|
276
|
+
if (!valFile) {
|
|
277
|
+
console.error('Usage: earos validate <file.yaml> [--json]')
|
|
158
278
|
process.exit(1)
|
|
159
279
|
}
|
|
160
|
-
await validateFile(args
|
|
280
|
+
await validateFile(valFile, args.includes('--json'))
|
|
161
281
|
} else if (args[0] === 'manifest') {
|
|
162
282
|
const manifestCli = resolve(__dirname, 'manifest-cli.mjs')
|
|
163
283
|
const result = spawnSync(process.execPath, [manifestCli, ...args.slice(1)], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as x,c as O,g as m,k as P,h as p,j as w,l as c,m as A,n as I,t as N,o as _}from"./_baseUniq-
|
|
1
|
+
import{e as x,c as O,g as m,k as P,h as p,j as w,l as c,m as A,n as I,t as N,o as _}from"./_baseUniq-CVy7rcC1.js";import{aV as g,aC as $,aW as E,aX as F,aY as M,aZ as b,a_ as B,a$ as T,b0 as y,b1 as S}from"./index-DoeSN_Oe.js";var C=/\s/;function G(n){for(var r=n.length;r--&&C.test(n.charAt(r)););return r}var H=/^\s+/;function L(n){return n&&n.slice(0,G(n)+1).replace(H,"")}var o=NaN,R=/^[-+]0x[0-9a-f]+$/i,W=/^0b[01]+$/i,X=/^0o[0-7]+$/i,Y=parseInt;function q(n){if(typeof n=="number")return n;if(x(n))return o;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=L(n);var t=W.test(n);return t||X.test(n)?Y(n.slice(2),t?2:8):R.test(n)?o:+n}var v=1/0,z=17976931348623157e292;function K(n){if(!n)return n===0?n:0;if(n=q(n),n===v||n===-v){var r=n<0?-1:1;return r*z}return n===n?n:0}function Z(n){var r=K(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?O(n):[]}var l=Object.prototype,D=l.hasOwnProperty,dn=$(function(n,r){n=Object(n);var t=-1,i=r.length,a=i>2?r[2]:void 0;for(a&&E(r[0],r[1],a)&&(i=1);++t<i;)for(var f=r[t],e=F(f),s=-1,d=e.length;++s<d;){var u=e[s],h=n[u];(h===void 0||M(h,l[u])&&!D.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function J(n){return function(r,t,i){var a=Object(r);if(!b(r)){var f=m(t);r=P(r),t=function(s){return f(a[s],s,a)}}var e=n(r,t,i);return e>-1?a[f?r[e]:e]:void 0}}var Q=Math.max;function U(n,r,t){var i=n==null?0:n.length;if(!i)return-1;var a=t==null?0:Z(t);return a<0&&(a=Q(i+a,0)),p(n,m(r),a)}var hn=J(U);function V(n,r){var t=-1,i=b(n)?Array(n.length):[];return w(n,function(a,f,e){i[++t]=r(a,f,e)}),i}function gn(n,r){var t=B(n)?c:V;return t(n,m(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function mn(n,r){return n!=null&&A(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var i=-1,a=n.length;++i<a;){var f=n[i],e=r(f);if(e!=null&&(s===void 0?e===e&&!x(e):t(e,s)))var s=e,d=f}return d}function on(n){return n&&n.length?tn(n,T,rn):void 0}function an(n,r,t,i){if(!g(n))return n;r=I(r,n);for(var a=-1,f=r.length,e=f-1,s=n;s!=null&&++a<f;){var d=N(r[a]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(a!=e){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:y(r[a+1])?[]:{})}S(s,d,u),s=s[d]}return n}function vn(n,r,t){for(var i=-1,a=r.length,f={};++i<a;){var e=r[i],s=_(n,e);t(s,e)&&an(f,I(e,n),s)}return f}export{rn as a,tn as b,V as c,vn as d,on as e,fn as f,hn as g,mn as h,dn as i,Z as j,un as l,gn as m,K as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{bi as E,bj as Rn,a_ as T,bk as w,aZ as sn,bl as xn,bm as mn,bn as Cn,bo as un,bp as x,aX as B,bq as Mn,br as on,bs as Fn,bt as S,bg as gn,bu as R,aV as ln,bv as Dn,bw as D,bx as Gn,by as Bn,bz as _,b1 as Un,bA as Nn,aY as Kn,bB as X,bC as jn,bD as Hn,b0 as qn,a$ as cn,be as Yn,bE as C}from"./index-DMt1cpG6.js";var Zn="[object Symbol]";function U(n){return typeof n=="symbol"||E(n)&&Rn(n)==Zn}function bn(n,r){for(var e=-1,t=n==null?0:n.length,f=Array(t);++e<t;)f[e]=r(n[e],e,n);return f}var J=w?w.prototype:void 0,Q=J?J.toString:void 0;function dn(n){if(typeof n=="string")return n;if(T(n))return bn(n,dn)+"";if(U(n))return Q?Q.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Xn(){}function pn(n,r){for(var e=-1,t=n==null?0:n.length;++e<t&&r(n[e],e,n)!==!1;);return n}function Jn(n,r,e,t){for(var f=n.length,i=e+-1;++i<f;)if(r(n[i],i,n))return i;return-1}function Qn(n){return n!==n}function Wn(n,r,e){for(var t=e-1,f=n.length;++t<f;)if(n[t]===r)return t;return-1}function zn(n,r,e){return r===r?Wn(n,r,e):Jn(n,Qn,e)}function Vn(n,r){var e=n==null?0:n.length;return!!e&&zn(n,r,0)>-1}function $(n){return sn(n)?xn(n):mn(n)}var kn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nr=/^\w*$/;function N(n,r){if(T(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||U(n)?!0:nr.test(n)||!kn.test(n)||r!=null&&n in Object(r)}var rr=500;function er(n){var r=Cn(n,function(t){return e.size===rr&&e.clear(),t}),e=r.cache;return r}var tr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ir=/\\(\\)?/g,fr=er(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(tr,function(e,t,f,i){r.push(f?i.replace(ir,"$1"):t||e)}),r});function ar(n){return n==null?"":dn(n)}function An(n,r){return T(n)?n:N(n,r)?[n]:fr(ar(n))}function m(n){if(typeof n=="string"||U(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function yn(n,r){r=An(r,n);for(var e=0,t=r.length;n!=null&&e<t;)n=n[m(r[e++])];return e&&e==t?n:void 0}function sr(n,r,e){var t=n==null?void 0:yn(n,r);return t===void 0?e:t}function K(n,r){for(var e=-1,t=r.length,f=n.length;++e<t;)n[f+e]=r[e];return n}var W=w?w.isConcatSpreadable:void 0;function ur(n){return T(n)||un(n)||!!(W&&n&&n[W])}function Ot(n,r,e,t,f){var i=-1,a=n.length;for(e||(e=ur),f||(f=[]);++i<a;){var s=n[i];e(s)?K(f,s):t||(f[f.length]=s)}return f}function or(n,r,e,t){var f=-1,i=n==null?0:n.length;for(t&&i&&(e=n[++f]);++f<i;)e=r(e,n[f],f,n);return e}function gr(n,r){return n&&x(r,$(r),n)}function lr(n,r){return n&&x(r,B(r),n)}function Tn(n,r){for(var e=-1,t=n==null?0:n.length,f=0,i=[];++e<t;){var a=n[e];r(a,e,n)&&(i[f++]=a)}return i}function hn(){return[]}var cr=Object.prototype,br=cr.propertyIsEnumerable,z=Object.getOwnPropertySymbols,j=z?function(n){return n==null?[]:(n=Object(n),Tn(z(n),function(r){return br.call(n,r)}))}:hn;function dr(n,r){return x(n,j(n),r)}var pr=Object.getOwnPropertySymbols,wn=pr?function(n){for(var r=[];n;)K(r,j(n)),n=Mn(n);return r}:hn;function Ar(n,r){return x(n,wn(n),r)}function On(n,r,e){var t=r(n);return T(n)?t:K(t,e(n))}function G(n){return On(n,$,j)}function yr(n){return On(n,B,wn)}var Tr=Object.prototype,hr=Tr.hasOwnProperty;function wr(n){var r=n.length,e=new n.constructor(r);return r&&typeof n[0]=="string"&&hr.call(n,"index")&&(e.index=n.index,e.input=n.input),e}function Or(n,r){var e=r?on(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}var $r=/\w*$/;function _r(n){var r=new n.constructor(n.source,$r.exec(n));return r.lastIndex=n.lastIndex,r}var V=w?w.prototype:void 0,k=V?V.valueOf:void 0;function Er(n){return k?Object(k.call(n)):{}}var Sr="[object Boolean]",Ir="[object Date]",Pr="[object Map]",vr="[object Number]",Lr="[object RegExp]",Rr="[object Set]",xr="[object String]",mr="[object Symbol]",Cr="[object ArrayBuffer]",Mr="[object DataView]",Fr="[object Float32Array]",Dr="[object Float64Array]",Gr="[object Int8Array]",Br="[object Int16Array]",Ur="[object Int32Array]",Nr="[object Uint8Array]",Kr="[object Uint8ClampedArray]",jr="[object Uint16Array]",Hr="[object Uint32Array]";function qr(n,r,e){var t=n.constructor;switch(r){case Cr:return on(n);case Sr:case Ir:return new t(+n);case Mr:return Or(n,e);case Fr:case Dr:case Gr:case Br:case Ur:case Nr:case Kr:case jr:case Hr:return Fn(n,e);case Pr:return new t;case vr:case xr:return new t(n);case Lr:return _r(n);case Rr:return new t;case mr:return Er(n)}}var Yr="[object Map]";function Zr(n){return E(n)&&S(n)==Yr}var nn=R&&R.isMap,Xr=nn?gn(nn):Zr,Jr="[object Set]";function Qr(n){return E(n)&&S(n)==Jr}var rn=R&&R.isSet,Wr=rn?gn(rn):Qr,zr=1,Vr=2,kr=4,$n="[object Arguments]",ne="[object Array]",re="[object Boolean]",ee="[object Date]",te="[object Error]",_n="[object Function]",ie="[object GeneratorFunction]",fe="[object Map]",ae="[object Number]",En="[object Object]",se="[object RegExp]",ue="[object Set]",oe="[object String]",ge="[object Symbol]",le="[object WeakMap]",ce="[object ArrayBuffer]",be="[object DataView]",de="[object Float32Array]",pe="[object Float64Array]",Ae="[object Int8Array]",ye="[object Int16Array]",Te="[object Int32Array]",he="[object Uint8Array]",we="[object Uint8ClampedArray]",Oe="[object Uint16Array]",$e="[object Uint32Array]",g={};g[$n]=g[ne]=g[ce]=g[be]=g[re]=g[ee]=g[de]=g[pe]=g[Ae]=g[ye]=g[Te]=g[fe]=g[ae]=g[En]=g[se]=g[ue]=g[oe]=g[ge]=g[he]=g[we]=g[Oe]=g[$e]=!0;g[te]=g[_n]=g[le]=!1;function M(n,r,e,t,f,i){var a,s=r&zr,u=r&Vr,b=r&kr;if(a!==void 0)return a;if(!ln(n))return n;var l=T(n);if(l){if(a=wr(n),!s)return Dn(n,a)}else{var o=S(n),c=o==_n||o==ie;if(D(n))return Gn(n,s);if(o==En||o==$n||c&&!f){if(a=u||c?{}:Bn(n),!s)return u?Ar(n,lr(a,n)):dr(n,gr(a,n))}else{if(!g[o])return f?n:{};a=qr(n,o,s)}}i||(i=new _);var h=i.get(n);if(h)return h;i.set(n,a),Wr(n)?n.forEach(function(d){a.add(M(d,r,e,d,n,i))}):Xr(n)&&n.forEach(function(d,p){a.set(p,M(d,r,e,p,n,i))});var A=b?u?yr:G:u?B:$,y=l?void 0:A(n);return pn(y||n,function(d,p){y&&(p=d,d=n[p]),Un(a,p,M(d,r,e,p,n,i))}),a}var _e="__lodash_hash_undefined__";function Ee(n){return this.__data__.set(n,_e),this}function Se(n){return this.__data__.has(n)}function I(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new Nn;++r<e;)this.add(n[r])}I.prototype.add=I.prototype.push=Ee;I.prototype.has=Se;function Ie(n,r){for(var e=-1,t=n==null?0:n.length;++e<t;)if(r(n[e],e,n))return!0;return!1}function Sn(n,r){return n.has(r)}var Pe=1,ve=2;function In(n,r,e,t,f,i){var a=e&Pe,s=n.length,u=r.length;if(s!=u&&!(a&&u>s))return!1;var b=i.get(n),l=i.get(r);if(b&&l)return b==r&&l==n;var o=-1,c=!0,h=e&ve?new I:void 0;for(i.set(n,r),i.set(r,n);++o<s;){var A=n[o],y=r[o];if(t)var d=a?t(y,A,o,r,n,i):t(A,y,o,n,r,i);if(d!==void 0){if(d)continue;c=!1;break}if(h){if(!Ie(r,function(p,O){if(!Sn(h,O)&&(A===p||f(A,p,e,t,i)))return h.push(O)})){c=!1;break}}else if(!(A===y||f(A,y,e,t,i))){c=!1;break}}return i.delete(n),i.delete(r),c}function Le(n){var r=-1,e=Array(n.size);return n.forEach(function(t,f){e[++r]=[f,t]}),e}function H(n){var r=-1,e=Array(n.size);return n.forEach(function(t){e[++r]=t}),e}var Re=1,xe=2,me="[object Boolean]",Ce="[object Date]",Me="[object Error]",Fe="[object Map]",De="[object Number]",Ge="[object RegExp]",Be="[object Set]",Ue="[object String]",Ne="[object Symbol]",Ke="[object ArrayBuffer]",je="[object DataView]",en=w?w.prototype:void 0,F=en?en.valueOf:void 0;function He(n,r,e,t,f,i,a){switch(e){case je:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case Ke:return!(n.byteLength!=r.byteLength||!i(new X(n),new X(r)));case me:case Ce:case De:return Kn(+n,+r);case Me:return n.name==r.name&&n.message==r.message;case Ge:case Ue:return n==r+"";case Fe:var s=Le;case Be:var u=tℜif(s||(s=H),n.size!=r.size&&!u)return!1;var b=a.get(n);if(b)return b==r;t|=xe,a.set(n,r);var l=In(s(n),s(r),t,f,i,a);return a.delete(n),l;case Ne:if(F)return F.call(n)==F.call(r)}return!1}var qe=1,Ye=Object.prototype,Ze=Ye.hasOwnProperty;function Xe(n,r,e,t,f,i){var a=e&qe,s=G(n),u=s.length,b=G(r),l=b.length;if(u!=l&&!a)return!1;for(var o=u;o--;){var c=s[o];if(!(a?c in r:Ze.call(r,c)))return!1}var h=i.get(n),A=i.get(r);if(h&&A)return h==r&&A==n;var y=!0;i.set(n,r),i.set(r,n);for(var d=a;++o<u;){c=s[o];var p=n[c],O=r[c];if(t)var Z=a?t(O,p,c,r,n,i):t(p,O,c,n,r,i);if(!(Z===void 0?p===O||f(p,O,e,t,i):Z)){y=!1;break}d||(d=c=="constructor")}if(y&&!d){var P=n.constructor,v=r.constructor;P!=v&&"constructor"in n&&"constructor"in r&&!(typeof P=="function"&&P instanceof P&&typeof v=="function"&&v instanceof v)&&(y=!1)}return i.delete(n),i.delete(r),y}var Je=1,tn="[object Arguments]",fn="[object Array]",L="[object Object]",Qe=Object.prototype,an=Qe.hasOwnProperty;function We(n,r,e,t,f,i){var a=T(n),s=T(r),u=a?fn:S(n),b=s?fn:S(r);u=u==tn?L:u,b=b==tn?L:b;var l=u==L,o=b==L,c=u==b;if(c&&D(n)){if(!D(r))return!1;a=!0,l=!1}if(c&&!l)return i||(i=new _),a||jn(n)?In(n,r,e,t,f,i):He(n,r,u,e,t,f,i);if(!(e&Je)){var h=l&&an.call(n,"__wrapped__"),A=o&&an.call(r,"__wrapped__");if(h||A){var y=h?n.value():n,d=A?r.value():r;return i||(i=new _),f(y,d,e,t,i)}}return c?(i||(i=new _),Xe(n,r,e,t,f,i)):!1}function q(n,r,e,t,f){return n===r?!0:n==null||r==null||!E(n)&&!E(r)?n!==n&&r!==r:We(n,r,e,t,q,f)}var ze=1,Ve=2;function ke(n,r,e,t){var f=e.length,i=f;if(n==null)return!i;for(n=Object(n);f--;){var a=e[f];if(a[2]?a[1]!==n[a[0]]:!(a[0]in n))return!1}for(;++f<i;){a=e[f];var s=a[0],u=n[s],b=a[1];if(a[2]){if(u===void 0&&!(s in n))return!1}else{var l=new _,o;if(!(o===void 0?q(b,u,ze|Ve,t,l):o))return!1}}return!0}function Pn(n){return n===n&&!ln(n)}function nt(n){for(var r=$(n),e=r.length;e--;){var t=r[e],f=n[t];r[e]=[t,f,Pn(f)]}return r}function vn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function rt(n){var r=nt(n);return r.length==1&&r[0][2]?vn(r[0][0],r[0][1]):function(e){return e===n||ke(e,n,r)}}function et(n,r){return n!=null&&r in Object(n)}function tt(n,r,e){r=An(r,n);for(var t=-1,f=r.length,i=!1;++t<f;){var a=m(r[t]);if(!(i=n!=null&&e(n,a)))break;n=n[a]}return i||++t!=f?i:(f=n==null?0:n.length,!!f&&Hn(f)&&qn(a,f)&&(T(n)||un(n)))}function it(n,r){return n!=null&&tt(n,r,et)}var ft=1,at=2;function st(n,r){return N(n)&&Pn(r)?vn(m(n),r):function(e){var t=sr(e,n);return t===void 0&&t===r?it(e,n):q(r,t,ft|at)}}function ut(n){return function(r){return r==null?void 0:r[n]}}function ot(n){return function(r){return yn(r,n)}}function gt(n){return N(n)?ut(m(n)):ot(n)}function Ln(n){return typeof n=="function"?n:n==null?cn:typeof n=="object"?T(n)?st(n[0],n[1]):rt(n):gt(n)}function lt(n,r){return n&&Yn(n,r,$)}function ct(n,r){return function(e,t){if(e==null)return e;if(!sn(e))return n(e,t);for(var f=e.length,i=-1,a=Object(e);++i<f&&t(a[i],i,a)!==!1;);return e}}var Y=ct(lt);function bt(n){return typeof n=="function"?n:cn}function $t(n,r){var e=T(n)?pn:Y;return e(n,bt(r))}function dt(n,r){var e=[];return Y(n,function(t,f,i){r(t,f,i)&&e.push(t)}),e}function _t(n,r){var e=T(n)?Tn:dt;return e(n,Ln(r))}function pt(n,r){return bn(r,function(e){return n[e]})}function Et(n){return n==null?[]:pt(n,$(n))}function St(n){return n===void 0}function At(n,r,e,t,f){return f(n,function(i,a,s){e=t?(t=!1,i):r(e,i,a,s)}),e}function It(n,r,e){var t=T(n)?or:At,f=arguments.length<3;return t(n,Ln(r),e,f,Y)}var yt=1/0,Tt=C&&1/H(new C([,-0]))[1]==yt?function(n){return new C(n)}:Xn,ht=200;function Pt(n,r,e){var t=-1,f=Vn,i=n.length,a=!0,s=[],u=s;if(i>=ht){var b=r?null:Tt(n);if(b)return H(b);a=!1,f=Sn,u=new I}else u=r?[]:s;n:for(;++t<i;){var l=n[t],o=r?r(l):l;if(l=l!==0?l:0,a&&o===o){for(var c=u.length;c--;)if(u[c]===o)continue n;r&&u.push(o),s.push(l)}else f(u,o,e)||(u!==s&&u.push(o),s.push(l))}return s}export{Tn as A,dt as B,Ie as C,Xn as D,I as S,Pt as a,M as b,Ot as c,$t as d,U as e,_t as f,Ln as g,Jn as h,St as i,Y as j,$ as k,bn as l,tt as m,An as n,yn as o,bt as p,lt as q,It as r,it as s,m as t,ar as u,Et as v,Vn as w,Sn as x,zn as y,yr as z};
|
|
1
|
+
import{bi as E,bj as Rn,a_ as T,bk as w,aZ as sn,bl as xn,bm as mn,bn as Cn,bo as un,bp as x,aX as B,bq as Mn,br as on,bs as Fn,bt as S,bg as gn,bu as R,aV as ln,bv as Dn,bw as D,bx as Gn,by as Bn,bz as _,b1 as Un,bA as Nn,aY as Kn,bB as X,bC as jn,bD as Hn,b0 as qn,a$ as cn,be as Yn,bE as C}from"./index-DoeSN_Oe.js";var Zn="[object Symbol]";function U(n){return typeof n=="symbol"||E(n)&&Rn(n)==Zn}function bn(n,r){for(var e=-1,t=n==null?0:n.length,f=Array(t);++e<t;)f[e]=r(n[e],e,n);return f}var J=w?w.prototype:void 0,Q=J?J.toString:void 0;function dn(n){if(typeof n=="string")return n;if(T(n))return bn(n,dn)+"";if(U(n))return Q?Q.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function Xn(){}function pn(n,r){for(var e=-1,t=n==null?0:n.length;++e<t&&r(n[e],e,n)!==!1;);return n}function Jn(n,r,e,t){for(var f=n.length,i=e+-1;++i<f;)if(r(n[i],i,n))return i;return-1}function Qn(n){return n!==n}function Wn(n,r,e){for(var t=e-1,f=n.length;++t<f;)if(n[t]===r)return t;return-1}function zn(n,r,e){return r===r?Wn(n,r,e):Jn(n,Qn,e)}function Vn(n,r){var e=n==null?0:n.length;return!!e&&zn(n,r,0)>-1}function $(n){return sn(n)?xn(n):mn(n)}var kn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nr=/^\w*$/;function N(n,r){if(T(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||U(n)?!0:nr.test(n)||!kn.test(n)||r!=null&&n in Object(r)}var rr=500;function er(n){var r=Cn(n,function(t){return e.size===rr&&e.clear(),t}),e=r.cache;return r}var tr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ir=/\\(\\)?/g,fr=er(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(tr,function(e,t,f,i){r.push(f?i.replace(ir,"$1"):t||e)}),r});function ar(n){return n==null?"":dn(n)}function An(n,r){return T(n)?n:N(n,r)?[n]:fr(ar(n))}function m(n){if(typeof n=="string"||U(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function yn(n,r){r=An(r,n);for(var e=0,t=r.length;n!=null&&e<t;)n=n[m(r[e++])];return e&&e==t?n:void 0}function sr(n,r,e){var t=n==null?void 0:yn(n,r);return t===void 0?e:t}function K(n,r){for(var e=-1,t=r.length,f=n.length;++e<t;)n[f+e]=r[e];return n}var W=w?w.isConcatSpreadable:void 0;function ur(n){return T(n)||un(n)||!!(W&&n&&n[W])}function Ot(n,r,e,t,f){var i=-1,a=n.length;for(e||(e=ur),f||(f=[]);++i<a;){var s=n[i];e(s)?K(f,s):t||(f[f.length]=s)}return f}function or(n,r,e,t){var f=-1,i=n==null?0:n.length;for(t&&i&&(e=n[++f]);++f<i;)e=r(e,n[f],f,n);return e}function gr(n,r){return n&&x(r,$(r),n)}function lr(n,r){return n&&x(r,B(r),n)}function Tn(n,r){for(var e=-1,t=n==null?0:n.length,f=0,i=[];++e<t;){var a=n[e];r(a,e,n)&&(i[f++]=a)}return i}function hn(){return[]}var cr=Object.prototype,br=cr.propertyIsEnumerable,z=Object.getOwnPropertySymbols,j=z?function(n){return n==null?[]:(n=Object(n),Tn(z(n),function(r){return br.call(n,r)}))}:hn;function dr(n,r){return x(n,j(n),r)}var pr=Object.getOwnPropertySymbols,wn=pr?function(n){for(var r=[];n;)K(r,j(n)),n=Mn(n);return r}:hn;function Ar(n,r){return x(n,wn(n),r)}function On(n,r,e){var t=r(n);return T(n)?t:K(t,e(n))}function G(n){return On(n,$,j)}function yr(n){return On(n,B,wn)}var Tr=Object.prototype,hr=Tr.hasOwnProperty;function wr(n){var r=n.length,e=new n.constructor(r);return r&&typeof n[0]=="string"&&hr.call(n,"index")&&(e.index=n.index,e.input=n.input),e}function Or(n,r){var e=r?on(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}var $r=/\w*$/;function _r(n){var r=new n.constructor(n.source,$r.exec(n));return r.lastIndex=n.lastIndex,r}var V=w?w.prototype:void 0,k=V?V.valueOf:void 0;function Er(n){return k?Object(k.call(n)):{}}var Sr="[object Boolean]",Ir="[object Date]",Pr="[object Map]",vr="[object Number]",Lr="[object RegExp]",Rr="[object Set]",xr="[object String]",mr="[object Symbol]",Cr="[object ArrayBuffer]",Mr="[object DataView]",Fr="[object Float32Array]",Dr="[object Float64Array]",Gr="[object Int8Array]",Br="[object Int16Array]",Ur="[object Int32Array]",Nr="[object Uint8Array]",Kr="[object Uint8ClampedArray]",jr="[object Uint16Array]",Hr="[object Uint32Array]";function qr(n,r,e){var t=n.constructor;switch(r){case Cr:return on(n);case Sr:case Ir:return new t(+n);case Mr:return Or(n,e);case Fr:case Dr:case Gr:case Br:case Ur:case Nr:case Kr:case jr:case Hr:return Fn(n,e);case Pr:return new t;case vr:case xr:return new t(n);case Lr:return _r(n);case Rr:return new t;case mr:return Er(n)}}var Yr="[object Map]";function Zr(n){return E(n)&&S(n)==Yr}var nn=R&&R.isMap,Xr=nn?gn(nn):Zr,Jr="[object Set]";function Qr(n){return E(n)&&S(n)==Jr}var rn=R&&R.isSet,Wr=rn?gn(rn):Qr,zr=1,Vr=2,kr=4,$n="[object Arguments]",ne="[object Array]",re="[object Boolean]",ee="[object Date]",te="[object Error]",_n="[object Function]",ie="[object GeneratorFunction]",fe="[object Map]",ae="[object Number]",En="[object Object]",se="[object RegExp]",ue="[object Set]",oe="[object String]",ge="[object Symbol]",le="[object WeakMap]",ce="[object ArrayBuffer]",be="[object DataView]",de="[object Float32Array]",pe="[object Float64Array]",Ae="[object Int8Array]",ye="[object Int16Array]",Te="[object Int32Array]",he="[object Uint8Array]",we="[object Uint8ClampedArray]",Oe="[object Uint16Array]",$e="[object Uint32Array]",g={};g[$n]=g[ne]=g[ce]=g[be]=g[re]=g[ee]=g[de]=g[pe]=g[Ae]=g[ye]=g[Te]=g[fe]=g[ae]=g[En]=g[se]=g[ue]=g[oe]=g[ge]=g[he]=g[we]=g[Oe]=g[$e]=!0;g[te]=g[_n]=g[le]=!1;function M(n,r,e,t,f,i){var a,s=r&zr,u=r&Vr,b=r&kr;if(a!==void 0)return a;if(!ln(n))return n;var l=T(n);if(l){if(a=wr(n),!s)return Dn(n,a)}else{var o=S(n),c=o==_n||o==ie;if(D(n))return Gn(n,s);if(o==En||o==$n||c&&!f){if(a=u||c?{}:Bn(n),!s)return u?Ar(n,lr(a,n)):dr(n,gr(a,n))}else{if(!g[o])return f?n:{};a=qr(n,o,s)}}i||(i=new _);var h=i.get(n);if(h)return h;i.set(n,a),Wr(n)?n.forEach(function(d){a.add(M(d,r,e,d,n,i))}):Xr(n)&&n.forEach(function(d,p){a.set(p,M(d,r,e,p,n,i))});var A=b?u?yr:G:u?B:$,y=l?void 0:A(n);return pn(y||n,function(d,p){y&&(p=d,d=n[p]),Un(a,p,M(d,r,e,p,n,i))}),a}var _e="__lodash_hash_undefined__";function Ee(n){return this.__data__.set(n,_e),this}function Se(n){return this.__data__.has(n)}function I(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new Nn;++r<e;)this.add(n[r])}I.prototype.add=I.prototype.push=Ee;I.prototype.has=Se;function Ie(n,r){for(var e=-1,t=n==null?0:n.length;++e<t;)if(r(n[e],e,n))return!0;return!1}function Sn(n,r){return n.has(r)}var Pe=1,ve=2;function In(n,r,e,t,f,i){var a=e&Pe,s=n.length,u=r.length;if(s!=u&&!(a&&u>s))return!1;var b=i.get(n),l=i.get(r);if(b&&l)return b==r&&l==n;var o=-1,c=!0,h=e&ve?new I:void 0;for(i.set(n,r),i.set(r,n);++o<s;){var A=n[o],y=r[o];if(t)var d=a?t(y,A,o,r,n,i):t(A,y,o,n,r,i);if(d!==void 0){if(d)continue;c=!1;break}if(h){if(!Ie(r,function(p,O){if(!Sn(h,O)&&(A===p||f(A,p,e,t,i)))return h.push(O)})){c=!1;break}}else if(!(A===y||f(A,y,e,t,i))){c=!1;break}}return i.delete(n),i.delete(r),c}function Le(n){var r=-1,e=Array(n.size);return n.forEach(function(t,f){e[++r]=[f,t]}),e}function H(n){var r=-1,e=Array(n.size);return n.forEach(function(t){e[++r]=t}),e}var Re=1,xe=2,me="[object Boolean]",Ce="[object Date]",Me="[object Error]",Fe="[object Map]",De="[object Number]",Ge="[object RegExp]",Be="[object Set]",Ue="[object String]",Ne="[object Symbol]",Ke="[object ArrayBuffer]",je="[object DataView]",en=w?w.prototype:void 0,F=en?en.valueOf:void 0;function He(n,r,e,t,f,i,a){switch(e){case je:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case Ke:return!(n.byteLength!=r.byteLength||!i(new X(n),new X(r)));case me:case Ce:case De:return Kn(+n,+r);case Me:return n.name==r.name&&n.message==r.message;case Ge:case Ue:return n==r+"";case Fe:var s=Le;case Be:var u=tℜif(s||(s=H),n.size!=r.size&&!u)return!1;var b=a.get(n);if(b)return b==r;t|=xe,a.set(n,r);var l=In(s(n),s(r),t,f,i,a);return a.delete(n),l;case Ne:if(F)return F.call(n)==F.call(r)}return!1}var qe=1,Ye=Object.prototype,Ze=Ye.hasOwnProperty;function Xe(n,r,e,t,f,i){var a=e&qe,s=G(n),u=s.length,b=G(r),l=b.length;if(u!=l&&!a)return!1;for(var o=u;o--;){var c=s[o];if(!(a?c in r:Ze.call(r,c)))return!1}var h=i.get(n),A=i.get(r);if(h&&A)return h==r&&A==n;var y=!0;i.set(n,r),i.set(r,n);for(var d=a;++o<u;){c=s[o];var p=n[c],O=r[c];if(t)var Z=a?t(O,p,c,r,n,i):t(p,O,c,n,r,i);if(!(Z===void 0?p===O||f(p,O,e,t,i):Z)){y=!1;break}d||(d=c=="constructor")}if(y&&!d){var P=n.constructor,v=r.constructor;P!=v&&"constructor"in n&&"constructor"in r&&!(typeof P=="function"&&P instanceof P&&typeof v=="function"&&v instanceof v)&&(y=!1)}return i.delete(n),i.delete(r),y}var Je=1,tn="[object Arguments]",fn="[object Array]",L="[object Object]",Qe=Object.prototype,an=Qe.hasOwnProperty;function We(n,r,e,t,f,i){var a=T(n),s=T(r),u=a?fn:S(n),b=s?fn:S(r);u=u==tn?L:u,b=b==tn?L:b;var l=u==L,o=b==L,c=u==b;if(c&&D(n)){if(!D(r))return!1;a=!0,l=!1}if(c&&!l)return i||(i=new _),a||jn(n)?In(n,r,e,t,f,i):He(n,r,u,e,t,f,i);if(!(e&Je)){var h=l&&an.call(n,"__wrapped__"),A=o&&an.call(r,"__wrapped__");if(h||A){var y=h?n.value():n,d=A?r.value():r;return i||(i=new _),f(y,d,e,t,i)}}return c?(i||(i=new _),Xe(n,r,e,t,f,i)):!1}function q(n,r,e,t,f){return n===r?!0:n==null||r==null||!E(n)&&!E(r)?n!==n&&r!==r:We(n,r,e,t,q,f)}var ze=1,Ve=2;function ke(n,r,e,t){var f=e.length,i=f;if(n==null)return!i;for(n=Object(n);f--;){var a=e[f];if(a[2]?a[1]!==n[a[0]]:!(a[0]in n))return!1}for(;++f<i;){a=e[f];var s=a[0],u=n[s],b=a[1];if(a[2]){if(u===void 0&&!(s in n))return!1}else{var l=new _,o;if(!(o===void 0?q(b,u,ze|Ve,t,l):o))return!1}}return!0}function Pn(n){return n===n&&!ln(n)}function nt(n){for(var r=$(n),e=r.length;e--;){var t=r[e],f=n[t];r[e]=[t,f,Pn(f)]}return r}function vn(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function rt(n){var r=nt(n);return r.length==1&&r[0][2]?vn(r[0][0],r[0][1]):function(e){return e===n||ke(e,n,r)}}function et(n,r){return n!=null&&r in Object(n)}function tt(n,r,e){r=An(r,n);for(var t=-1,f=r.length,i=!1;++t<f;){var a=m(r[t]);if(!(i=n!=null&&e(n,a)))break;n=n[a]}return i||++t!=f?i:(f=n==null?0:n.length,!!f&&Hn(f)&&qn(a,f)&&(T(n)||un(n)))}function it(n,r){return n!=null&&tt(n,r,et)}var ft=1,at=2;function st(n,r){return N(n)&&Pn(r)?vn(m(n),r):function(e){var t=sr(e,n);return t===void 0&&t===r?it(e,n):q(r,t,ft|at)}}function ut(n){return function(r){return r==null?void 0:r[n]}}function ot(n){return function(r){return yn(r,n)}}function gt(n){return N(n)?ut(m(n)):ot(n)}function Ln(n){return typeof n=="function"?n:n==null?cn:typeof n=="object"?T(n)?st(n[0],n[1]):rt(n):gt(n)}function lt(n,r){return n&&Yn(n,r,$)}function ct(n,r){return function(e,t){if(e==null)return e;if(!sn(e))return n(e,t);for(var f=e.length,i=-1,a=Object(e);++i<f&&t(a[i],i,a)!==!1;);return e}}var Y=ct(lt);function bt(n){return typeof n=="function"?n:cn}function $t(n,r){var e=T(n)?pn:Y;return e(n,bt(r))}function dt(n,r){var e=[];return Y(n,function(t,f,i){r(t,f,i)&&e.push(t)}),e}function _t(n,r){var e=T(n)?Tn:dt;return e(n,Ln(r))}function pt(n,r){return bn(r,function(e){return n[e]})}function Et(n){return n==null?[]:pt(n,$(n))}function St(n){return n===void 0}function At(n,r,e,t,f){return f(n,function(i,a,s){e=t?(t=!1,i):r(e,i,a,s)}),e}function It(n,r,e){var t=T(n)?or:At,f=arguments.length<3;return t(n,Ln(r),e,f,Y)}var yt=1/0,Tt=C&&1/H(new C([,-0]))[1]==yt?function(n){return new C(n)}:Xn,ht=200;function Pt(n,r,e){var t=-1,f=Vn,i=n.length,a=!0,s=[],u=s;if(i>=ht){var b=r?null:Tt(n);if(b)return H(b);a=!1,f=Sn,u=new I}else u=r?[]:s;n:for(;++t<i;){var l=n[t],o=r?r(l):l;if(l=l!==0?l:0,a&&o===o){for(var c=u.length;c--;)if(u[c]===o)continue n;r&&u.push(o),s.push(l)}else f(u,o,e)||(u!==s&&u.push(o),s.push(l))}return s}export{Tn as A,dt as B,Ie as C,Xn as D,I as S,Pt as a,M as b,Ot as c,$t as d,U as e,_t as f,Ln as g,Jn as h,St as i,Y as j,$ as k,bn as l,tt as m,An as n,yn as o,bt as p,lt as q,It as r,it as s,m as t,ar as u,Et as v,Vn as w,Sn as x,zn as y,yr as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a0 as ln,a1 as an,a2 as y,a3 as tn,a4 as H,a5 as q,a6 as _,a7 as un,a8 as rn,a9 as L,aa as o,ab as B,ac as sn,ad as on,ae as fn}from"./index-
|
|
1
|
+
import{a0 as ln,a1 as an,a2 as y,a3 as tn,a4 as H,a5 as q,a6 as _,a7 as un,a8 as rn,a9 as L,aa as o,ab as B,ac as sn,ad as on,ae as fn}from"./index-DoeSN_Oe.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(fn(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,F=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<rn)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(on((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|