void prepare_import_results(Local<Value> returned_value, sass_context_wrapper* ctx_w) { NanScope(); if (returned_value->IsArray()) { Handle<Array> array = Handle<Array>::Cast(returned_value); ctx_w->imports = sass_make_import_list(array->Length()); for (size_t i = 0; i < array->Length(); ++i) { Local<Value> value = array->Get(i); if (!value->IsObject()) continue; Local<Object> object = Local<Object>::Cast(value); char* path = create_string(object->Get(NanNew<String>("file"))); char* contents = create_string(object->Get(NanNew<String>("contents"))); ctx_w->imports[i] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0); } } else if (returned_value->IsObject()) { ctx_w->imports = sass_make_import_list(1); Local<Object> object = Local<Object>::Cast(returned_value); char* path = create_string(object->Get(NanNew<String>("file"))); char* contents = create_string(object->Get(NanNew<String>("contents"))); ctx_w->imports[0] = sass_make_import_entry(path, (!contents || contents[0] == '\0') ? 0 : strdup(contents), 0); } else { ctx_w->imports = sass_make_import_list(1); ctx_w->imports[0] = sass_make_import_entry(ctx_w->file, 0, 0); } }
SassImportList CustomImporterBridge::post_process_return_value(v8::Local<v8::Value> returned_value) const { SassImportList imports = 0; Nan::HandleScope scope; if (returned_value->IsArray()) { v8::Local<v8::Array> array = returned_value.As<v8::Array>(); imports = sass_make_import_list(array->Length()); for (size_t i = 0; i < array->Length(); ++i) { v8::Local<v8::Value> value = Nan::Get(array, static_cast<uint32_t>(i)).ToLocalChecked(); if (!value->IsObject()) { auto entry = sass_make_import_entry(0, 0, 0); sass_import_set_error(entry, "returned array must only contain object literals", -1, -1); continue; } v8::Local<v8::Object> object = value.As<v8::Object>(); if (value->IsNativeError()) { char* message = create_string(Nan::Get(object, Nan::New<v8::String>("message").ToLocalChecked())); imports[i] = sass_make_import_entry(0, 0, 0); sass_import_set_error(imports[i], message, -1, -1); } else { imports[i] = get_importer_entry(object); } } } else if (returned_value->IsNativeError()) { imports = sass_make_import_list(1); v8::Local<v8::Object> object = returned_value.As<v8::Object>(); char* message = create_string(Nan::Get(object, Nan::New<v8::String>("message").ToLocalChecked())); imports[0] = sass_make_import_entry(0, 0, 0); sass_import_set_error(imports[0], message, -1, -1); } else if (returned_value->IsObject()) { imports = sass_make_import_list(1); imports[0] = get_importer_entry(returned_value.As<v8::Object>()); } return imports; }
Sass_Import_List custom_importer(const char* cur_path, Sass_Importer_Entry cb, struct Sass_Compiler* comp) { // get the cookie from importer descriptor void* cookie = sass_importer_get_cookie(cb); // create a list to hold our import entries Sass_Import_List incs = sass_make_import_list(1); // create our only import entry (route path back) incs[0] = sass_make_import_entry(cur_path, 0, 0); // return imports return incs; }
Sass_Import* CustomImporterBridge::check_returned_string(Nan::MaybeLocal<v8::Value> value, const char *msg) const { v8::Local<v8::Value> checked; if (value.ToLocal(&checked)) { if (!checked->IsUndefined() && !checked->IsString()) { goto err; } else { return nullptr; } } err: auto entry = sass_make_import_entry(0, 0, 0); sass_import_set_error(entry, msg, -1, -1); return entry; }
// create a custom header to define to variables Sass_Import_List custom_header(const char* cur_path, Sass_Importer_Entry cb, struct Sass_Compiler* comp) { // get the cookie from importer descriptor void* cookie = sass_importer_get_cookie(cb); // create a list to hold our import entries Sass_Import_List incs = sass_make_import_list(1); // create our only import entry (must make copy) incs[0] = sass_make_import_entry("[math]", strdup( "$E: 2.718281828459045235360287471352 !global;\n" "$PI: 3.141592653589793238462643383275 !global;\n" "$TAU: 6.283185307179586476925286766559 !global;\n" ), 0); // return imports return incs; }
Sass_Import* CustomImporterBridge::get_importer_entry(const v8::Local<v8::Object>& object) const { auto returned_file = Nan::Get(object, Nan::New<v8::String>("file").ToLocalChecked()); auto returned_contents = Nan::Get(object, Nan::New<v8::String>("contents").ToLocalChecked()).ToLocalChecked(); auto returned_map = Nan::Get(object, Nan::New<v8::String>("map").ToLocalChecked()); Sass_Import *err; if ((err = check_returned_string(returned_file, "returned value of `file` must be a string"))) return err; if ((err = check_returned_string(returned_contents, "returned value of `contents` must be a string"))) return err; if ((err = check_returned_string(returned_map, "returned value of `returned_map` must be a string"))) return err; char* path = create_string(returned_file); char* contents = create_string(returned_contents); char* srcmap = create_string(returned_map); return sass_make_import_entry(path, contents, srcmap); }