stringifyObj = (
	obj,
	parser,
	valueCacheVersions,
	key,
	runtimeTemplate,
	logger,
	asiSafe,
	objKeys
) => {
	let code;
	const arr = Array.isArray(obj);
	if (arr) {
		code = `[${obj
			.map(code =>
				toCode(
					code,
					parser,
					valueCacheVersions,
					key,
					runtimeTemplate,
					logger,
					null
				)
			)
			.join(",")}]`;
	} else {
		let keys = Object.keys(obj);
		if (objKeys) {
			keys = objKeys.size === 0 ? [] : keys.filter(k => objKeys.has(k));
		}
		code = `{${keys
			.map(key => {
				const code = obj[key];
				return `${JSON.stringify(key)}:${toCode(
					code,
					parser,
					valueCacheVersions,
					key,
					runtimeTemplate,
					logger,
					null
				)}`;
			})
			.join(",")}}`;
	}

	switch (asiSafe) {
		case null:
			return code;
		case true:
			return arr ? code : `(${code})`;
		case false:
			return arr ? `;${code}` : `;(${code})`;
		default:
			return `/*#__PURE__*/Object(${code})`;
	}
}
@param {EXPECTED_ANY[] | {[k: string]: EXPECTED_ANY}} obj obj
@param {JavascriptParser} parser Parser
@param {ValueCacheVersions} valueCacheVersions valueCacheVersions
@param {string} key the defined key
@param {RuntimeTemplate} runtimeTemplate the runtime template
@param {Logger} logger the logger object
@param {AsiSafe=} asiSafe asi safe (undefined: unknown, null: unneeded)
@param {ObjKeys=} objKeys used keys
@returns {string} code converted to string that evaluates