diff --git a/scripts/validateTokenJson.ts b/scripts/validateTokenJson.ts index 3d488f90d..23fc55679 100644 --- a/scripts/validateTokenJson.ts +++ b/scripts/validateTokenJson.ts @@ -65,15 +65,15 @@ if (getFlag('--silent') === null) { // eslint-disable-next-line no-console console.log(`\u001b[36;1m\u001b[1m${fail.fileName}\u001b[0m`) - for (const path of Object.keys(fail.errorsByPath)) { + for (const mainPath of Object.keys(fail.errorsByPath)) { // eslint-disable-next-line no-console - console.log(`\nPath: \u001b[34;1m\u001b[1m${path}\u001b[0m`) + console.log(`\nPath: \u001b[34;1m\u001b[1m${mainPath}\u001b[0m`) // eslint-disable-next-line no-console console.log( - fail.errorsByPath[path] + fail.errorsByPath[mainPath] .map( - ({message, code, errors}) => - `${message.replace(/\*\*(.*?)\*\*/g, '- \u001b[31;1m\u001b[1m$1\u001b[0m').replace(/\n(?!-)/g, '\n ↳ ')}, code: ${code}, errors:\n ${errors + ({message, code, errors, ...item}) => + `${message.replace(/\*\*(.*?)\*\*/g, '- \u001b[31;1m\u001b[1m$1\u001b[0m').replace(/\n(?!-)/g, '\n ↳ ')}, code: ${code}, path: ${item.path}, errors:\n ${errors .map(error => { return `- ${error.issues[0].code}: ${error.issues[0].message}` }) diff --git a/src/schemas/shadowToken.ts b/src/schemas/shadowToken.ts index 265924472..b78455504 100644 --- a/src/schemas/shadowToken.ts +++ b/src/schemas/shadowToken.ts @@ -19,6 +19,12 @@ export const shadowValue = z }) .strict() +const baseShadowToken = baseToken.extend({ + $value: z.union([shadowValue, referenceValue, z.array(shadowValue)]), +}) + +const override = z.union([referenceValue, baseShadowToken]).optional() + export const shadowToken = baseToken .extend({ $value: z.union([shadowValue, z.array(shadowValue), referenceValue]), @@ -42,6 +48,32 @@ export const shadowToken = baseToken group: z.string().optional(), }) .strict(), + 'org.primer.overrides': z + .object( + { + light: override, + 'light-tritanopia': override, + 'light-protanopia-deuteranopia': override, + 'light-high-contrast': override, + dark: override, + 'dark-tritanopia': override, + 'dark-protanopia-deuteranopia': override, + 'dark-high-contrast': override, + 'dark-dimmed': override, + }, + { + errorMap: e => { + if (e.code === 'unrecognized_keys') { + return { + message: `Unrecognized key: "${e.keys.join(', ')}", must be one of: light, light-tritanopia, light-protanopia-deuteranopia, light-high-contrast, dark, dark-tritanopia, dark-protanopia-deuteranopia, dark-high-contrast, dark-dimmed`, + } + } + return {message: `Error: ${e.code}`} + }, + }, + ) + .strict() + .optional(), }) .optional(), }) diff --git a/src/tokens/functional/shadow/shadow.json5 b/src/tokens/functional/shadow/shadow.json5 index b22af96e4..9f972bac0 100644 --- a/src/tokens/functional/shadow/shadow.json5 +++ b/src/tokens/functional/shadow/shadow.json5 @@ -646,6 +646,8 @@ ], $type: 'shadow', $extensions: { + 'org.primer.figma': { + }, 'org.primer.overrides': { dark: { $value: [