Skip to content

Commit 4261169

Browse files
refactor(core)!: retire 42 zero-consumer entry exports (#30708)
<!-- claude-projects-attribution: {"github_login":"os-sales"} --> _Requested by **Sales** · [project thread](https://claude.ai/code/project/chan_01D5bWFY3rFzgJcytD5gD4Uu?thread=cmsg_01D5bWFY3rFzgJcytD5gD4Uu3DovMYxyWDWaMXs3JX16Av)_ Part of #25921. The umbrella stays open; this is barrel batch 5, claim 6670047779 (seat `domain:ui#6`, batch amendment from the seat after the census). Earlier batches: #30541, #30576, #30629, #30650. Clause-②: no (narrowing) Metadata-protocol: none ## 维护者速读 - 改了什么:`@object-ui/core` 的包入口不再导出 42 个名字,其中 `buildQueryAST` 与它包装的 `defaultQueryASTBuilder` 连同代码一起删掉,其余 40 个只离开入口、模块照旧。 - 为什么改:这 42 个名字在仓内(包外,含测试与文档)与 hotcrm 均零引用,README 未教,也不被保留导出的签名用到;被删的 2 个在包内也零读者,是死代码。本卡逐包收窄无人使用的公开导出。 - 风险与回滚:对外是 breaking 收窄,只影响直接从包入口 import 这些名字的外部宿主;控制台与所有 `@object-ui/*` 包不受影响。入口与内部子 barrel 的 `export *` 改成了具名列表,反向探针证明其余 476 个名字一个不少。回滚即 revert 本 PR。 - 先看:`ui/packages/core/src/index.ts`(11 处 `export *` 改具名列表,漏列即丢活名)、`ui/packages/core/src/actions/index.ts` 与 `evaluator/index.ts`(子 barrel 同类改写)、`.changeset/25921-core-zero-consumer-exports.md`(迁移说明)。 - 两分钟验证:`git grep -l -w -e buildQueryAST -e defaultQueryASTBuilder -e KNOWN_ACTION_KEYS -e isDebugEnabled -- ':!ui/packages/core' ':!**/CHANGELOG.md'` 应只命中本 PR 的 changeset。 - 需要你做的:无,席位落地。 ## What changes - `@object-ui/core`, deleted (nothing inside the package read them either): `buildQueryAST` and the `defaultQueryASTBuilder` instance it wrapped, from `src/query/query-ast.ts`. Both were re-grepped on the new head: the only hits left are this PR's changeset. - `@object-ui/core`, off the entry only (each module keeps its in-package readers): - `utils/column-identity`: `CANONICAL_COLUMN_IDENTITY_KEY`, `LEGACY_COLUMN_IDENTITY_KEYS`, `normalizeColumnIdentities`, `CANONICAL_COLUMN_LABEL_KEY` (dropped from the existing named list); - `utils/dom-props`: `isOpenDomAttributeFamily`; `utils/affordanceGrants`: type `AffordanceGrantRow`; `utils/column-sortability`: `normalizeObjectSortability`, `OBJECT_SORTABILITY_KEY`; `utils/action-activation`: `ACTION_SWITCHED_OFF_KEY`; `utils/cascade-delete-objects`: `CASCADE_DELETE_OBJECTS_KEY`; `utils/sort-values`: `compareCellValues`; `errors/index`: `isErrorCode`, `formatErrorMessage`; `utils/debug`: `isDebugEnabled`; `utils/filter-tokens`: type `ContextTokenName`; `utils/chart-series`: `isBuiltinAggregate`, `resolveMeasureLabel`, `resolveRelationshipTarget`, `resolveDimensionFieldOptions`, `INTEGER_AGGREGATES`; `utils/record-color`: `isColorLiteral`, `buildFieldColorMap`, type `FieldColorOption`. Those eleven `export *` lines in `src/index.ts` become named lists of their kept exports; - through the unpublished sub-barrels (`exports` has only `.`): `evaluator/index.ts` (`SUBJECT_PERMISSIONS`, `SUBJECT_CAPABILITIES`, `ROW_PREDICATE_CANONICAL_ROOT`; two `export *` lines become named lists), `actions/index.ts` (`NAVIGATION_ALIAS_KEYS`, `HOST_DISPATCH_ACTION_KEYS`, `KNOWN_ACTION_KEYS`, `classifyActionKeys`, `hasDeprecatedObjectParams`, `warnOnDeprecatedObjectParams` leave the `actionKeys` list; `isLegacyActionEnvelope`, `actionCopyText`, `fillTransitionalCopy` leave two `export *` lines turned named), `theme/index.ts` (`toCSSColor`, `generateTypographyVars`, `generateBorderRadiusVars`, `generateShadowVars`), `data-scope/index.ts` (`isElementDataSourceBlock`). - Named lists were built from the TypeScript checker's export list. The first cut missed five names two modules re-export from `@objectstack/spec` (`CONTEXT_TOKENS` through `utils/filter-tokens`; `FIELD_UNSORTABLE_VIRTUAL_TYPE`, `FIELD_SORTABLE_UNPROVISIONED_ANCHOR`, `FieldSortability`, `ObjectSortability` through `utils/column-sortability`); the reverse probe caught them and the second commit puts them back. - One test moves: `evaluator/__tests__/rowPredicateCanon.test.ts` imported `ROW_PREDICATE_CANONICAL_ROOT` from the evaluator barrel; it now imports the module and asserts the constant is off the barrel, beside the detector that stays. - One new changeset, `.changeset/25921-core-zero-consumer-exports.md`: patch level, `!` title, BREAKING paragraph that says which names are gone from the package and which only left the entry, FROM/TO lines for every retired name, ADR-0087 marker `not-required (runtime-export-retired …)` naming all 42 operands. ## Why Card #25921 narrows `ui/packages` barrels to names someone imports. The checker export list after this PR is exactly the census list minus these 42 (518 to 476), nothing added. ## Tests Census on `origin/main` 66a8822 with the method of batches 1 to 4: entry export names from the TypeScript checker over the built `dist/index.d.ts`; per name `git grep -l -w -F` outside the package, minus `**/CHANGELOG.md`, `pnpm-lock.yaml` and `.changeset/**` (test files and prose count), each zero re-run one name at a time; the package `*.md` and `demo/`; keep rule 3 (reached from a kept export's emitted declaration, walked through non-exported local declarations too, to a fixpoint); hotcrm `6961ab1`. Full table: project file `issue-25921-seat6/census-b5.md`. | Package | Entry names | Zero outside hits | Kept (README, rule 3, or seat ruling) | Retired | |:--|--:|--:|--:|--:| | `@object-ui/core` | 518 | 116 | 74 (2 README, 67 rule 3, 5 by seat ruling) | 42 | Kept by seat ruling, zero hits notwithstanding: `defaultObjectValidationEngine` (`validation/validators/index.ts` states the deprecated engine stays exported for host applications), and `SchemaError`, `RegistryError`, `ExpressionError`, `PluginError` (returned by the kept `createError`; a caller needs them for `instanceof`). Controls (outside hits, same module as the retired names): `toDomProps` 111, `columnIdentity` 36, `buildChartSeries` 34, `resolveAffordance` 33, `elementDataSourceBlock` 37, `resolveFilterPlaceholders` 40, `isActionSwitchedOff` 15, `FieldValidationError` 11, `attachObjectSortability` 8, `getSortValue` 6, `interpretActionResponse` 6, `createFieldColorResolver` 6, `RETIRED_ACTION_KEYS` 5, `actionCopySource` 4, `QueryASTBuilder` 3, `subjectPermissionsOf` 3, `detectNonCanonicalRowSpelling` 3, `parseDebugFlags` 3, `attachCascadeDeleteObjects` 3, `hexToHSL` 2; hotcrm imports no `@object-ui/core` code but names it in prose (`ActionRunner` 2 files). Readings at dea2c4b (branch head after merging `origin/main` a2437b5; the same set first ran green at c21d361 before the merge): <details><summary>Build, type-check, package tests</summary> - `turbo run build --filter=@object-ui/console... --filter='./packages/**' --filter='@objectstack/dogfood^...'`: 113 of 113 successful, under `os-verify-lock`, VERDICT command-exit 0. - `pnpm --filter @object-ui/core type-check` (`tsc --noEmit && tsc -p tsconfig.test.json`): exit 0. - `pnpm --filter @object-ui/core test`: Test Files 233 passed (233), Tests 4376 passed, 27 skipped (4403), exit 0. </details> <details><summary>Reverse check over every former entry name</summary> A temporary `app-shell` probe re-exporting ALL 518 base entry names of `@object-ui/core` (types as `type`), `tsc --noEmit` in `ui/packages/app-shell` against the rebuilt `dist/index.d.ts`: exactly 42 errors (`TS2305` 27, `TS2724` 15, all in the probe), and the set of names they name is identical (`diff`) to the 42 retired names; the other 476 resolve. On the first cut the probe answered 47: it caught the five spec re-exports the named lists had dropped, fixed in the second commit. Probe deleted; `git status` clean. </details> <details><summary>Gates</summary> - `node scripts/pm/dispatch-gates.mjs --commands`: 35 derived families, each run with its exit code captured before any pipe, all exit 0 (among them `check-adr-0087-registration --base origin/main`, `check-changeset-no-major`, `check-empty-changeset`, `check-closing-keyword-parity`, `check-comment-mask-corpus`, `check-sdui-manifest`, `check:published-files`, `check:type-check-coverage`, `check:type-check-debt`, `check:undeclared-dep-imports`, and `vitest run scripts/` in `ui/`: Test Files 170 passed, 2 skipped (172), Tests 4970 passed, 2 skipped (4972)). - `dispatch-gates --ran`: 35 derived, 35 run, 0 NOT-MEASURED (a derived zero: all 35 recorded an exit code). - `node scripts/check-platform-checklist.mjs --changed-from origin/main`: exit 0, 0 anchored files in the change set. </details> <details><summary>Dogfood (narrowing arm)</summary> `pnpm --filter @objectstack/dogfood test` under `os-verify-lock` on dea2c4b: VERDICT command-exit 0; Test Files 421 passed, 3 skipped (424); Tests 3513 passed, 36 skipped (3549); no failures. </details> Deleted names re-grepped on dea2c4b: `buildQueryAST` and `defaultQueryASTBuilder` appear only in this PR's changeset. No ablation: export lines and two dead declarations only. ## Acceptance notes - Nothing outside the card's surface was found. ## Verification Reviewer: `git grep -l -w -e buildQueryAST -e defaultQueryASTBuilder -- ':!**/CHANGELOG.md'` answers only this PR's changeset; the CI `Type Check UI` lane compiles every `@object-ui/*` consumer against the narrowed entry. --- _Generated by [Claude Code](https://claude.ai/code/session_01L6bhgXepjCvAfm5dmHYdrX)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 89dbc74 commit 4261169

8 files changed

Lines changed: 238 additions & 39 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
---
2+
'@object-ui/core': patch
3+
---
4+
5+
refactor(core)!: retire forty-two zero-consumer entry exports, and delete the query-AST convenience pair nothing reads
6+
7+
Clause-②: no (narrowing)
8+
Metadata-protocol: none
9+
10+
<!-- adr-0087: not-required (runtime-export-retired @object-ui/core#buildQueryAST, @object-ui/core#defaultQueryASTBuilder, @object-ui/core#CANONICAL_COLUMN_IDENTITY_KEY, @object-ui/core#LEGACY_COLUMN_IDENTITY_KEYS, @object-ui/core#normalizeColumnIdentities, @object-ui/core#CANONICAL_COLUMN_LABEL_KEY, @object-ui/core#isOpenDomAttributeFamily, @object-ui/core#AffordanceGrantRow, @object-ui/core#normalizeObjectSortability, @object-ui/core#OBJECT_SORTABILITY_KEY, @object-ui/core#ACTION_SWITCHED_OFF_KEY, @object-ui/core#CASCADE_DELETE_OBJECTS_KEY, @object-ui/core#compareCellValues, @object-ui/core#SUBJECT_PERMISSIONS, @object-ui/core#SUBJECT_CAPABILITIES, @object-ui/core#ROW_PREDICATE_CANONICAL_ROOT, @object-ui/core#NAVIGATION_ALIAS_KEYS, @object-ui/core#HOST_DISPATCH_ACTION_KEYS, @object-ui/core#KNOWN_ACTION_KEYS, @object-ui/core#classifyActionKeys, @object-ui/core#hasDeprecatedObjectParams, @object-ui/core#warnOnDeprecatedObjectParams, @object-ui/core#isLegacyActionEnvelope, @object-ui/core#actionCopyText, @object-ui/core#fillTransitionalCopy, @object-ui/core#toCSSColor, @object-ui/core#generateTypographyVars, @object-ui/core#generateBorderRadiusVars, @object-ui/core#generateShadowVars, @object-ui/core#isElementDataSourceBlock, @object-ui/core#isErrorCode, @object-ui/core#formatErrorMessage, @object-ui/core#isDebugEnabled, @object-ui/core#ContextTokenName, @object-ui/core#isBuiltinAggregate, @object-ui/core#resolveMeasureLabel, @object-ui/core#resolveRelationshipTarget, @object-ui/core#resolveDimensionFieldOptions, @object-ui/core#INTEGER_AGGREGATES, @object-ui/core#isColorLiteral, @object-ui/core#buildFieldColorMap, @object-ui/core#FieldColorOption) the retired operands are client-side helpers, constants, symbol keys and three types of the UI core package; nothing in the workspace or in hotcrm imports any of them from the package entry, and no packages/spec schema, registered node type, conversion surface or stored shape names them, so there is nothing for `objectstack migrate meta` to rewrite -->
11+
12+
**BREAKING** for a host that imports any of these forty-two names from `@object-ui/core`. None had an importer anywhere in the workspace or in hotcrm, so the Console and every `@object-ui/*` package are unaffected.
13+
14+
Two of them are **gone from the package, not only from the entry**, because nothing inside the package read them either: `buildQueryAST` and the `defaultQueryASTBuilder` instance it wrapped are deleted from `query/query-ast.ts`.
15+
16+
The other forty stay in their modules for the code and tests that read them and only leave the entry. Every other name the entry exported stays exported unchanged, among them `QueryASTBuilder`, `columnIdentity`, `columnHeader`, `normalizeColumnIdentity`, `toDomProps`, `pickDomProps`, `AFFORDANCE_GRANTS`, `attachObjectSortability`, `readObjectSortability`, `markSwitchedOffActions`, `isActionSwitchedOff`, `attachCascadeDeleteObjects`, `readCascadeDeleteObjects`, `getSortValue`, `compareSortValues`, `bindSubjectPermissions`, `subjectPermissionsOf`, `bindSubjectCapabilities`, `subjectCapabilitiesOf`, `detectNonCanonicalRowSpelling`, `ACTION_DEF_KEYS`, `SPEC_ACTION_KEYS`, `RETIRED_ACTION_KEYS`, `warnOnUnknownActionKeys`, `interpretActionResponse`, `readActionPayload`, `actionCopySource`, `fillTemplateHoles`, `generateThemeVars`, `generateColorVars`, `elementDataSourceBlock`, `ERROR_CODES`, `createError`, `ObjectUIError` with all its subclasses, `debugLog`, `parseDebugFlags`, `CONTEXT_TOKENS`, `resolveFilterPlaceholders`, `buildChartSeries`, `isIntegerAggregate`, `resolveDimensionFieldMeta` and `createFieldColorResolver`.
17+
18+
What leaves, and what to write instead:
19+
20+
- FROM `buildQueryAST(query)`, `defaultQueryASTBuilder` TO `new QueryASTBuilder().build(query)`.
21+
- FROM `CANONICAL_COLUMN_IDENTITY_KEY`, `LEGACY_COLUMN_IDENTITY_KEYS`, `CANONICAL_COLUMN_LABEL_KEY` TO `columnIdentity(column)` / `columnHeader(column)`, which read the canonical key and its legacy spellings; FROM `normalizeColumnIdentities(columns)` TO `columns.map(normalizeColumnIdentity)`.
22+
- FROM `isOpenDomAttributeFamily` TO `toDomProps` / `pickDomProps`, which already pass every `data-*` and `aria-*` key.
23+
- FROM `AffordanceGrantRow` TO `AffordanceGrant`, or `(typeof AFFORDANCE_GRANTS)[ConsoleAffordance]` for one row.
24+
- FROM `normalizeObjectSortability`, `OBJECT_SORTABILITY_KEY` TO `attachObjectSortability` / `readObjectSortability`.
25+
- FROM `ACTION_SWITCHED_OFF_KEY` TO `markSwitchedOffActions` / `markSwitchedOffActionsByObject` / `isActionSwitchedOff`.
26+
- FROM `CASCADE_DELETE_OBJECTS_KEY` TO `attachCascadeDeleteObjects` / `readCascadeDeleteObjects`.
27+
- FROM `compareCellValues(a, b, options)` TO `compareSortValues(getSortValue(a, options), getSortValue(b, options))`.
28+
- FROM `SUBJECT_PERMISSIONS`, `SUBJECT_CAPABILITIES` TO `bindSubjectPermissions` / `subjectPermissionsOf` and `bindSubjectCapabilities` / `subjectCapabilitiesOf`.
29+
- FROM `ROW_PREDICATE_CANONICAL_ROOT` TO the literal `'record'`, or `detectNonCanonicalRowSpelling` to check a predicate.
30+
- FROM `NAVIGATION_ALIAS_KEYS`, `HOST_DISPATCH_ACTION_KEYS`, `KNOWN_ACTION_KEYS`, `classifyActionKeys` TO `warnOnUnknownActionKeys`, which classifies an action against the same vocabulary, or `ACTION_DEF_KEYS` / `SPEC_ACTION_KEYS` for the authored key lists.
31+
- FROM `hasDeprecatedObjectParams`, `warnOnDeprecatedObjectParams` TO nothing: `ActionRunner` warns about deprecated object params itself when it runs the action.
32+
- FROM `isLegacyActionEnvelope` TO `interpretActionResponse` / `readActionPayload`, which unwrap the legacy envelope.
33+
- FROM `actionCopyText`, `fillTransitionalCopy` TO `actionCopySource` with `hasTemplateHoles` / `fillTemplateHoles`.
34+
- FROM `toCSSColor`, `generateTypographyVars`, `generateBorderRadiusVars`, `generateShadowVars` TO `generateThemeVars(theme)`, which emits all of those variables, or `generateColorVars` for the colour block alone.
35+
- FROM `isElementDataSourceBlock` TO nothing a host needs: the component registry reads it when `elementDataSourceBlock` marks a renderer.
36+
- FROM `isErrorCode(code)` TO `code in ERROR_CODES`; FROM `formatErrorMessage(error)` TO `error.message` with `ERROR_CODES[error.code]` for the suggestion and doc link.
37+
- FROM `isDebugEnabled` TO `debugLog` / `debugTime`, which are no-ops when debug mode is off.
38+
- FROM `ContextTokenName` TO `(typeof CONTEXT_TOKENS)[number]`.
39+
- FROM `isBuiltinAggregate`, `resolveMeasureLabel` TO `buildChartSeries` with `builtinAggregateLabels`, which labels a built-in aggregate measure the same way; FROM `INTEGER_AGGREGATES` TO `isIntegerAggregate`.
40+
- FROM `resolveDimensionFieldOptions(...)` TO `resolveDimensionFieldMeta(...)`, the same walk, reading each entry's `options`; FROM `resolveRelationshipTarget` TO `resolveDimensionFieldMeta`, which follows the relationship for a dotted path.
41+
- FROM `isColorLiteral`, `buildFieldColorMap`, `FieldColorOption` TO `createFieldColorResolver(fieldDef)`, which builds the colour map and accepts colour literals as-is.

‎ui/packages/core/src/actions/index.ts‎

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,38 @@ export * from './ActionEngine.js';
1111
export {
1212
ACTION_DEF_KEYS,
1313
SPEC_ACTION_KEYS,
14-
NAVIGATION_ALIAS_KEYS,
15-
HOST_DISPATCH_ACTION_KEYS,
1614
RETIRED_ACTION_KEYS,
17-
KNOWN_ACTION_KEYS,
18-
classifyActionKeys,
1915
warnOnUnknownActionKeys,
20-
hasDeprecatedObjectParams,
21-
warnOnDeprecatedObjectParams,
22-
// `resetActionKeyWarnings` is test-only and stays off the barrel
16+
// `resetActionKeyWarnings` is test-only and stays off the barrel;
17+
// `NAVIGATION_ALIAS_KEYS`, `HOST_DISPATCH_ACTION_KEYS`, `KNOWN_ACTION_KEYS`,
18+
// `classifyActionKeys`, `hasDeprecatedObjectParams` and
19+
// `warnOnDeprecatedObjectParams` stay in the module for `ActionRunner` and
20+
// its pins, off the public entry (objectstack#25921: zero consumers)
2321
} from './actionKeys.js';
2422
export * from './TransactionManager.js';
2523
export * from './UndoManager.js';
2624
export * from './bulkFastPath.js';
2725
export * from './actionErrorDetail.js';
28-
export * from './actionResponse.js';
26+
// Named, not `export *`: `isLegacyActionEnvelope` stays in the module for its
27+
// in-package readers and off the public entry (objectstack#25921: zero
28+
// consumers).
29+
export {
30+
readActionPayload,
31+
interpretActionResponse,
32+
refusalFieldErrors,
33+
type ActionResponseOutcome,
34+
} from './actionResponse.js';
2935
export * from './serverActionHandler.js';
3036
export * from './recordIdParam.js';
3137
export * from './recordDelete.js';
3238
export * from './navigationTarget.js';
33-
export * from './actionCopyTemplate.js';
39+
// Named, not `export *`: `actionCopyText`, `fillTransitionalCopy` stay in the
40+
// module for its in-package readers and off the public entry
41+
// (objectstack#25921: zero consumers).
42+
export {
43+
isActionCopyEnvelope,
44+
actionCopySource,
45+
hasTemplateHoles,
46+
fillTemplateHoles,
47+
type ActionCopyTemplate,
48+
} from './actionCopyTemplate.js';

‎ui/packages/core/src/data-scope/index.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ export {
2929
elementDataSourceBlock,
3030
elementDataSourceRefusedLimitMessage,
3131
elementDataSourceViewNotFoundMessage,
32-
isElementDataSourceBlock,
32+
// `isElementDataSourceBlock` stays in the module for the registry and off
33+
// the public entry (objectstack#25921: zero consumers).
3334
isElementDataSourceConfig,
3435
resolveSavedView,
3536
type ComposedElementDataSource,

‎ui/packages/core/src/evaluator/__tests__/rowPredicateCanon.test.ts‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ import { describe, it, expect, vi, beforeEach, afterEach, type MockInstance } fr
3333
import * as core from '../index.js';
3434
import {
3535
detectNonCanonicalRowSpelling,
36-
ROW_PREDICATE_CANONICAL_ROOT,
3736
evalRowPredicate,
3837
partitionRowsByPredicate,
3938
} from '../index.js';
39+
import { ROW_PREDICATE_CANONICAL_ROOT } from '../rowPredicateCanon.js';
4040

4141
const row = { status: 'in_review', amount: 10 };
4242
const other = { status: 'draft', amount: 1 };
@@ -165,7 +165,9 @@ describe('[#5741] `evalRowPredicate` — the row is bound as `record.*` only', (
165165
expect('warnNonCanonicalRowSpelling' in core).toBe(false);
166166
expect('resetRowPredicateCanonWarnings' in core).toBe(false);
167167
expect(typeof core.detectNonCanonicalRowSpelling).toBe('function');
168-
expect(core.ROW_PREDICATE_CANONICAL_ROOT).toBe('record');
168+
// The canonical-root constant stays in the module, off the barrel
169+
// (objectstack#25921: zero consumers outside the package).
170+
expect('ROW_PREDICATE_CANONICAL_ROOT' in core).toBe(false);
169171
});
170172

171173
it('`partitionRowsByPredicate`: `record.*` still partitions; a retired spelling excludes EVERY row', () => {

‎ui/packages/core/src/evaluator/index.ts‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,22 @@ export * from './ExpressionEvaluator.js';
1111
export * from './predicateInput.js';
1212
export * from './declaredPredicate.js';
1313
export * from './fieldRules.js';
14-
export * from './subjectPermissions.js';
15-
export * from './rowPredicateCanon.js';
14+
// Named, not `export *`: `SUBJECT_PERMISSIONS`, `SUBJECT_CAPABILITIES` stay in
15+
// the module for its in-package readers and off the public entry
16+
// (objectstack#25921: zero consumers).
17+
export {
18+
bindSubjectPermissions,
19+
subjectPermissionsOf,
20+
bindSubjectCapabilities,
21+
subjectCapabilitiesOf,
22+
} from './subjectPermissions.js';
23+
// Named, not `export *`: `ROW_PREDICATE_CANONICAL_ROOT` stays in the module for
24+
// its in-package readers and off the public entry (objectstack#25921: zero
25+
// consumers).
26+
export {
27+
detectNonCanonicalRowSpelling,
28+
type NonCanonicalRowSpelling,
29+
} from './rowPredicateCanon.js';
1630
export * from './listConditional.js';
1731
export * from './deadlineSettled.js';
1832
export * from './optionRules.js';

0 commit comments

Comments
 (0)