std::string SourceMap::generate_source_map(Context &ctx) { const bool include_sources = ctx.source_map_contents; const std::vector<std::string> includes = ctx.include_links; const std::vector<char*> sources = ctx.sources; JsonNode* json_srcmap = json_mkobject(); json_append_member(json_srcmap, "version", json_mknumber(3)); // pass-through sourceRoot option if (!ctx.source_map_root.empty()) { JsonNode* root = json_mkstring(ctx.source_map_root.c_str()); json_append_member(json_srcmap, "sourceRoot", root); } const char *include = file.c_str(); JsonNode *json_include = json_mkstring(include); json_append_member(json_srcmap, "file", json_include); JsonNode *json_includes = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { const char *include = includes[source_index[i]].c_str(); JsonNode *json_include = json_mkstring(include); json_append_element(json_includes, json_include); } json_append_member(json_srcmap, "sources", json_includes); if (include_sources) { JsonNode *json_contents = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { const char *content = sources[source_index[i]]; JsonNode *json_content = json_mkstring(content); json_append_element(json_contents, json_content); } if (json_contents->children.head) json_append_member(json_srcmap, "sourcesContent", json_contents); } std::string mappings = serialize_mappings(); JsonNode *json_mappings = json_mkstring(mappings.c_str()); json_append_member(json_srcmap, "mappings", json_mappings); JsonNode *json_names = json_mkarray(); // so far we have no implementation for names // no problem as we do not alter any identifiers json_append_member(json_srcmap, "names", json_names); char *str = json_stringify(json_srcmap, "\t"); std::string result = std::string(str); free(str); json_delete(json_srcmap); return result; }
std::string SourceMap::render_srcmap(Context &ctx) { const bool include_sources = ctx.c_options.source_map_contents; const std::vector<std::string> links = ctx.srcmap_links; const std::vector<Resource>& sources(ctx.resources); JsonNode* json_srcmap = json_mkobject(); json_append_member(json_srcmap, "version", json_mknumber(3)); const char *include = file.c_str(); JsonNode *json_include = json_mkstring(include); json_append_member(json_srcmap, "file", json_include); // pass-through sourceRoot option if (!ctx.source_map_root.empty()) { JsonNode* root = json_mkstring(ctx.source_map_root.c_str()); json_append_member(json_srcmap, "sourceRoot", root); } JsonNode *json_includes = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { std::string include(links[source_index[i]]); if (ctx.c_options.source_map_file_urls) { include = File::rel2abs(include); // check for windows abs path if (include[0] == '/') { // ends up with three slashes include = "file://" + include; } else { // needs an additional slash include = "file:///" + include; } } const char* inc = include.c_str(); JsonNode *json_include = json_mkstring(inc); json_append_element(json_includes, json_include); } json_append_member(json_srcmap, "sources", json_includes); if (include_sources) { JsonNode *json_contents = json_mkarray(); for (size_t i = 0; i < source_index.size(); ++i) { const Resource& resource(sources[source_index[i]]); JsonNode *json_content = json_mkstring(resource.contents); json_append_element(json_contents, json_content); } if (json_contents->children.head) json_append_member(json_srcmap, "sourcesContent", json_contents); } JsonNode *json_names = json_mkarray(); // so far we have no implementation for names // no problem as we do not alter any identifiers json_append_member(json_srcmap, "names", json_names); std::string mappings = serialize_mappings(); JsonNode *json_mappings = json_mkstring(mappings.c_str()); json_append_member(json_srcmap, "mappings", json_mappings); char *str = json_stringify(json_srcmap, "\t"); std::string result = std::string(str); free(str); json_delete(json_srcmap); return result; }