diff --git a/scripts/build/index.ts b/scripts/build/index.ts index f8cd7aba3f9738..eb1eeca0635693 100644 --- a/scripts/build/index.ts +++ b/scripts/build/index.ts @@ -7,7 +7,6 @@ import { fileURLToPath } from 'node:url'; import betterAjvErrors from 'better-ajv-errors'; import esMain from 'es-main'; -import stringify from 'fast-json-stable-stringify'; import { compareVersions } from 'compare-versions'; import { marked } from 'marked'; @@ -20,6 +19,7 @@ import { createAjv } from '../lib/ajv.js'; import { walk } from '../../utils/index.js'; import { WalkOutput } from '../../utils/walk.js'; import bcd from '../../index.js'; +import stringifyAndOrderProperties from '../lib/stringify-and-order-properties.js'; import mirrorSupport from './mirror.js'; @@ -261,7 +261,7 @@ const writeData = async () => { const dest = new URL('data.json', targetdir); const data = await createDataBundle(); validate(data); - await fs.writeFile(dest, stringify(data)); + await fs.writeFile(dest, stringifyAndOrderProperties(data, null)); logWrite(dest, 'data'); }; diff --git a/scripts/lib/stringify-and-order-properties.ts b/scripts/lib/stringify-and-order-properties.ts index 725948f9b456e3..3b119961ba57be 100644 --- a/scripts/lib/stringify-and-order-properties.ts +++ b/scripts/lib/stringify-and-order-properties.ts @@ -82,6 +82,7 @@ const doOrder = (value: T, order: string[]): T => { */ export const stringifyReleases = ( releases: Record, + indent: any, ): string => { const indentStep = ' '; // Constant with the indent step that sortStringify will use @@ -90,7 +91,7 @@ export const stringifyReleases = ( let result = ''; for (let i = 0; i < sortedKeys.length; i++) { const k = sortedKeys[i]; - const v = JSON.stringify(releases[k], null, 2).replace(/\n/g, '\n '); + const v = JSON.stringify(releases[k], null, indent).replace(/\n/g, '\n '); // Add it to the result result += `${indentStep}"${k}": ${v}`; @@ -100,10 +101,14 @@ export const stringifyReleases = ( result += ','; } - // We always need a carriage return - result += '\n'; + // We always need a carriage return unless we're squashing the format + if (indent) { + result += '\n'; + } } - return `*#*#{\n${result}}#*#*`; // Close the brace and return the string + return `*#*#{${indent ? '\n' : ''}${result}}#*#*` + .replace(/"/g, '*"*') + .replace(/\\n/g, '*\\n*'); // Close the brace and return the string }; /** @@ -115,7 +120,7 @@ export const stringifyReleases = ( * @param value The value of the key * @returns The new value */ -export const orderProperties = (key: string, value: any): any => { +export const orderProperties = (key: string, value: any, indent: any): any => { if (value instanceof Object) { // Order properties for data if ('__compat' in value) { @@ -154,23 +159,24 @@ export const orderProperties = (key: string, value: any): any => { // Order properties for browsers if ('browsers' in value) { - const browser = Object.keys(value.browsers)[0]; + for (const browser in value.browsers) { + value.browsers[browser] = doOrder( + value.browsers[browser] as BrowserStatement, + propOrder.browsers.browser, + ); - value.browsers[browser] = doOrder( - value.browsers[browser] as BrowserStatement, - propOrder.browsers.browser, - ); + for (const r of Object.keys(value.browsers[browser].releases)) { + value.browsers[browser].releases[r] = doOrder( + value.browsers[browser].releases[r] as ReleaseStatement, + propOrder.browsers.release, + ); + } - for (const r of Object.keys(value.browsers[browser].releases)) { - value.browsers[browser].releases[r] = doOrder( - value.browsers[browser].releases[r] as ReleaseStatement, - propOrder.browsers.release, + value.browsers[browser].releases = stringifyReleases( + value.browsers[browser].releases, + indent, ); } - - value.browsers[browser].releases = stringifyReleases( - value.browsers[browser].releases, - ); } } return value; @@ -181,22 +187,22 @@ export const orderProperties = (key: string, value: any): any => { * @param rawdata The object to stringify * @returns The stringified object */ -const stringifyAndOrderProperties = (rawdata: any): string => { +const stringifyAndOrderProperties = (rawdata: any, indent: any = 2): string => { if (rawdata instanceof Object) { rawdata = JSON.stringify(rawdata); } - const data = JSON.parse(rawdata, orderProperties); + const data = JSON.parse(rawdata, (k, v) => orderProperties(k, v, indent)); if ('browsers' in data) { // Browser data needs to be stringified in a special way due to the release data - return JSON.stringify(data, null, 2) - .replace('"*#*#', '') - .replace('#*#*"', '') - .replace(/\\n/g, '\n ') - .replace(/\\"/g, '"'); + return JSON.stringify(data, null, indent) + .replace(/"\*#\*#/g, '') + .replace(/#\*#\*"/g, '') + .replace(/\*\\n\*/g, '\n') + .replace(/\*\\"\*/g, '"'); } - return JSON.stringify(data, null, 2); + return JSON.stringify(data, null, indent); }; export default stringifyAndOrderProperties;