@std/ini
Этот пакет @std является экспериментальным, и его API может измениться без увеличения основной версии.
Обзор
parse и stringify для работы с данными в формате INI, например с данными из спецификации Desktop Entry. По умолчанию значения разбираются как строки, чтобы сохранить соответствие исходным данным. Настройка возможна с помощью функций reviver/replacer, подобных функциям в JSON.parse и JSON.stringify. Вложенные секции, повторяющиеся имена ключей в одной секции и массивы ключей/значений не поддерживаются, но сохраняются при использовании IniMap. Многострочные значения не поддерживаются и приводят к синтаксической ошибке. Отступы из пробелов и строки, начинающиеся с '#', ';' или '//', считаются комментариями.
import * as ini from "@std/ini";
import { assertEquals } from "@std/assert";
const iniFile = `# Example configuration file
Global Key=Some data here
[Section #1]
Section Value=42
Section Date=1977-05-25`;
const parsed = ini.parse(iniFile, {
reviver(key, value, section) {
if (section === "Section #1") {
if (key === "Section Value") return Number(value);
if (key === "Section Date") return new Date(value);
}
return value;
},
});
assertEquals(parsed, {
"Global Key": "Some data here",
"Section #1": {
"Section Value": 42,
"Section Date": new Date("1977-05-25T00:00:00.000Z"),
},
});
const text = ini.stringify(parsed, {
replacer(key, value, section) {
if (section === "Section #1" && key === "Section Date") {
return (value as Date).toISOString().split("T")[0];
}
return value;
},
});
assertEquals(text, `Global Key=Some data here
[Section #1]
Section Value=42
Section Date=1977-05-25`);
При необходимости для более точной работы с INI можно использовать IniMap. Этот класс позволяет сохранять комментарии, обращаться к значениям как к элементам map, перебирать записи ключей/значений/секций и выполнять другие действия.
import { IniMap } from "@std/ini/ini-map";
import { assertEquals } from "@std/assert";
const ini = new IniMap();
ini.set("section1", "keyA", 100);
assertEquals(ini.toString(), `[section1]
keyA=100`);
ini.set('keyA', 25)
assertEquals(ini.toObject(), {
keyA: 25,
section1: {
keyA: 100
}
});
API reviver и replacer можно использовать для расширения возможностей IniMap, например, чтобы добавить поддержку дублирующихся ключей, представленных в виде массивов значений.
import { IniMap } from "@std/ini/ini-map";
import { assertEquals } from "@std/assert";
const iniFile = `# Example of key/value arrays
[section1]
key1=This key
key1=is non-standard
key1=but can be captured!`;
const ini = new IniMap({ assignment: "=", deduplicate: true });
ini.parse(iniFile, (key, value, section) => {
if (section) {
if (ini.has(section, key)) {
const exists = ini.get(section, key);
if (Array.isArray(exists)) {
exists.push(value);
return exists;
} else {
return [exists, value];
}
}
}
return value;
});
assertEquals(
ini.get("section1", "key1"),
["This key", "is non-standard", "but can be captured!"]
);
const result = ini.toString((key, value) => {
if (Array.isArray(value)) {
return value.join(
`${ini.formatting.lineBreak}${key}${ini.formatting.assignment}`,
);
}
return value;
});
assertEquals(result, iniFile);
Добавление в проект
deno add jsr:@std/ini
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/std/ini