const obj1 = {
foo: {
bar: {
value: 'final'
}
}
}
const getBreadcrumbs = (data, accumulate = []) => {
Object.keys(data).forEach(key => {
if (typeof data[key] === 'object') {
accumulate.push(key);
return getBreadcrumbs(data[key], accumulate);
} else {
accumulate.push(key);
return accumulate;
}
});
return accumulate;
};
const breadcrumbs = getBreadcrumbs(obj1).join('.');
console.info(breadcrumbs); // 'foo.bar.value'
const obj1 = {
foo: {
bar: {
value: 'final'
}
}
};
function getDeepKeys(obj) {
let keys = [];
for(const key in obj) {
keys.push(key);
if(typeof obj[key] === "object") {
const subkeys = getDeepKeys(obj[key]);
keys = keys.concat(subkeys.map(subkey => `${key}.${subkey}`));
}
}
return keys;
}
console.log(getDeepKeys(obj1)); // ["foo", "foo.bar", "foo.bar.value"]
const arr = str.split('-');
const end = 'final';
const obj = arr.reduceRight((acc, n) => ({ [n]: acc }), end);
const obj = (function createObj(arr, i, end) {
return i < arr.length
? { [arr[i]]: createObj(arr, i + 1, end) }
: end;
})(arr, 0, end);
const obj = {
param1: "1",
param2: "string",
param3: "false"
};
function convertType(prop) {
try {
return JSON.parse(prop);
} catch (e) {
if (e.name === 'SyntaxError') {
return prop;
}
throw e;
}
}
Object.entries(obj).forEach(([key, value]) => {
obj[key] = convertType(value);
});
console.log(obj); // {param1: 1, param2: "string", param3: false}
const through = require('through2');
const PLUGIN_NAME = 'my plugin ';
const myPlugin = function (options) {
return through.obj(function (file, enc, cb) {
if (file.isNull()) {
cb(null, file);
return;
}
if (file.isStream()) {
cb(new Error(PLUGIN_NAME + 'Streaming not supported'));
return;
}
try {
let content = file.contents.toString();
content = '';// ... что-то делаем
file.contents = Buffer.from(content);
} catch (err) {
this.emit('error', new Error(PLUGIN_NAME + err.message));
}
this.push(file);
cb();
});
};
function build() {
return gulp.src('./src/css/*.css')
.pipe(myPlugin)
//...
}
if (/\.css$/.exec(file.path) !== null) {
//...
}
Как правильно реализовывать какой либо административный функционал в SPA?в вебе у вас один (простой*) вариант знать, что запрос пришел от авторизированного пользователя - куки
Если сделать просто защищенные роуты типа - example.com/admin с защитой, то это не совсем правильно как я понимаю ибо можно открыть в конце концов build.js и увидеть там статический HTML на всех этих "защищенных аутентификацией и правами пользователей" страницах.и правильно. Перед тем как процессить запрос в апи проверяются права пользователя
Возникает очевидное решение - делать такие админки на отдельных доменах, ибо все равно весь функционал и взаимодействия с БД осуществляются с помощью RESTfull API.отдельный домен делается для того, чтоб куки не утекали, если пользователям позволено вставлять жс код
можно открыть в конце концов build.js и увидеть там...