@harnessed-ts/chai 0.0.0-stage → 0.6.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,32 @@
1
+ # @harnessed-ts/chai
2
+
3
+ ## 0.6.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [e324e94]
8
+ - @harnessed-ts/core@0.6.0
9
+
10
+ ## 0.5.0
11
+
12
+ ### Patch Changes
13
+
14
+ - @harnessed-ts/core@0.5.0
15
+
16
+ ## 0.4.0
17
+
18
+ ### Minor Changes
19
+
20
+ - 9666a3d: Two new assertion packages, both backed by core's one matcher implementation so the messages read the same under every runner:
21
+
22
+ - `@harnessed-ts/qunit`: `install(QUnit)` adds `assert.harness(x)` with `isAbsent`/`isPresent`, `isSelected`/`isNotSelected`, and `readsAs`/`doesNotReadAs`, reported through `pushResult`. For ember-qunit and any QUnit suite.
23
+ - `@harnessed-ts/chai`: `chai.use(harnessedChai)` adds `absent`, `selected`, and `readAs`, awaitable and negatable. For Mocha, ember-mocha, Cypress, and WebdriverIO under Mocha.
24
+
25
+ `harnessMatchers` results now carry `observed: { actual, expected }`, which the QUnit and Chai adapters report so their runners can show what was read.
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies [9666a3d]
30
+ - Updated dependencies [9666a3d]
31
+ - Updated dependencies [1823546]
32
+ - @harnessed-ts/core@0.4.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Joe Gaudet, Jay Seo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,28 @@
1
- # Temporary Holding Version
1
+ # @harnessed-ts/chai
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Chai assertions for [harnessed](https://github.com/joegaudet/harnessed#readme)
4
+ harnesses: Mocha, Cypress, WebdriverIO under Mocha — anything that
5
+ asserts through Chai.
6
+
7
+ ```ts
8
+ import * as chai from 'chai'
9
+ import { harnessedChai } from '@harnessed-ts/chai'
10
+ chai.use(harnessedChai)
11
+ ```
12
+
13
+ ```ts
14
+ await expect(banner).to.be.absent
15
+ await expect(card).not.to.be.selected
16
+ await expect(price).to.readAs(/^\$/)
17
+ ```
18
+
19
+ `absent`, `selected` and `readAs` take a target or a harness and return a
20
+ promise: reading the page goes through a driver, so **await every one** — an
21
+ un-awaited assertion cannot fail the test. `@typescript-eslint/no-floating-promises`
22
+ catches a missing `await`. `.not` negates as usual. The failure
23
+ messages are the same ones the Vitest, Playwright and QUnit assertions use.
24
+
25
+ Tested against Chai 6; it uses only the plugin API Chai has kept since 4.
26
+ A failure carries `actual` and `expected`, so Mocha and Cypress show a diff.
27
+
28
+ MIT © Joe Gaudet, Jay Seo
package/dist/index.cjs ADDED
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var core = require('@harnessed-ts/core');
4
+
5
+ // src/index.ts
6
+ function harnessedChai(chai, utils) {
7
+ const settle = async (assertion, run) => {
8
+ const negated = utils.flag(assertion, "negate") === true;
9
+ const result = await run(assertion._obj);
10
+ if (result.pass === negated) {
11
+ throw new chai.AssertionError(result.message(), {
12
+ actual: result.observed.actual,
13
+ expected: result.observed.expected,
14
+ showDiff: !negated
15
+ });
16
+ }
17
+ };
18
+ chai.Assertion.addProperty("absent", function() {
19
+ return settle(this, (subject) => core.harnessMatchers.toBeAbsent(subject));
20
+ });
21
+ chai.Assertion.addProperty("selected", function() {
22
+ return settle(this, (subject) => core.harnessMatchers.toBeSelected(subject));
23
+ });
24
+ chai.Assertion.addMethod("readAs", function(expected) {
25
+ return settle(this, (subject) => core.harnessMatchers.toReadAs(subject, expected));
26
+ });
27
+ }
28
+
29
+ exports.harnessedChai = harnessedChai;
30
+ //# sourceMappingURL=index.cjs.map
31
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["harnessMatchers"],"mappings":";;;;;AA4CO,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAwB;AACtE,EAAA,MAAM,MAAA,GAAS,OACb,SAAA,EACA,GAAA,KACkB;AAClB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA,KAAM,IAAA;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,IAAkB,CAAA;AAGrD,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAG3B,MAAA,MAAM,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,SAAQ,EAAG;AAAA,QAC9C,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,QACxB,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,QAC1B,UAAU,CAAC;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,QAAA,EAAU,WAAY;AAC/C,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAWA,oBAAA,CAAgB,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,UAAA,EAAY,WAAY;AACjD,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAWA,oBAAA,CAAgB,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EACtE,CAAC,CAAA;AAED,EAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,QAAA,EAAU,SAAU,QAAA,EAA2B;AACtE,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAWA,qBAAgB,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC5E,CAAC,CAAA;AACH","file":"index.cjs","sourcesContent":["import { harnessMatchers } from '@harnessed-ts/core'\nimport type { Assertable, MatcherResult } from '@harnessed-ts/core'\n\n/**\n * The structural slice of Chai a plugin is handed, so this package needs\n * neither Chai's runtime nor its types at build time — and works with Chai 4,\n * 5 and 6 alike.\n */\ninterface ChaiAssertionContext {\n _obj: unknown\n}\n\ninterface ChaiUtils {\n flag(assertion: ChaiAssertionContext, name: string): unknown\n}\n\ninterface ChaiStatic {\n Assertion: {\n addProperty(name: string, getter: (this: ChaiAssertionContext) => unknown): void\n addMethod(\n name: string,\n method: (this: ChaiAssertionContext, expected: string | RegExp) => unknown,\n ): void\n }\n AssertionError: new (message: string, props?: Record<string, unknown>) => Error\n}\n\n/**\n * Registers `absent`, `selected` and `readAs`:\n *\n * ```ts\n * import * as chai from 'chai'\n * import { harnessedChai } from '@harnessed-ts/chai'\n * chai.use(harnessedChai)\n *\n * await expect(banner).to.be.absent\n * await expect(card).not.to.be.selected\n * await expect(price).to.readAs(/^\\$/)\n * ```\n *\n * Each takes a target or a harness and returns a promise: reading the page goes\n * through a driver, so every one of them must be awaited. The failure messages\n * are core's, shared with the Vitest and Playwright matchers.\n */\nexport function harnessedChai(chai: ChaiStatic, utils: ChaiUtils): void {\n const settle = async (\n assertion: ChaiAssertionContext,\n run: (subject: Assertable) => Promise<MatcherResult>,\n ): Promise<void> => {\n const negated = utils.flag(assertion, 'negate') === true\n const result = await run(assertion._obj as Assertable)\n // A matcher's message already describes whichever way it went, so a\n // negated assertion that fails reads \"expected … not to …\" on its own.\n if (result.pass === negated) {\n // actual/expected let Mocha and Cypress show a diff. A failed negation has\n // nothing to diff — the values agreed, which was the problem.\n throw new chai.AssertionError(result.message(), {\n actual: result.observed.actual,\n expected: result.observed.expected,\n showDiff: !negated,\n })\n }\n }\n\n chai.Assertion.addProperty('absent', function () {\n return settle(this, subject => harnessMatchers.toBeAbsent(subject))\n })\n\n chai.Assertion.addProperty('selected', function () {\n return settle(this, subject => harnessMatchers.toBeSelected(subject))\n })\n\n chai.Assertion.addMethod('readAs', function (expected: string | RegExp) {\n return settle(this, subject => harnessMatchers.toReadAs(subject, expected))\n })\n}\n\ndeclare global {\n // Chai's augmentation point is this global namespace.\n namespace Chai {\n interface Assertion {\n /** Nothing matches. Await it. */\n readonly absent: Promise<void>\n /** `aria-pressed=\"true\"`. Await it. */\n readonly selected: Promise<void>\n /** The text equals a string or matches a pattern. Await it. */\n readAs(expected: string | RegExp): Promise<void>\n }\n }\n}\n"]}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The structural slice of Chai a plugin is handed, so this package needs
3
+ * neither Chai's runtime nor its types at build time — and works with Chai 4,
4
+ * 5 and 6 alike.
5
+ */
6
+ interface ChaiAssertionContext {
7
+ _obj: unknown;
8
+ }
9
+ interface ChaiUtils {
10
+ flag(assertion: ChaiAssertionContext, name: string): unknown;
11
+ }
12
+ interface ChaiStatic {
13
+ Assertion: {
14
+ addProperty(name: string, getter: (this: ChaiAssertionContext) => unknown): void;
15
+ addMethod(name: string, method: (this: ChaiAssertionContext, expected: string | RegExp) => unknown): void;
16
+ };
17
+ AssertionError: new (message: string, props?: Record<string, unknown>) => Error;
18
+ }
19
+ /**
20
+ * Registers `absent`, `selected` and `readAs`:
21
+ *
22
+ * ```ts
23
+ * import * as chai from 'chai'
24
+ * import { harnessedChai } from '@harnessed-ts/chai'
25
+ * chai.use(harnessedChai)
26
+ *
27
+ * await expect(banner).to.be.absent
28
+ * await expect(card).not.to.be.selected
29
+ * await expect(price).to.readAs(/^\$/)
30
+ * ```
31
+ *
32
+ * Each takes a target or a harness and returns a promise: reading the page goes
33
+ * through a driver, so every one of them must be awaited. The failure messages
34
+ * are core's, shared with the Vitest and Playwright matchers.
35
+ */
36
+ export declare function harnessedChai(chai: ChaiStatic, utils: ChaiUtils): void;
37
+ declare global {
38
+ namespace Chai {
39
+ interface Assertion {
40
+ /** Nothing matches. Await it. */
41
+ readonly absent: Promise<void>;
42
+ /** `aria-pressed="true"`. Await it. */
43
+ readonly selected: Promise<void>;
44
+ /** The text equals a string or matches a pattern. Await it. */
45
+ readAs(expected: string | RegExp): Promise<void>;
46
+ }
47
+ }
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,UAAU,oBAAoB;IAC5B,IAAI,EAAE,OAAO,CAAA;CACd;AAED,UAAU,SAAS;IACjB,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC7D;AAED,UAAU,UAAU;IAClB,SAAS,EAAE;QACT,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,OAAO,GAAG,IAAI,CAAA;QAChF,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,GACzE,IAAI,CAAA;KACR,CAAA;IACD,cAAc,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,CAAA;CAChF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CA+BtE;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,IAAI,CAAC;QACb,UAAU,SAAS;YACjB,iCAAiC;YACjC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAC9B,uCAAuC;YACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAChC,+DAA+D;YAC/D,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;SACjD;KACF;CACF"}
package/dist/index.js ADDED
@@ -0,0 +1,29 @@
1
+ import { harnessMatchers } from '@harnessed-ts/core';
2
+
3
+ // src/index.ts
4
+ function harnessedChai(chai, utils) {
5
+ const settle = async (assertion, run) => {
6
+ const negated = utils.flag(assertion, "negate") === true;
7
+ const result = await run(assertion._obj);
8
+ if (result.pass === negated) {
9
+ throw new chai.AssertionError(result.message(), {
10
+ actual: result.observed.actual,
11
+ expected: result.observed.expected,
12
+ showDiff: !negated
13
+ });
14
+ }
15
+ };
16
+ chai.Assertion.addProperty("absent", function() {
17
+ return settle(this, (subject) => harnessMatchers.toBeAbsent(subject));
18
+ });
19
+ chai.Assertion.addProperty("selected", function() {
20
+ return settle(this, (subject) => harnessMatchers.toBeSelected(subject));
21
+ });
22
+ chai.Assertion.addMethod("readAs", function(expected) {
23
+ return settle(this, (subject) => harnessMatchers.toReadAs(subject, expected));
24
+ });
25
+ }
26
+
27
+ export { harnessedChai };
28
+ //# sourceMappingURL=index.js.map
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;AA4CO,SAAS,aAAA,CAAc,MAAkB,KAAA,EAAwB;AACtE,EAAA,MAAM,MAAA,GAAS,OACb,SAAA,EACA,GAAA,KACkB;AAClB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA,KAAM,IAAA;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,SAAA,CAAU,IAAkB,CAAA;AAGrD,IAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AAG3B,MAAA,MAAM,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,SAAQ,EAAG;AAAA,QAC9C,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,QACxB,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,QAC1B,UAAU,CAAC;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,QAAA,EAAU,WAAY;AAC/C,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAW,eAAA,CAAgB,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EACpE,CAAC,CAAA;AAED,EAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,UAAA,EAAY,WAAY;AACjD,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAW,eAAA,CAAgB,YAAA,CAAa,OAAO,CAAC,CAAA;AAAA,EACtE,CAAC,CAAA;AAED,EAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,QAAA,EAAU,SAAU,QAAA,EAA2B;AACtE,IAAA,OAAO,OAAO,IAAA,EAAM,CAAA,OAAA,KAAW,gBAAgB,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AAAA,EAC5E,CAAC,CAAA;AACH","file":"index.js","sourcesContent":["import { harnessMatchers } from '@harnessed-ts/core'\nimport type { Assertable, MatcherResult } from '@harnessed-ts/core'\n\n/**\n * The structural slice of Chai a plugin is handed, so this package needs\n * neither Chai's runtime nor its types at build time — and works with Chai 4,\n * 5 and 6 alike.\n */\ninterface ChaiAssertionContext {\n _obj: unknown\n}\n\ninterface ChaiUtils {\n flag(assertion: ChaiAssertionContext, name: string): unknown\n}\n\ninterface ChaiStatic {\n Assertion: {\n addProperty(name: string, getter: (this: ChaiAssertionContext) => unknown): void\n addMethod(\n name: string,\n method: (this: ChaiAssertionContext, expected: string | RegExp) => unknown,\n ): void\n }\n AssertionError: new (message: string, props?: Record<string, unknown>) => Error\n}\n\n/**\n * Registers `absent`, `selected` and `readAs`:\n *\n * ```ts\n * import * as chai from 'chai'\n * import { harnessedChai } from '@harnessed-ts/chai'\n * chai.use(harnessedChai)\n *\n * await expect(banner).to.be.absent\n * await expect(card).not.to.be.selected\n * await expect(price).to.readAs(/^\\$/)\n * ```\n *\n * Each takes a target or a harness and returns a promise: reading the page goes\n * through a driver, so every one of them must be awaited. The failure messages\n * are core's, shared with the Vitest and Playwright matchers.\n */\nexport function harnessedChai(chai: ChaiStatic, utils: ChaiUtils): void {\n const settle = async (\n assertion: ChaiAssertionContext,\n run: (subject: Assertable) => Promise<MatcherResult>,\n ): Promise<void> => {\n const negated = utils.flag(assertion, 'negate') === true\n const result = await run(assertion._obj as Assertable)\n // A matcher's message already describes whichever way it went, so a\n // negated assertion that fails reads \"expected … not to …\" on its own.\n if (result.pass === negated) {\n // actual/expected let Mocha and Cypress show a diff. A failed negation has\n // nothing to diff — the values agreed, which was the problem.\n throw new chai.AssertionError(result.message(), {\n actual: result.observed.actual,\n expected: result.observed.expected,\n showDiff: !negated,\n })\n }\n }\n\n chai.Assertion.addProperty('absent', function () {\n return settle(this, subject => harnessMatchers.toBeAbsent(subject))\n })\n\n chai.Assertion.addProperty('selected', function () {\n return settle(this, subject => harnessMatchers.toBeSelected(subject))\n })\n\n chai.Assertion.addMethod('readAs', function (expected: string | RegExp) {\n return settle(this, subject => harnessMatchers.toReadAs(subject, expected))\n })\n}\n\ndeclare global {\n // Chai's augmentation point is this global namespace.\n namespace Chai {\n interface Assertion {\n /** Nothing matches. Await it. */\n readonly absent: Promise<void>\n /** `aria-pressed=\"true\"`. Await it. */\n readonly selected: Promise<void>\n /** The text equals a string or matches a pattern. Await it. */\n readAs(expected: string | RegExp): Promise<void>\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,74 @@
1
1
  {
2
2
  "name": "@harnessed-ts/chai",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.6.0",
4
+ "description": "Chai assertions for harnesses: `await expect(banner).to.be.absent` under Mocha, WebdriverIO or Cypress.",
5
+ "keywords": [
6
+ "testing",
7
+ "harness",
8
+ "chai",
9
+ "mocha",
10
+ "bdd"
11
+ ],
12
+ "license": "MIT",
13
+ "contributors": [
14
+ {
15
+ "name": "Joe Gaudet",
16
+ "url": "https://github.com/joegaudet"
17
+ },
18
+ {
19
+ "name": "Jay Seo",
20
+ "url": "https://github.com/jayseo5953"
21
+ }
22
+ ],
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/joegaudet/harnessed.git",
26
+ "directory": "packages/chai"
27
+ },
28
+ "homepage": "https://github.com/joegaudet/harnessed#readme",
29
+ "bugs": "https://github.com/joegaudet/harnessed/issues",
30
+ "type": "module",
31
+ "main": "./dist/index.cjs",
32
+ "module": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js",
38
+ "require": "./dist/index.cjs"
39
+ },
40
+ "./package.json": "./package.json"
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "CHANGELOG.md",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "engines": {
49
+ "node": ">=22.12.0"
50
+ },
51
+ "dependencies": {
52
+ "@harnessed-ts/core": "^0.6.0"
53
+ },
54
+ "peerDependencies": {
55
+ "chai": ">=4"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public"
59
+ },
60
+ "devDependencies": {
61
+ "@harnessed-ts/dom": "^0.6.0",
62
+ "@testing-library/dom": "^10.4.2",
63
+ "@testing-library/user-event": "^14.6.7",
64
+ "@types/chai": "^5.2.3",
65
+ "chai": "^6.3.0",
66
+ "jsdom": "^30.1.1",
67
+ "vitest": "^5.0.3"
68
+ },
69
+ "scripts": {
70
+ "build": "tsup",
71
+ "clean": "rm -rf dist *.tsbuildinfo",
72
+ "test": "vitest run"
73
+ }
6
74
  }