dolphindb 3.0.204 → 3.0.208

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs.js CHANGED
@@ -1,4 +1,4 @@
1
- import { constants, keywords } from './language.js';
1
+ import { constants, keywords } from "./language.js";
2
2
  export class DocsProvider {
3
3
  /** 文档原始信息 */
4
4
  docs;
package/docs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["docs.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants, keywords } from './language.js'\n\n\nexport interface FunctionSignature {\n full: string\n name: string\n parameters: {\n full: string\n name: string\n optional?: boolean\n default?: string\n }[]\n}\n\nexport interface Doc {\n /** 文档的公网链接 */\n url: string\n \n /** 部分函数存在多个签名,例如 append! 和 x.append!, eachPre 和 func:P 这两组,最好在分析阶段就处理好 */\n signatures: FunctionSignature[] | null\n \n /** 文档内容 */\n markdown: string\n}\n\nexport type Docs = Record<string, Doc>\n\n\nexport class DocsProvider {\n /** 文档原始信息 */\n docs?: Docs\n \n /** 函数名列表 */\n functions: string[]\n \n /** 转化成小写字母的函数名列表 */\n functions_lower: string[]\n \n constants_lower: string[]\n \n \n /** - docs: docs.zh.json 等文件对应的文档对象 */\n constructor (docs: Docs) {\n this.docs = docs\n this.functions = Object.keys(docs)\n this.functions_lower = this.functions.map(func => func.toLowerCase())\n this.constants_lower = constants.map(constant => constant.toLowerCase())\n }\n \n \n get_function_markdown (name: string) {\n return this.docs[name]?.markdown\n }\n \n \n get_signatures (name: string) {\n return this.docs[name]?.signatures\n }\n \n \n /** 根据用户输入提供补全列表,返回匹配的关键字、常量和函数 */\n complete (query: string) {\n let functions: string[]\n let _constants: string[]\n \n if (query.length === 1) {\n const c = query[0].toLowerCase()\n functions = this.functions.filter((func, i) =>\n this.functions_lower[i].startsWith(c)\n )\n _constants = constants.filter((constant, i) =>\n this.constants_lower[i].startsWith(c)\n )\n } else {\n const query_lower = query.toLowerCase()\n \n functions = this.functions.filter((func, i) => {\n const func_lower = this.functions_lower[i]\n let j = 0\n for (const c of query_lower) {\n j = func_lower.indexOf(c, j) + 1\n if (!j) // 找不到则 j === 0\n return false\n }\n \n return true\n })\n \n _constants = constants.filter((constant, i) => {\n const constant_lower = this.constants_lower[i]\n let j = 0\n for (const c of query_lower) {\n j = constant_lower.indexOf(c, j) + 1\n if (!j) // 找不到则 j === 0\n return false\n }\n \n return true\n })\n }\n \n return {\n keywords: keywords.filter(kw => kw.startsWith(query)),\n constants: _constants,\n functions,\n }\n }\n \n \n get_signature_help (text: string) {\n const caller = reverse_search_func(text)\n if (!caller)\n return\n \n const { func_name, param_start_at } = caller\n \n const cursor_param_index = find_active_param_index(text, param_start_at)\n if (cursor_param_index === -1)\n return\n \n const signatures = this.get_signatures(func_name)\n if (!signatures)\n return\n \n const signature = signatures[0]\n const params_length = signature.parameters.length\n // 如果输入参数数量超出了签名内声明的参数数量,active_parameter 为 undefined\n const active_parameter = cursor_param_index > params_length - 1 ? undefined : cursor_param_index\n const documentation_md = this.get_function_markdown(func_name)\n \n return {\n signature,\n active_parameter,\n documentation_md,\n }\n }\n}\n\n\nconst FUNC_NAME_CHAR_REG_EXP = /[a-zA-Z0-9!_]/\n\nfunction reverse_search_func (text: string): null | {\n param_start_at: number\n func_name: string\n} {\n let depth = 0\n let param_start_at = -1\n \n for (let i = text.length; i >= 0; i--) {\n const char = text[i]\n \n // 遇到右括号,入栈\n if (char === ')') {\n depth++\n continue\n }\n // 遇到左括号,出栈\n else if (char === '(') {\n depth--\n continue\n }\n \n // 栈深度小于0,且遇到合法函数名字符,跳出括号语境,搜索结束:参数搜索开始位置\n if (FUNC_NAME_CHAR_REG_EXP.test(char) && depth < 0) {\n param_start_at = i\n break\n }\n }\n \n // 找不到参数搜索开始位置,返回null\n if (param_start_at === -1)\n return null\n \n \n // 往前找函数名\n let func_name_end = -1\n let func_name_start = 0\n for (let i = param_start_at; i >= 0; i--) {\n const char = text[i]\n \n // 空字符跳过\n if (func_name_end === -1 && char === ' ')\n continue\n \n // 合法函数名字字符,继续往前找\n if (FUNC_NAME_CHAR_REG_EXP.test(char)) {\n // 标记函数名字末尾位置\n if (func_name_end === -1)\n func_name_end = i\n \n continue\n }\n \n // 不合法函数名字符,标记函数名字开头位置\n func_name_start = i + 1\n break\n }\n \n // 找不到函数名\n if (func_name_end === -1)\n return null\n \n \n return {\n param_start_at: param_start_at + 1,\n func_name: text.slice(func_name_start, func_name_end + 1),\n }\n}\n\n\n// 栈 token 匹配表\nconst PAIR_TOKEN_MAP: Record<string, string> = {\n ')': '(',\n '}': '{',\n ']': '[',\n}\n\nconst PAIR_START_TOKENS = new Set(Object.values(PAIR_TOKEN_MAP))\n\nconst LAST_IDENTIFIER_NAME_REGEXP = /[a-zA-Z_\\u4e00-\\u9fa5][\\w\\u4e00-\\u9fa5]*!?$/\n\n\n/** 根据函数参数开始位置分析参数语义,提取出当前参数索引 */\nfunction find_active_param_index (text: string, param_start_at: number) {\n let index = 0\n const stack = [ ]\n \n let commas_count = 0\n \n // 是否在转义符作用范围内\n let is_escaping_string = false\n \n // 搜索\n for (let i = param_start_at; i < text.length; i++) {\n const char = text[i]\n \n // 空字符跳过\n if (/\\s/.test(char))\n continue\n \n // 转义符作用范围下一个字符直接忽略\n if (is_escaping_string) {\n is_escaping_string = false\n continue\n }\n \n const last_stack = stack[stack.length - 1]\n // 字符串内除引号全部忽略\n if (last_stack === '\"' || last_stack === \"'\") {\n // 进入转义符作用范围\n if (char === '\\\\') {\n is_escaping_string = true\n continue\n }\n \n // 遇到相同引号\n if (char === last_stack)\n stack.pop()\n \n \n continue\n }\n \n // 开括号入栈\n if (PAIR_START_TOKENS.has(char) || char === '\"' || char === \"'\") {\n stack.push(char)\n continue\n } else if (char in PAIR_TOKEN_MAP)\n if (last_stack === PAIR_TOKEN_MAP[char]) {\n // 括号匹配,出栈\n stack.pop()\n continue\n } else\n return -1\n \n \n \n // 栈深度为1 且为左小括号:当前语境\n if (stack.length === 1 && stack[0] === '(' && char === ',')\n commas_count++\n \n \n // 根据逗号数量判断高亮参数索引值\n index = commas_count\n }\n \n const caller = text.slice(0, param_start_at)\n /** 匹配当前函数名的正则, 并捕获该函数名 */\n const match = LAST_IDENTIFIER_NAME_REGEXP.exec(caller)\n \n const is_member_call = match && caller[param_start_at - 1 /* 去掉括号 */ - match[0].length] === '.'\n \n // 是否为对象方法调用,若是,参数索引+1(对象会变成第一个参数)\n return is_member_call ? index + 1 : index\n}\n"]}
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AA4BnD,MAAM,OAAO,YAAY;IACrB,aAAa;IACb,IAAI,CAAO;IAEX,YAAY;IACZ,SAAS,CAAU;IAEnB,oBAAoB;IACpB,eAAe,CAAU;IAEzB,eAAe,CAAU;IAGzB,sCAAsC;IACtC,YAAa,IAAU;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IAC5E,CAAC;IAGD,qBAAqB,CAAE,IAAY;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACpC,CAAC;IAGD,cAAc,CAAE,IAAY;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;IACtC,CAAC;IAGD,kCAAkC;IAClC,QAAQ,CAAE,KAAa;QACnB,IAAI,SAAmB,CAAA;QACvB,IAAI,UAAoB,CAAA;QAExB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;YAChC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAC1C,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACxC,CAAA;YACD,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAC1C,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CACxC,CAAA;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;YAEvC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;gBAC1C,IAAI,CAAC,GAAG,CAAC,CAAA;gBACT,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC1B,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;oBAChC,IAAI,CAAC,CAAC,EAAG,eAAe;wBACpB,OAAO,KAAK,CAAA;gBACpB,CAAC;gBAED,OAAO,IAAI,CAAA;YACf,CAAC,CAAC,CAAA;YAEF,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;gBAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;gBAC9C,IAAI,CAAC,GAAG,CAAC,CAAA;gBACT,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;oBAC1B,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;oBACpC,IAAI,CAAC,CAAC,EAAG,eAAe;wBACpB,OAAO,KAAK,CAAA;gBACpB,CAAC;gBAED,OAAO,IAAI,CAAA;YACf,CAAC,CAAC,CAAA;QACN,CAAC;QAED,OAAO;YACH,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACrD,SAAS,EAAE,UAAU;YACrB,SAAS;SACZ,CAAA;IACL,CAAC;IAGD,kBAAkB,CAAE,IAAY;QAC5B,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM;YACP,OAAM;QAEV,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,MAAM,CAAA;QAE5C,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QACxE,IAAI,kBAAkB,KAAK,CAAC,CAAC;YACzB,OAAM;QAEV,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,UAAU;YACX,OAAM;QAEV,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QAC/B,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAA;QACjD,qDAAqD;QACrD,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAA;QAChG,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;QAE9D,OAAO;YACH,SAAS;YACT,gBAAgB;YAChB,gBAAgB;SACnB,CAAA;IACL,CAAC;CACJ;AAGD,MAAM,sBAAsB,GAAG,eAAe,CAAA;AAE9C,SAAS,mBAAmB,CAAE,IAAY;IAItC,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,cAAc,GAAG,CAAC,CAAC,CAAA;IAEvB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,IAAI,CAAC,EAAG,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEpB,WAAW;QACX,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAA;YACP,SAAQ;QACZ,CAAC;QACD,WAAW;aACN,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,EAAE,CAAA;YACP,SAAQ;QACZ,CAAC;QAED,yCAAyC;QACzC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACjD,cAAc,GAAG,CAAC,CAAA;YAClB,MAAK;QACT,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,IAAI,cAAc,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAA;IAGf,SAAS;IACT,IAAI,aAAa,GAAG,CAAC,CAAC,CAAA;IACtB,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,KAAK,IAAI,CAAC,GAAG,cAAc,EAAG,CAAC,IAAI,CAAC,EAAG,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEpB,QAAQ;QACR,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,GAAG;YACpC,SAAQ;QAEZ,iBAAiB;QACjB,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,aAAa;YACb,IAAI,aAAa,KAAK,CAAC,CAAC;gBACpB,aAAa,GAAG,CAAC,CAAA;YAErB,SAAQ;QACZ,CAAC;QAED,sBAAsB;QACtB,eAAe,GAAG,CAAC,GAAG,CAAC,CAAA;QACvB,MAAK;IACT,CAAC;IAED,SAAS;IACT,IAAI,aAAa,KAAK,CAAC,CAAC;QACpB,OAAO,IAAI,CAAA;IAGf,OAAO;QACH,cAAc,EAAE,cAAc,GAAG,CAAC;QAClC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,GAAG,CAAC,CAAC;KAC5D,CAAA;AACL,CAAC;AAGD,cAAc;AACd,MAAM,cAAc,GAA2B;IAC3C,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,GAAG;CACX,CAAA;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;AAEhE,MAAM,2BAA2B,GAAG,6CAA6C,CAAA;AAGjF,iCAAiC;AACjC,SAAS,uBAAuB,CAAE,IAAY,EAAE,cAAsB;IAClE,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,KAAK,GAAG,EAAG,CAAA;IAEjB,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,cAAc;IACd,IAAI,kBAAkB,GAAG,KAAK,CAAA;IAE9B,KAAK;IACL,KAAK,IAAI,CAAC,GAAG,cAAc,EAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAG,CAAC,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEpB,QAAQ;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACf,SAAQ;QAEZ,mBAAmB;QACnB,IAAI,kBAAkB,EAAE,CAAC;YACrB,kBAAkB,GAAG,KAAK,CAAA;YAC1B,SAAQ;QACZ,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAC1C,cAAc;QACd,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YAC3C,YAAY;YACZ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAChB,kBAAkB,GAAG,IAAI,CAAA;gBACzB,SAAQ;YACZ,CAAC;YAED,SAAS;YACT,IAAI,IAAI,KAAK,UAAU;gBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;YAGf,SAAQ;QACZ,CAAC;QAED,QAAQ;QACR,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,SAAQ;QACZ,CAAC;aAAM,IAAI,IAAI,IAAI,cAAc;YAC7B,IAAI,UAAU,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,UAAU;gBACV,KAAK,CAAC,GAAG,EAAE,CAAA;gBACX,SAAQ;YACZ,CAAC;;gBACG,OAAO,CAAC,CAAC,CAAA;QAIjB,oBAAoB;QACpB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;YACtD,YAAY,EAAE,CAAA;QAGlB,kBAAkB;QAClB,KAAK,GAAG,YAAY,CAAA;IACxB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IAC5C,0BAA0B;IAC1B,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAEtD,MAAM,cAAc,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAA;IAE/F,kCAAkC;IAClC,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAC7C,CAAC","sourcesContent":["import { constants, keywords } from './language.ts'\n\n\nexport interface FunctionSignature {\n full: string\n name: string\n parameters: {\n full: string\n name: string\n optional?: boolean\n default?: string\n }[]\n}\n\nexport interface Doc {\n /** 文档的公网链接 */\n url: string\n \n /** 部分函数存在多个签名,例如 append! 和 x.append!, eachPre 和 func:P 这两组,最好在分析阶段就处理好 */\n signatures: FunctionSignature[] | null\n \n /** 文档内容 */\n markdown: string\n}\n\nexport type Docs = Record<string, Doc>\n\n\nexport class DocsProvider {\n /** 文档原始信息 */\n docs?: Docs\n \n /** 函数名列表 */\n functions: string[]\n \n /** 转化成小写字母的函数名列表 */\n functions_lower: string[]\n \n constants_lower: string[]\n \n \n /** - docs: docs.zh.json 等文件对应的文档对象 */\n constructor (docs: Docs) {\n this.docs = docs\n this.functions = Object.keys(docs)\n this.functions_lower = this.functions.map(func => func.toLowerCase())\n this.constants_lower = constants.map(constant => constant.toLowerCase())\n }\n \n \n get_function_markdown (name: string) {\n return this.docs[name]?.markdown\n }\n \n \n get_signatures (name: string) {\n return this.docs[name]?.signatures\n }\n \n \n /** 根据用户输入提供补全列表,返回匹配的关键字、常量和函数 */\n complete (query: string) {\n let functions: string[]\n let _constants: string[]\n \n if (query.length === 1) {\n const c = query[0].toLowerCase()\n functions = this.functions.filter((func, i) =>\n this.functions_lower[i].startsWith(c)\n )\n _constants = constants.filter((constant, i) =>\n this.constants_lower[i].startsWith(c)\n )\n } else {\n const query_lower = query.toLowerCase()\n \n functions = this.functions.filter((func, i) => {\n const func_lower = this.functions_lower[i]\n let j = 0\n for (const c of query_lower) {\n j = func_lower.indexOf(c, j) + 1\n if (!j) // 找不到则 j === 0\n return false\n }\n \n return true\n })\n \n _constants = constants.filter((constant, i) => {\n const constant_lower = this.constants_lower[i]\n let j = 0\n for (const c of query_lower) {\n j = constant_lower.indexOf(c, j) + 1\n if (!j) // 找不到则 j === 0\n return false\n }\n \n return true\n })\n }\n \n return {\n keywords: keywords.filter(kw => kw.startsWith(query)),\n constants: _constants,\n functions,\n }\n }\n \n \n get_signature_help (text: string) {\n const caller = reverse_search_func(text)\n if (!caller)\n return\n \n const { func_name, param_start_at } = caller\n \n const cursor_param_index = find_active_param_index(text, param_start_at)\n if (cursor_param_index === -1)\n return\n \n const signatures = this.get_signatures(func_name)\n if (!signatures)\n return\n \n const signature = signatures[0]\n const params_length = signature.parameters.length\n // 如果输入参数数量超出了签名内声明的参数数量,active_parameter 为 undefined\n const active_parameter = cursor_param_index > params_length - 1 ? undefined : cursor_param_index\n const documentation_md = this.get_function_markdown(func_name)\n \n return {\n signature,\n active_parameter,\n documentation_md,\n }\n }\n}\n\n\nconst FUNC_NAME_CHAR_REG_EXP = /[a-zA-Z0-9!_]/\n\nfunction reverse_search_func (text: string): null | {\n param_start_at: number\n func_name: string\n} {\n let depth = 0\n let param_start_at = -1\n \n for (let i = text.length; i >= 0; i--) {\n const char = text[i]\n \n // 遇到右括号,入栈\n if (char === ')') {\n depth++\n continue\n }\n // 遇到左括号,出栈\n else if (char === '(') {\n depth--\n continue\n }\n \n // 栈深度小于0,且遇到合法函数名字符,跳出括号语境,搜索结束:参数搜索开始位置\n if (FUNC_NAME_CHAR_REG_EXP.test(char) && depth < 0) {\n param_start_at = i\n break\n }\n }\n \n // 找不到参数搜索开始位置,返回null\n if (param_start_at === -1)\n return null\n \n \n // 往前找函数名\n let func_name_end = -1\n let func_name_start = 0\n for (let i = param_start_at; i >= 0; i--) {\n const char = text[i]\n \n // 空字符跳过\n if (func_name_end === -1 && char === ' ')\n continue\n \n // 合法函数名字字符,继续往前找\n if (FUNC_NAME_CHAR_REG_EXP.test(char)) {\n // 标记函数名字末尾位置\n if (func_name_end === -1)\n func_name_end = i\n \n continue\n }\n \n // 不合法函数名字符,标记函数名字开头位置\n func_name_start = i + 1\n break\n }\n \n // 找不到函数名\n if (func_name_end === -1)\n return null\n \n \n return {\n param_start_at: param_start_at + 1,\n func_name: text.slice(func_name_start, func_name_end + 1),\n }\n}\n\n\n// 栈 token 匹配表\nconst PAIR_TOKEN_MAP: Record<string, string> = {\n ')': '(',\n '}': '{',\n ']': '[',\n}\n\nconst PAIR_START_TOKENS = new Set(Object.values(PAIR_TOKEN_MAP))\n\nconst LAST_IDENTIFIER_NAME_REGEXP = /[a-zA-Z_\\u4e00-\\u9fa5][\\w\\u4e00-\\u9fa5]*!?$/\n\n\n/** 根据函数参数开始位置分析参数语义,提取出当前参数索引 */\nfunction find_active_param_index (text: string, param_start_at: number) {\n let index = 0\n const stack = [ ]\n \n let commas_count = 0\n \n // 是否在转义符作用范围内\n let is_escaping_string = false\n \n // 搜索\n for (let i = param_start_at; i < text.length; i++) {\n const char = text[i]\n \n // 空字符跳过\n if (/\\s/.test(char))\n continue\n \n // 转义符作用范围下一个字符直接忽略\n if (is_escaping_string) {\n is_escaping_string = false\n continue\n }\n \n const last_stack = stack[stack.length - 1]\n // 字符串内除引号全部忽略\n if (last_stack === '\"' || last_stack === \"'\") {\n // 进入转义符作用范围\n if (char === '\\\\') {\n is_escaping_string = true\n continue\n }\n \n // 遇到相同引号\n if (char === last_stack)\n stack.pop()\n \n \n continue\n }\n \n // 开括号入栈\n if (PAIR_START_TOKENS.has(char) || char === '\"' || char === \"'\") {\n stack.push(char)\n continue\n } else if (char in PAIR_TOKEN_MAP)\n if (last_stack === PAIR_TOKEN_MAP[char]) {\n // 括号匹配,出栈\n stack.pop()\n continue\n } else\n return -1\n \n \n \n // 栈深度为1 且为左小括号:当前语境\n if (stack.length === 1 && stack[0] === '(' && char === ',')\n commas_count++\n \n \n // 根据逗号数量判断高亮参数索引值\n index = commas_count\n }\n \n const caller = text.slice(0, param_start_at)\n /** 匹配当前函数名的正则, 并捕获该函数名 */\n const match = LAST_IDENTIFIER_NAME_REGEXP.exec(caller)\n \n const is_member_call = match && caller[param_start_at - 1 /* 去掉括号 */ - match[0].length] === '.'\n \n // 是否为对象方法调用,若是,参数索引+1(对象会变成第一个参数)\n return is_member_call ? index + 1 : index\n}\n"]}
package/i18n/dict.json CHANGED
@@ -106,5 +106,8 @@
106
106
  },
107
107
  "iotany 的 meta vector 长度至少为 2": {
108
108
  "en": "The length of the iotany meta vector is at least 2"
109
+ },
110
+ "value 不能转换为 {{classname}}": {
111
+ "en": "value cannot be converted to {{classname}}"
109
112
  }
110
113
  }
package/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { InspectOptions as UtilInspectOptions } from 'util';
2
+ import { type Dayjs } from 'dayjs';
2
3
  import { inspect, Lock, type WebSocket, type WebSocketConnectionError } from 'xshell';
3
4
  export declare const nulls: {
4
5
  readonly int8: -128;
@@ -9,7 +10,7 @@ export declare const nulls: {
9
10
  readonly float32: -3.4028234663852886e+38;
10
11
  /** -Number.MAX_VALUE */
11
12
  readonly double: number;
12
- readonly bytes16: Uint8Array;
13
+ readonly bytes16: Uint8Array<ArrayBuffer>;
13
14
  };
14
15
  export declare enum DdbForm {
15
16
  scalar = 0,
@@ -406,7 +407,7 @@ export interface ConvertOptions {
406
407
  /** `'ms'` timestamp 类型转换为字符串表示时显示到秒还是毫秒 */
407
408
  timestamp?: 's' | 'ms';
408
409
  }
409
- export declare function convert(type: DdbType, value: DdbValue, le: boolean, { blob, char, timestamp }?: ConvertOptions): string | number | bigint | boolean | Uint8Array | number[] | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | string[] | Uint8Array[] | DdbFunctionDefValue | DdbDurationValue | DdbDecimal32Value | DdbDecimal64Value | BigInt128Array | DdbObj<DdbValue>[] | IotVectorItemValue | DdbSymbolExtendedValue | DdbArrayVectorValue | DdbDecimal32VectorValue | DdbDecimal64VectorValue | DdbDecimal128VectorValue | DdbDurationVectorValue | DdbMatrixValue | DdbChartValue | DdbTensorValue;
410
+ export declare function convert(type: DdbType, value: DdbValue, le: boolean, { blob, char, timestamp }?: ConvertOptions): string | number | bigint | boolean | number[] | string[] | Uint8Array<ArrayBufferLike> | DdbFunctionDefValue | DdbDurationValue | DdbDecimal32Value | DdbDecimal64Value | Int8Array<ArrayBufferLike> | Int16Array<ArrayBufferLike> | Int32Array<ArrayBufferLike> | Float32Array<ArrayBufferLike> | Float64Array<ArrayBufferLike> | BigInt64Array<ArrayBufferLike> | BigInt128Array | Uint8Array<ArrayBufferLike>[] | DdbObj<DdbValue>[] | IotVectorItemValue | DdbSymbolExtendedValue | DdbArrayVectorValue | DdbDecimal32VectorValue | DdbDecimal64VectorValue | DdbDecimal128VectorValue | DdbDurationVectorValue | DdbMatrixValue | DdbChartValue | DdbTensorValue;
410
411
  /** 转换一个向量到 js 原生数组 */
411
412
  export declare function converts(type: DdbType, value: DdbVectorValue, rows: number, le: boolean, options?: ConvertOptions): any[] | Uint8Array;
412
413
  export declare class DdbVoid extends DdbObj<undefined> {
@@ -431,16 +432,16 @@ export declare class DdbDouble extends DdbObj<number> {
431
432
  constructor(value: number | null);
432
433
  }
433
434
  export declare class DdbDateTime extends DdbObj<number> {
434
- constructor(value: number | null);
435
+ constructor(value?: null | number | string | Date | Dayjs);
435
436
  }
436
437
  export declare class DdbTimeStamp extends DdbObj<bigint> {
437
- /** @example
438
- new DdbTimeStamp(new Date().getTime())
439
- new DdbTimeStamp(dayjs().valueOf()) */
440
- constructor(value?: bigint | null | number);
438
+ constructor(value?: null | number | string | Date | Dayjs);
441
439
  }
442
440
  export declare class DdbNanoTimeStamp extends DdbObj<bigint> {
443
- constructor(value: bigint | null);
441
+ constructor(value?: null | number | string | Date | Dayjs);
442
+ }
443
+ export declare class DdbDate extends DdbObj<number> {
444
+ constructor(value?: null | number | string | Date | Dayjs);
444
445
  }
445
446
  export declare class DdbBlob extends DdbObj<Uint8Array> {
446
447
  constructor(value: Uint8Array | ArrayBuffer);
package/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import dayjs from 'dayjs';
1
+ import { default as dayjs } from 'dayjs';
2
2
  import DayjsCustomParseFormat from 'dayjs/plugin/customParseFormat.js';
3
3
  dayjs.extend(DayjsCustomParseFormat);
4
4
  import ipaddrjs from 'ipaddr.js';
5
5
  const { fromByteArray: buf2ipaddr } = ipaddrjs;
6
- import { concat, assert, inspect, typed_array_to_buffer, connect_websocket, Lock, genid, seq, zip_object, WebSocketOpen, WebSocketClosed, WebSocketClosing, decode, delay } from 'xshell';
7
- import { t } from './i18n/index.js';
6
+ import { concat, assert, inspect, typed_array_to_buffer, connect_websocket, Lock, genid, seq, zip_object, WebSocketOpen, WebSocketClosed, WebSocketClosing, decode, delay, check } from 'xshell';
7
+ import { t } from "./i18n/index.js";
8
8
  export const nulls = {
9
9
  int8: -0x80, // -128
10
10
  int16: -0x80_00, // -32768
@@ -2195,24 +2195,16 @@ export class DdbDateTime extends DdbObj {
2195
2195
  super({
2196
2196
  form: DdbForm.scalar,
2197
2197
  type: DdbType.datetime,
2198
- value
2198
+ value: get_ddb_time_value('DdbDateTime', value)
2199
2199
  });
2200
2200
  }
2201
2201
  }
2202
2202
  export class DdbTimeStamp extends DdbObj {
2203
- /** @example
2204
- new DdbTimeStamp(new Date().getTime())
2205
- new DdbTimeStamp(dayjs().valueOf()) */
2206
2203
  constructor(value) {
2207
- if (value === undefined)
2208
- value = new Date().getTime();
2209
- if (typeof value === 'number')
2210
- value = BigInt(-(1000 * 60 * new Date(value).getTimezoneOffset()) +
2211
- value);
2212
2204
  super({
2213
2205
  form: DdbForm.scalar,
2214
2206
  type: DdbType.timestamp,
2215
- value
2207
+ value: get_ddb_time_value('DdbTimeStamp', value)
2216
2208
  });
2217
2209
  }
2218
2210
  }
@@ -2221,10 +2213,46 @@ export class DdbNanoTimeStamp extends DdbObj {
2221
2213
  super({
2222
2214
  form: DdbForm.scalar,
2223
2215
  type: DdbType.nanotimestamp,
2224
- value
2216
+ value: get_ddb_time_value('DdbNanoTimeStamp', value)
2225
2217
  });
2226
2218
  }
2227
2219
  }
2220
+ export class DdbDate extends DdbObj {
2221
+ constructor(value) {
2222
+ super({
2223
+ form: DdbForm.scalar,
2224
+ type: DdbType.date,
2225
+ value: get_ddb_time_value('DdbDate', value)
2226
+ });
2227
+ }
2228
+ }
2229
+ function get_ddb_time_value(classname, value) {
2230
+ if (value === null)
2231
+ return null;
2232
+ if (classname === 'DdbNanoTimeStamp' && typeof value === 'string')
2233
+ return str2nanotimestamp(value);
2234
+ let date;
2235
+ if (value === undefined)
2236
+ date = new Date();
2237
+ else if (typeof value === 'number' || typeof value === 'string')
2238
+ date = new Date(value);
2239
+ else if (value instanceof Date)
2240
+ date = value;
2241
+ else if (dayjs.isDayjs(value))
2242
+ date = new Date(value.valueOf());
2243
+ else
2244
+ throw new Error(t('value 不能转换为 {{classname}}', { classname }));
2245
+ switch (classname) {
2246
+ case 'DdbDateTime':
2247
+ return (date.getTime() - 1000 * 60 * date.getTimezoneOffset()) / 1000;
2248
+ case 'DdbTimeStamp':
2249
+ return BigInt(date.getTime() - 1000 * 60 * date.getTimezoneOffset());
2250
+ case 'DdbNanoTimeStamp':
2251
+ return BigInt(date.getTime() - 1000 * 60 * date.getTimezoneOffset()) * 1000000n;
2252
+ case 'DdbDate':
2253
+ return Math.floor((date.getTime() - 1000 * 60 * date.getTimezoneOffset()) / (1000 * 3600 * 24));
2254
+ }
2255
+ }
2228
2256
  export class DdbBlob extends DdbObj {
2229
2257
  constructor(value) {
2230
2258
  assert(value, t('new DdbBlob 不能传空的 value'));
@@ -2647,12 +2675,12 @@ export function nanotimestamp2str(nanotimestamp, format = 'YYYY.MM.DD HH:mm:ss.S
2647
2675
  export function str2nanotimestamp(str, format = 'YYYY.MM.DD HH:mm:ss.SSSSSSSSS') {
2648
2676
  if (!str || str === 'null')
2649
2677
  return nulls.int64;
2650
- assert(str.length === format.length, t('nanotimestamp 字符串长度必须等于格式串长度'));
2678
+ check(str.length === format.length, t('nanotimestamp 字符串长度必须等于格式串长度'));
2651
2679
  const i_second_start = format.indexOf('ss');
2652
- assert(i_second_start !== -1, t('格式串必须包含秒的格式 (ss)'));
2680
+ check(i_second_start !== -1, t('格式串必须包含秒的格式 (ss)'));
2653
2681
  const i_second_end = i_second_start + 2;
2654
2682
  const i_nanosecond_start = format.indexOf('SSSSSSSSS', i_second_end);
2655
- assert(i_nanosecond_start !== -1, t('格式串必须包含纳秒的格式 (SSSSSSSSS)'));
2683
+ check(i_nanosecond_start !== -1, t('格式串必须包含纳秒的格式 (SSSSSSSSS)'));
2656
2684
  const ms = dayjs(str.slice(0, i_second_end), format.slice(0, i_second_end)).valueOf();
2657
2685
  return (BigInt(-(1000 * 60 * new Date(ms).getTimezoneOffset()) +
2658
2686
  ms) * 1000000n