Skip to content

Commit a4d4688

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-21972-caller-scoped-views-not-first
2 parents f757947 + dcf3eb4 commit a4d4688

13 files changed

Lines changed: 89 additions & 89 deletions

‎packages/spec/src/api/plugin-rest-api.handler-status-retirement.test.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const WELL_FORMED = {
7070

7171
const PRESCRIPTION = /`RestApiEndpoint\.handlerStatus`.*was removed.*17/s;
7272

73-
describe('[#13823] RestApiEndpoint.handlerStatus retirement', () => {
73+
describe('RestApiEndpoint.handlerStatus retirement', () => {
7474
// All three former values, INCLUDING the documented default: the old
7575
// docblock's `@default 'implemented'` was prose only — the key never carried
7676
// a Zod `.default()`, so no built artifact materialised it and there is no
@@ -156,7 +156,7 @@ describe('[#13823] RestApiEndpoint.handlerStatus retirement', () => {
156156
});
157157
});
158158

159-
describe('[#13823] api/HandlerStatus + api/RouteCoverage{Entry,Report} def retirement', () => {
159+
describe('api/HandlerStatus + api/RouteCoverage{Entry,Report} def retirement', () => {
160160
/** The 6 names the three retired defs exported (3 schema consts + 3 types). */
161161
const RETIRED_NAMES = [
162162
'HandlerStatusSchema',
@@ -176,7 +176,7 @@ describe('[#13823] api/HandlerStatus + api/RouteCoverage{Entry,Report} def retir
176176

177177
// ── ABSENCE (every entry, not just ./api) ─────────────────────────────
178178
for (const name of RETIRED_NAMES) {
179-
expect(holdersOf(name), `${name} must have zero holders after #13823`).toEqual([]);
179+
expect(holdersOf(name), `${name} must have zero holders after its retirement`).toEqual([]);
180180
}
181181

182182
// ── SURVIVAL ──────────────────────────────────────────────────────────
@@ -205,7 +205,7 @@ describe('[#13823] api/HandlerStatus + api/RouteCoverage{Entry,Report} def retir
205205
});
206206
});
207207

208-
describe('[#13823] ADR-0087 registration', () => {
208+
describe('handlerStatus retirement — ADR-0087 registration', () => {
209209
it('declares the tombstoned key and the three removed defs under major 18, with the D3 entry', () => {
210210
expect(RETIRED_KEYS_BY_MAJOR[18]).toContain('api/RestApiEndpoint:handlerStatus');
211211
for (const def of ['api/HandlerStatus', 'api/RouteCoverageEntry', 'api/RouteCoverageReport']) {

‎packages/spec/src/api/plugin-rest-api.schema-refs.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function resolvesToZodSchema(name: string): boolean {
5353
return !!candidate && typeof (candidate as { safeParse?: unknown }).safeParse === 'function';
5454
}
5555

56-
describe('#3899 — catalog schema references resolve and sit on the right methods', () => {
56+
describe('catalog schema references resolve and sit on the right methods', () => {
5757
it('every requestSchema names a Zod schema exported from @objectstack/spec/api', () => {
5858
for (const ep of allEndpoints()) {
5959
if (!ep.requestSchema) continue;
@@ -87,7 +87,7 @@ describe('#3899 — catalog schema references resolve and sit on the right metho
8787
}
8888
});
8989

90-
it('at least the routes wired in #3899 still declare their request schemas', () => {
90+
it('at least the routes wired to the request-schema gate still declare their request schemas', () => {
9191
// Anti-erosion floor: the gate above is vacuous if declarations are simply
9292
// deleted. These five are validated at their mounted routes.
9393
const declared = new Map(

‎packages/spec/src/api/plugin-rest-api.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ describe('plugin-rest-api.zod', () => {
541541
expect(paths).not.toContain('/preferences');
542542
});
543543

544-
it('declares no AI routes — this table cannot vouch for a Cloud/EE surface (#3718)', () => {
544+
it('declares no AI routes — this table cannot vouch for a Cloud/EE surface', () => {
545545
// DEFAULT_AI_ROUTES used to sit here declaring `/nlq`, `/suggest` and
546546
// `/insights`, and this test asserted its shape — three endpoints no repo
547547
// has ever mounted, checked for `toHaveLength(3)`. Shape is not
@@ -691,7 +691,7 @@ describe('plugin-rest-api.zod', () => {
691691
// than a bare unrecognized-key error, and the value survives at the same
692692
// magnitude. Asserting the message, not just `.toThrow()`: a bare throw stays
693693
// green when the schema throws for some unrelated reason.
694-
describe('RestApiEndpoint / RestApiPluginConfig durations carry their unit (#15677)', () => {
694+
describe('RestApiEndpoint / RestApiPluginConfig durations carry their unit in the key name', () => {
695695
const endpoint = {
696696
method: 'GET' as const, path: '/api/v1/discovery',
697697
handler: 'getDiscovery', category: 'discovery' as const,

‎packages/spec/src/api/protocol.test.ts‎

Lines changed: 46 additions & 46 deletions
Large diffs are not rendered by default.

‎packages/spec/src/api/registry-retirement.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const RETIRED_NAMES = [
5858
'ApiDiscoveryResponseSchema',
5959
] as const;
6060

61-
describe('[#4939] ApiRegistry family retired from `@objectstack/spec/api`', () => {
61+
describe('ApiRegistry family retired from `@objectstack/spec/api`', () => {
6262
it('exports none of the retired names', async () => {
6363
const api = await import('./index');
6464

@@ -86,7 +86,7 @@ describe('[#4939] ApiRegistry family retired from `@objectstack/spec/api`', () =
8686
expect(
8787
'ConflictResolutionStrategy' in api,
8888
'two independent ratchets pin this as a ./api export: spec/src/automation/' +
89-
'sync-retirement.test.ts (#4738, the fourth ConflictResolution relative) and, ' +
89+
'sync-retirement.test.ts (the fourth ConflictResolution relative) and, ' +
9090
'cross-repo, objectui offline-nav-performance-spec-parity.test.ts',
9191
).toBe(true);
9292

‎packages/spec/src/api/rest-api-config-dead-keys-retirement.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ describe('rest_api retirement — `api.documentation.enabled`, a tombstone insid
145145
});
146146
});
147147

148-
describe('rest_api retirement — `api.documentation.version` (#20294), a second tombstone inside the live block', () => {
148+
describe('rest_api retirement — `api.documentation.version`, a second tombstone inside the live block', () => {
149149
// The old authored spellings: a release number, a semver-looking protocol
150150
// version, and an empty string.
151151
for (const version of ['2.3.0', '17.4.0', '']) {
@@ -254,7 +254,7 @@ describe('rest_api retirement — ADR-0087 registration', () => {
254254
expect(step.conversionIds.filter((id) => /response-format|documentation-enabled/.test(id))).toEqual([]);
255255
});
256256

257-
it('[#20294] declares `documentation.version` under major 18 with its own family D3 entry, and no D2 conversion', () => {
257+
it('declares `documentation.version` under major 18 with its own family D3 entry, and no D2 conversion', () => {
258258
expect(RETIRED_KEYS_BY_MAJOR[18]).toContain('api/RestApiConfig:documentation.version');
259259
const step = MIGRATIONS_BY_MAJOR[18]!;
260260
const entry = step.semantic.find((e) => e.id === 'rest-api-documentation-version-retired');

‎packages/spec/src/api/rest-server.test.ts‎

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('RestApiConfigSchema', () => {
7979
expect(config.enableDiscovery).toBe(false);
8080
});
8181

82-
it('[#11983] enableSearch defaults to true — search is ON unless opted out', () => {
82+
it('enableSearch defaults to true — search is ON unless opted out', () => {
8383
// Pinning the MATERIALIZED default (not just the declaration) is what makes
8484
// a later `.optional()` — which would hand `undefined` to the REST layer —
8585
// fail here rather than silently change the mount decision.
@@ -88,7 +88,7 @@ describe('RestApiConfigSchema', () => {
8888
expect(config.enableSearch).toBe(true);
8989
});
9090

91-
it('[#11983] enableSearch: false is the declared deployment-wide opt-out, and it SURVIVES the parse', () => {
91+
it('enableSearch: false is the declared deployment-wide opt-out, and it SURVIVES the parse', () => {
9292
// Before this key had a declared seat, this exact parse was the measured
9393
// trap: `RestApiConfigSchema` is not `.strict()`, so it STRIPPED the
9494
// undeclared key and any consumer of the parsed output silently got search
@@ -103,7 +103,7 @@ describe('RestApiConfigSchema', () => {
103103
expect(RestApiConfigSchema.parse({ enableSearch: true }).enableSearch).toBe(true);
104104
});
105105

106-
it('[#11983] enableSearch is authorable without a cast, and is a boolean (compile-time)', () => {
106+
it('enableSearch is authorable without a cast, and is a boolean (compile-time)', () => {
107107
// The declaration's REASON for existing: `objectstack.config.ts` authors
108108
// the key by name and `packages/rest`'s `normalizeConfig` reads it. Both go
109109
// through this input type, so this is the pin that says the key no longer
@@ -205,7 +205,7 @@ describe('CrudEndpointsConfigSchema', () => {
205205
expect(config.operations?.delete).toBe(false);
206206
});
207207

208-
it('[#14691] REJECTS `patterns` with the retirement prescription — the key never customized a route', () => {
208+
it('REJECTS `patterns` with the retirement prescription — the key never customized a route', () => {
209209
expect(() => CrudEndpointsConfigSchema.parse({
210210
patterns: {
211211
create: { method: 'POST', path: '/objects/{object}' },
@@ -221,14 +221,14 @@ describe('CrudEndpointsConfigSchema', () => {
221221
expect(config.dataPrefix).toBe('/objects');
222222
});
223223

224-
it('[#14691] REJECTS `objectParamStyle` — both former enum values, with the prescription', () => {
224+
it('REJECTS `objectParamStyle` — both former enum values, with the prescription', () => {
225225
for (const objectParamStyle of ['path', 'query']) {
226226
expect(() => CrudEndpointsConfigSchema.parse({ objectParamStyle }), objectParamStyle)
227227
.toThrow(/`crud\.objectParamStyle` was removed.*path segment.*Delete the key/s);
228228
}
229229
});
230230

231-
it('[#14691] the tombstones reject one key each, not the config — every live key still parses', () => {
231+
it('the tombstones reject one key each, not the config — every live key still parses', () => {
232232
const config = CrudEndpointsConfigSchema.parse({
233233
operations: { list: false },
234234
dataPrefix: '/records',
@@ -266,7 +266,7 @@ describe('MetadataEndpointsConfigSchema', () => {
266266
expect(config.enableCache).toBe(false);
267267
});
268268

269-
it('[#14691] REJECTS `cacheTtl` — including the negative value the old contract accepted', () => {
269+
it('REJECTS `cacheTtl` — including the negative value the old contract accepted', () => {
270270
for (const cacheTtl of [7200, 0, -1]) {
271271
expect(() => MetadataEndpointsConfigSchema.parse({ cacheTtl }), String(cacheTtl))
272272
.toThrow(/`metadata\.cacheTtl` was removed.*takes no TTL.*Delete the key/s);
@@ -290,7 +290,7 @@ describe('MetadataEndpointsConfigSchema', () => {
290290
expect(config.endpoints?.maintenance).toBe(true);
291291
});
292292

293-
it('[#14691] REJECTS `endpoints.schema` — it gated a route that does not exist', () => {
293+
it('REJECTS `endpoints.schema` — it gated a route that does not exist', () => {
294294
expect(() => MetadataEndpointsConfigSchema.parse({ endpoints: { schema: false } }))
295295
.toThrow(/`metadata\.endpoints\.schema` was removed.*does not exist.*Delete the key/s);
296296
});
@@ -386,12 +386,12 @@ describe('BatchEndpointsConfigSchema', () => {
386386
expect(config.operations).not.toHaveProperty('upsertMany');
387387
});
388388

389-
it('[#14691] REJECTS `operations.upsertMany` — it gated a route that was never built', () => {
389+
it('REJECTS `operations.upsertMany` — it gated a route that was never built', () => {
390390
expect(() => BatchEndpointsConfigSchema.parse({ operations: { upsertMany: false } }))
391391
.toThrow(/`batch\.operations\.upsertMany` was removed.*never built.*Delete the key.*'upsert'/s);
392392
});
393393

394-
it('[#14691] REJECTS `defaultAtomic` — atomicity is the per-request `options.atomic`', () => {
394+
it('REJECTS `defaultAtomic` — atomicity is the per-request `options.atomic`', () => {
395395
for (const defaultAtomic of [true, false]) {
396396
expect(() => BatchEndpointsConfigSchema.parse({ defaultAtomic }), String(defaultAtomic))
397397
.toThrow(/`batch\.defaultAtomic` was removed.*options\.atomic.*Delete the key/s);
@@ -400,27 +400,27 @@ describe('BatchEndpointsConfigSchema', () => {
400400
});
401401

402402
describe('RouteGenerationConfigSchema', () => {
403-
it('should accept the empty sub-object — and materialize nothing, every key being a tombstone (#14691)', () => {
403+
it('should accept the empty sub-object — and materialize nothing, every key being a tombstone', () => {
404404
const config = RouteGenerationConfigSchema.parse({});
405405

406406
expect(config).toEqual({});
407407
});
408408

409-
it('[#14691] REJECTS `includeObjects` / `excludeObjects` — the object declares its own exposure', () => {
409+
it('REJECTS `includeObjects` / `excludeObjects` — the object declares its own exposure', () => {
410410
expect(() => RouteGenerationConfigSchema.parse({ includeObjects: ['account', 'contact'] }))
411411
.toThrow(/`routes\.includeObjects` was removed.*Delete the key.*enable\.apiEnabled.*enable\.apiMethods/s);
412412
expect(() => RouteGenerationConfigSchema.parse({ excludeObjects: ['system_log'] }))
413413
.toThrow(/`routes\.excludeObjects` was removed.*Delete the key.*enable\.apiEnabled.*enable\.apiMethods/s);
414414
});
415415

416-
it('[#14691] REJECTS `nameTransform` — every former enum value, `none` included', () => {
416+
it('REJECTS `nameTransform` — every former enum value, `none` included', () => {
417417
for (const nameTransform of ['none', 'plural', 'kebab-case', 'camelCase']) {
418418
expect(() => RouteGenerationConfigSchema.parse({ nameTransform }), nameTransform)
419419
.toThrow(/`routes\.nameTransform` was removed.*Delete the key.*canonical id/s);
420420
}
421421
});
422422

423-
it('[#14691] REJECTS `overrides` — the per-object record turned nothing on or off', () => {
423+
it('REJECTS `overrides` — the per-object record turned nothing on or off', () => {
424424
expect(() => RouteGenerationConfigSchema.parse({
425425
overrides: {
426426
account: { enabled: true, basePath: '/accounts' },
@@ -473,7 +473,7 @@ describe('RestServerConfigSchema', () => {
473473
expect(config.routes).toEqual({});
474474
});
475475

476-
it('[#14691] a retired sub-object key is refused THROUGH the whole config, with its own prescription', () => {
476+
it('a retired sub-object key is refused THROUGH the whole config, with its own prescription', () => {
477477
// The tombstones live on the sub-schemas; this pins that composing them
478478
// under `RestServerConfigSchema` changes nothing — the same authored key is
479479
// refused at the whole-config parse with the same string.
@@ -697,7 +697,7 @@ describe('Integration Tests', () => {
697697
// tests were removed with the schemas (#4579, ADR-0049 enforce-or-remove).
698698
// The retirement itself is pinned below.
699699

700-
describe('[#4579] `RestServerConfig.openApi31` retirement', () => {
700+
describe('`RestServerConfig.openApi31` retirement', () => {
701701
it('REJECTS an authored openApi31 block, with the fix in the message', () => {
702702
// Tombstoned, not deleted: RestServerConfigSchema is not `.strict()`, so a
703703
// plain deletion would silently strip the key — the author's webhook
@@ -739,7 +739,7 @@ describe('[#4579] `RestServerConfig.openApi31` retirement', () => {
739739
// so the load-bearing pin is the compiler-API test below, with anti-vacuity
740740
// guards (a resolution failure would otherwise make every assertion pass
741741
// vacuously); sabotage-verified in the PR (re-adding an export turns it red).
742-
describe('[#4579] the OpenApi31 block schemas are not exported from any entry point', () => {
742+
describe('the OpenApi31 block schemas are not exported from any entry point', () => {
743743
const REMOVED_NAMES = [
744744
'OpenApi31ExtensionsSchema',
745745
'OpenApi31Extensions',
@@ -765,7 +765,7 @@ describe('[#4579] the OpenApi31 block schemas are not exported from any entry po
765765
expect(apiNames).toContain('RestApiConfigSchema');
766766

767767
for (const removed of REMOVED_NAMES) {
768-
expect(holdersOf(removed), `no entry may export ${removed} (#4579)`).toEqual([]);
768+
expect(holdersOf(removed), `no entry may export ${removed}`).toEqual([]);
769769
}
770770
});
771771

@@ -789,7 +789,7 @@ describe('[#4579] the OpenApi31 block schemas are not exported from any entry po
789789
// and removed; WebhookEvent(Schema) was first renamed OpenApiWebhookEvent(Schema)
790790
// (#4572) and then removed outright with the openApi31 block (#4579).
791791
// Pin: this module declares neither the bare names nor the renamed ones.
792-
it('does not re-expose the bare WebhookEvent/WebhookConfig names from ./api (#4572)', async () => {
792+
it('does not re-expose the bare WebhookEvent/WebhookConfig names from ./api', async () => {
793793
const restServer = await import('./rest-server.zod');
794794
expect('WebhookEventSchema' in restServer).toBe(false);
795795
expect('WebhookConfigSchema' in restServer).toBe(false);

‎packages/spec/src/api/router.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ describe('Integration Tests', () => {
562562
// than a bare unrecognized-key error, and the value survives at the same
563563
// magnitude. Asserting the message, not just `.toThrow()`: a bare throw stays
564564
// green when the schema throws for some unrelated reason.
565-
describe('RouteDefinition.timeout \u2192 timeoutMs (#15677)', () => {
565+
describe('RouteDefinition.timeout \u2192 timeoutMs', () => {
566566
const base = { method: 'GET' as const, path: '/api/test', handler: 'test_handler' };
567567

568568
it('REFUSES the retired `timeout` spelling with the rename in the message', () => {

‎packages/spec/src/api/sortability.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const OPPORTUNITY_LIKE = {
4242
},
4343
};
4444

45-
describe('#10235 resolveObjectSortability — the closed category set', () => {
45+
describe('resolveObjectSortability — the closed category set', () => {
4646
it('marks a formula column unsortable with the refusal-backed reason', () => {
4747
const { fields } = resolveObjectSortability(OPPORTUNITY_LIKE);
4848
expect(fields.expected_revenue).toEqual({
@@ -111,7 +111,7 @@ describe('#10235 resolveObjectSortability — the closed category set', () => {
111111
});
112112
});
113113

114-
describe('#10235 the #7865 anchor category — accepted, caveated, never refused', () => {
114+
describe('the unprovisioned injected-anchor category — accepted, caveated, never refused', () => {
115115
/** An ADR-0015 external object as the registry serves it: injected anchors present. */
116116
const EXTERNAL = {
117117
name: 'ext_customer',
@@ -167,7 +167,7 @@ describe('#10235 the #7865 anchor category — accepted, caveated, never refused
167167
});
168168
});
169169

170-
describe('#10235 wire validity — the projection parses under its own schema', () => {
170+
describe('wire validity — the projection parses under its own schema', () => {
171171
it.each([
172172
['oracle-shaped object', OPPORTUNITY_LIKE],
173173
['external object', {

‎packages/spec/src/api/storage.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ describe('FileDownloadUrlResponseSchema', () => {
634634
expect(resp.data.url).toBe('/api/v1/storage/_local/raw/eyJrIjoi.c2ln');
635635
});
636636

637-
it('should reject the bare pre-#3689 shape', () => {
637+
it('should reject the bare shape from before the shared success envelope', () => {
638638
expect(() =>
639639
FileDownloadUrlResponseSchema.parse({ url: 'https://cdn.example.com/f1.png' })
640640
).toThrow();
@@ -655,7 +655,7 @@ describe('RawUploadResponseSchema', () => {
655655
expect(resp.data.key).toBe('user/f1.png');
656656
});
657657

658-
it('should reject the pre-#3689 `{ ok, key }` shape', () => {
658+
it('should reject the `{ ok, key }` shape from before the shared success envelope', () => {
659659
expect(() => RawUploadResponseSchema.parse({ ok: true, key: 'user/f1.png' })).toThrow();
660660
});
661661

0 commit comments

Comments
 (0)