@zentered/issue-forms-body-parser 2.2.0 → 3.0.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.
package/README.md CHANGED
@@ -118,9 +118,23 @@ jobs:
118
118
  - name: Issue Forms Body Parser
119
119
  id: parse
120
120
  uses: zentered/issue-forms-body-parser@v2.0.0
121
- - run: echo ${{ toJSON(steps.parse.outputs.data) }}
121
+ - name: Print parsed data
122
+ env:
123
+ DATA: ${{ steps.parse.outputs.data }}
124
+ run: echo "$DATA"
122
125
  ```
123
126
 
127
+ > **⚠️ Security:** The parsed `data` output is derived entirely from the issue
128
+ > body, which is **untrusted user input** - on `issues`-triggered workflows
129
+ > anyone who can open an issue controls it. Never interpolate it directly into a
130
+ > `run:` script (e.g. `run: echo ${{ steps.parse.outputs.data }}`): `toJSON()`
131
+ > escapes JSON, not shell metacharacters, so a value containing `$(...)` or
132
+ > backticks executes as a shell command. Always pass it through an `env:`
133
+ > variable and reference `"$DATA"` as shown above, and treat any field
134
+ > (including `links`/`images` URLs) as untrusted before using it in `ref:`, API
135
+ > calls, or other sinks. See [SECURITY.md](./SECURITY.md) for the full threat
136
+ > model.
137
+
124
138
  You can also provide a custom `body` input:
125
139
 
126
140
  ```yml
@@ -141,17 +155,27 @@ jobs:
141
155
  steps:
142
156
  - name: Fetch the issue
143
157
  id: read_issue_body
144
- run:
145
- echo "body=$(gh issue view ${{ inputs.issue_number }} --repo ${{
146
- github.repo }} --json body --jq '.body')" >> $GITHUB_OUTPUT
158
+ env:
159
+ ISSUE_NUMBER: ${{ inputs.issue_number }}
160
+ REPO: ${{ github.repository }}
161
+ run: |
162
+ delimiter="$(openssl rand -hex 8)"
163
+ {
164
+ echo "body<<$delimiter"
165
+ gh issue view "$ISSUE_NUMBER" --repo "$REPO" --json body --jq '.body'
166
+ echo "$delimiter"
167
+ } >> "$GITHUB_OUTPUT"
147
168
 
148
169
  - name: Issue Forms Body Parser
149
170
  id: parse
150
171
  uses: zentered/issue-forms-body-parser@v2.0.0
151
172
  with:
152
- body: ${{ steps.read_issue_body.output.body }}
173
+ body: ${{ steps.read_issue_body.outputs.body }}
153
174
 
154
- - run: echo ${{ toJSON(steps.parse.outputs.data) }}
175
+ - name: Print parsed data
176
+ env:
177
+ DATA: ${{ steps.parse.outputs.data }}
178
+ run: echo "$DATA"
155
179
  ```
156
180
 
157
181
  ### NPM
package/SECURITY.md ADDED
@@ -0,0 +1,80 @@
1
+ # Security Policy
2
+
3
+ ## Reporting a Vulnerability
4
+
5
+ Please report security vulnerabilities privately through GitHub's
6
+ [private vulnerability reporting](https://github.com/zentered/issue-forms-body-parser/security/advisories/new)
7
+ rather than opening a public issue. We will acknowledge receipt and work with
8
+ you on a fix and coordinated disclosure.
9
+
10
+ ## Threat Model
11
+
12
+ This action and the `@zentered/issue-forms-body-parser` package parse a GitHub
13
+ issue body into structured data. The issue body is **untrusted input**: on
14
+ `issues`-triggered workflows, anyone who can open an issue in your repository
15
+ controls its full content.
16
+
17
+ The parser itself does not execute, evaluate, or shell out to anything in the
18
+ issue body - it only walks a Markdown AST and returns a plain object. The
19
+ security boundary therefore sits in **how a consuming workflow uses the parsed
20
+ output**, not in the action's runtime.
21
+
22
+ ### What the action guarantees
23
+
24
+ - It never runs `eval`, a shell, or a subprocess on issue content.
25
+ - It emits its result through `@actions/core` `setOutput`, which uses a
26
+ random-delimiter guard. An attacker cannot break out of the `data` value to
27
+ inject additional step outputs or workflow commands.
28
+
29
+ ### What the action cannot guarantee
30
+
31
+ - The **content** of `data` is the user's parsed text by design (an event
32
+ description may legitimately contain `$`, backticks, or quotes). It is not and
33
+ cannot be sanitized into a "safe" string without corrupting the data.
34
+ - What your workflow does with that output is outside the action's control.
35
+
36
+ ## Using the output safely
37
+
38
+ Treat every field of `outputs.data` (including `links`/`images` URLs) as
39
+ attacker-controlled.
40
+
41
+ **Never** interpolate the output directly into a `run:` script. GitHub Actions
42
+ expands `${{ }}` into the script text _before_ the shell runs, and `toJSON()`
43
+ escapes JSON metacharacters but **not** shell metacharacters - so a value
44
+ containing `$(...)` or backticks executes as a command:
45
+
46
+ ```yml
47
+ # UNSAFE - command injection
48
+ - run: echo ${{ toJSON(steps.parse.outputs.data) }}
49
+ ```
50
+
51
+ **Always** pass the output through an `env:` variable and reference it with a
52
+ quoted shell variable. Values set via `env:` are passed to the runner as literal
53
+ environment variables and are not re-interpolated into the script:
54
+
55
+ ```yml
56
+ # SAFE
57
+ - name: Print parsed data
58
+ env:
59
+ DATA: ${{ steps.parse.outputs.data }}
60
+ run: echo "$DATA"
61
+ ```
62
+
63
+ The same applies to any other sink. Do not place parsed values into a `ref:`
64
+ parameter, a `gh`/API call, a database query, or HTML without validating or
65
+ encoding them for that context first.
66
+
67
+ ## Token permissions
68
+
69
+ Workflows that run this action on `issues` execute in the trusted base-repo
70
+ context. Apply least privilege so a mistake cannot be leveraged into a
71
+ supply-chain foothold:
72
+
73
+ ```yml
74
+ permissions:
75
+ contents: read
76
+ ```
77
+
78
+ If the job does not push or create releases, keep the default `GITHUB_TOKEN`
79
+ read-only and set `persist-credentials: false` on `actions/checkout` so the
80
+ token is not written to `.git/config`.
@@ -0,0 +1,92 @@
1
+ # Design: Return `null` for empty ("No response") fields
2
+
3
+ Related issue:
4
+ [#40](https://github.com/zentered/issue-forms-body-parser/issues/40)
5
+
6
+ ## Problem
7
+
8
+ GitHub Issue Forms render an optional field that was left blank as the literal
9
+ markdown `_No response_`. By the time `parse.js` re-stringifies the paragraph
10
+ with `remark-stringify`'s default emphasis marker, `_No response_` is normalized
11
+ to `*No response*`. The parser currently treats this like any other paragraph,
12
+ producing:
13
+
14
+ ```json
15
+ "field": {
16
+ "title": "field",
17
+ "heading": 3,
18
+ "content": ["*No response*"],
19
+ "text": "*No response*"
20
+ }
21
+ ```
22
+
23
+ This leaks an internal markdown placeholder into the structured output, forcing
24
+ consumers to special-case the string `*No response*`.
25
+
26
+ ## Solution
27
+
28
+ In `src/parse.js`, inside the `paragraph` branch, after computing `cleanText`:
29
+
30
+ 1. If the trimmed `cleanText` is `*No response*` or `_No response_`, treat the
31
+ field as empty:
32
+ - Matching both forms covers `remark-stringify`'s default asterisk emphasis
33
+ (the normal case for the GitHub Issue Forms placeholder) as well as the
34
+ underscore form, which can occur if `cleanText` contains escaped
35
+ underscores that get unescaped back to `_No response_` by the `\\_` cleanup
36
+ step earlier in the loop.
37
+ - Do not run date/time/duration/links/images parsing on it.
38
+ - Do not push it into `obj.content`.
39
+ - Set `obj.text = null` directly.
40
+ 2. Otherwise, process the paragraph as today.
41
+
42
+ ### Why this is sufficient
43
+
44
+ The closing loop in `parse.js` (the `for (const key in structuredResponse)`
45
+ block) only overwrites `token.text` when `content.length > 0`. Since the "No
46
+ response" placeholder paragraph is never pushed to `content`, `content` stays
47
+ `[]`, and the explicit `obj.text = null` set above is preserved.
48
+
49
+ ### Resulting shape
50
+
51
+ ```json
52
+ "field": {
53
+ "title": "field",
54
+ "heading": 3,
55
+ "content": [],
56
+ "text": null
57
+ }
58
+ ```
59
+
60
+ ## Edge cases
61
+
62
+ - **Checkbox / task lists**: GitHub always renders a checked/unchecked state for
63
+ these, never `_No response_`. No change needed in the `list` branch.
64
+ - **Code-block fields** (e.g. fields with a code-language hint): an empty
65
+ textarea renders as a `_No response_` paragraph, not an empty code block.
66
+ Already covered by the paragraph branch.
67
+ - **Multiple paragraphs under one heading where only one is `*No response*`**
68
+ (unlikely in practice, since GitHub Issue Forms map one field to one
69
+ paragraph): only the `*No response*` paragraph is skipped; remaining
70
+ paragraphs are joined normally.
71
+
72
+ ## Testing
73
+
74
+ Update `test/parse-issue.test.js` expectations for:
75
+
76
+ - `repository-description` (currently
77
+ `content: ['*No response*'], text: '*No response*'`)
78
+ - `repository-justification` (same)
79
+
80
+ Both become `content: [], text: null`.
81
+
82
+ Add a fixture field whose raw markdown contains escaped underscores
83
+ (`\_No response\_`), which `parse.js` unescapes back to `_No response_` before
84
+ the placeholder check. This covers the underscore branch of the check added
85
+ above, expecting `content: [], text: null`.
86
+
87
+ ## Versioning
88
+
89
+ This changes the type of `.text` for previously-empty fields from `string` to
90
+ `null`. Consumers calling string methods on `.text` for an empty field would
91
+ break. Commit as `fix!:` with a `BREAKING CHANGE:` footer, triggering a major
92
+ version bump per semantic-release.
@@ -0,0 +1,42 @@
1
+ import js from '@eslint/js'
2
+ import n from 'eslint-plugin-n'
3
+ import json from '@eslint/json'
4
+ import globals from 'globals'
5
+
6
+ export default [
7
+ {
8
+ ignores: [
9
+ 'dist/**',
10
+ 'action/**',
11
+ 'pkg/**',
12
+ 'coverage/**',
13
+ 'test/**',
14
+ 'package-lock.json',
15
+ 'eslint.config.js'
16
+ ]
17
+ },
18
+ {
19
+ files: ['**/*.js'],
20
+ plugins: {
21
+ ...n.configs['flat/recommended'].plugins
22
+ },
23
+ languageOptions: {
24
+ ecmaVersion: 2021,
25
+ sourceType: 'module',
26
+ globals: {
27
+ ...globals.node,
28
+ ...globals.es2021
29
+ }
30
+ },
31
+ rules: {
32
+ ...js.configs.recommended.rules,
33
+ ...n.configs['flat/recommended'].rules
34
+ }
35
+ },
36
+ {
37
+ files: ['**/*.json'],
38
+ plugins: { json },
39
+ language: 'json/json',
40
+ rules: json.configs.recommended.rules
41
+ }
42
+ ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zentered/issue-forms-body-parser",
3
- "version": "2.2.0",
3
+ "version": "3.0.0",
4
4
  "private": false,
5
5
  "description": "Parser for GitHub Issue Form body, also available as GitHub Action",
6
6
  "keywords": [
@@ -68,34 +68,39 @@
68
68
  ]
69
69
  },
70
70
  "dependencies": {
71
- "@actions/core": "^1.10.1",
72
- "@actions/github": "^6.0.0",
73
- "@sindresorhus/slugify": "^2.2.1",
74
- "date-fns": "^2.30.0",
75
- "date-fns-tz": "^2.0.0",
76
- "debug": "^4.3.4",
77
- "is-ci": "^3.0.1",
78
- "remark-gfm": "^4.0.0",
71
+ "@actions/core": "^3.0.1",
72
+ "@actions/github": "^9.1.1",
73
+ "@sindresorhus/slugify": "^3.0.0",
74
+ "date-fns": "^4.4.0",
75
+ "date-fns-tz": "^3.2.0",
76
+ "debug": "^4.4.3",
77
+ "is-ci": "^4.1.0",
78
+ "remark-gfm": "^4.0.1",
79
79
  "remark-parse": "^11.0.0",
80
80
  "remark-stringify": "^11.0.0",
81
- "strip-final-newline": "^3.0.0",
82
- "unified": "^11.0.4"
81
+ "strip-final-newline": "^4.0.0",
82
+ "unified": "^11.0.5"
83
83
  },
84
84
  "devDependencies": {
85
- "@commitlint/config-conventional": "^18.4.0",
86
- "@vercel/ncc": "^0.38.1",
87
- "commitlint": "^18.4.0",
88
- "eslint": "^8.53.0",
89
- "eslint-plugin-json": "^3.1.0",
90
- "eslint-plugin-node": "^11.1.0",
91
- "husky": "^8.0.3",
85
+ "@commitlint/config-conventional": "^21.0.2",
86
+ "@eslint/js": "^10.0.1",
87
+ "@eslint/json": "^2.0.0",
88
+ "@vercel/ncc": "^0.44.0",
89
+ "commitlint": "^21.0.2",
90
+ "eslint": "^10.4.1",
91
+ "eslint-plugin-n": "^18.1.0",
92
+ "globals": "^17.6.0",
93
+ "husky": "^9.1.7",
92
94
  "license-checker": "^25.0.1",
93
95
  "microbundle": "^0.15.1",
94
96
  "npm-run-all": "^4.1.5",
95
- "prettier": "^3.0.3"
97
+ "prettier": "^3.8.4"
96
98
  },
97
99
  "engines": {
98
100
  "node": ">=18"
99
101
  },
102
+ "overrides": {
103
+ "serialize-javascript": "7.0.5"
104
+ },
100
105
  "src": "src/parse.js"
101
106
  }
package/pkg/parse.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("unified"),n=require("remark-parse"),t=require("remark-gfm"),r=require("@sindresorhus/slugify"),i=require("remark-stringify"),u=require("strip-final-newline"),a=require("debug"),o=require("date-fns"),f=require("date-fns-tz");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=/*#__PURE__*/l(n),d=/*#__PURE__*/l(t),h=/*#__PURE__*/l(r),s=/*#__PURE__*/l(i),v=/*#__PURE__*/l(u),y=/*#__PURE__*/l(a);function m(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}var p=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],g=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],b=function e(n){return n.children.map(function(t){var r={};return"list"===t.type?e(n):"listItem"===t.type?(r.checked=t.checked,t.children.map(function(e){if("paragraph"===e.type)return r.text=e.children.map(function(e){return"link"===e.type?(r.link=e.url,"["+e.children[0].value+"]("+e.url+")"):e.value}).filter(function(e){return!!e}).join(""),r}).filter(function(e){return!!e})):void 0}).filter(function(e){return!!e})};function M(e,n,t){if(!e.s){if(t instanceof x){if(!t.s)return void(t.o=M.bind(null,e,n));1&n&&(n=t.s),t=t.v}if(t&&t.then)return void t.then(M.bind(null,e,n),M.bind(null,e,2));e.s=n,e.v=t;var r=e.o;r&&r(e)}}var x=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,t){var r=new e,i=this.s;if(i){var u=1&i?n:t;if(u){try{M(r,1,u(this.v))}catch(e){M(r,2,e)}return r}return this}return this.o=function(e){try{var i=e.v;1&e.s?M(r,1,n?n(i):i):t?M(r,1,t(i)):M(r,2,i)}catch(e){M(r,2,e)}},r},e}();function k(e){return e instanceof x&&1&e.s}var w=y.default("body-parser");module.exports=function(n){try{var t,r,i,u,a,l,y,T,q,I,O,j,A,H,S;return w("parseMD()"),Promise.resolve(e.unified().use(c.default).use(d.default).parse(n)).then(function(n){function c(){for(A in U)(S=(H=U[A]).content.filter(Boolean))&&S.length>0&&(1===S.length&&(H.text=S[0]),H.text=S.join("\n\n")),H.content=S;return U}if(!n)return[];var U={},C=null;t=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return m(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?m(e,n):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(n.children);var z=function(e,n,t){for(var r;;){var i=e();if(k(i)&&(i=i.v),!i)return u;if(i.then){r=0;break}var u=t();if(u&&u.then){if(!k(u)){r=1;break}u=u.s}if(n){var a=n();if(a&&a.then&&!k(a)){r=2;break}}}var o=new x,f=M.bind(null,o,2);return(0===r?i.then(c):1===r?u.then(l):a.then(d)).then(void 0,f),o;function l(r){u=r;do{if(n&&(a=n())&&a.then&&!k(a))return void a.then(d).then(void 0,f);if(!(i=e())||k(i)&&!i.v)return void M(o,1,u);if(i.then)return void i.then(c).then(void 0,f);k(u=t())&&(u=u.v)}while(!u||!u.then);u.then(l).then(void 0,f)}function c(e){e?(u=t())&&u.then?u.then(l).then(void 0,f):l(u):M(o,1,u)}function d(){(i=e())?i.then?i.then(c).then(void 0,f):c(i):M(o,1,u)}}(function(){return!(r=t()).done},void 0,function(){return i=r.value,Promise.resolve(e.unified().use(d.default).use(s.default).stringify(i)).then(function(e){var n,t;(u=v.default(e)).indexOf("\\_")>-1&&(u=u.replace(/\\_/g,"_")),"heading"===i.type?(C=h.default(i.children[0].value),U[C]={title:i.children[0].value,heading:i.depth,content:[]}):"paragraph"===i.type&&C?(a=U[C],n=u,t=p.map(function(e){return o.isMatch(n,e)}),l=t.indexOf(!0)>-1?f.zonedTimeToUtc(o.parse(n,p[t.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,y=i.children.filter(function(e){return"image"===e.type}).map(function(e){return{src:e.url,alt:e.alt}}),T=i.children.filter(function(e){return"link"===e.type}).map(function(e){return{src:e.url,alt:e.children[0].value}}),q=function(e){var n=g.map(function(n){return o.isMatch(e,n)});if(n.indexOf(!0)>-1){var t=f.zonedTimeToUtc(o.parse(e,g[n.indexOf(!0)],new Date),"UTC");return f.formatInTimeZone(t,"UTC","HH:mm")}return null}(u),I=function(e){var n=!1,t={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(e.match(r)){n=!0;var u=e.match(r),a=u[2];t.hours=parseInt(u[1]),t.minutes=parseInt(a)}else if(e.match(i)){n=!0;var o=e.match(i);t.hours=parseInt(o[1]),t.minutes=0}return n?t:null}(u),l&&(a.date=l),q&&(a.time=q),I&&(a.duration=I),T&&T.length>0&&(a.links=T),y&&y.length>0&&(a.images=y),a.content.push(u)):"list"===i.type?((O=U[C]).text=u,O.list=b(i).flat()):"html"===i.type?U[C].content.push(i.html):"code"===i.type?((j=U[C]).lang=i.lang,j.text=u):(w("unhandled token type"),w(i))})});return z&&z.then?z.then(c):c()})}catch(e){return Promise.reject(e)}};
1
+ var e=require("unified"),n=require("remark-parse"),t=require("remark-gfm"),r=require("@sindresorhus/slugify"),i=require("remark-stringify"),u=require("strip-final-newline"),a=require("debug"),o=require("date-fns"),f=require("date-fns-tz");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=/*#__PURE__*/l(n),h=/*#__PURE__*/l(t),c=/*#__PURE__*/l(r),s=/*#__PURE__*/l(i),v=/*#__PURE__*/l(u),m=/*#__PURE__*/l(a);function y(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var p=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],g=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],b=function e(n){return n.children.map(function(t){var r={};return"list"===t.type?e(n):"listItem"===t.type?(r.checked=t.checked,t.children.map(function(e){if("paragraph"===e.type)return r.text=e.children.map(function(e){return"link"===e.type?(r.link=e.url,"["+e.children[0].value+"]("+e.url+")"):e.value}).filter(function(e){return!!e}).join(""),r}).filter(function(e){return!!e})):void 0}).filter(function(e){return!!e})};function M(e,n,t){if(!e.s){if(t instanceof x){if(!t.s)return void(t.o=M.bind(null,e,n));1&n&&(n=t.s),t=t.v}if(t&&t.then)return void t.then(M.bind(null,e,n),M.bind(null,e,2));e.s=n,e.v=t;var r=e.o;r&&r(e)}}var x=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,t){var r=new e,i=this.s;if(i){var u=1&i?n:t;if(u){try{M(r,1,u(this.v))}catch(e){M(r,2,e)}return r}return this}return this.o=function(e){try{var i=e.v;1&e.s?M(r,1,n?n(i):i):t?M(r,1,t(i)):M(r,2,i)}catch(e){M(r,2,e)}},r},e}();function k(e){return e instanceof x&&1&e.s}var w=m.default("body-parser");module.exports=function(n){try{var t,r,i,u,a,l,m,q,I,T,O,j,A,H,S,_;return w("parseMD()"),Promise.resolve(e.unified().use(d.default).use(h.default).parse(n)).then(function(n){function d(){for(H in C)(_=(S=C[H]).content.filter(Boolean))&&_.length>0&&(1===_.length&&(S.text=_[0]),S.text=_.join("\n\n")),S.content=_;return C}if(!n)return[];var C={},U=null;t=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return y(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?y(e,n):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(n.children);var D=function(e,n,t){for(var r;;){var i=e();if(k(i)&&(i=i.v),!i)return u;if(i.then){r=0;break}var u=t();if(u&&u.then){if(!k(u)){r=1;break}u=u.s}if(n){var a=n();if(a&&a.then&&!k(a)){r=2;break}}}var o=new x,f=M.bind(null,o,2);return(0===r?i.then(d):1===r?u.then(l):a.then(h)).then(void 0,f),o;function l(r){u=r;do{if(n&&(a=n())&&a.then&&!k(a))return void a.then(h).then(void 0,f);if(!(i=e())||k(i)&&!i.v)return void M(o,1,u);if(i.then)return void i.then(d).then(void 0,f);k(u=t())&&(u=u.v)}while(!u||!u.then);u.then(l).then(void 0,f)}function d(e){e?(u=t())&&u.then?u.then(l).then(void 0,f):l(u):M(o,1,u)}function h(){(i=e())?i.then?i.then(d).then(void 0,f):d(i):M(o,1,u)}}(function(){return!(r=t()).done},void 0,function(){return i=r.value,Promise.resolve(e.unified().use(h.default).use(s.default).stringify(i)).then(function(e){if((u=v.default(e)).indexOf("\\_")>-1&&(u=u.replace(/\\_/g,"_")),"heading"===i.type)U=c.default(i.children[0].value),C[U]={title:i.children[0].value,heading:i.depth,content:[]};else if("paragraph"===i.type&&U){if(a=C[U],"*No response*"===(l=u.trim())||"_No response_"===l)return void(a.text=null);n=u,t=p.map(function(e){return o.isMatch(n,e)}),m=t.indexOf(!0)>-1?f.fromZonedTime(o.parse(n,p[t.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,q=i.children.filter(function(e){return"image"===e.type}).map(function(e){return{src:e.url,alt:e.alt}}),I=i.children.filter(function(e){return"link"===e.type}).map(function(e){return{src:e.url,alt:e.children[0].value}}),T=function(e){var n=g.map(function(n){return o.isMatch(e,n)});if(n.indexOf(!0)>-1){var t=f.fromZonedTime(o.parse(e,g[n.indexOf(!0)],new Date),"UTC");return f.formatInTimeZone(t,"UTC","HH:mm")}return null}(u),O=function(e){var n=!1,t={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(e.match(r)){n=!0;var u=e.match(r),a=u[2];t.hours=parseInt(u[1]),t.minutes=parseInt(a)}else if(e.match(i)){n=!0;var o=e.match(i);t.hours=parseInt(o[1]),t.minutes=0}return n?t:null}(u),m&&(a.date=m),T&&(a.time=T),O&&(a.duration=O),I&&I.length>0&&(a.links=I),q&&q.length>0&&(a.images=q),a.content.push(u)}else"list"===i.type?((j=C[U]).text=u,j.list=b(i).flat()):"html"===i.type?C[U].content.push(i.html):"code"===i.type?((A=C[U]).lang=i.lang,A.text=u):(w("unhandled token type"),w(i));var n,t})});return D&&D.then?D.then(d):d()})}catch(e){return Promise.reject(e)}};
2
2
  //# sourceMappingURL=parse.cjs.map
package/pkg/parse.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.cjs","sources":["../src/parsers/date.js","../src/parsers/time.js","../src/parsers/index.js","../src/parsers/list.js","../src/parse.js","../src/parsers/images.js","../src/parsers/links.js","../src/parsers/duration.js"],"sourcesContent":["'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { zonedTimeToUtc } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonDateFormats = [\n 'yyyy-MM-dd',\n 'dd/MM/yyyy',\n 'dd/MM/yy',\n 'dd-MM-yyyy',\n 'dd-MM-yy',\n 'dd.MM.yyyy',\n 'dd.MM.yy'\n]\n\nexport default function parseDate(text) {\n const match = commonDateFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const date = zonedTimeToUtc(\n parse(text, commonDateFormats[match.indexOf(true)], new Date()),\n loc\n ).toJSON()\n return date.split('T')[0]\n } else {\n return null\n }\n}\n","'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { zonedTimeToUtc, formatInTimeZone } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonTimeFormats = [\n 'HH:mm',\n 'HH.mm',\n 'hh:mm aaa',\n 'hh:mm a..aa',\n 'hh:mm aaaa'\n]\n\nexport default function parseTime(text) {\n const match = commonTimeFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const time = zonedTimeToUtc(\n parse(text, commonTimeFormats[match.indexOf(true)], new Date()),\n loc\n )\n return formatInTimeZone(time, loc, 'HH:mm')\n } else {\n return null\n }\n}\n","'use strict'\n\nimport date from './date.js'\nimport time from './time.js'\nimport duration from './duration.js'\nimport list from './list.js'\nimport images from './images.js'\nimport links from './links.js'\n\nexport const parseDate = date\nexport const parseTime = time\nexport const parseDuration = duration\nexport const parseList = list\nexport const parseImages = images\nexport const parseLinks = links\n","'use strict'\n\nexport default function parseList(list) {\n return list.children\n .map((item) => {\n const listItem = {}\n if (item.type === 'list') {\n return parseList(list)\n } else if (item.type === 'listItem') {\n listItem.checked = item.checked\n return item.children\n .map((child) => {\n if (child.type === 'paragraph') {\n listItem.text = child.children\n .map((c) => {\n if (c.type === 'link') {\n listItem.link = c.url\n return `[${c.children[0].value}](${c.url})`\n } else {\n return c.value\n }\n })\n .filter((x) => !!x)\n .join('')\n return listItem\n }\n })\n .filter((x) => !!x)\n }\n })\n .filter((x) => !!x)\n}\n","'use strict'\n\nimport { unified } from 'unified'\nimport remarkParse from 'remark-parse'\nimport remarkGfm from 'remark-gfm'\nimport slugify from '@sindresorhus/slugify'\nimport remarkStringify from 'remark-stringify'\nimport stripFinalNewline from 'strip-final-newline'\nimport createDebug from 'debug'\nconst debug = createDebug('body-parser')\n\nimport {\n parseDate,\n parseTime,\n parseDuration,\n parseList,\n parseImages,\n parseLinks\n} from './parsers/index.js'\n\nexport default async function parseMD(body) {\n debug('parseMD()')\n const tokens = await unified().use(remarkParse).use(remarkGfm).parse(body)\n if (!tokens) {\n return []\n }\n\n const structuredResponse = {}\n let currentHeading = null\n\n for (const token of tokens.children) {\n const text = await unified()\n .use(remarkGfm)\n .use(remarkStringify)\n .stringify(token)\n let cleanText = stripFinalNewline(text)\n\n // remove `\\\\_`\n if (cleanText.indexOf('\\\\_') > -1) {\n cleanText = cleanText.replace(/\\\\_/g, '_')\n }\n\n // issue forms uses h3 as a heading\n if (token.type === 'heading') {\n currentHeading = slugify(token.children[0].value)\n structuredResponse[currentHeading] = {\n title: token.children[0].value,\n heading: token.depth,\n content: []\n }\n } else if (token.type === 'paragraph' && currentHeading) {\n const obj = structuredResponse[currentHeading]\n\n const date = parseDate(cleanText)\n const images = parseImages(token.children)\n const links = parseLinks(token.children)\n const time = parseTime(cleanText)\n const duration = parseDuration(cleanText)\n\n if (date) {\n obj.date = date\n }\n\n if (time) {\n obj.time = time\n }\n\n if (duration) {\n obj.duration = duration\n }\n\n if (links && links.length > 0) {\n obj.links = links\n }\n\n if (images && images.length > 0) {\n obj.images = images\n }\n\n obj.content.push(cleanText)\n } else if (token.type === 'list') {\n const obj = structuredResponse[currentHeading]\n obj.text = cleanText\n obj.list = parseList(token).flat()\n } else if (token.type === 'html') {\n const obj = structuredResponse[currentHeading]\n obj.content.push(token.html)\n } else if (token.type === 'code') {\n const obj = structuredResponse[currentHeading]\n obj.lang = token.lang\n obj.text = cleanText\n } else {\n debug('unhandled token type')\n debug(token)\n }\n }\n\n for (const key in structuredResponse) {\n const token = structuredResponse[key]\n const content = token.content.filter(Boolean)\n if (content && content.length > 0) {\n if (content.length === 1) {\n token.text = content[0]\n }\n token.text = content.join('\\n\\n')\n }\n token.content = content\n }\n\n return structuredResponse\n}\n","'use strict'\n\nexport default function parseImage(props) {\n return props\n .filter((p) => p.type === 'image')\n .map((p) => {\n return {\n src: p.url,\n alt: p.alt\n }\n })\n}\n","'use strict'\n\nexport default function parseLinks(props) {\n return props\n .filter((p) => p.type === 'link')\n .map((p) => {\n return {\n src: p.url,\n alt: p.children[0].value\n }\n })\n}\n","'use strict'\n\nexport default function parseDuration(text) {\n let matched = false\n const duration = {\n hours: 0,\n minutes: 0\n }\n\n const hoursAndMinutes = new RegExp(/([0-9]+)h([0-9]+)m/)\n const hours = new RegExp(/([0-9]+)h/)\n\n if (text.match(hoursAndMinutes)) {\n matched = true\n const [, h, m] = text.match(hoursAndMinutes)\n duration.hours = parseInt(h)\n duration.minutes = parseInt(m)\n } else if (text.match(hours)) {\n matched = true\n const [, h] = text.match(hours)\n duration.hours = parseInt(h)\n duration.minutes = 0\n }\n\n if (matched) {\n return duration\n } else {\n return null\n }\n}\n"],"names":["commonDateFormats","commonTimeFormats","parseList","list","children","map","item","listItem","type","checked","child","text","c","link","url","value","filter","x","join","_settle","pact","state","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","debug","createDebug","body","_iterator","_step","token","cleanText","obj","date","images","links","time","duration","key","content","Promise","resolve","unified","use","remarkParse","remarkGfm","parse","tokens","_temp2","structuredResponse","Boolean","length","currentHeading","_createForOfIteratorHelperLoose","_temp","test","update","stage","shouldContinue","updateValue","reject","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","done","remarkStringify","stringify","_unified$use$use$stri","match","stripFinalNewline","indexOf","replace","slugify","title","heading","depth","format","isMatch","zonedTimeToUtc","Date","toJSON","split","p","src","alt","formatInTimeZone","parseTime","matched","hours","minutes","hoursAndMinutes","RegExp","_text$match","m","parseInt","_text$match2","parseDuration","push","flat","html","lang"],"mappings":"6hBAKA,IACMA,EAAoB,CACxB,aACA,aACA,WACA,aACA,WACA,aACA,YCPIC,EAAoB,CACxB,QACA,QACA,YACA,cACA,cCCWC,ECVE,SAASA,EAAUC,GAChC,OAAOA,EAAKC,SACTC,IAAI,SAACC,GACJ,IAAMC,EAAW,CAAE,EACnB,MAAkB,SAAdD,EAAKE,KACAN,EAAUC,GACM,aAAdG,EAAKE,MACdD,EAASE,QAAUH,EAAKG,QACjBH,EAAKF,SACTC,IAAI,SAACK,GACJ,GAAmB,cAAfA,EAAMF,KAYR,OAXAD,EAASI,KAAOD,EAAMN,SACnBC,IAAI,SAACO,GACJ,MAAe,SAAXA,EAAEJ,MACJD,EAASM,KAAOD,EAAEE,IACPF,IAAAA,EAAER,SAAS,GAAGW,MAAK,KAAKH,EAAEE,SAE9BF,EAAEG,KAEb,GACCC,OAAO,SAACC,WAAQA,CAAC,GACjBC,KAAK,IACDX,CAEX,GACCS,OAAO,SAACC,GAAC,QAAOA,CAAC,SAnBf,CAqBT,GACCD,OAAO,SAACC,WAAQA,CAAC,EACtB,ECQO,SAASE,EAAQC,EAAMC,EAAON,GACpC,IAAKK,EAAKE,EAAG,CACZ,GAAIP,aAAiBQ,EAAO,CAC3B,IAAIR,EAAMO,EAOT,YADAP,EAAMS,EAAIL,EAAQM,KAAK,KAAML,EAAMC,IALvB,EAARA,IACHA,EAAQN,EAAMO,GAEfP,EAAQA,EAAMW,CAKhB,CACA,GAAIX,GAASA,EAAMY,KAElB,YADAZ,EAAMY,KAAKR,EAAQM,KAAK,KAAML,EAAMC,GAAQF,EAAQM,KAAK,KAAML,EAAM,IAGtEA,EAAKE,EAAID,EACTD,EAAKM,EAAIX,EACT,IAAMa,EAAWR,EAAKI,EAClBI,GACHA,EAASR,EAEX,CACD,CA3C8B,IAnBjBG,eAAsB,WAClC,SAAAA,IAAiB,CAiCjB,OAhCAA,EAAMM,UAAUF,KAAO,SAASG,EAAaC,GAC5C,IAAMC,EAAS,IAAAT,EACTF,EAAQY,KAAKX,EACnB,GAAID,EAAO,CACV,IAAMa,EAAmB,EAARb,EAAYS,EAAcC,EAC3C,GAAIG,EAAU,CACb,IACCf,EAAQa,EAAQ,EAAGE,EAASD,KAAKP,GAClC,CAAE,MAAOS,GACRhB,EAAQa,EAAQ,EAAGG,EACpB,CACA,OAAOH,CACR,CACC,OAAOC,IAET,CAeA,OAdAA,KAAKT,EAAI,SAASY,GACjB,IACC,IAAMrB,EAAQqB,EAAMV,EACN,EAAVU,EAAMd,EACTH,EAAQa,EAAQ,EAAGF,EAAcA,EAAYf,GAASA,GAC5CgB,EACVZ,EAAQa,EAAQ,EAAGD,EAAWhB,IAE9BI,EAAQa,EAAQ,EAAGjB,EAErB,CAAE,MAAOoB,GACRhB,EAAQa,EAAQ,EAAGG,EACpB,CACD,EACOH,CACR,EACAT,CACD,CAnCmC,GAgE5B,SAASc,EAAeC,GAC9B,OAAOA,aAAoBf,GAAsB,EAAbe,EAAShB,CAC9C,CAgRC,IA1UKiB,EAAQC,EAAW,QAAC,8BAWI,SAAQC,GAAM,IAAA,IAAAC,EAAAC,EAU/BC,EAKLC,EAgBIC,EAEAC,EACAC,EACAC,EACAC,EACAC,EAwBAL,EAOAA,EASCM,EACHR,EACAS,EA9EUC,OAAlBf,EAAM,aAAYe,QAAAC,QACGC,YAAUC,IAAIC,WAAaD,IAAIE,EAAAA,SAAWC,MAAMnB,IAAKd,cAApEkC,GAAM,SAAAC,IA2EZ,IAAWV,KAAOW,GAEVV,GADAT,EAAQmB,EAAmBX,IACXC,QAAQrC,OAAOgD,WACtBX,EAAQY,OAAS,IACP,IAAnBZ,EAAQY,SACVrB,EAAMjC,KAAO0C,EAAQ,IAEvBT,EAAMjC,KAAO0C,EAAQnC,KAAK,SAE5B0B,EAAMS,QAAUA,EAGlB,OAAOU,CAAkB,CAtFzB,IAAKF,EACH,MAAO,GAGT,IAAME,EAAqB,CAAE,EACzBG,EAAiB,KAAIxB,2qBAAAyB,CAELN,EAAOzD,UAAQgE,IAAAA,EAiO9B,SAAcC,EAAMC,EAAQ7B,GAElC,IADA,IAAI8B,IACK,CACR,IAAIC,EAAiBH,IAIrB,GAHIhC,EAAemC,KAClBA,EAAiBA,EAAe9C,IAE5B8C,EACJ,OAAOxC,EAER,GAAIwC,EAAe7C,KAAM,CACxB4C,EAAQ,EACR,KACD,CACA,IAAIvC,EAASS,IACb,GAAIT,GAAUA,EAAOL,KAAM,CAC1B,IAAIU,EAAeL,GAEZ,CACNuC,EAAQ,EACR,KACD,CAJCvC,EAASA,EAAOV,CAKlB,CACA,GAAIgD,EAAQ,CACX,IAAIG,EAAcH,IAClB,GAAIG,GAAeA,EAAY9C,OAASU,EAAeoC,GAAc,CACpEF,EAAQ,EACR,KACD,CACD,CACD,CACA,IAAInD,EAAO,IAAIG,EACXmD,EAASvD,EAAQM,KAAK,KAAML,EAAM,GAEtC,OADW,IAAVmD,EAAcC,EAAe7C,KAAKgD,GAA8B,IAAVJ,EAAcvC,EAAOL,KAAKiD,GAAoBH,EAAY9C,KAAKkD,IAAqBlD,UAAK,EAAQ+C,GACjJtD,EACP,SAASwD,EAAiB7D,GACzBiB,EAASjB,EACT,EAAG,CACF,GAAIuD,IACHG,EAAcH,MACKG,EAAY9C,OAASU,EAAeoC,GAEtD,YADAA,EAAY9C,KAAKkD,GAAoBlD,UAAK,EAAQ+C,GAKpD,KADAF,EAAiBH,MACOhC,EAAemC,KAAoBA,EAAe9C,EAEzE,YADAP,EAAQC,EAAM,EAAGY,GAGlB,GAAIwC,EAAe7C,KAElB,YADA6C,EAAe7C,KAAKgD,GAAkBhD,UAAK,EAAQ+C,GAIhDrC,EADJL,EAASS,OAERT,EAASA,EAAON,EAElB,QAAUM,IAAWA,EAAOL,MAC5BK,EAAOL,KAAKiD,GAAkBjD,UAAK,EAAQ+C,EAC5C,CACA,SAASC,EAAiBH,GACrBA,GACHxC,EAASS,MACKT,EAAOL,KACpBK,EAAOL,KAAKiD,GAAkBjD,UAAK,EAAQ+C,GAE3CE,EAAiB5C,GAGlBb,EAAQC,EAAM,EAAGY,EAEnB,CACA,SAAS6C,KACJL,EAAiBH,KAChBG,EAAe7C,KAClB6C,EAAe7C,KAAKgD,GAAkBhD,UAAK,EAAQ+C,GAEnDC,EAAiBH,GAGlBrD,EAAQC,EAAM,EAAGY,EAEnB,CACD,CArTqC8C,CAAA,WAAA,QAAAnC,EAAAD,KAAAqC,IAAA,OAAA,EAAA,WAAnBzB,OAALV,EAAKD,EAAA5B,MAAAuC,QAAAC,QACKC,EAAAA,UAChBC,IAAIE,EAAAA,SACJF,IAAIuB,EAAe,SACnBC,UAAUrC,IAAMjB,cAAAuD,GChCC,ILcUvE,EAC1BwE,GIkBAtC,EAAYuC,UAJNF,IAOIG,QAAQ,QAAU,IAC9BxC,EAAYA,EAAUyC,QAAQ,OAAQ,MAIrB,YAAf1C,EAAMpC,MACR0D,EAAiBqB,EAAO,QAAC3C,EAAMxC,SAAS,GAAGW,OAC3CgD,EAAmBG,GAAkB,CACnCsB,MAAO5C,EAAMxC,SAAS,GAAGW,MACzB0E,QAAS7C,EAAM8C,MACfrC,QAAS,KAEa,cAAfT,EAAMpC,MAAwB0D,GACjCpB,EAAMiB,EAAmBG,GJnCHvD,EIqCLkC,EJpCrBsC,EAAQnF,EAAkBK,IAAI,SAACsF,GACnC,OAAOC,EAAAA,QAAQjF,EAAMgF,EACvB,GIkCU5C,EJjCNoC,EAAME,SAAQ,IAAS,EACZQ,EAAAA,eACXjC,EAAKA,MAACjD,EAAMX,EAAkBmF,EAAME,SAAQ,IAAQ,IAAIS,MAjBlD,OAmBNC,SACUC,MAAM,KAAK,QI6BfhD,EAAqBJ,EAAMxC,SClDlCY,OAAO,SAACiF,GAAM,MAAW,UAAXA,EAAEzF,IAAgB,GAChCH,IAAI,SAAC4F,GACJ,MAAO,CACLC,IAAKD,EAAEnF,IACPqF,IAAKF,EAAEE,IAEX,GD6CQlD,EAAmBL,EAAMxC,SEnDhCY,OAAO,SAACiF,GAAM,MAAW,SAAXA,EAAEzF,IAAe,GAC/BH,IAAI,SAAC4F,GACJ,MAAO,CACLC,IAAKD,EAAEnF,IACPqF,IAAKF,EAAE7F,SAAS,GAAGW,MAEvB,GF8CQmC,EH1CG,SAAmBvC,GAChC,IAAMwE,EAAQlF,EAAkBI,IAAI,SAACsF,GACnC,OAAOC,EAAOA,QAACjF,EAAMgF,EACvB,GACA,GAAIR,EAAME,SAAQ,IAAS,EAAG,CAC5B,IAAMnC,EAAO2C,iBACXjC,EAAAA,MAAMjD,EAAMV,EAAkBkF,EAAME,SAAQ,IAAQ,IAAIS,MAflD,OAkBR,OAAOM,EAAgBA,iBAAClD,EAlBhB,MAkB2B,QACrC,CACE,OAAO,IAEX,CG6BmBmD,CAAUxD,GACjBM,EGvDY,SAAcxC,GACpC,IAAI2F,GAAU,EACRnD,EAAW,CACfoD,MAAO,EACPC,QAAS,GAGLC,EAAkB,IAAIC,OAAO,sBAC7BH,EAAQ,IAAIG,OAAO,aAEzB,GAAI/F,EAAKwE,MAAMsB,GAAkB,CAC/BH,GAAU,EACV,IAAAK,EAAiBhG,EAAKwE,MAAMsB,GAAhBG,EAACD,EAAA,GACbxD,EAASoD,MAAQM,SADPF,EAAEC,IAEZzD,EAASqD,QAAUK,SAASD,EAC9B,MAAO,GAAIjG,EAAKwE,MAAMoB,GAAQ,CAC5BD,GAAU,EACV,IAAAQ,EAAcnG,EAAKwE,MAAMoB,GACzBpD,EAASoD,MAAQM,SADPC,EACV3D,IACAA,EAASqD,QAAU,CACrB,CAEA,OAAIF,EACKnD,MAIX,CH4BuB4D,CAAclE,GAE3BE,IACFD,EAAIC,KAAOA,GAGTG,IACFJ,EAAII,KAAOA,GAGTC,IACFL,EAAIK,SAAWA,GAGbF,GAASA,EAAMgB,OAAS,IAC1BnB,EAAIG,MAAQA,GAGVD,GAAUA,EAAOiB,OAAS,IAC5BnB,EAAIE,OAASA,GAGfF,EAAIO,QAAQ2D,KAAKnE,IACO,SAAfD,EAAMpC,OACTsC,EAAMiB,EAAmBG,IAC3BvD,KAAOkC,EACXC,EAAI3C,KAAOD,EAAU0C,GAAOqE,QACJ,SAAfrE,EAAMpC,KACHuD,EAAmBG,GAC3Bb,QAAQ2D,KAAKpE,EAAMsE,MACC,SAAftE,EAAMpC,OACTsC,EAAMiB,EAAmBG,IAC3BiD,KAAOvE,EAAMuE,KACjBrE,EAAInC,KAAOkC,IAEXN,EAAM,wBACNA,EAAMK,GACP,EACH,GAAC,OAAAwB,GAAAA,EAAAzC,KAAAyC,EAAAzC,KAAAmC,GAAAA,GAAA,EAeH,CAAC,MAAA3B,UAAAmB,QAAAoB,OAAAvC,EA7GY,CAAA"}
1
+ {"version":3,"file":"parse.cjs","sources":["../src/parsers/date.js","../src/parsers/time.js","../src/parsers/index.js","../src/parsers/list.js","../src/parse.js","../src/parsers/images.js","../src/parsers/links.js","../src/parsers/duration.js"],"sourcesContent":["'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { fromZonedTime } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonDateFormats = [\n 'yyyy-MM-dd',\n 'dd/MM/yyyy',\n 'dd/MM/yy',\n 'dd-MM-yyyy',\n 'dd-MM-yy',\n 'dd.MM.yyyy',\n 'dd.MM.yy'\n]\n\nexport default function parseDate(text) {\n const match = commonDateFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const date = fromZonedTime(\n parse(text, commonDateFormats[match.indexOf(true)], new Date()),\n loc\n ).toJSON()\n return date.split('T')[0]\n } else {\n return null\n }\n}\n","'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { fromZonedTime, formatInTimeZone } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonTimeFormats = [\n 'HH:mm',\n 'HH.mm',\n 'hh:mm aaa',\n 'hh:mm a..aa',\n 'hh:mm aaaa'\n]\n\nexport default function parseTime(text) {\n const match = commonTimeFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const time = fromZonedTime(\n parse(text, commonTimeFormats[match.indexOf(true)], new Date()),\n loc\n )\n return formatInTimeZone(time, loc, 'HH:mm')\n } else {\n return null\n }\n}\n","'use strict'\n\nimport date from './date.js'\nimport time from './time.js'\nimport duration from './duration.js'\nimport list from './list.js'\nimport images from './images.js'\nimport links from './links.js'\n\nexport const parseDate = date\nexport const parseTime = time\nexport const parseDuration = duration\nexport const parseList = list\nexport const parseImages = images\nexport const parseLinks = links\n","'use strict'\n\nexport default function parseList(list) {\n return list.children\n .map((item) => {\n const listItem = {}\n if (item.type === 'list') {\n return parseList(list)\n } else if (item.type === 'listItem') {\n listItem.checked = item.checked\n return item.children\n .map((child) => {\n if (child.type === 'paragraph') {\n listItem.text = child.children\n .map((c) => {\n if (c.type === 'link') {\n listItem.link = c.url\n return `[${c.children[0].value}](${c.url})`\n } else {\n return c.value\n }\n })\n .filter((x) => !!x)\n .join('')\n return listItem\n }\n })\n .filter((x) => !!x)\n }\n })\n .filter((x) => !!x)\n}\n","'use strict'\n\nimport { unified } from 'unified'\nimport remarkParse from 'remark-parse'\nimport remarkGfm from 'remark-gfm'\nimport slugify from '@sindresorhus/slugify'\nimport remarkStringify from 'remark-stringify'\nimport stripFinalNewline from 'strip-final-newline'\nimport createDebug from 'debug'\nconst debug = createDebug('body-parser')\n\nimport {\n parseDate,\n parseTime,\n parseDuration,\n parseList,\n parseImages,\n parseLinks\n} from './parsers/index.js'\n\nexport default async function parseMD(body) {\n debug('parseMD()')\n const tokens = await unified().use(remarkParse).use(remarkGfm).parse(body)\n if (!tokens) {\n return []\n }\n\n const structuredResponse = {}\n let currentHeading = null\n\n for (const token of tokens.children) {\n const text = await unified()\n .use(remarkGfm)\n .use(remarkStringify)\n .stringify(token)\n let cleanText = stripFinalNewline(text)\n\n // remove `\\\\_`\n if (cleanText.indexOf('\\\\_') > -1) {\n cleanText = cleanText.replace(/\\\\_/g, '_')\n }\n\n // issue forms uses h3 as a heading\n if (token.type === 'heading') {\n currentHeading = slugify(token.children[0].value)\n structuredResponse[currentHeading] = {\n title: token.children[0].value,\n heading: token.depth,\n content: []\n }\n } else if (token.type === 'paragraph' && currentHeading) {\n const obj = structuredResponse[currentHeading]\n\n const trimmedText = cleanText.trim()\n if (trimmedText === '*No response*' || trimmedText === '_No response_') {\n obj.text = null\n continue\n }\n\n const date = parseDate(cleanText)\n const images = parseImages(token.children)\n const links = parseLinks(token.children)\n const time = parseTime(cleanText)\n const duration = parseDuration(cleanText)\n\n if (date) {\n obj.date = date\n }\n\n if (time) {\n obj.time = time\n }\n\n if (duration) {\n obj.duration = duration\n }\n\n if (links && links.length > 0) {\n obj.links = links\n }\n\n if (images && images.length > 0) {\n obj.images = images\n }\n\n obj.content.push(cleanText)\n } else if (token.type === 'list') {\n const obj = structuredResponse[currentHeading]\n obj.text = cleanText\n obj.list = parseList(token).flat()\n } else if (token.type === 'html') {\n const obj = structuredResponse[currentHeading]\n obj.content.push(token.html)\n } else if (token.type === 'code') {\n const obj = structuredResponse[currentHeading]\n obj.lang = token.lang\n obj.text = cleanText\n } else {\n debug('unhandled token type')\n debug(token)\n }\n }\n\n for (const key in structuredResponse) {\n const token = structuredResponse[key]\n const content = token.content.filter(Boolean)\n if (content && content.length > 0) {\n if (content.length === 1) {\n token.text = content[0]\n }\n token.text = content.join('\\n\\n')\n }\n token.content = content\n }\n\n return structuredResponse\n}\n","'use strict'\n\nexport default function parseImage(props) {\n return props\n .filter((p) => p.type === 'image')\n .map((p) => {\n return {\n src: p.url,\n alt: p.alt\n }\n })\n}\n","'use strict'\n\nexport default function parseLinks(props) {\n return props\n .filter((p) => p.type === 'link')\n .map((p) => {\n return {\n src: p.url,\n alt: p.children[0].value\n }\n })\n}\n","'use strict'\n\nexport default function parseDuration(text) {\n let matched = false\n const duration = {\n hours: 0,\n minutes: 0\n }\n\n const hoursAndMinutes = new RegExp(/([0-9]+)h([0-9]+)m/)\n const hours = new RegExp(/([0-9]+)h/)\n\n if (text.match(hoursAndMinutes)) {\n matched = true\n const [, h, m] = text.match(hoursAndMinutes)\n duration.hours = parseInt(h)\n duration.minutes = parseInt(m)\n } else if (text.match(hours)) {\n matched = true\n const [, h] = text.match(hours)\n duration.hours = parseInt(h)\n duration.minutes = 0\n }\n\n if (matched) {\n return duration\n } else {\n return null\n }\n}\n"],"names":["commonDateFormats","commonTimeFormats","parseList","list","children","map","item","listItem","type","checked","child","text","c","link","url","value","filter","x","join","_settle","pact","state","s","_Pact","o","bind","v","then","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","debug","createDebug","body","_iterator","_step","token","cleanText","obj","trimmedText","date","images","links","time","duration","key","content","Promise","resolve","unified","use","remarkParse","remarkGfm","parse","tokens","_temp2","structuredResponse","Boolean","length","currentHeading","_createForOfIteratorHelperLoose","_temp","test","update","stage","shouldContinue","updateValue","reject","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","done","remarkStringify","stringify","_unified$use$use$stri","stripFinalNewline","indexOf","replace","slugify","title","heading","depth","trim","match","format","isMatch","fromZonedTime","Date","toJSON","split","p","src","alt","formatInTimeZone","parseTime","matched","hours","minutes","hoursAndMinutes","RegExp","_text$match","m","parseInt","_text$match2","parseDuration","push","flat","html","lang"],"mappings":"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"}
package/pkg/parse.js CHANGED
@@ -1,2 +1,2 @@
1
- import{unified as n}from"unified";import t from"remark-parse";import e from"remark-gfm";import r from"@sindresorhus/slugify";import i from"remark-stringify";import o from"strip-final-newline";import a from"debug";import{isMatch as u,parse as f}from"date-fns";import{zonedTimeToUtc as l,formatInTimeZone as h}from"date-fns-tz";function c(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=new Array(t);e<t;e++)r[e]=n[e];return r}var d=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],m=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],s=function n(t){return t.children.map(function(e){var r={};return"list"===e.type?n(t):"listItem"===e.type?(r.checked=e.checked,e.children.map(function(n){if("paragraph"===n.type)return r.text=n.children.map(function(n){return"link"===n.type?(r.link=n.url,"["+n.children[0].value+"]("+n.url+")"):n.value}).filter(function(n){return!!n}).join(""),r}).filter(function(n){return!!n})):void 0}).filter(function(n){return!!n})};function p(n,t,e){if(!n.s){if(e instanceof y){if(!e.s)return void(e.o=p.bind(null,n,t));1&t&&(t=e.s),e=e.v}if(e&&e.then)return void e.then(p.bind(null,n,t),p.bind(null,n,2));n.s=t,n.v=e;var r=n.o;r&&r(n)}}var v=function(a){try{var v,M,x,k,w,O,I,j,A,H,S,T,C,U,D;return b("parseMD()"),Promise.resolve(n().use(t).use(e).parse(a)).then(function(t){function a(){for(C in E)(D=(U=E[C]).content.filter(Boolean))&&D.length>0&&(1===D.length&&(U.text=D[0]),U.text=D.join("\n\n")),U.content=D;return E}if(!t)return[];var E={},P=null;v=function(n,t){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,t){if(n){if("string"==typeof n)return c(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?c(n,t):void 0}}(n))){e&&(n=e);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t.children);var _=function(n,t,e){for(var r;;){var i=n();if(g(i)&&(i=i.v),!i)return o;if(i.then){r=0;break}var o=e();if(o&&o.then){if(!g(o)){r=1;break}o=o.s}if(t){var a=t();if(a&&a.then&&!g(a)){r=2;break}}}var u=new y,f=p.bind(null,u,2);return(0===r?i.then(h):1===r?o.then(l):a.then(c)).then(void 0,f),u;function l(r){o=r;do{if(t&&(a=t())&&a.then&&!g(a))return void a.then(c).then(void 0,f);if(!(i=n())||g(i)&&!i.v)return void p(u,1,o);if(i.then)return void i.then(h).then(void 0,f);g(o=e())&&(o=o.v)}while(!o||!o.then);o.then(l).then(void 0,f)}function h(n){n?(o=e())&&o.then?o.then(l).then(void 0,f):l(o):p(u,1,o)}function c(){(i=n())?i.then?i.then(h).then(void 0,f):h(i):p(u,1,o)}}(function(){return!(M=v()).done},void 0,function(){return x=M.value,Promise.resolve(n().use(e).use(i).stringify(x)).then(function(n){var t,e;(k=o(n)).indexOf("\\_")>-1&&(k=k.replace(/\\_/g,"_")),"heading"===x.type?(P=r(x.children[0].value),E[P]={title:x.children[0].value,heading:x.depth,content:[]}):"paragraph"===x.type&&P?(w=E[P],t=k,e=d.map(function(n){return u(t,n)}),O=e.indexOf(!0)>-1?l(f(t,d[e.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,I=x.children.filter(function(n){return"image"===n.type}).map(function(n){return{src:n.url,alt:n.alt}}),j=x.children.filter(function(n){return"link"===n.type}).map(function(n){return{src:n.url,alt:n.children[0].value}}),A=function(n){var t=m.map(function(t){return u(n,t)});if(t.indexOf(!0)>-1){var e=l(f(n,m[t.indexOf(!0)],new Date),"UTC");return h(e,"UTC","HH:mm")}return null}(k),H=function(n){var t=!1,e={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(n.match(r)){t=!0;var o=n.match(r),a=o[2];e.hours=parseInt(o[1]),e.minutes=parseInt(a)}else if(n.match(i)){t=!0;var u=n.match(i);e.hours=parseInt(u[1]),e.minutes=0}return t?e:null}(k),O&&(w.date=O),A&&(w.time=A),H&&(w.duration=H),j&&j.length>0&&(w.links=j),I&&I.length>0&&(w.images=I),w.content.push(k)):"list"===x.type?((S=E[P]).text=k,S.list=s(x).flat()):"html"===x.type?E[P].content.push(x.html):"code"===x.type?((T=E[P]).lang=x.lang,T.text=k):(b("unhandled token type"),b(x))})});return _&&_.then?_.then(a):a()})}catch(n){return Promise.reject(n)}},y=/*#__PURE__*/function(){function n(){}return n.prototype.then=function(t,e){var r=new n,i=this.s;if(i){var o=1&i?t:e;if(o){try{p(r,1,o(this.v))}catch(n){p(r,2,n)}return r}return this}return this.o=function(n){try{var i=n.v;1&n.s?p(r,1,t?t(i):i):e?p(r,1,e(i)):p(r,2,i)}catch(n){p(r,2,n)}},r},n}();function g(n){return n instanceof y&&1&n.s}var b=a("body-parser");export{v as default};
1
+ import{unified as n}from"unified";import t from"remark-parse";import e from"remark-gfm";import r from"@sindresorhus/slugify";import i from"remark-stringify";import o from"strip-final-newline";import a from"debug";import{isMatch as u,parse as f}from"date-fns";import{fromZonedTime as l,formatInTimeZone as h}from"date-fns-tz";function c(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,r=Array(t);e<t;e++)r[e]=n[e];return r}var d=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],s=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],m=function n(t){return t.children.map(function(e){var r={};return"list"===e.type?n(t):"listItem"===e.type?(r.checked=e.checked,e.children.map(function(n){if("paragraph"===n.type)return r.text=n.children.map(function(n){return"link"===n.type?(r.link=n.url,"["+n.children[0].value+"]("+n.url+")"):n.value}).filter(function(n){return!!n}).join(""),r}).filter(function(n){return!!n})):void 0}).filter(function(n){return!!n})};function v(n,t,e){if(!n.s){if(e instanceof y){if(!e.s)return void(e.o=v.bind(null,n,t));1&t&&(t=e.s),e=e.v}if(e&&e.then)return void e.then(v.bind(null,n,t),v.bind(null,n,2));n.s=t,n.v=e;var r=n.o;r&&r(n)}}var p=function(a){try{var p,M,x,k,w,I,O,A,H,S,j,T,_,C,U,D;return b("parseMD()"),Promise.resolve(n().use(t).use(e).parse(a)).then(function(t){function a(){for(C in E)(D=(U=E[C]).content.filter(Boolean))&&D.length>0&&(1===D.length&&(U.text=D[0]),U.text=D.join("\n\n")),U.content=D;return E}if(!t)return[];var E={},N=null;p=function(n,t){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(e)return(e=e.call(n)).next.bind(e);if(Array.isArray(n)||(e=function(n,t){if(n){if("string"==typeof n)return c(n,t);var e={}.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?c(n,t):void 0}}(n))){e&&(n=e);var r=0;return function(){return r>=n.length?{done:!0}:{done:!1,value:n[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(t.children);var P=function(n,t,e){for(var r;;){var i=n();if(g(i)&&(i=i.v),!i)return o;if(i.then){r=0;break}var o=e();if(o&&o.then){if(!g(o)){r=1;break}o=o.s}if(t){var a=t();if(a&&a.then&&!g(a)){r=2;break}}}var u=new y,f=v.bind(null,u,2);return(0===r?i.then(h):1===r?o.then(l):a.then(c)).then(void 0,f),u;function l(r){o=r;do{if(t&&(a=t())&&a.then&&!g(a))return void a.then(c).then(void 0,f);if(!(i=n())||g(i)&&!i.v)return void v(u,1,o);if(i.then)return void i.then(h).then(void 0,f);g(o=e())&&(o=o.v)}while(!o||!o.then);o.then(l).then(void 0,f)}function h(n){n?(o=e())&&o.then?o.then(l).then(void 0,f):l(o):v(u,1,o)}function c(){(i=n())?i.then?i.then(h).then(void 0,f):h(i):v(u,1,o)}}(function(){return!(M=p()).done},void 0,function(){return x=M.value,Promise.resolve(n().use(e).use(i).stringify(x)).then(function(n){if((k=o(n)).indexOf("\\_")>-1&&(k=k.replace(/\\_/g,"_")),"heading"===x.type)N=r(x.children[0].value),E[N]={title:x.children[0].value,heading:x.depth,content:[]};else if("paragraph"===x.type&&N){if(w=E[N],"*No response*"===(I=k.trim())||"_No response_"===I)return void(w.text=null);t=k,e=d.map(function(n){return u(t,n)}),O=e.indexOf(!0)>-1?l(f(t,d[e.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,A=x.children.filter(function(n){return"image"===n.type}).map(function(n){return{src:n.url,alt:n.alt}}),H=x.children.filter(function(n){return"link"===n.type}).map(function(n){return{src:n.url,alt:n.children[0].value}}),S=function(n){var t=s.map(function(t){return u(n,t)});if(t.indexOf(!0)>-1){var e=l(f(n,s[t.indexOf(!0)],new Date),"UTC");return h(e,"UTC","HH:mm")}return null}(k),j=function(n){var t=!1,e={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(n.match(r)){t=!0;var o=n.match(r),a=o[2];e.hours=parseInt(o[1]),e.minutes=parseInt(a)}else if(n.match(i)){t=!0;var u=n.match(i);e.hours=parseInt(u[1]),e.minutes=0}return t?e:null}(k),O&&(w.date=O),S&&(w.time=S),j&&(w.duration=j),H&&H.length>0&&(w.links=H),A&&A.length>0&&(w.images=A),w.content.push(k)}else"list"===x.type?((T=E[N]).text=k,T.list=m(x).flat()):"html"===x.type?E[N].content.push(x.html):"code"===x.type?((_=E[N]).lang=x.lang,_.text=k):(b("unhandled token type"),b(x));var t,e})});return P&&P.then?P.then(a):a()})}catch(n){return Promise.reject(n)}},y=/*#__PURE__*/function(){function n(){}return n.prototype.then=function(t,e){var r=new n,i=this.s;if(i){var o=1&i?t:e;if(o){try{v(r,1,o(this.v))}catch(n){v(r,2,n)}return r}return this}return this.o=function(n){try{var i=n.v;1&n.s?v(r,1,t?t(i):i):e?v(r,1,e(i)):v(r,2,i)}catch(n){v(r,2,n)}},r},n}();function g(n){return n instanceof y&&1&n.s}var b=a("body-parser");export{p as default};
2
2
  //# sourceMappingURL=parse.js.map
package/pkg/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sources":["../src/parsers/date.js","../src/parsers/time.js","../src/parsers/index.js","../src/parsers/list.js","../src/parse.js","../src/parsers/images.js","../src/parsers/links.js","../src/parsers/duration.js"],"sourcesContent":["'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { zonedTimeToUtc } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonDateFormats = [\n 'yyyy-MM-dd',\n 'dd/MM/yyyy',\n 'dd/MM/yy',\n 'dd-MM-yyyy',\n 'dd-MM-yy',\n 'dd.MM.yyyy',\n 'dd.MM.yy'\n]\n\nexport default function parseDate(text) {\n const match = commonDateFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const date = zonedTimeToUtc(\n parse(text, commonDateFormats[match.indexOf(true)], new Date()),\n loc\n ).toJSON()\n return date.split('T')[0]\n } else {\n return null\n }\n}\n","'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { zonedTimeToUtc, formatInTimeZone } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonTimeFormats = [\n 'HH:mm',\n 'HH.mm',\n 'hh:mm aaa',\n 'hh:mm a..aa',\n 'hh:mm aaaa'\n]\n\nexport default function parseTime(text) {\n const match = commonTimeFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const time = zonedTimeToUtc(\n parse(text, commonTimeFormats[match.indexOf(true)], new Date()),\n loc\n )\n return formatInTimeZone(time, loc, 'HH:mm')\n } else {\n return null\n }\n}\n","'use strict'\n\nimport date from './date.js'\nimport time from './time.js'\nimport duration from './duration.js'\nimport list from './list.js'\nimport images from './images.js'\nimport links from './links.js'\n\nexport const parseDate = date\nexport const parseTime = time\nexport const parseDuration = duration\nexport const parseList = list\nexport const parseImages = images\nexport const parseLinks = links\n","'use strict'\n\nexport default function parseList(list) {\n return list.children\n .map((item) => {\n const listItem = {}\n if (item.type === 'list') {\n return parseList(list)\n } else if (item.type === 'listItem') {\n listItem.checked = item.checked\n return item.children\n .map((child) => {\n if (child.type === 'paragraph') {\n listItem.text = child.children\n .map((c) => {\n if (c.type === 'link') {\n listItem.link = c.url\n return `[${c.children[0].value}](${c.url})`\n } else {\n return c.value\n }\n })\n .filter((x) => !!x)\n .join('')\n return listItem\n }\n })\n .filter((x) => !!x)\n }\n })\n .filter((x) => !!x)\n}\n","'use strict'\n\nimport { unified } from 'unified'\nimport remarkParse from 'remark-parse'\nimport remarkGfm from 'remark-gfm'\nimport slugify from '@sindresorhus/slugify'\nimport remarkStringify from 'remark-stringify'\nimport stripFinalNewline from 'strip-final-newline'\nimport createDebug from 'debug'\nconst debug = createDebug('body-parser')\n\nimport {\n parseDate,\n parseTime,\n parseDuration,\n parseList,\n parseImages,\n parseLinks\n} from './parsers/index.js'\n\nexport default async function parseMD(body) {\n debug('parseMD()')\n const tokens = await unified().use(remarkParse).use(remarkGfm).parse(body)\n if (!tokens) {\n return []\n }\n\n const structuredResponse = {}\n let currentHeading = null\n\n for (const token of tokens.children) {\n const text = await unified()\n .use(remarkGfm)\n .use(remarkStringify)\n .stringify(token)\n let cleanText = stripFinalNewline(text)\n\n // remove `\\\\_`\n if (cleanText.indexOf('\\\\_') > -1) {\n cleanText = cleanText.replace(/\\\\_/g, '_')\n }\n\n // issue forms uses h3 as a heading\n if (token.type === 'heading') {\n currentHeading = slugify(token.children[0].value)\n structuredResponse[currentHeading] = {\n title: token.children[0].value,\n heading: token.depth,\n content: []\n }\n } else if (token.type === 'paragraph' && currentHeading) {\n const obj = structuredResponse[currentHeading]\n\n const date = parseDate(cleanText)\n const images = parseImages(token.children)\n const links = parseLinks(token.children)\n const time = parseTime(cleanText)\n const duration = parseDuration(cleanText)\n\n if (date) {\n obj.date = date\n }\n\n if (time) {\n obj.time = time\n }\n\n if (duration) {\n obj.duration = duration\n }\n\n if (links && links.length > 0) {\n obj.links = links\n }\n\n if (images && images.length > 0) {\n obj.images = images\n }\n\n obj.content.push(cleanText)\n } else if (token.type === 'list') {\n const obj = structuredResponse[currentHeading]\n obj.text = cleanText\n obj.list = parseList(token).flat()\n } else if (token.type === 'html') {\n const obj = structuredResponse[currentHeading]\n obj.content.push(token.html)\n } else if (token.type === 'code') {\n const obj = structuredResponse[currentHeading]\n obj.lang = token.lang\n obj.text = cleanText\n } else {\n debug('unhandled token type')\n debug(token)\n }\n }\n\n for (const key in structuredResponse) {\n const token = structuredResponse[key]\n const content = token.content.filter(Boolean)\n if (content && content.length > 0) {\n if (content.length === 1) {\n token.text = content[0]\n }\n token.text = content.join('\\n\\n')\n }\n token.content = content\n }\n\n return structuredResponse\n}\n","'use strict'\n\nexport default function parseImage(props) {\n return props\n .filter((p) => p.type === 'image')\n .map((p) => {\n return {\n src: p.url,\n alt: p.alt\n }\n })\n}\n","'use strict'\n\nexport default function parseLinks(props) {\n return props\n .filter((p) => p.type === 'link')\n .map((p) => {\n return {\n src: p.url,\n alt: p.children[0].value\n }\n })\n}\n","'use strict'\n\nexport default function parseDuration(text) {\n let matched = false\n const duration = {\n hours: 0,\n minutes: 0\n }\n\n const hoursAndMinutes = new RegExp(/([0-9]+)h([0-9]+)m/)\n const hours = new RegExp(/([0-9]+)h/)\n\n if (text.match(hoursAndMinutes)) {\n matched = true\n const [, h, m] = text.match(hoursAndMinutes)\n duration.hours = parseInt(h)\n duration.minutes = parseInt(m)\n } else if (text.match(hours)) {\n matched = true\n const [, h] = text.match(hours)\n duration.hours = parseInt(h)\n duration.minutes = 0\n }\n\n if (matched) {\n return duration\n } else {\n return null\n }\n}\n"],"names":["commonDateFormats","commonTimeFormats","parseList","list","children","map","item","listItem","type","checked","child","text","c","link","url","value","filter","x","join","_settle","pact","state","s","_Pact","o","bind","v","then","observer","parseMD","body","_iterator","_step","token","cleanText","obj","date","images","links","time","duration","key","content","Promise","debug","resolve","unified","use","remarkParse","remarkGfm","parse","tokens","_temp2","structuredResponse","Boolean","length","currentHeading","_createForOfIteratorHelperLoose","_temp","test","update","stage","shouldContinue","_isSettledPact","result","updateValue","reject","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","done","remarkStringify","stringify","_unified$use$use$stri","match","stripFinalNewline","indexOf","replace","slugify","title","heading","depth","format","isMatch","zonedTimeToUtc","Date","toJSON","split","p","src","alt","formatInTimeZone","parseTime","matched","hours","minutes","hoursAndMinutes","RegExp","_text$match","m","parseInt","_text$match2","parseDuration","push","flat","html","lang","e","prototype","onFulfilled","onRejected","this","callback","_this","thenable","createDebug"],"mappings":"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"}
1
+ {"version":3,"file":"parse.js","sources":["../src/parsers/date.js","../src/parsers/time.js","../src/parsers/index.js","../src/parsers/list.js","../src/parse.js","../src/parsers/images.js","../src/parsers/links.js","../src/parsers/duration.js"],"sourcesContent":["'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { fromZonedTime } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonDateFormats = [\n 'yyyy-MM-dd',\n 'dd/MM/yyyy',\n 'dd/MM/yy',\n 'dd-MM-yyyy',\n 'dd-MM-yy',\n 'dd.MM.yyyy',\n 'dd.MM.yy'\n]\n\nexport default function parseDate(text) {\n const match = commonDateFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const date = fromZonedTime(\n parse(text, commonDateFormats[match.indexOf(true)], new Date()),\n loc\n ).toJSON()\n return date.split('T')[0]\n } else {\n return null\n }\n}\n","'use strict'\n\nimport { parse, isMatch } from 'date-fns'\nimport { fromZonedTime, formatInTimeZone } from 'date-fns-tz'\n\nconst loc = 'UTC'\nconst commonTimeFormats = [\n 'HH:mm',\n 'HH.mm',\n 'hh:mm aaa',\n 'hh:mm a..aa',\n 'hh:mm aaaa'\n]\n\nexport default function parseTime(text) {\n const match = commonTimeFormats.map((format) => {\n return isMatch(text, format)\n })\n if (match.indexOf(true) > -1) {\n const time = fromZonedTime(\n parse(text, commonTimeFormats[match.indexOf(true)], new Date()),\n loc\n )\n return formatInTimeZone(time, loc, 'HH:mm')\n } else {\n return null\n }\n}\n","'use strict'\n\nimport date from './date.js'\nimport time from './time.js'\nimport duration from './duration.js'\nimport list from './list.js'\nimport images from './images.js'\nimport links from './links.js'\n\nexport const parseDate = date\nexport const parseTime = time\nexport const parseDuration = duration\nexport const parseList = list\nexport const parseImages = images\nexport const parseLinks = links\n","'use strict'\n\nexport default function parseList(list) {\n return list.children\n .map((item) => {\n const listItem = {}\n if (item.type === 'list') {\n return parseList(list)\n } else if (item.type === 'listItem') {\n listItem.checked = item.checked\n return item.children\n .map((child) => {\n if (child.type === 'paragraph') {\n listItem.text = child.children\n .map((c) => {\n if (c.type === 'link') {\n listItem.link = c.url\n return `[${c.children[0].value}](${c.url})`\n } else {\n return c.value\n }\n })\n .filter((x) => !!x)\n .join('')\n return listItem\n }\n })\n .filter((x) => !!x)\n }\n })\n .filter((x) => !!x)\n}\n","'use strict'\n\nimport { unified } from 'unified'\nimport remarkParse from 'remark-parse'\nimport remarkGfm from 'remark-gfm'\nimport slugify from '@sindresorhus/slugify'\nimport remarkStringify from 'remark-stringify'\nimport stripFinalNewline from 'strip-final-newline'\nimport createDebug from 'debug'\nconst debug = createDebug('body-parser')\n\nimport {\n parseDate,\n parseTime,\n parseDuration,\n parseList,\n parseImages,\n parseLinks\n} from './parsers/index.js'\n\nexport default async function parseMD(body) {\n debug('parseMD()')\n const tokens = await unified().use(remarkParse).use(remarkGfm).parse(body)\n if (!tokens) {\n return []\n }\n\n const structuredResponse = {}\n let currentHeading = null\n\n for (const token of tokens.children) {\n const text = await unified()\n .use(remarkGfm)\n .use(remarkStringify)\n .stringify(token)\n let cleanText = stripFinalNewline(text)\n\n // remove `\\\\_`\n if (cleanText.indexOf('\\\\_') > -1) {\n cleanText = cleanText.replace(/\\\\_/g, '_')\n }\n\n // issue forms uses h3 as a heading\n if (token.type === 'heading') {\n currentHeading = slugify(token.children[0].value)\n structuredResponse[currentHeading] = {\n title: token.children[0].value,\n heading: token.depth,\n content: []\n }\n } else if (token.type === 'paragraph' && currentHeading) {\n const obj = structuredResponse[currentHeading]\n\n const trimmedText = cleanText.trim()\n if (trimmedText === '*No response*' || trimmedText === '_No response_') {\n obj.text = null\n continue\n }\n\n const date = parseDate(cleanText)\n const images = parseImages(token.children)\n const links = parseLinks(token.children)\n const time = parseTime(cleanText)\n const duration = parseDuration(cleanText)\n\n if (date) {\n obj.date = date\n }\n\n if (time) {\n obj.time = time\n }\n\n if (duration) {\n obj.duration = duration\n }\n\n if (links && links.length > 0) {\n obj.links = links\n }\n\n if (images && images.length > 0) {\n obj.images = images\n }\n\n obj.content.push(cleanText)\n } else if (token.type === 'list') {\n const obj = structuredResponse[currentHeading]\n obj.text = cleanText\n obj.list = parseList(token).flat()\n } else if (token.type === 'html') {\n const obj = structuredResponse[currentHeading]\n obj.content.push(token.html)\n } else if (token.type === 'code') {\n const obj = structuredResponse[currentHeading]\n obj.lang = token.lang\n obj.text = cleanText\n } else {\n debug('unhandled token type')\n debug(token)\n }\n }\n\n for (const key in structuredResponse) {\n const token = structuredResponse[key]\n const content = token.content.filter(Boolean)\n if (content && content.length > 0) {\n if (content.length === 1) {\n token.text = content[0]\n }\n token.text = content.join('\\n\\n')\n }\n token.content = content\n }\n\n return structuredResponse\n}\n","'use strict'\n\nexport default function parseImage(props) {\n return props\n .filter((p) => p.type === 'image')\n .map((p) => {\n return {\n src: p.url,\n alt: p.alt\n }\n })\n}\n","'use strict'\n\nexport default function parseLinks(props) {\n return props\n .filter((p) => p.type === 'link')\n .map((p) => {\n return {\n src: p.url,\n alt: p.children[0].value\n }\n })\n}\n","'use strict'\n\nexport default function parseDuration(text) {\n let matched = false\n const duration = {\n hours: 0,\n minutes: 0\n }\n\n const hoursAndMinutes = new RegExp(/([0-9]+)h([0-9]+)m/)\n const hours = new RegExp(/([0-9]+)h/)\n\n if (text.match(hoursAndMinutes)) {\n matched = true\n const [, h, m] = text.match(hoursAndMinutes)\n duration.hours = parseInt(h)\n duration.minutes = parseInt(m)\n } else if (text.match(hours)) {\n matched = true\n const [, h] = text.match(hours)\n duration.hours = parseInt(h)\n duration.minutes = 0\n }\n\n if (matched) {\n return duration\n } else {\n return null\n }\n}\n"],"names":["commonDateFormats","commonTimeFormats","parseList","list","children","map","item","listItem","type","checked","child","text","c","link","url","value","filter","x","join","_settle","pact","state","s","_Pact","o","bind","v","then","observer","parseMD","body","_iterator","_step","token","cleanText","obj","trimmedText","date","images","links","time","duration","key","content","Promise","debug","resolve","unified","use","remarkParse","remarkGfm","parse","tokens","_temp2","structuredResponse","Boolean","length","currentHeading","_createForOfIteratorHelperLoose","_temp","test","update","stage","shouldContinue","_isSettledPact","result","updateValue","reject","_resumeAfterTest","_resumeAfterBody","_resumeAfterUpdate","_for","done","remarkStringify","stringify","_unified$use$use$stri","stripFinalNewline","indexOf","replace","slugify","title","heading","depth","trim","match","format","isMatch","fromZonedTime","Date","toJSON","split","p","src","alt","formatInTimeZone","parseTime","matched","hours","minutes","hoursAndMinutes","RegExp","_text$match","m","parseInt","_text$match2","parseDuration","push","flat","html","lang","e","prototype","onFulfilled","onRejected","this","callback","_this","thenable","createDebug"],"mappings":"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"}
package/pkg/parse.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("unified"),require("remark-parse"),require("remark-gfm"),require("@sindresorhus/slugify"),require("remark-stringify"),require("strip-final-newline"),require("debug"),require("date-fns"),require("date-fns-tz")):"function"==typeof define&&define.amd?define(["unified","remark-parse","remark-gfm","@sindresorhus/slugify","remark-stringify","strip-final-newline","debug","date-fns","date-fns-tz"],n):(e||self).issueFormsBodyParser=n(e.unified,e.remarkParse,e.remarkGfm,e.slugify,e.remarkStringify,e.stripFinalNewline,e.debug,e.dateFns,e.dateFnsTz)}(this,function(e,n,t,r,i,u,a,o,f){function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=/*#__PURE__*/l(n),s=/*#__PURE__*/l(t),c=/*#__PURE__*/l(r),h=/*#__PURE__*/l(i),m=/*#__PURE__*/l(u),y=/*#__PURE__*/l(a);function p(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}var v=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],g=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],b=function e(n){return n.children.map(function(t){var r={};return"list"===t.type?e(n):"listItem"===t.type?(r.checked=t.checked,t.children.map(function(e){if("paragraph"===e.type)return r.text=e.children.map(function(e){return"link"===e.type?(r.link=e.url,"["+e.children[0].value+"]("+e.url+")"):e.value}).filter(function(e){return!!e}).join(""),r}).filter(function(e){return!!e})):void 0}).filter(function(e){return!!e})};function k(e,n,t){if(!e.s){if(t instanceof M){if(!t.s)return void(t.o=k.bind(null,e,n));1&n&&(n=t.s),t=t.v}if(t&&t.then)return void t.then(k.bind(null,e,n),k.bind(null,e,2));e.s=n,e.v=t;var r=e.o;r&&r(e)}}var M=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,t){var r=new e,i=this.s;if(i){var u=1&i?n:t;if(u){try{k(r,1,u(this.v))}catch(e){k(r,2,e)}return r}return this}return this.o=function(e){try{var i=e.v;1&e.s?k(r,1,n?n(i):i):t?k(r,1,t(i)):k(r,2,i)}catch(e){k(r,2,e)}},r},e}();function x(e){return e instanceof M&&1&e.s}var w=y.default("body-parser");return function(n){try{var t,r,i,u,a,l,y,T,q,j,I,O,S,A,H;return w("parseMD()"),Promise.resolve(e.unified().use(d.default).use(s.default).parse(n)).then(function(n){function d(){for(S in U)(H=(A=U[S]).content.filter(Boolean))&&H.length>0&&(1===H.length&&(A.text=H[0]),A.text=H.join("\n\n")),A.content=H;return U}if(!n)return[];var U={},z=null;t=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return p(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?p(e,n):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(n.children);var P=function(e,n,t){for(var r;;){var i=e();if(x(i)&&(i=i.v),!i)return u;if(i.then){r=0;break}var u=t();if(u&&u.then){if(!x(u)){r=1;break}u=u.s}if(n){var a=n();if(a&&a.then&&!x(a)){r=2;break}}}var o=new M,f=k.bind(null,o,2);return(0===r?i.then(d):1===r?u.then(l):a.then(s)).then(void 0,f),o;function l(r){u=r;do{if(n&&(a=n())&&a.then&&!x(a))return void a.then(s).then(void 0,f);if(!(i=e())||x(i)&&!i.v)return void k(o,1,u);if(i.then)return void i.then(d).then(void 0,f);x(u=t())&&(u=u.v)}while(!u||!u.then);u.then(l).then(void 0,f)}function d(e){e?(u=t())&&u.then?u.then(l).then(void 0,f):l(u):k(o,1,u)}function s(){(i=e())?i.then?i.then(d).then(void 0,f):d(i):k(o,1,u)}}(function(){return!(r=t()).done},void 0,function(){return i=r.value,Promise.resolve(e.unified().use(s.default).use(h.default).stringify(i)).then(function(e){var n,t;(u=m.default(e)).indexOf("\\_")>-1&&(u=u.replace(/\\_/g,"_")),"heading"===i.type?(z=c.default(i.children[0].value),U[z]={title:i.children[0].value,heading:i.depth,content:[]}):"paragraph"===i.type&&z?(a=U[z],n=u,t=v.map(function(e){return o.isMatch(n,e)}),l=t.indexOf(!0)>-1?f.zonedTimeToUtc(o.parse(n,v[t.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,y=i.children.filter(function(e){return"image"===e.type}).map(function(e){return{src:e.url,alt:e.alt}}),T=i.children.filter(function(e){return"link"===e.type}).map(function(e){return{src:e.url,alt:e.children[0].value}}),q=function(e){var n=g.map(function(n){return o.isMatch(e,n)});if(n.indexOf(!0)>-1){var t=f.zonedTimeToUtc(o.parse(e,g[n.indexOf(!0)],new Date),"UTC");return f.formatInTimeZone(t,"UTC","HH:mm")}return null}(u),j=function(e){var n=!1,t={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(e.match(r)){n=!0;var u=e.match(r),a=u[2];t.hours=parseInt(u[1]),t.minutes=parseInt(a)}else if(e.match(i)){n=!0;var o=e.match(i);t.hours=parseInt(o[1]),t.minutes=0}return n?t:null}(u),l&&(a.date=l),q&&(a.time=q),j&&(a.duration=j),T&&T.length>0&&(a.links=T),y&&y.length>0&&(a.images=y),a.content.push(u)):"list"===i.type?((I=U[z]).text=u,I.list=b(i).flat()):"html"===i.type?U[z].content.push(i.html):"code"===i.type?((O=U[z]).lang=i.lang,O.text=u):(w("unhandled token type"),w(i))})});return P&&P.then?P.then(d):d()})}catch(e){return Promise.reject(e)}}});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("unified"),require("remark-parse"),require("remark-gfm"),require("@sindresorhus/slugify"),require("remark-stringify"),require("strip-final-newline"),require("debug"),require("date-fns"),require("date-fns-tz")):"function"==typeof define&&define.amd?define(["unified","remark-parse","remark-gfm","@sindresorhus/slugify","remark-stringify","strip-final-newline","debug","date-fns","date-fns-tz"],n):(e||self).issueFormsBodyParser=n(e.unified,e.remarkParse,e.remarkGfm,e.slugify,e.remarkStringify,e.stripFinalNewline,e.debug,e.dateFns,e.dateFnsTz)}(this,function(e,n,t,r,i,u,a,o,f){function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var d=/*#__PURE__*/l(n),s=/*#__PURE__*/l(t),h=/*#__PURE__*/l(r),c=/*#__PURE__*/l(i),m=/*#__PURE__*/l(u),y=/*#__PURE__*/l(a);function p(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=Array(n);t<n;t++)r[t]=e[t];return r}var v=["yyyy-MM-dd","dd/MM/yyyy","dd/MM/yy","dd-MM-yyyy","dd-MM-yy","dd.MM.yyyy","dd.MM.yy"],g=["HH:mm","HH.mm","hh:mm aaa","hh:mm a..aa","hh:mm aaaa"],b=function e(n){return n.children.map(function(t){var r={};return"list"===t.type?e(n):"listItem"===t.type?(r.checked=t.checked,t.children.map(function(e){if("paragraph"===e.type)return r.text=e.children.map(function(e){return"link"===e.type?(r.link=e.url,"["+e.children[0].value+"]("+e.url+")"):e.value}).filter(function(e){return!!e}).join(""),r}).filter(function(e){return!!e})):void 0}).filter(function(e){return!!e})};function k(e,n,t){if(!e.s){if(t instanceof M){if(!t.s)return void(t.o=k.bind(null,e,n));1&n&&(n=t.s),t=t.v}if(t&&t.then)return void t.then(k.bind(null,e,n),k.bind(null,e,2));e.s=n,e.v=t;var r=e.o;r&&r(e)}}var M=/*#__PURE__*/function(){function e(){}return e.prototype.then=function(n,t){var r=new e,i=this.s;if(i){var u=1&i?n:t;if(u){try{k(r,1,u(this.v))}catch(e){k(r,2,e)}return r}return this}return this.o=function(e){try{var i=e.v;1&e.s?k(r,1,n?n(i):i):t?k(r,1,t(i)):k(r,2,i)}catch(e){k(r,2,e)}},r},e}();function x(e){return e instanceof M&&1&e.s}var w=y.default("body-parser");return function(n){try{var t,r,i,u,a,l,y,T,q,I,j,O,S,A,H,P;return w("parseMD()"),Promise.resolve(e.unified().use(d.default).use(s.default).parse(n)).then(function(n){function d(){for(A in _)(P=(H=_[A]).content.filter(Boolean))&&P.length>0&&(1===P.length&&(H.text=P[0]),H.text=P.join("\n\n")),H.content=P;return _}if(!n)return[];var _={},C=null;t=function(e,n){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=function(e,n){if(e){if("string"==typeof e)return p(e,n);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?p(e,n):void 0}}(e))){t&&(e=t);var r=0;return function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(n.children);var F=function(e,n,t){for(var r;;){var i=e();if(x(i)&&(i=i.v),!i)return u;if(i.then){r=0;break}var u=t();if(u&&u.then){if(!x(u)){r=1;break}u=u.s}if(n){var a=n();if(a&&a.then&&!x(a)){r=2;break}}}var o=new M,f=k.bind(null,o,2);return(0===r?i.then(d):1===r?u.then(l):a.then(s)).then(void 0,f),o;function l(r){u=r;do{if(n&&(a=n())&&a.then&&!x(a))return void a.then(s).then(void 0,f);if(!(i=e())||x(i)&&!i.v)return void k(o,1,u);if(i.then)return void i.then(d).then(void 0,f);x(u=t())&&(u=u.v)}while(!u||!u.then);u.then(l).then(void 0,f)}function d(e){e?(u=t())&&u.then?u.then(l).then(void 0,f):l(u):k(o,1,u)}function s(){(i=e())?i.then?i.then(d).then(void 0,f):d(i):k(o,1,u)}}(function(){return!(r=t()).done},void 0,function(){return i=r.value,Promise.resolve(e.unified().use(s.default).use(c.default).stringify(i)).then(function(e){if((u=m.default(e)).indexOf("\\_")>-1&&(u=u.replace(/\\_/g,"_")),"heading"===i.type)C=h.default(i.children[0].value),_[C]={title:i.children[0].value,heading:i.depth,content:[]};else if("paragraph"===i.type&&C){if(a=_[C],"*No response*"===(l=u.trim())||"_No response_"===l)return void(a.text=null);n=u,t=v.map(function(e){return o.isMatch(n,e)}),y=t.indexOf(!0)>-1?f.fromZonedTime(o.parse(n,v[t.indexOf(!0)],new Date),"UTC").toJSON().split("T")[0]:null,T=i.children.filter(function(e){return"image"===e.type}).map(function(e){return{src:e.url,alt:e.alt}}),q=i.children.filter(function(e){return"link"===e.type}).map(function(e){return{src:e.url,alt:e.children[0].value}}),I=function(e){var n=g.map(function(n){return o.isMatch(e,n)});if(n.indexOf(!0)>-1){var t=f.fromZonedTime(o.parse(e,g[n.indexOf(!0)],new Date),"UTC");return f.formatInTimeZone(t,"UTC","HH:mm")}return null}(u),j=function(e){var n=!1,t={hours:0,minutes:0},r=new RegExp(/([0-9]+)h([0-9]+)m/),i=new RegExp(/([0-9]+)h/);if(e.match(r)){n=!0;var u=e.match(r),a=u[2];t.hours=parseInt(u[1]),t.minutes=parseInt(a)}else if(e.match(i)){n=!0;var o=e.match(i);t.hours=parseInt(o[1]),t.minutes=0}return n?t:null}(u),y&&(a.date=y),I&&(a.time=I),j&&(a.duration=j),q&&q.length>0&&(a.links=q),T&&T.length>0&&(a.images=T),a.content.push(u)}else"list"===i.type?((O=_[C]).text=u,O.list=b(i).flat()):"html"===i.type?_[C].content.push(i.html):"code"===i.type?((S=_[C]).lang=i.lang,S.text=u):(w("unhandled token type"),w(i));var n,t})});return F&&F.then?F.then(d):d()})}catch(e){return Promise.reject(e)}}});
2
2
  //# sourceMappingURL=parse.umd.js.map