async build()

in libs/@guardian/source/src/design-tokens/cobalt-plugins/palette.js [19:65]


		async build({ tokens, rawSchema /*, metadata */ }) {
			const TOKEN_GROUP = 'palette';

			const description = rawSchema[TOKEN_GROUP]?.$description;

			// this is where we'll store the transformed tokens
			/** @type {Object.<string, string>} */
			const transformedTokens = {};

			/** @type {Object.<string, string>} */
			const jsDoc = {};

			const paletteTokens = tokens.filter((token) =>
				token.id.startsWith(TOKEN_GROUP),
			);

			// we can re-use the default transformer from `@cobalt-ui/plugin-js`
			for (const token of paletteTokens) {
				set(transformedTokens, token.id, defaultTransformer(token));
				if (token.$description) {
					jsDoc[getCommentId(token.id)] = token.$description;
				}
			}

			const typescriptSource = [];

			for (const [group, tokens] of Object.entries(transformedTokens)) {
				const serialisedJS = serializeJS(tokens, {
					comments: jsDoc,
				}).trim();

				if (description) {
					typescriptSource.push(`/** ${description} */`);
				}

				typescriptSource.push(
					`\nexport const ${group} = ${serialisedJS.replace(/;$/, '')} as const;`,
				);
			}

			return [
				{
					filename: options.filename,
					contents: template(import.meta.filename, typescriptSource.join('\n')),
				},
			];
		},