aboutsummaryrefslogtreecommitdiff
path: root/node_modules/call-signature/index.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-28 00:38:50 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-28 00:40:43 +0200
commit7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch)
tree6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/call-signature/index.js
parent963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff)
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/call-signature/index.js')
-rw-r--r--node_modules/call-signature/index.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/node_modules/call-signature/index.js b/node_modules/call-signature/index.js
new file mode 100644
index 000000000..327cb56ed
--- /dev/null
+++ b/node_modules/call-signature/index.js
@@ -0,0 +1,83 @@
+'use strict';
+module.exports.parse = parse;
+module.exports.generate = generate;
+
+// TODO(jamestalmage): Allow full range of identifier characters instead of just ASCII
+//
+// This will likely require a build step
+//
+// SPEC: http://www.ecma-international.org/ecma-262/5.1/#sec-7.6
+//
+// TOOLING:
+// https://github.com/mathiasbynens/regenerate
+// https://www.npmjs.com/package/regjsgen
+
+var regex = /^\s*(?:([A-Za-z$_][A-Za-z0-9$_]*)\s*\.)?\s*([A-Za-z$_][A-Za-z0-9$_]*)\s*\(\s*((?:[A-Za-z$_][A-Za-z0-9$_]*)|(?:\[\s*[A-Za-z$_][A-Za-z0-9$_]*\s*]))?((?:\s*,\s*(?:(?:[A-Za-z$_][A-Za-z0-9$_]*)|(?:\[\s*[A-Za-z$_][A-Za-z0-9$_]*\s*])))+)?\s*\)\s*$/;
+
+function parse(str) {
+ var match = regex.exec(str);
+ if (!match) {
+ return null;
+ }
+
+ var callee;
+ if (match[1]) {
+ callee = {
+ type: 'MemberExpression',
+ object: match[1],
+ member: match[2]
+ };
+ } else {
+ callee = {
+ type: 'Identifier',
+ name: match[2]
+ };
+ }
+
+ var args = match[4] || '';
+ args = args.split(',');
+ if (match[3]) {
+ args[0] = match[3];
+ }
+ var trimmed = [];
+ args.forEach(function (str) {
+ var optional = false;
+ str = str.replace(/\s+/g, '');
+ if (!str.length) {
+ return;
+ }
+ if (str.charAt(0) === '[' && str.charAt(str.length - 1) === ']') {
+ optional = true;
+ str = str.substring(1, str.length - 1);
+ }
+ trimmed.push({
+ name: str,
+ optional: optional
+ });
+ });
+
+ return {
+ callee: callee,
+ args: trimmed
+ };
+}
+
+function generate(parsed) {
+ var callee;
+ if (parsed.callee.type === 'MemberExpression') {
+ callee = [
+ parsed.callee.object,
+ '.',
+ parsed.callee.member
+ ];
+ } else {
+ callee = [parsed.callee.name];
+ }
+ return callee.concat([
+ '(',
+ parsed.args.map(function (arg) {
+ return arg.optional ? '[' + arg.name + ']' : arg.name;
+ }).join(', '),
+ ')'
+ ]).join('');
+}