ploaness 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Herman Ciechanowiec
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 ADDED
@@ -0,0 +1,19 @@
1
+ # ploaness
2
+
3
+ An external, versioned quality harness for Payload CMS projects. Declare one dependency and inherit the whole contract.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add -D ploaness
9
+ pnpm ploaness init
10
+ pnpm ploaness verify
11
+ ```
12
+
13
+ ## Documentation
14
+
15
+ <https://github.com/ciechanowiec/ploaness#readme>
16
+
17
+ ## License
18
+
19
+ MIT. See the LICENSE file in this package.
@@ -0,0 +1,140 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.5.11/schema.json",
3
+ "root": false,
4
+ "formatter": {
5
+ "enabled": true,
6
+ "indentStyle": "space",
7
+ "indentWidth": 2,
8
+ "lineWidth": 100,
9
+ "lineEnding": "lf"
10
+ },
11
+ "css": {
12
+ "parser": {
13
+ "tailwindDirectives": true
14
+ }
15
+ },
16
+ "javascript": {
17
+ "formatter": {
18
+ "quoteStyle": "single",
19
+ "semicolons": "asNeeded",
20
+ "trailingCommas": "all"
21
+ }
22
+ },
23
+ "linter": {
24
+ "enabled": true,
25
+ "rules": {
26
+ "preset": "recommended",
27
+ "complexity": {
28
+ "noExcessiveCognitiveComplexity": {
29
+ "level": "error",
30
+ "options": {
31
+ "maxAllowedComplexity": 8
32
+ }
33
+ },
34
+ "useSimplifiedLogicExpression": "error",
35
+ "useLiteralKeys": "off",
36
+ "noCommaOperator": "error",
37
+ "noThisInStatic": "error"
38
+ },
39
+ "correctness": {
40
+ "noUnusedImports": "error",
41
+ "noUnusedVariables": "error",
42
+ "noUnusedFunctionParameters": "error",
43
+ "useImportExtensions": "off",
44
+ "noUndeclaredDependencies": "off",
45
+ "noUnresolvedImports": "off"
46
+ },
47
+ "style": {
48
+ "noNonNullAssertion": "error",
49
+ "noParameterAssign": "error",
50
+ "useConst": "error",
51
+ "useBlockStatements": "error",
52
+ "noImplicitBoolean": "error",
53
+ "useDefaultSwitchClause": "error",
54
+ "noDefaultExport": "off",
55
+ "useNamingConvention": {
56
+ "level": "error",
57
+ "options": {
58
+ "strictCase": false,
59
+ "conventions": [
60
+ {
61
+ "selector": {
62
+ "kind": "objectLiteralProperty"
63
+ },
64
+ "match": "_*(.+)",
65
+ "formats": [
66
+ "camelCase",
67
+ "CONSTANT_CASE",
68
+ "PascalCase"
69
+ ]
70
+ },
71
+ {
72
+ "selector": {
73
+ "kind": "typeProperty"
74
+ },
75
+ "match": "_*(.+)",
76
+ "formats": [
77
+ "camelCase",
78
+ "CONSTANT_CASE",
79
+ "PascalCase"
80
+ ]
81
+ }
82
+ ]
83
+ }
84
+ },
85
+ "useExplicitLengthCheck": "off",
86
+ "useComponentExportOnlyModules": "off",
87
+ "useCollapsedElseIf": "error",
88
+ "useConsistentArrayType": {
89
+ "level": "error",
90
+ "options": {
91
+ "syntax": "shorthand"
92
+ }
93
+ },
94
+ "useForOf": "error",
95
+ "useShorthandAssign": "error",
96
+ "noYodaExpression": "error",
97
+ "useThrowNewError": "error",
98
+ "useThrowOnlyError": "error",
99
+ "useNumberNamespace": "error",
100
+ "noEnum": "error"
101
+ },
102
+ "performance": {
103
+ "noBarrelFile": "off",
104
+ "noJsxPropsBind": "off"
105
+ },
106
+ "suspicious": {
107
+ "noDoubleEquals": "error",
108
+ "noExplicitAny": "error",
109
+ "noVar": "error",
110
+ "noConsole": {
111
+ "level": "error",
112
+ "options": {
113
+ "allow": [
114
+ "warn",
115
+ "error",
116
+ "info"
117
+ ]
118
+ }
119
+ },
120
+ "noEmptyBlockStatements": "error",
121
+ "noLeakedRender": "error"
122
+ },
123
+ "security": {
124
+ "noSecrets": "off"
125
+ },
126
+ "nursery": {
127
+ "preset": "recommended",
128
+ "noImpliedEval": "error"
129
+ }
130
+ }
131
+ },
132
+ "assist": {
133
+ "enabled": true,
134
+ "actions": {
135
+ "source": {
136
+ "organizeImports": "on"
137
+ }
138
+ }
139
+ }
140
+ }
package/biome.json ADDED
@@ -0,0 +1,145 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.5.11/schema.json",
3
+ "root": false,
4
+ "formatter": {
5
+ "enabled": true,
6
+ "indentStyle": "space",
7
+ "indentWidth": 2,
8
+ "lineWidth": 100,
9
+ "lineEnding": "lf"
10
+ },
11
+ "css": {
12
+ "parser": {
13
+ "tailwindDirectives": true
14
+ }
15
+ },
16
+ "javascript": {
17
+ "formatter": {
18
+ "quoteStyle": "single",
19
+ "semicolons": "asNeeded",
20
+ "trailingCommas": "all"
21
+ }
22
+ },
23
+ "linter": {
24
+ "enabled": true,
25
+ "rules": {
26
+ "preset": "recommended",
27
+ "complexity": {
28
+ "noExcessiveCognitiveComplexity": {
29
+ "level": "error",
30
+ "options": {
31
+ "maxAllowedComplexity": 8
32
+ }
33
+ },
34
+ "useSimplifiedLogicExpression": "error",
35
+ "useLiteralKeys": "off",
36
+ "noCommaOperator": "error",
37
+ "noThisInStatic": "error"
38
+ },
39
+ "correctness": {
40
+ "noUnusedImports": "error",
41
+ "noUnusedVariables": "error",
42
+ "noUnusedFunctionParameters": "error",
43
+ "useImportExtensions": "off",
44
+ "noUndeclaredDependencies": "off",
45
+ "noUnresolvedImports": "off"
46
+ },
47
+ "style": {
48
+ "noNonNullAssertion": "error",
49
+ "noParameterAssign": "error",
50
+ "useConst": "error",
51
+ "useBlockStatements": "error",
52
+ "noImplicitBoolean": "error",
53
+ "useDefaultSwitchClause": "error",
54
+ "noDefaultExport": "off",
55
+ "useNamingConvention": {
56
+ "level": "error",
57
+ "options": {
58
+ "strictCase": false,
59
+ "conventions": [
60
+ {
61
+ "selector": {
62
+ "kind": "objectLiteralProperty"
63
+ },
64
+ "match": "_*(.+)",
65
+ "formats": [
66
+ "camelCase",
67
+ "CONSTANT_CASE",
68
+ "PascalCase"
69
+ ]
70
+ },
71
+ {
72
+ "selector": {
73
+ "kind": "typeProperty"
74
+ },
75
+ "match": "_*(.+)",
76
+ "formats": [
77
+ "camelCase",
78
+ "CONSTANT_CASE",
79
+ "PascalCase"
80
+ ]
81
+ }
82
+ ]
83
+ }
84
+ },
85
+ "useExplicitLengthCheck": "off",
86
+ "useComponentExportOnlyModules": "off",
87
+ "useCollapsedElseIf": "error",
88
+ "useConsistentArrayType": {
89
+ "level": "error",
90
+ "options": {
91
+ "syntax": "shorthand"
92
+ }
93
+ },
94
+ "useForOf": "error",
95
+ "useShorthandAssign": "error",
96
+ "noYodaExpression": "error",
97
+ "useThrowNewError": "error",
98
+ "useThrowOnlyError": "error",
99
+ "useNumberNamespace": "error",
100
+ "noEnum": "error"
101
+ },
102
+ "performance": {
103
+ "noBarrelFile": "off",
104
+ "noJsxPropsBind": "off"
105
+ },
106
+ "suspicious": {
107
+ "noDoubleEquals": "error",
108
+ "noExplicitAny": "error",
109
+ "noVar": "error",
110
+ "noConsole": {
111
+ "level": "error",
112
+ "options": {
113
+ "allow": [
114
+ "warn",
115
+ "error",
116
+ "info"
117
+ ]
118
+ }
119
+ },
120
+ "noEmptyBlockStatements": "error",
121
+ "noLeakedRender": "error"
122
+ },
123
+ "security": {
124
+ "noSecrets": "off"
125
+ },
126
+ "nursery": {
127
+ "preset": "recommended",
128
+ "noImpliedEval": "error"
129
+ }
130
+ },
131
+ "domains": {
132
+ "react": "all",
133
+ "next": "all",
134
+ "project": "all"
135
+ }
136
+ },
137
+ "assist": {
138
+ "enabled": true,
139
+ "actions": {
140
+ "source": {
141
+ "organizeImports": "on"
142
+ }
143
+ }
144
+ }
145
+ }
package/dist/a11y.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { MAX_SWEEP_ROUTES, SKIPPED_ROUTE_PREFIXES } from '@ploaness/config/a11y';
2
+ //# sourceMappingURL=a11y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/a11y.js ADDED
@@ -0,0 +1,3 @@
1
+ // See eslint.js for why every entry point is re-exported through this package.
2
+ export { MAX_SWEEP_ROUTES, SKIPPED_ROUTE_PREFIXES } from '@ploaness/config/a11y';
3
+ //# sourceMappingURL=a11y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y.js","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { type AccessReport, PUBLIC_ACCESS, undeclaredGrants } from '@ploaness/config/access';
2
+ export type { PublicAccess } from '@ploaness/governance';
3
+ //# sourceMappingURL=access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.d.ts","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/access.js ADDED
@@ -0,0 +1,10 @@
1
+ // See eslint.ts for why every entry point is re-exported through this package.
2
+ //
3
+ // The TYPES are re-exported, not merely relied on for the constant's own type. A governed project must
4
+ // annotate, so a type the managed access-boundary sweep has to name is part of this entry point's
5
+ // surface rather than an implementation detail of it. Exporting only the constant left the sweep unable
6
+ // to name what it was given, and nothing here could see that: the asset-body check runs Biome, which
7
+ // carries no type information, and ploaness has no Payload application to compile the spec against. A
8
+ // consumer's `types` gate reported it first.
9
+ export { PUBLIC_ACCESS, undeclaredGrants } from '@ploaness/config/access';
10
+ //# sourceMappingURL=access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../src/access.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,uGAAuG;AACvG,kGAAkG;AAClG,wGAAwG;AACxG,qGAAqG;AACrG,sGAAsG;AACtG,6CAA6C;AAE7C,OAAO,EAAqB,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import '@ploaness/cli/bin';
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAGA,OAAO,mBAAmB,CAAA"}
package/dist/bin.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ // The `ploaness` command. The implementation lives in @ploaness/cli; this file exists so the executable
3
+ // is owned by the package a consumer actually declares.
4
+ import '@ploaness/cli/bin';
5
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,wGAAwG;AACxG,wDAAwD;AACxD,OAAO,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@ploaness/config/eslint-library';
2
+ //# sourceMappingURL=eslint-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint-library.d.ts","sourceRoot":"","sources":["../src/eslint-library.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,5 @@
1
+ // See eslint.js for why every entry point is re-exported through this package. This is the variant a
2
+ // member with no application receives: the same caps and bans, without the blocks keyed to paths only a
3
+ // Payload application has.
4
+ export { default } from '@ploaness/config/eslint-library';
5
+ //# sourceMappingURL=eslint-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint-library.js","sourceRoot":"","sources":["../src/eslint-library.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,wGAAwG;AACxG,2BAA2B;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@ploaness/config/eslint';
2
+ //# sourceMappingURL=eslint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/eslint.js ADDED
@@ -0,0 +1,5 @@
1
+ // Consumers reference `ploaness/eslint`, never `@ploaness/config` directly. Under the strict pnpm layout
2
+ // a scoped package that is only a transitive dependency is not resolvable from the consumer, so every
3
+ // consumer-facing entry point is re-exported from this package, which is the one they declare.
4
+ export { default } from '@ploaness/config/eslint';
5
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../src/eslint.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,sGAAsG;AACtG,+FAA+F;AAC/F,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@ploaness/config/playwright';
2
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,3 @@
1
+ // See eslint.js for why every entry point is re-exported through this package.
2
+ export { default } from '@ploaness/config/playwright';
3
+ //# sourceMappingURL=playwright.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.js","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { safeHref } from '@ploaness/governance';
2
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,7 @@
1
+ // See eslint.js for why every entry point is re-exported through this package.
2
+ //
3
+ // The home for generic runtime helpers a governed project calls, as opposed to the configs and checks
4
+ // the rest of these entry points carry. One entry rather than one per helper, so a second helper does
5
+ // not mean a second export map, a second shim, and a second line in three `files` arrays.
6
+ export { safeHref } from '@ploaness/governance';
7
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,sGAAsG;AACtG,sGAAsG;AACtG,0FAA0F;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@ploaness/config/vitest-library';
2
+ //# sourceMappingURL=vitest-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-library.d.ts","sourceRoot":"","sources":["../src/vitest-library.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,4 @@
1
+ // See eslint.js for why every entry point is re-exported through this package. The library variant runs
2
+ // in node with no React plugin, because a package with no browser has no DOM to simulate.
3
+ export { default } from '@ploaness/config/vitest-library';
4
+ //# sourceMappingURL=vitest-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-library.js","sourceRoot":"","sources":["../src/vitest-library.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,0FAA0F;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from '@ploaness/config/vitest';
2
+ //# sourceMappingURL=vitest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/vitest.js ADDED
@@ -0,0 +1,3 @@
1
+ // See eslint.js for why every entry point is re-exported through this package.
2
+ export { default } from '@ploaness/config/vitest';
3
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../src/vitest.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "ploaness",
3
+ "version": "1.0.0",
4
+ "description": "An external, versioned quality harness for Payload CMS projects. Declare one dependency and inherit the whole contract.",
5
+ "keywords": [
6
+ "payload",
7
+ "payloadcms",
8
+ "lint",
9
+ "quality",
10
+ "harness",
11
+ "governance"
12
+ ],
13
+ "license": "MIT",
14
+ "author": "Herman Ciechanowiec <herman@ciechanowiec.eu>",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/ciechanowiec/ploaness.git",
18
+ "directory": "packages/ploaness"
19
+ },
20
+ "homepage": "https://github.com/ciechanowiec/ploaness#readme",
21
+ "bugs": {
22
+ "url": "https://github.com/ciechanowiec/ploaness/issues"
23
+ },
24
+ "type": "module",
25
+ "exports": {
26
+ "./eslint": {
27
+ "types": "./dist/eslint.d.ts",
28
+ "default": "./dist/eslint.js"
29
+ },
30
+ "./vitest": {
31
+ "types": "./dist/vitest.d.ts",
32
+ "default": "./dist/vitest.js"
33
+ },
34
+ "./playwright": {
35
+ "types": "./dist/playwright.d.ts",
36
+ "default": "./dist/playwright.js"
37
+ },
38
+ "./a11y": {
39
+ "types": "./dist/a11y.d.ts",
40
+ "default": "./dist/a11y.js"
41
+ },
42
+ "./access": {
43
+ "types": "./dist/access.d.ts",
44
+ "default": "./dist/access.js"
45
+ },
46
+ "./biome": "./biome.json",
47
+ "./tsconfig": "./tsconfig.json",
48
+ "./package.json": "./package.json",
49
+ "./tsconfig.json": "./tsconfig.json",
50
+ "./runtime": {
51
+ "types": "./dist/runtime.d.ts",
52
+ "default": "./dist/runtime.js"
53
+ },
54
+ "./biome-core": "./biome-core.json",
55
+ "./tsconfig-core": "./tsconfig-core.json",
56
+ "./tsconfig-core.json": "./tsconfig-core.json",
57
+ "./eslint-library": {
58
+ "types": "./dist/eslint-library.d.ts",
59
+ "default": "./dist/eslint-library.js"
60
+ },
61
+ "./vitest-library": {
62
+ "types": "./dist/vitest-library.d.ts",
63
+ "default": "./dist/vitest-library.js"
64
+ }
65
+ },
66
+ "bin": {
67
+ "ploaness": "./dist/bin.js"
68
+ },
69
+ "files": [
70
+ "dist",
71
+ "biome.json",
72
+ "tsconfig.json",
73
+ "biome-core.json",
74
+ "tsconfig-core.json"
75
+ ],
76
+ "dependencies": {
77
+ "@ploaness/assets": "1.0.0",
78
+ "@ploaness/cli": "1.0.0",
79
+ "@ploaness/config": "1.0.0",
80
+ "@ploaness/governance": "1.0.0"
81
+ },
82
+ "engines": {
83
+ "node": ">=26"
84
+ },
85
+ "publishConfig": {
86
+ "access": "public"
87
+ },
88
+ "devDependencies": {
89
+ "@types/node": "26.4.0",
90
+ "typescript": "6.0.3"
91
+ },
92
+ "scripts": {
93
+ "build": "node build.ts && tsc --build tsconfig.build.json"
94
+ }
95
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "$comment": "Every compiler setting ploaness owns, with nothing that assumes a framework. The sibling tsconfig.json adds the Next language-service plugin and nothing else, so a member with no Next application inherits the identical strictness rather than a second copy of it that could drift.",
3
+ "$comment-types": "A member extending this one runs on node and nothing else - ploaness requires node 26 and ESM - so it is told so. Left unset, a tooling member could not compile `import { readFileSync } from 'node:fs'`: automatic @types discovery does not reach the package under pnpm's layout, and a Next member never noticed because next-env.d.ts pulls the node types in behind it. ploaness declares exactly this in every one of its own package tsconfigs and did not ship it.",
4
+ "compilerOptions": {
5
+ "types": [
6
+ "node"
7
+ ],
8
+ "lib": [
9
+ "DOM",
10
+ "DOM.Iterable",
11
+ "ES2022"
12
+ ],
13
+ "allowJs": true,
14
+ "skipLibCheck": true,
15
+ "strict": true,
16
+ "noEmit": true,
17
+ "esModuleInterop": true,
18
+ "module": "esnext",
19
+ "moduleResolution": "bundler",
20
+ "resolveJsonModule": true,
21
+ "isolatedModules": true,
22
+ "jsx": "react-jsx",
23
+ "incremental": true,
24
+ "noImplicitOverride": true,
25
+ "noFallthroughCasesInSwitch": true,
26
+ "noImplicitReturns": true,
27
+ "useUnknownInCatchVariables": true,
28
+ "allowUnreachableCode": false,
29
+ "allowUnusedLabels": false,
30
+ "forceConsistentCasingInFileNames": true,
31
+ "noUnusedLocals": true,
32
+ "noUnusedParameters": true,
33
+ "noUncheckedIndexedAccess": true,
34
+ "exactOptionalPropertyTypes": true,
35
+ "noPropertyAccessFromIndexSignature": true,
36
+ "noUncheckedSideEffectImports": true,
37
+ "verbatimModuleSyntax": true,
38
+ "target": "ES2022"
39
+ }
40
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "$comment": "The framework-shaped half: tsconfig-core.json carries the strictness, this adds what only a Next application needs.",
3
+ "$comment-types": "A member extending this one runs on node and nothing else - ploaness requires node 26 and ESM - so it is told so. Left unset, a tooling member could not compile `import { readFileSync } from 'node:fs'`: automatic @types discovery does not reach the package under pnpm's layout, and a Next member never noticed because next-env.d.ts pulls the node types in behind it. ploaness declares exactly this in every one of its own package tsconfigs and did not ship it.",
4
+ "compilerOptions": {
5
+ "types": [
6
+ "node"
7
+ ],
8
+ "lib": [
9
+ "DOM",
10
+ "DOM.Iterable",
11
+ "ES2022"
12
+ ],
13
+ "allowJs": true,
14
+ "skipLibCheck": true,
15
+ "strict": true,
16
+ "noEmit": true,
17
+ "esModuleInterop": true,
18
+ "module": "esnext",
19
+ "moduleResolution": "bundler",
20
+ "resolveJsonModule": true,
21
+ "isolatedModules": true,
22
+ "jsx": "react-jsx",
23
+ "incremental": true,
24
+ "noImplicitOverride": true,
25
+ "noFallthroughCasesInSwitch": true,
26
+ "noImplicitReturns": true,
27
+ "useUnknownInCatchVariables": true,
28
+ "allowUnreachableCode": false,
29
+ "allowUnusedLabels": false,
30
+ "forceConsistentCasingInFileNames": true,
31
+ "noUnusedLocals": true,
32
+ "noUnusedParameters": true,
33
+ "noUncheckedIndexedAccess": true,
34
+ "exactOptionalPropertyTypes": true,
35
+ "noPropertyAccessFromIndexSignature": true,
36
+ "noUncheckedSideEffectImports": true,
37
+ "verbatimModuleSyntax": true,
38
+ "target": "ES2022",
39
+ "plugins": [
40
+ {
41
+ "name": "next"
42
+ }
43
+ ]
44
+ }
45
+ }