async build()

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


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

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

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

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

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

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

			// we can re-use the default transformer from `@cobalt-ui/plugin-js`
			for (const token of spaceTokens) {
				const value = Number(
					pxStringToNumber(defaultTransformer(token).toString()),
				);
				set(numberTokens, token.id, value);
				set(remTokens, token.id, numberToRem(value));
				if (token.$description) {
					jsDoc[getCommentId(token.id)] = token.$description;
				}
			}

			const typescriptSource = [];

			const exports = [
				{ varName: 'space', tokens: numberTokens },
				{ varName: 'remSpace', tokens: remTokens },
			];
			for (const { varName, tokens } of exports) {
				const serialisedJS = serializeJS(tokens['space'], {
					comments: jsDoc,
				}).trim();

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

				typescriptSource.push(
					`export const ${varName} = ${serialisedJS.replace(/;$/, '').replace(/'([0-9]{1,3})'/gm, '$1')} as const;`,
					'',
				);
			}

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