Skip to content

Commit e5e2792

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-21884-fls-mask-object-override
2 parents f0bf6fe + 1e18a07 commit e5e2792

49 files changed

Lines changed: 273 additions & 273 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/platform-objects': minor
3+
---
4+
5+
fix(platform-objects)!: retire the `sys_account` `link_social` action, which was dead on every boot; `unlink_account` stays
6+
7+
Clause-②: no (narrowing)
8+
9+
<!-- adr-0087: not-required (no-migration-prescription) The withdrawn action is platform-shipped metadata on sys_account, not something an author writes: no spec key, spelling, export name or config field is retired or renamed, and nothing an author wrote needs rewriting. No stored shape carries it either: sys_account is lock full, so no sys_metadata overlay of the object can be saved, and an action is not a stored row. No reachable member of an exported type carries it, measured on the built declarations: SysAccount's declared type keeps only fields from its literal, so its action names already resolved to string, and the bundles are typed as TranslationData objects with no key types. -->
10+
11+
**BREAKING**: `sys_account` no longer declares the `link_social` action, so the "Link Social Account" toolbar button is gone from the Account app's Linked Accounts list and from Setup's Identity Links. It never completed a link on any boot: it navigated to a `GET` of the social sign-in route, which is served as `POST` only, and it offered a fixed list of seven providers whatever the boot had configured. It is retired under ADR-0049 (enforce or remove) and ships as `minor` under the launch-window convention for narrowings.
12+
13+
**What stays.** `unlink_account` is unchanged: the same type, target, placement and row-id parameter. Its confirm question no longer says the user can re-link "from their account settings", because no console surface offers that now. The `sys_account._actions.link_social` leaves are gone from the `en`, `zh-CN`, `ja-JP` and `es-ES` bundles.
14+
15+
**What to do after upgrading.** Linking a social or OIDC identity stays available through the signed-in `POST /api/v1/auth/link-social`, which is `auth.accounts.linkSocial({ provider, callbackURL })` in `@objectstack/client`: call it and navigate to the `url` it answers.

‎content/docs/protocol/objectui/actions.mdx‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,15 @@ label: View Dashboard
9494
type: url
9595
target: /_console/dashboards/sales_overview
9696
97-
name: link_social
98-
label: Connect Account
97+
name: open_in_maps
98+
label: Open in Maps
9999
type: url
100-
target: '/api/v1/auth/sign-in/social?provider=${param.provider}&callbackURL=${ctx.origin}/_console/apps/account/sys_account'
100+
target: 'https://www.google.com/maps/search/?api=1&query=${param.address}'
101+
params:
102+
- name: address
103+
label: Address
104+
type: text
105+
required: true
101106
```
102107

103108
For a **static** url, `openIn: 'new-tab'` opens `target` in a new tab and `openIn: 'self'` navigates in place; omitted, absolute URLs open in a new tab and relative ones navigate in place. For an **async handler that redirects**, set `opensInNewTab: true` instead (the renderer pre-opens the tab synchronously so popup blockers don't fire); `newTabUrl` provides a zero-roundtrip new-tab target template supporting the `{recordId}` placeholder.

‎packages/platform-objects/src/apps/account.app.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
* make the experience equivalent to the old account SPA for supported
2020
* surfaces:
2121
* - `sys_oauth_application.create` — one-time client_secret reveal
22-
* - `sys_account.link_social` — OAuth redirect URL
2322
*
2423
* The same objects also appear (admin-only) in `setup.app.ts`'s
2524
* Advanced group, gated by `manage_platform_settings`, for tenant-wide

‎packages/platform-objects/src/apps/translations/en.objects.generated.ts‎

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -471,26 +471,9 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
471471
}
472472
},
473473
_actions: {
474-
link_social: {
475-
label: "Link Social Account",
476-
params: {
477-
provider: {
478-
label: "Provider",
479-
options: {
480-
google: "Google",
481-
github: "GitHub",
482-
microsoft: "Microsoft",
483-
apple: "Apple",
484-
facebook: "Facebook",
485-
gitlab: "GitLab",
486-
discord: "Discord"
487-
}
488-
}
489-
}
490-
},
491474
unlink_account: {
492475
label: "Unlink Account",
493-
description: "Unlink this identity link? The user will no longer be able to sign in with this provider until they re-link it from their account settings.",
476+
description: "Unlink this identity link? The user will no longer be able to sign in with this provider until they re-link it.",
494477
successMessage: "Identity link removed"
495478
}
496479
}

‎packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts‎

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -471,26 +471,9 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
471471
}
472472
},
473473
_actions: {
474-
link_social: {
475-
label: "Vincular cuenta social",
476-
params: {
477-
provider: {
478-
label: "Proveedor",
479-
options: {
480-
google: "Google",
481-
github: "GitHub",
482-
microsoft: "Microsoft",
483-
apple: "Apple",
484-
facebook: "Facebook",
485-
gitlab: "GitLab",
486-
discord: "Discord"
487-
}
488-
}
489-
}
490-
},
491474
unlink_account: {
492475
label: "Desvincular cuenta",
493-
description: "¿Desvincular este vínculo de identidad? El usuario ya no podrá iniciar sesión con este proveedor hasta que lo vuelva a vincular desde la configuración de su cuenta.",
476+
description: "¿Desvincular este vínculo de identidad? El usuario ya no podrá iniciar sesión con este proveedor hasta que lo vuelva a vincular.",
494477
successMessage: "Vínculo de identidad eliminado"
495478
}
496479
}

‎packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@
1818
*/
1919

2020
export const esESGeneratedSourceHashes: Readonly<Record<string, string>> = {
21-
"objects.sys_account._actions.link_social.params.provider.options.apple": "cfdc41e15ed6699b",
22-
"objects.sys_account._actions.link_social.params.provider.options.discord": "12f931cc062e76ae",
23-
"objects.sys_account._actions.link_social.params.provider.options.facebook": "7eea009178f5b807",
24-
"objects.sys_account._actions.link_social.params.provider.options.github": "2971d247eb4e6abc",
25-
"objects.sys_account._actions.link_social.params.provider.options.gitlab": "bc3dbbf4b650e600",
26-
"objects.sys_account._actions.link_social.params.provider.options.google": "6fadcd05bb8da367",
27-
"objects.sys_account._actions.link_social.params.provider.options.microsoft": "17309efbdb1ec122",
2821
"objects.sys_email.fields.cc_addresses.label": "02946d952cf15623",
2922
"objects.sys_email.fields.error.label": "786fed84bd8d5a32",
3023
"objects.sys_email.fields.message_id.label": "14cd089a4062f4b1",

‎packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts‎

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -471,26 +471,9 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
471471
}
472472
},
473473
_actions: {
474-
link_social: {
475-
label: "ソーシャルアカウント連携",
476-
params: {
477-
provider: {
478-
label: "プロバイダー",
479-
options: {
480-
google: "Google",
481-
github: "GitHub",
482-
microsoft: "Microsoft",
483-
apple: "Apple",
484-
facebook: "Facebook",
485-
gitlab: "GitLab",
486-
discord: "Discord"
487-
}
488-
}
489-
}
490-
},
491474
unlink_account: {
492475
label: "連携解除",
493-
description: "このID連携を解除しますか?ユーザーがアカウント設定から再度連携するまで、このプロバイダーでサインインできなくなります。",
476+
description: "このID連携を解除しますか?ユーザーが再度連携するまで、このプロバイダーでサインインできなくなります。",
494477
successMessage: "アイデンティティ連携を解除しました"
495478
}
496479
}

‎packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts‎

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,6 @@
1818
*/
1919

2020
export const jaJPGeneratedSourceHashes: Readonly<Record<string, string>> = {
21-
"objects.sys_account._actions.link_social.params.provider.options.apple": "cfdc41e15ed6699b",
22-
"objects.sys_account._actions.link_social.params.provider.options.discord": "12f931cc062e76ae",
23-
"objects.sys_account._actions.link_social.params.provider.options.facebook": "7eea009178f5b807",
24-
"objects.sys_account._actions.link_social.params.provider.options.github": "2971d247eb4e6abc",
25-
"objects.sys_account._actions.link_social.params.provider.options.gitlab": "bc3dbbf4b650e600",
26-
"objects.sys_account._actions.link_social.params.provider.options.google": "6fadcd05bb8da367",
27-
"objects.sys_account._actions.link_social.params.provider.options.microsoft": "17309efbdb1ec122",
2821
"objects.sys_email.fields.bcc_addresses.label": "8674899b7b6d5126",
2922
"objects.sys_email.fields.cc_addresses.label": "02946d952cf15623",
3023
"objects.sys_email.fields.message_id.label": "14cd089a4062f4b1",

‎packages/platform-objects/src/apps/translations/objects-es-es-echo-decisions.test.ts‎

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@
4848
// table holds nothing BEYOND the echoes is not asserted, for the reason the
4949
// next section gives.
5050
//
51+
// Since that walk, the seven `sys_account._actions.link_social` provider-brand
52+
// rows (Google through Discord) left this ledger together with the action,
53+
// retired under ADR-0049 enforce-or-remove (#21849): the bundle no longer
54+
// carries those leaves, so the ledger below holds 47 echoes.
55+
//
5156
// ## What this file deliberately does NOT assert
5257
//
5358
// That no OTHER es-ES objects leaf reads its `en` source. A new field's label
@@ -89,8 +94,6 @@ interface Decision {
8994
departure?: string;
9095
}
9196

92-
const BRAND =
93-
'A sign-in provider brand, shown as the name a user recognises on the link button. This bundle renders no brand name: the authored SSO empty state keeps Okta, Entra and Auth0 verbatim.';
9497
const BARE_ID =
9598
'The bare initialism ID. This bundle keeps ID verbatim inside every label that carries it (ID de usuario, ID de organización, ID de cliente); a bare en ID has no noun to render, and adding one would invent content.';
9699
const JWKS =
@@ -151,15 +154,7 @@ const DECISIONS: readonly Decision[] = [
151154
reason: 'The team record page field zh-CN reproduced as MEMBER COUNT: an ordinary field label an admin reads, an unauthored fill.',
152155
},
153156

154-
// ── Kept as written by design (54) ───────────────────────────────────────
155-
echo('sys_account._actions.link_social.params.provider.options.google', 'Google', BRAND),
156-
echo('sys_account._actions.link_social.params.provider.options.github', 'GitHub', BRAND),
157-
echo('sys_account._actions.link_social.params.provider.options.microsoft', 'Microsoft', BRAND),
158-
echo('sys_account._actions.link_social.params.provider.options.apple', 'Apple', BRAND),
159-
echo('sys_account._actions.link_social.params.provider.options.facebook', 'Facebook', BRAND),
160-
echo('sys_account._actions.link_social.params.provider.options.gitlab', 'GitLab', BRAND),
161-
echo('sys_account._actions.link_social.params.provider.options.discord', 'Discord', BRAND),
162-
157+
// ── Kept as written by design (47) ───────────────────────────────────────
163158
echo('sys_oauth_application.fields.jwks.label', 'JWKS', JWKS),
164159
echo('sys_oauth_application.fields.jwks_uri.label', 'JWKS URI', JWKS),
165160
echo('sys_oauth_application._actions.create_oauth_application.params.type.options.web', 'Web', WEB_CLIENT_TYPE),
@@ -242,10 +237,10 @@ function undeclaredEchoes(rows: readonly Decision[]): string[] {
242237
}
243238

244239
describe('#20493 es-ES — the ledger itself (controls before verdicts)', () => {
245-
it('is the size it claims: 3 pinned translations and 54 declared echoes, no path twice', () => {
246-
expect(DECISIONS.length).toBe(57);
240+
it('is the size it claims: 3 pinned translations and 47 declared echoes, no path twice', () => {
241+
expect(DECISIONS.length).toBe(50);
247242
expect(DECISIONS.filter((d) => d.verdict === 'translate').length).toBe(3);
248-
expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(54);
243+
expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(47);
249244
expect(new Set(DECISIONS.map((d) => d.path)).size).toBe(DECISIONS.length);
250245
});
251246

‎packages/platform-objects/src/apps/translations/objects-ja-jp-echo-decisions.test.ts‎

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
// table holds nothing BEYOND the echoes is not asserted, for the reason the
4646
// next section gives.
4747
//
48+
// Since that walk, the seven `sys_account._actions.link_social` provider-brand
49+
// rows (Google through Discord) left this ledger together with the action,
50+
// retired under ADR-0049 enforce-or-remove (#21849): the bundle no longer
51+
// carries those leaves, so the ledger below holds 36 echoes.
52+
//
4853
// ## What this file deliberately does NOT assert
4954
//
5055
// That no OTHER ja-JP objects leaf reads its `en` source. A new field's label
@@ -89,8 +94,6 @@ interface Decision {
8994
departure?: string;
9095
}
9196

92-
const BRAND =
93-
'A sign-in provider brand, shown as the name a user recognises on the link button. This bundle renders no brand name in kana: the authored SSO empty state keeps Okta, Entra and Auth0 verbatim.';
9497
const BARE_ID =
9598
'The bare initialism ID. This bundle keeps ID verbatim inside every label that carries it (ユーザー ID, 組織 ID, クライアント ID); a bare en ID has no noun to render, and adding one would invent content.';
9699
const JWKS =
@@ -143,15 +146,7 @@ const DECISIONS: readonly Decision[] = [
143146
reason: 'The team record page field zh-CN reproduced as MEMBER COUNT: an ordinary field label an admin reads, an unauthored fill.',
144147
},
145148

146-
// ── Kept in English by design (43) ───────────────────────────────────────
147-
echo('sys_account._actions.link_social.params.provider.options.google', 'Google', BRAND),
148-
echo('sys_account._actions.link_social.params.provider.options.github', 'GitHub', BRAND),
149-
echo('sys_account._actions.link_social.params.provider.options.microsoft', 'Microsoft', BRAND),
150-
echo('sys_account._actions.link_social.params.provider.options.apple', 'Apple', BRAND),
151-
echo('sys_account._actions.link_social.params.provider.options.facebook', 'Facebook', BRAND),
152-
echo('sys_account._actions.link_social.params.provider.options.gitlab', 'GitLab', BRAND),
153-
echo('sys_account._actions.link_social.params.provider.options.discord', 'Discord', BRAND),
154-
149+
// ── Kept in English by design (36) ───────────────────────────────────────
155150
echo('sys_oauth_application.fields.jwks.label', 'JWKS', JWKS),
156151
echo('sys_oauth_application.fields.jwks_uri.label', 'JWKS URI', JWKS),
157152
echo('sys_oauth_application._actions.create_oauth_application.params.type.options.web', 'Web', WEB_CLIENT_TYPE),
@@ -221,10 +216,10 @@ function undeclaredEchoes(rows: readonly Decision[]): string[] {
221216
}
222217

223218
describe('#20493 ja-JP — the ledger itself (controls before verdicts)', () => {
224-
it('is the size it claims: 3 pinned translations and 43 declared echoes, no path twice', () => {
225-
expect(DECISIONS.length).toBe(46);
219+
it('is the size it claims: 3 pinned translations and 36 declared echoes, no path twice', () => {
220+
expect(DECISIONS.length).toBe(39);
226221
expect(DECISIONS.filter((d) => d.verdict === 'translate').length).toBe(3);
227-
expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(43);
222+
expect(DECISIONS.filter((d) => d.verdict === 'echo').length).toBe(36);
228223
expect(new Set(DECISIONS.map((d) => d.path)).size).toBe(DECISIONS.length);
229224
});
230225

0 commit comments

Comments
 (0)