@mnaoumov/typescript-dev-toolkit 5.1.0 → 5.3.0

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.
Files changed (31) hide show
  1. package/dist/lib/cjs/index.cjs +4 -1
  2. package/dist/lib/cjs/index.d.cts +1 -0
  3. package/dist/lib/cjs/link-check-skip.cjs +166 -0
  4. package/dist/lib/cjs/link-check-skip.d.cts +109 -0
  5. package/dist/lib/cjs/linters/eslint-config.cjs +2 -1
  6. package/dist/lib/cjs/linters/eslint-rules/import-fix.cjs +116 -0
  7. package/dist/lib/cjs/linters/eslint-rules/import-fix.d.cts +49 -0
  8. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +3 -1
  9. package/dist/lib/cjs/linters/eslint-rules/index.cjs +7 -1
  10. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +2 -0
  11. package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.cjs +189 -0
  12. package/dist/lib/cjs/linters/eslint-rules/prefer-dedent.d.cts +10 -0
  13. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +7 -30
  14. package/dist/lib/cjs/linters/markdownlint.cjs +42 -13
  15. package/dist/lib/esm/index.d.mts +1 -0
  16. package/dist/lib/esm/index.mjs +3 -1
  17. package/dist/lib/esm/link-check-skip.d.mts +109 -0
  18. package/dist/lib/esm/link-check-skip.mjs +125 -0
  19. package/dist/lib/esm/linters/eslint-config.mjs +2 -1
  20. package/dist/lib/esm/linters/eslint-rules/import-fix.d.mts +49 -0
  21. package/dist/lib/esm/linters/eslint-rules/import-fix.mjs +90 -0
  22. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +3 -1
  23. package/dist/lib/esm/linters/eslint-rules/index.d.mts +2 -0
  24. package/dist/lib/esm/linters/eslint-rules/index.mjs +5 -1
  25. package/dist/lib/esm/linters/eslint-rules/prefer-dedent.d.mts +10 -0
  26. package/dist/lib/esm/linters/eslint-rules/prefer-dedent.mjs +168 -0
  27. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +11 -30
  28. package/dist/lib/esm/linters/markdownlint.mjs +54 -15
  29. package/linters/eslint-rules/import-fix/package.json +6 -0
  30. package/linters/eslint-rules/prefer-dedent/package.json +6 -0
  31. package/package.json +1 -1
@@ -23,6 +23,7 @@ import * as gate from "./gate.mjs";
23
23
  import * as git from "./git.mjs";
24
24
  import * as json from "./json.mjs";
25
25
  import * as library_build from "./library-build.mjs";
26
+ import * as link_check_skip from "./link-check-skip.mjs";
26
27
  import * as linters from "./linters/index.mjs";
27
28
  import * as nano_staged_config from "./nano-staged-config.mjs";
28
29
  import * as npm_publish from "./npm-publish.mjs";
@@ -61,6 +62,7 @@ export {
61
62
  git,
62
63
  json,
63
64
  library_build as "library-build",
65
+ link_check_skip as "link-check-skip",
64
66
  linters,
65
67
  nano_staged_config as "nano-staged-config",
66
68
  npm,
@@ -79,4 +81,4 @@ export {
79
81
  validate_dependencies as "validate-dependencies",
80
82
  version
81
83
  };
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksV0FBYTtBQUN6QixZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWSxjQUFnQjtBQUM1QixZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWUMsZUFBaUI7QUFDN0IsWUFBWUMsb0JBQXNCO0FBQ2xDLFlBQVlDLHVCQUF5QjtBQUNyQyxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxlQUFpQjtBQUM3QixZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZLGdCQUFrQjtBQUM5QixZQUFZLFFBQVU7QUFDdEIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksU0FBVztBQUN2QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVksYUFBZTtBQUMzQixZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGFBQWU7QUFDM0IsWUFBWSxTQUFXO0FBQ3ZCLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxxQkFBdUI7QUFDbkMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLGdCQUFrQjtBQUM5QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyx1QkFBeUI7QUFDckMsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWSxhQUFlOyIsCiAgIm5hbWVzIjogWyJidWxrLWNvbmN1cnJlbmN5IiwgImNoZWNrLXByb2plY3QtdHlwZXMiLCAiY2xpLXV0aWxzIiwgImNvZGUtZ2VuZXJhdG9yIiwgImNvbW1pdGxpbnQtY29uZmlnIiwgImNvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zIiwgImNvbW1pdGxpbnQtbGludC1tZC1oZWFkZXIiLCAiY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlciIsICJkb2NzLXNpdGUiLCAiZW52LXRvZ2dsZSIsICJmb3JiaWRkZW4tcGF0dGVybnMiLCAibGlicmFyeS1idWlsZCIsICJuYW5vLXN0YWdlZC1jb25maWciLCAibnBtLXB1Ymxpc2giLCAibnBtLXJ1biIsICJwYWNrYWdlLWxvY2staW50ZWdyaXR5IiwgInBhY2thZ2UtbWFuYWdlciIsICJyZWxlYXNlZC1pc3N1ZXMiLCAicmVwby1wYXRocyIsICJzaGFyZWQtY29uZmlnLWZpbGVzIiwgInRlc3QtcnVubmVycyIsICJ1cHN0cmVhbS1zeW5jLWNsaSIsICJ1cHN0cmVhbS1zeW5jIiwgInZhbGlkYXRlLWRlY2xhcmF0aW9ucyIsICJ2YWxpZGF0ZS1kZXBlbmRlbmNpZXMiXQp9Cg==
84
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidWxrLWNvbmN1cnJlbmN5JyBmcm9tICcuL2J1bGstY29uY3VycmVuY3kudHMnO1xuZXhwb3J0ICogYXMgJ2J1bmRsZXJzJyBmcm9tICcuL2J1bmRsZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdjaGVjay1wcm9qZWN0LXR5cGVzJyBmcm9tICcuL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuZXhwb3J0ICogYXMgJ2NsaS11dGlscycgZnJvbSAnLi9jbGktdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ2NvZGUtZ2VuZXJhdG9yJyBmcm9tICcuL2NvZGUtZ2VuZXJhdG9yLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LWNvbmZpZycgZnJvbSAnLi9jb21taXRsaW50LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vY29tbWl0bGludC1mb3JiaWRkZW4tcGF0dGVybnMudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtbGludC1tZC1oZWFkZXInIGZyb20gJy4vY29tbWl0bGludC1saW50LW1kLWhlYWRlci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1zcGVsbGNoZWNrLWhlYWRlcicgZnJvbSAnLi9jb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyLnRzJztcbmV4cG9ydCAqIGFzICdkb2NzLXNpdGUnIGZyb20gJy4vZG9jcy1zaXRlL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdlbnYtdG9nZ2xlJyBmcm9tICcuL2Vudi10b2dnbGUudHMnO1xuZXhwb3J0ICogYXMgJ2V4ZWMnIGZyb20gJy4vZXhlYy50cyc7XG5leHBvcnQgKiBhcyAnZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2ZvcmJpZGRlbi1wYXR0ZXJucy50cyc7XG5leHBvcnQgKiBhcyAnZm9ybWF0dGVycycgZnJvbSAnLi9mb3JtYXR0ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICdmcycgZnJvbSAnLi9mcy50cyc7XG5leHBvcnQgKiBhcyAnZ2F0ZScgZnJvbSAnLi9nYXRlLnRzJztcbmV4cG9ydCAqIGFzICdnaXQnIGZyb20gJy4vZ2l0LnRzJztcbmV4cG9ydCAqIGFzICdqc29uJyBmcm9tICcuL2pzb24udHMnO1xuZXhwb3J0ICogYXMgJ2xpYnJhcnktYnVpbGQnIGZyb20gJy4vbGlicmFyeS1idWlsZC50cyc7XG5leHBvcnQgKiBhcyAnbGluay1jaGVjay1za2lwJyBmcm9tICcuL2xpbmstY2hlY2stc2tpcC50cyc7XG5leHBvcnQgKiBhcyAnbGludGVycycgZnJvbSAnLi9saW50ZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICduYW5vLXN0YWdlZC1jb25maWcnIGZyb20gJy4vbmFuby1zdGFnZWQtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICducG0tcHVibGlzaCcgZnJvbSAnLi9ucG0tcHVibGlzaC50cyc7XG5leHBvcnQgKiBhcyAnbnBtLXJ1bicgZnJvbSAnLi9ucG0tcnVuLnRzJztcbmV4cG9ydCAqIGFzICducG0nIGZyb20gJy4vbnBtLnRzJztcbmV4cG9ydCAqIGFzICdwYWNrYWdlLWxvY2staW50ZWdyaXR5JyBmcm9tICcuL3BhY2thZ2UtbG9jay1pbnRlZ3JpdHkudHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbWFuYWdlcicgZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuZXhwb3J0ICogYXMgJ3JlbGVhc2VkLWlzc3VlcycgZnJvbSAnLi9yZWxlYXNlZC1pc3N1ZXMudHMnO1xuZXhwb3J0ICogYXMgJ3JlcG8tcGF0aHMnIGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncm9vdCcgZnJvbSAnLi9yb290LnRzJztcbmV4cG9ydCAqIGFzICdzaGFyZWQtY29uZmlnLWZpbGVzJyBmcm9tICcuL3NoYXJlZC1jb25maWctZmlsZXMudHMnO1xuZXhwb3J0ICogYXMgJ3Rlc3QtcnVubmVycycgZnJvbSAnLi90ZXN0LXJ1bm5lcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMtY2xpJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMtY2xpLnRzJztcbmV4cG9ydCAqIGFzICd1cHN0cmVhbS1zeW5jJyBmcm9tICcuL3Vwc3RyZWFtLXN5bmMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlY2xhcmF0aW9ucycgZnJvbSAnLi92YWxpZGF0ZS1kZWNsYXJhdGlvbnMudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbGlkYXRlLWRlcGVuZGVuY2llcycgZnJvbSAnLi92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMnO1xuZXhwb3J0ICogYXMgJ3ZlcnNpb24nIGZyb20gJy4vdmVyc2lvbi50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksV0FBYTtBQUN6QixZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWSxjQUFnQjtBQUM1QixZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWUMsZUFBaUI7QUFDN0IsWUFBWUMsb0JBQXNCO0FBQ2xDLFlBQVlDLHVCQUF5QjtBQUNyQyxZQUFZQyxtQ0FBcUM7QUFDakQsWUFBWUMsK0JBQWlDO0FBQzdDLFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxlQUFpQjtBQUM3QixZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZLGdCQUFrQjtBQUM5QixZQUFZLFFBQVU7QUFDdEIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksU0FBVztBQUN2QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsd0JBQTBCO0FBQ3RDLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxhQUFlO0FBQzNCLFlBQVksU0FBVztBQUN2QixZQUFZQyw0QkFBOEI7QUFDMUMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHlCQUEyQjtBQUN2QyxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsdUJBQXlCO0FBQ3JDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksYUFBZTsiLAogICJuYW1lcyI6IFsiYnVsay1jb25jdXJyZW5jeSIsICJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LWxpbnQtbWQtaGVhZGVyIiwgImNvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIiLCAiZG9jcy1zaXRlIiwgImVudi10b2dnbGUiLCAiZm9yYmlkZGVuLXBhdHRlcm5zIiwgImxpYnJhcnktYnVpbGQiLCAibGluay1jaGVjay1za2lwIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMtY2xpIiwgInVwc3RyZWFtLXN5bmMiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
@@ -0,0 +1,109 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Links the markdown link check leaves unchecked for one run, named by the {@link LINK_CHECK_SKIP_ENV_VARIABLE}
6
+ * environment variable.
7
+ *
8
+ * Two cases need it: a host the current network cannot reach although it is up (a provider blocking it), and a
9
+ * release whose documentation links to something only that same release pushes. Both are temporary, so the
10
+ * variable belongs on the one command that needs it, never in `.env`: a skip left in place lets a link go stale
11
+ * with nothing to say so. It is read like every other variable here, `.env` included, and every skipped link,
12
+ * like every entry that skipped nothing, prints a warning, so a skip is never silent.
13
+ *
14
+ * Entries are comma-separated. An entry holding `://` is a URL prefix and matches every link starting with it; any
15
+ * other entry is a host and matches the links to exactly that host (`mail.tm` does not match `docs.mail.tm`).
16
+ */
17
+ /**
18
+ * The environment variable naming the links to skip.
19
+ */
20
+ export declare const LINK_CHECK_SKIP_ENV_VARIABLE = "LINK_CHECK_SKIP";
21
+ /**
22
+ * One entry of {@link LINK_CHECK_SKIP_ENV_VARIABLE}.
23
+ */
24
+ export interface LinkCheckSkipEntry {
25
+ /**
26
+ * `host` matches links to exactly that host; `prefix` matches links starting with {@link value}.
27
+ */
28
+ readonly kind: 'host' | 'prefix';
29
+ /**
30
+ * The entry as written, a host lowercased.
31
+ */
32
+ readonly value: string;
33
+ }
34
+ /**
35
+ * The text of one markdown file the link check reads.
36
+ */
37
+ export interface LinkCheckSourceFile {
38
+ /**
39
+ * The file's content.
40
+ */
41
+ readonly content: string;
42
+ /**
43
+ * The file's path, as the warnings name it.
44
+ */
45
+ readonly path: string;
46
+ }
47
+ /**
48
+ * Tells whether an entry matches a URL.
49
+ *
50
+ * @param url - The URL.
51
+ * @param entry - The entry.
52
+ * @returns `true` when a `prefix` entry starts the URL, or a `host` entry is exactly the URL's host.
53
+ */
54
+ export declare function doesLinkCheckSkipEntryMatch(url: string, entry: LinkCheckSkipEntry): boolean;
55
+ /**
56
+ * Finds the absolute `http`/`https` URLs written in a text.
57
+ *
58
+ * It is a textual scan, so it also finds a URL inside a code span, which `linkinator` does not check.
59
+ *
60
+ * @param text - The text to scan.
61
+ * @returns The URLs, in order of appearance, trailing punctuation dropped.
62
+ */
63
+ export declare function extractUrls(text: string): string[];
64
+ /**
65
+ * Builds the warnings for a run with skip entries: one per distinct link each file loses to an entry, and one per
66
+ * entry that matched no link at all.
67
+ *
68
+ * @param entries - The entries, as {@link parseLinkCheckSkipEntries} returned them.
69
+ * @param files - The markdown files the link check is handed.
70
+ * @returns The warning lines, without a trailing newline.
71
+ */
72
+ export declare function getLinkCheckSkipWarnings(entries: readonly LinkCheckSkipEntry[], files: readonly LinkCheckSourceFile[]): string[];
73
+ /**
74
+ * Adds the entries to a `linkinator` config, keeping whatever the project's own config already skips.
75
+ *
76
+ * The skip list goes to `linkinator` as a config file because `--config` replaces the project's
77
+ * `linkinator.config.json` rather than adding to it, so the project's settings have to be carried over.
78
+ *
79
+ * @param projectConfig - The parsed project `linkinator.config.json`, or `undefined` when there is none.
80
+ * @param entries - The entries.
81
+ * @returns The config to write.
82
+ * @throws If the project config is not a JSON object.
83
+ */
84
+ export declare function mergeLinkinatorSkipConfig(projectConfig: unknown, entries: readonly LinkCheckSkipEntry[]): Record<string, unknown>;
85
+ /**
86
+ * Parses the value of {@link LINK_CHECK_SKIP_ENV_VARIABLE}.
87
+ *
88
+ * @param value - The comma-separated value; blank entries are ignored.
89
+ * @returns The entries.
90
+ * @throws If an entry is neither a URL prefix nor a host name.
91
+ */
92
+ export declare function parseLinkCheckSkipEntries(value: string): LinkCheckSkipEntry[];
93
+ /**
94
+ * Reads the entries of {@link LINK_CHECK_SKIP_ENV_VARIABLE}, loading the optional `.env` first.
95
+ *
96
+ * @returns The entries; none when the variable is unset or blank.
97
+ */
98
+ export declare function readLinkCheckSkipEntries(): LinkCheckSkipEntry[];
99
+ /**
100
+ * Converts an entry into a regular expression for the `skip` list of a `linkinator` config file.
101
+ *
102
+ * Never pass it as a `--skip` argument: on Windows the command line passes through the `npx` and `.bin` shims,
103
+ * which re-expand it unquoted, so the `|` in it pipes into a command named by what follows.
104
+ *
105
+ * @param entry - The entry.
106
+ * @returns The regular expression source: an anchored prefix, or the scheme, optional credentials, the host and an
107
+ * optional port followed by the end of the authority.
108
+ */
109
+ export declare function toLinkinatorSkipPattern(entry: LinkCheckSkipEntry): string;
@@ -0,0 +1,125 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ import { escapeRegExp } from "@mnaoumov/typescript-lib/reg-exp";
40
+ import process from "node:process";
41
+ import { loadEnvFileIfExists } from "./env-toggle.mjs";
42
+ const LINK_CHECK_SKIP_ENV_VARIABLE = "LINK_CHECK_SKIP";
43
+ const HOST_REG_EXP = /^[a-z\d-]+(?:\.[a-z\d-]+)*$/i;
44
+ const URL_REG_EXP = /\bhttps?:\/\/[^\s<>()[\]{}"'`]+/gi;
45
+ const URL_TRAILING_PUNCTUATION_REG_EXP = /[.,;:!?*_~]+$/;
46
+ function doesLinkCheckSkipEntryMatch(url, entry) {
47
+ return entry.kind === "prefix" ? url.startsWith(entry.value) : URL.parse(url)?.hostname === entry.value;
48
+ }
49
+ function extractUrls(text) {
50
+ return Array.from(text.matchAll(URL_REG_EXP), (match) => match[0].replace(URL_TRAILING_PUNCTUATION_REG_EXP, ""));
51
+ }
52
+ function getLinkCheckSkipWarnings(entries, files) {
53
+ const warnings = [];
54
+ const usedEntries = /* @__PURE__ */ new Set();
55
+ for (const file of files) {
56
+ for (const url of new Set(extractUrls(file.content))) {
57
+ const entry = entries.find((candidate) => doesLinkCheckSkipEntryMatch(url, candidate));
58
+ if (!entry) {
59
+ continue;
60
+ }
61
+ usedEntries.add(entry);
62
+ warnings.push(`WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} skips ${url} in ${file.path} (entry ${entry.value}).`);
63
+ }
64
+ }
65
+ for (const entry of entries) {
66
+ if (!usedEntries.has(entry)) {
67
+ warnings.push(`WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} entry ${entry.value} matched no link; remove it.`);
68
+ }
69
+ }
70
+ if (entries.length > 0) {
71
+ warnings.push(
72
+ `WARNING: ${LINK_CHECK_SKIP_ENV_VARIABLE} is set. Set it for one command only, never in .env: a lasting skip lets links go stale unnoticed.`
73
+ );
74
+ }
75
+ return warnings;
76
+ }
77
+ function mergeLinkinatorSkipConfig(projectConfig, entries) {
78
+ const config = projectConfig ?? {};
79
+ if (typeof config !== "object" || Array.isArray(config)) {
80
+ throw new TypeError("The project linkinator.config.json is not a JSON object.");
81
+ }
82
+ const record = config;
83
+ const projectSkip = record["skip"];
84
+ const existingSkip = projectSkip === void 0 ? [] : [projectSkip].flat();
85
+ return { ...record, skip: [...existingSkip, ...entries.map((entry) => toLinkinatorSkipPattern(entry))] };
86
+ }
87
+ function parseLinkCheckSkipEntries(value) {
88
+ const entries = [];
89
+ for (const rawEntry of value.split(",")) {
90
+ const entry = rawEntry.trim();
91
+ if (entry === "") {
92
+ continue;
93
+ }
94
+ if (entry.includes("://")) {
95
+ entries.push({ kind: "prefix", value: entry });
96
+ continue;
97
+ }
98
+ if (!HOST_REG_EXP.test(entry)) {
99
+ throw new Error(`${LINK_CHECK_SKIP_ENV_VARIABLE} entry ${entry} is neither a host name nor a URL prefix (one holding ://).`);
100
+ }
101
+ entries.push({ kind: "host", value: entry.toLowerCase() });
102
+ }
103
+ return entries;
104
+ }
105
+ function readLinkCheckSkipEntries() {
106
+ loadEnvFileIfExists();
107
+ return parseLinkCheckSkipEntries(process.env[LINK_CHECK_SKIP_ENV_VARIABLE] ?? "");
108
+ }
109
+ function toLinkinatorSkipPattern(entry) {
110
+ if (entry.kind === "prefix") {
111
+ return `^${escapeRegExp(entry.value)}`;
112
+ }
113
+ return String.raw`^https?://(?:[^/?#@]*@)?${escapeRegExp(entry.value)}(?::\d+)?(?:[/?#]|$)`;
114
+ }
115
+ export {
116
+ LINK_CHECK_SKIP_ENV_VARIABLE,
117
+ doesLinkCheckSkipEntryMatch,
118
+ extractUrls,
119
+ getLinkCheckSkipWarnings,
120
+ mergeLinkinatorSkipConfig,
121
+ parseLinkCheckSkipEntries,
122
+ readLinkCheckSkipEntries,
123
+ toLinkinatorSkipPattern
124
+ };
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saW5rLWNoZWNrLXNraXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExpbmtzIHRoZSBtYXJrZG93biBsaW5rIGNoZWNrIGxlYXZlcyB1bmNoZWNrZWQgZm9yIG9uZSBydW4sIG5hbWVkIGJ5IHRoZSB7QGxpbmsgTElOS19DSEVDS19TS0lQX0VOVl9WQVJJQUJMRX1cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICpcbiAqIFR3byBjYXNlcyBuZWVkIGl0OiBhIGhvc3QgdGhlIGN1cnJlbnQgbmV0d29yayBjYW5ub3QgcmVhY2ggYWx0aG91Z2ggaXQgaXMgdXAgKGEgcHJvdmlkZXIgYmxvY2tpbmcgaXQpLCBhbmQgYVxuICogcmVsZWFzZSB3aG9zZSBkb2N1bWVudGF0aW9uIGxpbmtzIHRvIHNvbWV0aGluZyBvbmx5IHRoYXQgc2FtZSByZWxlYXNlIHB1c2hlcy4gQm90aCBhcmUgdGVtcG9yYXJ5LCBzbyB0aGVcbiAqIHZhcmlhYmxlIGJlbG9uZ3Mgb24gdGhlIG9uZSBjb21tYW5kIHRoYXQgbmVlZHMgaXQsIG5ldmVyIGluIGAuZW52YDogYSBza2lwIGxlZnQgaW4gcGxhY2UgbGV0cyBhIGxpbmsgZ28gc3RhbGVcbiAqIHdpdGggbm90aGluZyB0byBzYXkgc28uIEl0IGlzIHJlYWQgbGlrZSBldmVyeSBvdGhlciB2YXJpYWJsZSBoZXJlLCBgLmVudmAgaW5jbHVkZWQsIGFuZCBldmVyeSBza2lwcGVkIGxpbmssXG4gKiBsaWtlIGV2ZXJ5IGVudHJ5IHRoYXQgc2tpcHBlZCBub3RoaW5nLCBwcmludHMgYSB3YXJuaW5nLCBzbyBhIHNraXAgaXMgbmV2ZXIgc2lsZW50LlxuICpcbiAqIEVudHJpZXMgYXJlIGNvbW1hLXNlcGFyYXRlZC4gQW4gZW50cnkgaG9sZGluZyBgOi8vYCBpcyBhIFVSTCBwcmVmaXggYW5kIG1hdGNoZXMgZXZlcnkgbGluayBzdGFydGluZyB3aXRoIGl0OyBhbnlcbiAqIG90aGVyIGVudHJ5IGlzIGEgaG9zdCBhbmQgbWF0Y2hlcyB0aGUgbGlua3MgdG8gZXhhY3RseSB0aGF0IGhvc3QgKGBtYWlsLnRtYCBkb2VzIG5vdCBtYXRjaCBgZG9jcy5tYWlsLnRtYCkuXG4gKi9cblxuaW1wb3J0IHsgZXNjYXBlUmVnRXhwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3JlZy1leHAnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHsgbG9hZEVudkZpbGVJZkV4aXN0cyB9IGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWluZyB0aGUgbGlua3MgdG8gc2tpcC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEUgPSAnTElOS19DSEVDS19TS0lQJztcblxuLyoqXG4gKiBPbmUgZW50cnkgb2Yge0BsaW5rIExJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDaGVja1NraXBFbnRyeSB7XG4gIC8qKlxuICAgKiBgaG9zdGAgbWF0Y2hlcyBsaW5rcyB0byBleGFjdGx5IHRoYXQgaG9zdDsgYHByZWZpeGAgbWF0Y2hlcyBsaW5rcyBzdGFydGluZyB3aXRoIHtAbGluayB2YWx1ZX0uXG4gICAqL1xuICByZWFkb25seSBraW5kOiAnaG9zdCcgfCAncHJlZml4JztcblxuICAvKipcbiAgICogVGhlIGVudHJ5IGFzIHdyaXR0ZW4sIGEgaG9zdCBsb3dlcmNhc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgdGV4dCBvZiBvbmUgbWFya2Rvd24gZmlsZSB0aGUgbGluayBjaGVjayByZWFkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2hlY2tTb3VyY2VGaWxlIHtcbiAgLyoqXG4gICAqIFRoZSBmaWxlJ3MgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUncyBwYXRoLCBhcyB0aGUgd2FybmluZ3MgbmFtZSBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY29uc3QgSE9TVF9SRUdfRVhQID0gL15bYS16XFxkLV0rKD86XFwuW2EtelxcZC1dKykqJC9pO1xuY29uc3QgVVJMX1JFR19FWFAgPSAvXFxiaHR0cHM/OlxcL1xcL1teXFxzPD4oKVtcXF17fVwiJ2BdKy9naTtcbmNvbnN0IFVSTF9UUkFJTElOR19QVU5DVFVBVElPTl9SRUdfRVhQID0gL1suLDs6IT8qX35dKyQvO1xuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgYW4gZW50cnkgbWF0Y2hlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTC5cbiAqIEBwYXJhbSBlbnRyeSAtIFRoZSBlbnRyeS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGEgYHByZWZpeGAgZW50cnkgc3RhcnRzIHRoZSBVUkwsIG9yIGEgYGhvc3RgIGVudHJ5IGlzIGV4YWN0bHkgdGhlIFVSTCdzIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb2VzTGlua0NoZWNrU2tpcEVudHJ5TWF0Y2godXJsOiBzdHJpbmcsIGVudHJ5OiBMaW5rQ2hlY2tTa2lwRW50cnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGVudHJ5LmtpbmQgPT09ICdwcmVmaXgnID8gdXJsLnN0YXJ0c1dpdGgoZW50cnkudmFsdWUpIDogVVJMLnBhcnNlKHVybCk/Lmhvc3RuYW1lID09PSBlbnRyeS52YWx1ZTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYWJzb2x1dGUgYGh0dHBgL2BodHRwc2AgVVJMcyB3cml0dGVuIGluIGEgdGV4dC5cbiAqXG4gKiBJdCBpcyBhIHRleHR1YWwgc2Nhbiwgc28gaXQgYWxzbyBmaW5kcyBhIFVSTCBpbnNpZGUgYSBjb2RlIHNwYW4sIHdoaWNoIGBsaW5raW5hdG9yYCBkb2VzIG5vdCBjaGVjay5cbiAqXG4gKiBAcGFyYW0gdGV4dCAtIFRoZSB0ZXh0IHRvIHNjYW4uXG4gKiBAcmV0dXJucyBUaGUgVVJMcywgaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSwgdHJhaWxpbmcgcHVuY3R1YXRpb24gZHJvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGV4dC5tYXRjaEFsbChVUkxfUkVHX0VYUCksIChtYXRjaCkgPT4gbWF0Y2hbMF0ucmVwbGFjZShVUkxfVFJBSUxJTkdfUFVOQ1RVQVRJT05fUkVHX0VYUCwgJycpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHdhcm5pbmdzIGZvciBhIHJ1biB3aXRoIHNraXAgZW50cmllczogb25lIHBlciBkaXN0aW5jdCBsaW5rIGVhY2ggZmlsZSBsb3NlcyB0byBhbiBlbnRyeSwgYW5kIG9uZSBwZXJcbiAqIGVudHJ5IHRoYXQgbWF0Y2hlZCBubyBsaW5rIGF0IGFsbC5cbiAqXG4gKiBAcGFyYW0gZW50cmllcyAtIFRoZSBlbnRyaWVzLCBhcyB7QGxpbmsgcGFyc2VMaW5rQ2hlY2tTa2lwRW50cmllc30gcmV0dXJuZWQgdGhlbS5cbiAqIEBwYXJhbSBmaWxlcyAtIFRoZSBtYXJrZG93biBmaWxlcyB0aGUgbGluayBjaGVjayBpcyBoYW5kZWQuXG4gKiBAcmV0dXJucyBUaGUgd2FybmluZyBsaW5lcywgd2l0aG91dCBhIHRyYWlsaW5nIG5ld2xpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5rQ2hlY2tTa2lwV2FybmluZ3MoZW50cmllczogcmVhZG9ubHkgTGlua0NoZWNrU2tpcEVudHJ5W10sIGZpbGVzOiByZWFkb25seSBMaW5rQ2hlY2tTb3VyY2VGaWxlW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB1c2VkRW50cmllcyA9IG5ldyBTZXQ8TGlua0NoZWNrU2tpcEVudHJ5PigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGZvciAoY29uc3QgdXJsIG9mIG5ldyBTZXQoZXh0cmFjdFVybHMoZmlsZS5jb250ZW50KSkpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKChjYW5kaWRhdGUpID0+IGRvZXNMaW5rQ2hlY2tTa2lwRW50cnlNYXRjaCh1cmwsIGNhbmRpZGF0ZSkpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdXNlZEVudHJpZXMuYWRkKGVudHJ5KTtcbiAgICAgIHdhcm5pbmdzLnB1c2goYFdBUk5JTkc6ICR7TElOS19DSEVDS19TS0lQX0VOVl9WQVJJQUJMRX0gc2tpcHMgJHt1cmx9IGluICR7ZmlsZS5wYXRofSAoZW50cnkgJHtlbnRyeS52YWx1ZX0pLmApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghdXNlZEVudHJpZXMuaGFzKGVudHJ5KSkge1xuICAgICAgd2FybmluZ3MucHVzaChgV0FSTklORzogJHtMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSBlbnRyeSAke2VudHJ5LnZhbHVlfSBtYXRjaGVkIG5vIGxpbms7IHJlbW92ZSBpdC5gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGBXQVJOSU5HOiAke0xJTktfQ0hFQ0tfU0tJUF9FTlZfVkFSSUFCTEV9IGlzIHNldC4gU2V0IGl0IGZvciBvbmUgY29tbWFuZCBvbmx5LCBuZXZlciBpbiAuZW52OiBhIGxhc3Rpbmcgc2tpcCBsZXRzIGxpbmtzIGdvIHN0YWxlIHVubm90aWNlZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB3YXJuaW5ncztcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBlbnRyaWVzIHRvIGEgYGxpbmtpbmF0b3JgIGNvbmZpZywga2VlcGluZyB3aGF0ZXZlciB0aGUgcHJvamVjdCdzIG93biBjb25maWcgYWxyZWFkeSBza2lwcy5cbiAqXG4gKiBUaGUgc2tpcCBsaXN0IGdvZXMgdG8gYGxpbmtpbmF0b3JgIGFzIGEgY29uZmlnIGZpbGUgYmVjYXVzZSBgLS1jb25maWdgIHJlcGxhY2VzIHRoZSBwcm9qZWN0J3NcbiAqIGBsaW5raW5hdG9yLmNvbmZpZy5qc29uYCByYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQsIHNvIHRoZSBwcm9qZWN0J3Mgc2V0dGluZ3MgaGF2ZSB0byBiZSBjYXJyaWVkIG92ZXIuXG4gKlxuICogQHBhcmFtIHByb2plY3RDb25maWcgLSBUaGUgcGFyc2VkIHByb2plY3QgYGxpbmtpbmF0b3IuY29uZmlnLmpzb25gLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcGFyYW0gZW50cmllcyAtIFRoZSBlbnRyaWVzLlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB0byB3cml0ZS5cbiAqIEB0aHJvd3MgSWYgdGhlIHByb2plY3QgY29uZmlnIGlzIG5vdCBhIEpTT04gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMaW5raW5hdG9yU2tpcENvbmZpZyhwcm9qZWN0Q29uZmlnOiB1bmtub3duLCBlbnRyaWVzOiByZWFkb25seSBMaW5rQ2hlY2tTa2lwRW50cnlbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgY29uZmlnID0gcHJvamVjdENvbmZpZyA/PyB7fTtcbiAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9qZWN0IGxpbmtpbmF0b3IuY29uZmlnLmpzb24gaXMgbm90IGEgSlNPTiBvYmplY3QuJyk7XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBjb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHByb2plY3RTa2lwID0gcmVjb3JkWydza2lwJ107XG4gIGNvbnN0IGV4aXN0aW5nU2tpcCA9IHByb2plY3RTa2lwID09PSB1bmRlZmluZWQgPyBbXSA6IFtwcm9qZWN0U2tpcF0uZmxhdCgpO1xuICByZXR1cm4geyAuLi5yZWNvcmQsIHNraXA6IFsuLi5leGlzdGluZ1NraXAsIC4uLmVudHJpZXMubWFwKChlbnRyeSkgPT4gdG9MaW5raW5hdG9yU2tpcFBhdHRlcm4oZW50cnkpKV0gfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHZhbHVlIG9mIHtAbGluayBMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWEtc2VwYXJhdGVkIHZhbHVlOyBibGFuayBlbnRyaWVzIGFyZSBpZ25vcmVkLlxuICogQHJldHVybnMgVGhlIGVudHJpZXMuXG4gKiBAdGhyb3dzIElmIGFuIGVudHJ5IGlzIG5laXRoZXIgYSBVUkwgcHJlZml4IG5vciBhIGhvc3QgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua0NoZWNrU2tpcEVudHJpZXModmFsdWU6IHN0cmluZyk6IExpbmtDaGVja1NraXBFbnRyeVtdIHtcbiAgY29uc3QgZW50cmllczogTGlua0NoZWNrU2tpcEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0VudHJ5IG9mIHZhbHVlLnNwbGl0KCcsJykpIHtcbiAgICBjb25zdCBlbnRyeSA9IHJhd0VudHJ5LnRyaW0oKTtcbiAgICBpZiAoZW50cnkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoZW50cnkuaW5jbHVkZXMoJzovLycpKSB7XG4gICAgICBlbnRyaWVzLnB1c2goeyBraW5kOiAncHJlZml4JywgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFIT1NUX1JFR19FWFAudGVzdChlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSBlbnRyeSAke2VudHJ5fSBpcyBuZWl0aGVyIGEgaG9zdCBuYW1lIG5vciBhIFVSTCBwcmVmaXggKG9uZSBob2xkaW5nIDovLykuYCk7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsga2luZDogJ2hvc3QnLCB2YWx1ZTogZW50cnkudG9Mb3dlckNhc2UoKSB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBlbnRyaWVzIG9mIHtAbGluayBMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFfSwgbG9hZGluZyB0aGUgb3B0aW9uYWwgYC5lbnZgIGZpcnN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBlbnRyaWVzOyBub25lIHdoZW4gdGhlIHZhcmlhYmxlIGlzIHVuc2V0IG9yIGJsYW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZExpbmtDaGVja1NraXBFbnRyaWVzKCk6IExpbmtDaGVja1NraXBFbnRyeVtdIHtcbiAgbG9hZEVudkZpbGVJZkV4aXN0cygpO1xuICByZXR1cm4gcGFyc2VMaW5rQ2hlY2tTa2lwRW50cmllcyhwcm9jZXNzLmVudltMSU5LX0NIRUNLX1NLSVBfRU5WX1ZBUklBQkxFXSA/PyAnJyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gZW50cnkgaW50byBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdGhlIGBza2lwYCBsaXN0IG9mIGEgYGxpbmtpbmF0b3JgIGNvbmZpZyBmaWxlLlxuICpcbiAqIE5ldmVyIHBhc3MgaXQgYXMgYSBgLS1za2lwYCBhcmd1bWVudDogb24gV2luZG93cyB0aGUgY29tbWFuZCBsaW5lIHBhc3NlcyB0aHJvdWdoIHRoZSBgbnB4YCBhbmQgYC5iaW5gIHNoaW1zLFxuICogd2hpY2ggcmUtZXhwYW5kIGl0IHVucXVvdGVkLCBzbyB0aGUgYHxgIGluIGl0IHBpcGVzIGludG8gYSBjb21tYW5kIG5hbWVkIGJ5IHdoYXQgZm9sbG93cy5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBUaGUgZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgcmVndWxhciBleHByZXNzaW9uIHNvdXJjZTogYW4gYW5jaG9yZWQgcHJlZml4LCBvciB0aGUgc2NoZW1lLCBvcHRpb25hbCBjcmVkZW50aWFscywgdGhlIGhvc3QgYW5kIGFuXG4gKiBvcHRpb25hbCBwb3J0IGZvbGxvd2VkIGJ5IHRoZSBlbmQgb2YgdGhlIGF1dGhvcml0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGlua2luYXRvclNraXBQYXR0ZXJuKGVudHJ5OiBMaW5rQ2hlY2tTa2lwRW50cnkpOiBzdHJpbmcge1xuICBpZiAoZW50cnkua2luZCA9PT0gJ3ByZWZpeCcpIHtcbiAgICByZXR1cm4gYF4ke2VzY2FwZVJlZ0V4cChlbnRyeS52YWx1ZSl9YDtcbiAgfVxuXG4gIC8vIGBsaW5raW5hdG9yYCBtYXRjaGVzIHRoZSBVUkwgaXQgaGFzIG5vcm1hbGl6ZWQsIHdob3NlIHNjaGVtZSBhbmQgaG9zdCBhcmUgbG93ZXJjYXNlIGFscmVhZHkuXG4gIHJldHVybiBTdHJpbmcucmF3YF5odHRwcz86Ly8oPzpbXi8/I0BdKkApPyR7ZXNjYXBlUmVnRXhwKGVudHJ5LnZhbHVlKX0oPzo6XFxkKyk/KD86Wy8/I118JClgO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLG9CQUFvQjtBQUM3QixPQUFPLGFBQWE7QUFFcEIsU0FBUywyQkFBMkI7QUFLN0IsTUFBTSwrQkFBK0I7QUFnQzVDLE1BQU0sZUFBZTtBQUNyQixNQUFNLGNBQWM7QUFDcEIsTUFBTSxtQ0FBbUM7QUFTbEMsU0FBUyw0QkFBNEIsS0FBYSxPQUFvQztBQUMzRixTQUFPLE1BQU0sU0FBUyxXQUFXLElBQUksV0FBVyxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sR0FBRyxHQUFHLGFBQWEsTUFBTTtBQUNwRztBQVVPLFNBQVMsWUFBWSxNQUF3QjtBQUNsRCxTQUFPLE1BQU0sS0FBSyxLQUFLLFNBQVMsV0FBVyxHQUFHLENBQUMsVUFBVSxNQUFNLENBQUMsRUFBRSxRQUFRLGtDQUFrQyxFQUFFLENBQUM7QUFDakg7QUFVTyxTQUFTLHlCQUF5QixTQUF3QyxPQUFpRDtBQUNoSSxRQUFNLFdBQXFCLENBQUM7QUFDNUIsUUFBTSxjQUFjLG9CQUFJLElBQXdCO0FBRWhELGFBQVcsUUFBUSxPQUFPO0FBQ3hCLGVBQVcsT0FBTyxJQUFJLElBQUksWUFBWSxLQUFLLE9BQU8sQ0FBQyxHQUFHO0FBQ3BELFlBQU0sUUFBUSxRQUFRLEtBQUssQ0FBQyxjQUFjLDRCQUE0QixLQUFLLFNBQVMsQ0FBQztBQUNyRixVQUFJLENBQUMsT0FBTztBQUNWO0FBQUEsTUFDRjtBQUVBLGtCQUFZLElBQUksS0FBSztBQUNyQixlQUFTLEtBQUssWUFBWSw0QkFBNEIsVUFBVSxHQUFHLE9BQU8sS0FBSyxJQUFJLFdBQVcsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUMvRztBQUFBLEVBQ0Y7QUFFQSxhQUFXLFNBQVMsU0FBUztBQUMzQixRQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssR0FBRztBQUMzQixlQUFTLEtBQUssWUFBWSw0QkFBNEIsVUFBVSxNQUFNLEtBQUssOEJBQThCO0FBQUEsSUFDM0c7QUFBQSxFQUNGO0FBRUEsTUFBSSxRQUFRLFNBQVMsR0FBRztBQUN0QixhQUFTO0FBQUEsTUFDUCxZQUFZLDRCQUE0QjtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQWFPLFNBQVMsMEJBQTBCLGVBQXdCLFNBQWlFO0FBQ2pJLFFBQU0sU0FBUyxpQkFBaUIsQ0FBQztBQUNqQyxNQUFJLE9BQU8sV0FBVyxZQUFZLE1BQU0sUUFBUSxNQUFNLEdBQUc7QUFDdkQsVUFBTSxJQUFJLFVBQVUsMERBQTBEO0FBQUEsRUFDaEY7QUFFQSxRQUFNLFNBQVM7QUFDZixRQUFNLGNBQWMsT0FBTyxNQUFNO0FBQ2pDLFFBQU0sZUFBZSxnQkFBZ0IsU0FBWSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSztBQUN6RSxTQUFPLEVBQUUsR0FBRyxRQUFRLE1BQU0sQ0FBQyxHQUFHLGNBQWMsR0FBRyxRQUFRLElBQUksQ0FBQyxVQUFVLHdCQUF3QixLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3pHO0FBU08sU0FBUywwQkFBMEIsT0FBcUM7QUFDN0UsUUFBTSxVQUFnQyxDQUFDO0FBRXZDLGFBQVcsWUFBWSxNQUFNLE1BQU0sR0FBRyxHQUFHO0FBQ3ZDLFVBQU0sUUFBUSxTQUFTLEtBQUs7QUFDNUIsUUFBSSxVQUFVLElBQUk7QUFDaEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxNQUFNLFNBQVMsS0FBSyxHQUFHO0FBQ3pCLGNBQVEsS0FBSyxFQUFFLE1BQU0sVUFBVSxPQUFPLE1BQU0sQ0FBQztBQUM3QztBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssR0FBRztBQUM3QixZQUFNLElBQUksTUFBTSxHQUFHLDRCQUE0QixVQUFVLEtBQUssNkRBQTZEO0FBQUEsSUFDN0g7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLFFBQVEsT0FBTyxNQUFNLFlBQVksRUFBRSxDQUFDO0FBQUEsRUFDM0Q7QUFFQSxTQUFPO0FBQ1Q7QUFPTyxTQUFTLDJCQUFpRDtBQUMvRCxzQkFBb0I7QUFDcEIsU0FBTywwQkFBMEIsUUFBUSxJQUFJLDRCQUE0QixLQUFLLEVBQUU7QUFDbEY7QUFZTyxTQUFTLHdCQUF3QixPQUFtQztBQUN6RSxNQUFJLE1BQU0sU0FBUyxVQUFVO0FBQzNCLFdBQU8sSUFBSSxhQUFhLE1BQU0sS0FBSyxDQUFDO0FBQUEsRUFDdEM7QUFHQSxTQUFPLE9BQU8sOEJBQThCLGFBQWEsTUFBTSxLQUFLLENBQUM7QUFDdkU7IiwibmFtZXMiOltdfQ==