Dieses Repository beinhaltet HTML- und Javascript Code zur einer NotizenWebApp auf Basis von Web Storage. Zudem sind Mocha/Chai Tests im Browser enthalten. https://meinenotizen.netlify.app/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.js 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. 'use strict';
  2. const yargs = require('yargs/yargs');
  3. const flatten = require('flat');
  4. const { castArray, some, isPlainObject, camelCase, kebabCase, omitBy } = require('lodash');
  5. function isAlias(key, alias) {
  6. return some(alias, (aliases) => castArray(aliases).indexOf(key) !== -1);
  7. }
  8. function hasDefaultValue(key, value, defaults) {
  9. return value === defaults[key];
  10. }
  11. function isCamelCased(key, argv) {
  12. return /[A-Z]/.test(key) && camelCase(key) === key && // Is it camel case?
  13. argv[kebabCase(key)] != null; // Is the standard version defined?
  14. }
  15. function keyToFlag(key) {
  16. return key.length === 1 ? `-${key}` : `--${key}`;
  17. }
  18. function unparseOption(key, value, unparsed) {
  19. if (typeof value === 'string') {
  20. unparsed.push(keyToFlag(key), value);
  21. } else if (value === true) {
  22. unparsed.push(keyToFlag(key));
  23. } else if (value === false) {
  24. unparsed.push(`--no-${key}`);
  25. } else if (Array.isArray(value)) {
  26. value.forEach((item) => unparseOption(key, item, unparsed));
  27. } else if (isPlainObject(value)) {
  28. const flattened = flatten(value, { safe: true });
  29. for (const flattenedKey in flattened) {
  30. if (!isCamelCased(flattenedKey, flattened)) {
  31. unparseOption(`${key}.${flattenedKey}`, flattened[flattenedKey], unparsed);
  32. }
  33. }
  34. // Fallback case (numbers and other types)
  35. } else if (value != null) {
  36. unparsed.push(keyToFlag(key), `${value}`);
  37. }
  38. }
  39. function unparsePositional(argv, options, unparsed) {
  40. const knownPositional = [];
  41. // Unparse command if set, collecting all known positional arguments
  42. // e.g.: build <first> <second> <rest...>
  43. if (options.command) {
  44. const { 0: cmd, index } = options.command.match(/[^<[]*/);
  45. const { demanded, optional } = yargs()
  46. .getCommandInstance()
  47. .parseCommand(`foo ${options.command.substr(index + cmd.length)}`);
  48. // Push command (can be a deep command)
  49. unparsed.push(...cmd.trim().split(/\s+/));
  50. // Push positional arguments
  51. [...demanded, ...optional].forEach(({ cmd: cmds, variadic }) => {
  52. knownPositional.push(...cmds);
  53. const cmd = cmds[0];
  54. const args = (variadic ? argv[cmd] || [] : [argv[cmd]])
  55. .filter((arg) => arg != null)
  56. .map((arg) => `${arg}`);
  57. unparsed.push(...args);
  58. });
  59. }
  60. // Unparse unkown positional arguments
  61. argv._ && unparsed.push(...argv._.slice(knownPositional.length));
  62. return knownPositional;
  63. }
  64. function unparseOptions(argv, options, knownPositional, unparsed) {
  65. const optionsArgv = omitBy(argv, (value, key) =>
  66. // Remove positional arguments
  67. knownPositional.includes(key) ||
  68. // Remove special _, -- and $0
  69. ['_', '--', '$0'].includes(key) ||
  70. // Remove aliases
  71. isAlias(key, options.alias) ||
  72. // Remove default values
  73. hasDefaultValue(key, value, options.default) ||
  74. // Remove camel-cased
  75. isCamelCased(key, argv));
  76. for (const key in optionsArgv) {
  77. unparseOption(key, optionsArgv[key], unparsed);
  78. }
  79. }
  80. function unparseEndOfOptions(argv, options, unparsed) {
  81. // Unparse ending (--) arguments if set
  82. argv['--'] && unparsed.push('--', ...argv['--']);
  83. }
  84. // ------------------------------------------------------------
  85. function unparser(argv, options) {
  86. options = Object.assign({
  87. alias: {},
  88. default: {},
  89. command: null,
  90. }, options);
  91. const unparsed = [];
  92. // Unparse known & unknown positional arguments (foo <first> <second> [rest...])
  93. // All known positional will be returned so that they are not added as flags
  94. const knownPositional = unparsePositional(argv, options, unparsed);
  95. // Unparse option arguments (--foo hello --bar hi)
  96. unparseOptions(argv, options, knownPositional, unparsed);
  97. // Unparse "end-of-options" arguments (stuff after " -- ")
  98. unparseEndOfOptions(argv, options, unparsed);
  99. return unparsed;
  100. }
  101. module.exports = unparser;