levn

中文文档
0.4.1发布于 2020/04/04MITCommonJS近 30 天下载 5.7亿

轻ECMAScript (JavaScript)值表示法-人类编写的,简洁的,类型的,灵活的

中文使用文档
文档目录9 节
  1. 快速的例子
  2. 用法
  3. 解析(类型,输入,选项)
  4. parsedTypeParse(parsedType, input, options)
  5. Levn格式
  6. 选项
  7. 显式的
  8. customTypes
  9. 技术对

levn Build Status

轻ECMAScript (JavaScript)值表示法 Levn是一个库,它允许您根据期望的类型将字符串解析为JavaScript值。它适用于少量的人工输入数据(例如。配置文件,命令行参数)。

Levn的目标是在文本中简洁地描述JavaScript值,并允许对这些值进行提取和验证。Levn使用 类型检查 获取其类型格式,并验证结果。麻省理工学院的许可。0.4.1版本。

这与JSON有什么不同? Levn只适合人类编写,(由于前面的一点)更简洁,可以根据提供的类型进行验证,具有正则表达式和日期文字,并且可以轻松地使用自定义类型进行扩展。另一方面,它可能更慢,因此在传输大量数据时效率更低,这没有关系,因为这不是它的目的。

npm install levn

有关levn的最新消息, 在twitter上关注我。

快速的例子

var parse = require('levn').parse;
parse('Number', '2');      // 2
parse('String', '2');      // '2'
parse('String', 'levn');   // 'levn'
parse('String', 'a b');    // 'a b'
parse('Boolean', 'true');  // true

parse('Date', '#2011-11-11#'); // (Date object)
parse('Date', '2011-11-11');   // (Date object)
parse('RegExp', '/[a-z]/gi');  // /[a-z]/gi
parse('RegExp', 're');         // /re/
parse('Int', '2');             // 2

parse('Number | String', 'str'); // 'str'
parse('Number | String', '2');   // 2

parse('[Number]', '[1,2,3]');                      // [1,2,3]
parse('(String, Boolean)', '(hi, false)');         // ['hi', false]
parse('{a: String, b: Number}', '{a: str, b: 2}'); // {a: 'str', b: 2}

// at the top level, you can ommit surrounding delimiters
parse('[Number]', '1,2,3');                      // [1,2,3]
parse('(String, Boolean)', 'hi, false');         // ['hi', false]
parse('{a: String, b: Number}', 'a: str, b: 2'); // {a: 'str', b: 2}

// wildcard - auto choose type
parse('*', '[hi,(null,[42]),{k: true}]'); // ['hi', [null, [42]], {k: true}]

用法

require('levn'); 返回一个公开三个属性的对象。 VERSION 以字符串形式表示库的当前版本。 parse 和 parsedTypeParse 是功能。

// parse(type, input, options);
parse('[Number]', '1,2,3'); // [1, 2, 3]

// parsedTypeParse(parsedType, input, options);
var parsedType = require('type-check').parseType('[Number]');
parsedTypeParse(parsedType, '1,2,3'); // [1, 2, 3]

解析(类型,输入,选项)

parse 强制转换字符串 input 转换为一个JavaScript值 type 在 类型格式 (并考虑到可选的 options)并返回结果的JavaScript值。

参数
  • 类型, String -写在 类型格式 要对照哪一个
  • 输入- String 写入的值 levn格式
  • 选项- Maybe Object -可选参数,指定附加参数 选项
返回

* -生成的JavaScript值

例子
parse('[Number]', '1,2,3'); // [1, 2, 3]

parsedTypeParse(parsedType, input, options)

parsedTypeParse 强制转换字符串 input 转换为一个JavaScript值 type 哪些已经被解析过了(考虑到可选的 options)并返回结果的JavaScript值。方法解析类型 类型检查 图书馆的 parseType 函数。

参数
  • 类型, Object -要检查的已解析类型格式中的类型
  • 输入- String 写入的值 levn格式
  • 选项- Maybe Object -可选参数,指定附加参数 选项
返回

* -生成的JavaScript值

例子
var parsedType = require('type-check').parseType('[Number]');
parsedTypeParse(parsedType, '1,2,3'); // [1, 2, 3]

Levn格式

Levn可以使用您提供的类型信息来选择要从输入中生成的适当值。对于相同的输入,它将根据所提供的类型选择不同的输出值。例如, parse('Number', '2') 会产生数字 2,但 parse('String', '2') 会产生字符串 "2"。

如果不提供类型信息,则直接使用 *, levn将根据明确的“显式”模式解析输入,我们现在将详细说明-您还可以设置 explicit 选项手动设置为true 选项。

  • "string", 'string' 解析为字符串,例如: "a msg" 是 "a msg"
  • #date# 被解析为日期,例如。 #2011-11-11# 是 new Date('2011-11-11')
  • /regexp/flags 解析为RegExp,例如: /re/gi 是 /re/gi
  • undefined, null, NaN, true, false 它们都是JavaScript的等价物吗
  • [element1, element2, etc] 是Array,并且将强制转换过程递归地应用于每个元素。如。 [1,2,3] 是 [1,2,3]。
  • (element1, element2, etc) 是一个元组,并且将强制转换过程递归地应用于每个元素。如。 (1, a) 是 (1, a) (是 [1, 'a']).
  • {key1: val1, key2: val2, ...} 是一个对象,并且转换过程递归地应用于每个属性。如。 {a: 1, b: 2} 是 {a: 1, b: 2}。
  • 任何不属于上述范畴及不包含特殊字符([``]``(``)``{``}``:``,)是字符串,例如。 $12- blah 是 "$12- blah"。

如果您确实提供了类型信息,您可以使您的输入更简洁,因为程序已经有了一些关于它所期望的信息。请参阅 类型格式 的部分 类型检查 有关如何指定类型的详细信息。关于莱文如何处理这些信息,有一些规则:

  • 如果期望的是字符串,并且只是字符串,则输入的所有字符(包括任何特殊字符)都将成为输出的一部分。如。 [({})] 是 "[({})]", "hi" 是 '"hi"'。
  • 如果需要Date,则周围 # 可以从日期文字中省略。如。 2011-11-11 是 new Date('2011-11-11')。
  • 如果期望使用RegExp,则不需要指定标志,并且regex不使用任何特殊字符(开始和结束) / 可以省略-这将影响将正则表达式的源设置为输入。如。 regex 是 /regex/。
  • 如果期望有一个Array,并且它是根节点(在顶层),则打开 [ 和关闭 ] 可以省略。如。 1,2,3 是 [1,2,3]。
  • 如果期望有一个元组,并且它是根节点(在顶层),则打开 ( 和关闭 ) 可以省略。如。 1, a 是 (1, a) (是 [1, 'a']).
  • 如果期望有一个Object,并且它是根节点(在顶层),则打开 { 和关闭 } 可以省略。如 a: 1, b: 2 是 {a: 1, b: 2}。

如果您列出多个类型(例如: Number | String),它将首先尝试转换到第一个类型,然后进行验证——如果验证失败,它将转移到下一个类型,依此类推,从左到右。您必须小心,因为某些类型可以通过任何输入成功,例如String。因此,将String放在列表的末尾。在非显式模式下,Date和RegExp可以成功地处理大量的输入——也要小心,如果它们不在列表的最后,请将它们列在末尾。

特殊字符和元素之间的空白是无关紧要的。

选项

Options是一个对象。的可选参数 parse 和 parsedTypeParse 功能。

显式的

一个 Boolean. 默认情况下是 false。

例子:

parse('RegExp', 're', {explicit: false});          // /re/
parse('RegExp', 're', {explicit: true});           // Error: ... does not type check...
parse('RegExp | String', 're', {explicit: true});  // 're'

explicit 设置是否处于显式模式。使用 * 自动激活显式模式。欲了解更多信息,请阅读 levn格式 部分。

customTypes

一个 Object. 空 {} 默认情况下。

例子:

var options = {
  customTypes: {
    Even: {
      typeOf: 'Number',
      validate: function (x) {
        return x % 2 === 0;
      },
      cast: function (x) {
        return {type: 'Just', value: parseInt(x)};
      }
    }
  }
}
parse('Even', '2', options); // 2
parse('Even', '3', options); // Error: Value: "3" does not type check...

另一个例子:

function Person(name, age){
  this.name = name;
  this.age = age;
}
var options = {
  customTypes: {
    Person: {
      typeOf: 'Object',
      validate: function (x) {
        x instanceof Person;
      },
      cast: function (value, options, typesCast) {
        var name, age;
        if ({}.toString.call(value).slice(8, -1) !== 'Object') {
          return {type: 'Nothing'};
        }
        name = typesCast(value.name, [{type: 'String'}], options);
        age = typesCast(value.age, [{type: 'Numger'}], options);
        return {type: 'Just', value: new Person(name, age)};
    }
  }
}
parse('Person', '{name: Laura, age: 25}', options); // Person {name: 'Laura', age: 25}

customTypes 是一个对象,其键是类型的名称,其值是一个具有三个属性的对象, typeOf, validate, cast. 欲了解更多有关 typeOf 和 validate,请参阅 自定义类型 类型检查部分。

cast 是一个函数,它接受三个参数:问题的值、选项和typesCast函数。在 cast,尝试将值强制转换为指定的类型。如果成功,则返回格式的对象 {type: 'Just', value: CAST-VALUE}如果你知道行不通,那就回去 {type: 'Nothing'}。你可以使用 typesCast 函数强制转换任何子值。记得传递 options 到它。在你的函数中你也可以检查 options.explicit 并采取相应的行动。

技术对

levn 写在 LiveScript -一种编译成JavaScript的语言。它使用 类型检查 解析类型和验证值。它还使用 prelude.ls 图书馆。

版本与发布记录

levn 共发布 10 个版本,首次发布于 2013/10/05;过去 12 个月发布了 0 个版本。

版本发布日期距今
0.4.1latest2020/04/046 年前
0.4.02020/04/046 年前
0.3.02015/12/2910 年前
0.2.52014/04/2912 年前
0.2.42014/04/0812 年前
0.2.32014/03/2112 年前

关于 levn 的常见问题

levn 是什么?

轻ECMAScript (JavaScript)值表示法-人类编写的,简洁的,类型的,灵活的

如何安装 levn?

在项目目录运行 npm install levn,或使用 pnpm add / yarn add / bun add。

levn 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/levn 是否存在。

levn 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

levn 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 0.8.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

levn 可以商用吗?

levn 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

levn 的下载量有多少?

根据 npm 官方下载统计,levn 在 2026/10/04 – 2026/11/02 这 30 天内被下载 570,465,688 次,日均约 19,015,523 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

levn 还在维护吗?

最新版本 0.4.1 发布于 2020/04/04(6 年前);至今共发布 10 个版本,其中过去 12 个月发布了 0 个;首次发布于 2013/10/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。