@airmark/quiver 0.21.0 → 0.22.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@airmark/quiver",
3
- "version": "0.21.0",
3
+ "version": "0.22.1",
4
4
  "description": "Airmark Quiver — Air Force and DAF document Quills for Quillmark.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -17,7 +17,7 @@
17
17
  },
18
18
  "devDependencies": {
19
19
  "@quillmark/quiver": "^0.11.0",
20
- "@quillmark/wasm": "^0.82.0"
20
+ "@quillmark/wasm": "^0.84.0"
21
21
  },
22
22
  "scripts": {
23
23
  "test": "quiver test",
@@ -11,20 +11,24 @@ main:
11
11
  fields:
12
12
  name:
13
13
  type: string
14
- required: true
14
+ default: ""
15
+ example: "Doe, John A."
15
16
  description: Full name in Last, First, Middle Initial format.
16
17
 
17
18
  unit:
18
19
  type: string
19
- required: true
20
+ default: ""
21
+ example: 1st Air Control Squadron
20
22
  description: Unit or organization of assignment.
21
23
 
22
24
  grade:
23
25
  type: string
26
+ default: ""
24
27
  description: Current grade or CCC level.
25
28
 
26
29
  commanders_auth:
27
30
  type: string
31
+ default: ""
28
32
  description: Commander's authentication entry on page 1.
29
33
 
30
34
  card_kinds:
@@ -37,18 +41,21 @@ card_kinds:
37
41
  fields:
38
42
  date:
39
43
  type: date
44
+ default: ""
40
45
  ui:
41
46
  group: Record
42
47
  description: Date of the action (column A).
43
48
 
44
49
  action:
45
50
  type: string
51
+ default: ""
46
52
  ui:
47
53
  group: Record
48
54
  description: One type of action per line (column B).
49
55
 
50
56
  written_grade:
51
57
  type: string
58
+ default: ""
52
59
  ui:
53
60
  group: Record
54
61
  compact: true
@@ -64,6 +71,7 @@ card_kinds:
64
71
 
65
72
  positional_grade:
66
73
  type: string
74
+ default: ""
67
75
  ui:
68
76
  group: Record
69
77
  compact: true
@@ -79,6 +87,7 @@ card_kinds:
79
87
 
80
88
  auth_or_remarks:
81
89
  type: string
90
+ default: ""
82
91
  ui:
83
92
  group: Record
84
93
  description: Authentication or remarks entry (column G).
@@ -41,8 +41,8 @@
41
41
  #let max-rows = 37
42
42
  #{
43
43
  let row = 0
44
- for card in data.CARDS {
45
- if card.CARD == "experience" {
44
+ for card in data.at("$cards") {
45
+ if card.at("$kind") == "experience" {
46
46
  if row < max-rows {
47
47
  for (col, key) in col-keys.enumerate() {
48
48
  let value = form-cell(card.at(key, default: none))
@@ -13,30 +13,47 @@ main:
13
13
  fields:
14
14
  award:
15
15
  type: string
16
+ default: ""
17
+ example: Outstanding Performer of the Quarter
16
18
  category_if_applicable:
17
19
  type: string
20
+ default: ""
18
21
  ui:
19
22
  compact: true
20
23
  award_period:
21
24
  type: string
25
+ default: ""
26
+ example: 1 Jan 2026 – 31 Mar 2026
22
27
  ui:
23
28
  compact: true
24
29
  rankname_of_nominee:
25
30
  type: string
31
+ default: ""
32
+ example: "SSgt John A. Doe"
26
33
  ui:
27
34
  compact: true
28
35
  majcom_fldcom_foa_or_dru:
29
36
  type: string
37
+ default: ""
38
+ example: ACC
30
39
  ui:
31
40
  compact: true
32
41
  dafsc_duty_title:
33
42
  type: string
43
+ default: ""
44
+ example: "1C5X1, Aerospace Control and Warning Systems"
34
45
  nominees_telephone_dsn_commercial:
35
46
  type: string
47
+ default: ""
48
+ example: "DSN 555-1234 / (555) 555-1234"
36
49
  unit_office_symbol_street_address_base_state_zip:
37
50
  type: string
51
+ default: ""
52
+ example: "1st ACS, 123 Main St, Tyndall AFB FL 32403"
38
53
  unit_commander_rank_name_and_telephone:
39
54
  type: string
55
+ default: ""
56
+ example: "Lt Col Jane B. Smith, (555) 555-5678"
40
57
 
41
58
  card_kinds:
42
59
  accomplishments_continued:
@@ -30,17 +30,17 @@
30
30
  data.unit_commander_rank_name_and_telephone,
31
31
  )
32
32
  }
33
- #if "BODY" in data {
33
+ #if "$body" in data {
34
34
  vals.insert(
35
35
  "SPECIFIC_ACCOMPLISHMENTS_Use_Performance_Statements_IAW_DAFMAN_362806",
36
- data.BODY,
36
+ data.at("$body"),
37
37
  )
38
38
  }
39
39
 
40
40
  #let continued-key = "SPECIFIC_ACCOMPLISHMENTS_Use_Performance_Statements_IAW_DAFMAN_362806_Continued"
41
- #for card in data.CARDS {
42
- if card.CARD == "accomplishments_continued" and continued-key not in vals and "BODY" in card {
43
- vals.insert(continued-key, card.BODY)
41
+ #for card in data.at("$cards") {
42
+ if card.at("$kind") == "accomplishments_continued" and continued-key not in vals and "$body" in card {
43
+ vals.insert(continued-key, card.at("$body"))
44
44
  }
45
45
  }
46
46
 
@@ -12,72 +12,83 @@ main:
12
12
  transportation_mode:
13
13
  type: string
14
14
  enum: [pmv, airplane, bus, train, motorcycle, other]
15
- required: true
15
+ default: pmv
16
16
  description: "Matches the check box."
17
17
 
18
18
  departure_date:
19
19
  type: date
20
- required: true
20
+ default: ""
21
+ example: "2026-06-01"
21
22
  ui:
22
23
  compact: true
23
24
  description: "Date of initial departure."
24
25
 
25
26
  final_destination:
26
27
  type: string
27
- required: true
28
+ default: ""
29
+ example: San Antonio, TX
28
30
  ui:
29
31
  compact: true
30
32
  description: "Final travel destination."
31
33
 
32
34
  dept_flight_num:
33
35
  type: string
36
+ default: ""
34
37
  ui:
35
38
  compact: true
36
39
  description: "Departure flight number. (tenative or confirmed)"
37
40
 
38
41
  arrival_flight_num:
39
42
  type: string
43
+ default: ""
40
44
  ui:
41
45
  compact: true
42
46
  description: "Arrival flight number. (tenative or confirmed)"
43
47
 
44
48
  notes:
45
49
  type: string
50
+ default: ""
46
51
  description: "Additional notes or remarks for the travel."
47
52
 
48
53
  organization:
49
54
  type: string
50
- required: true
55
+ default: ""
56
+ example: 1st Air Control Squadron
51
57
  ui:
52
58
  compact: true
53
59
  description: "Unit / Organization."
54
60
 
55
61
  briefed_date:
56
62
  type: date
57
- required: true
63
+ default: ""
64
+ example: "2026-05-22"
58
65
  ui:
59
66
  compact: true
60
67
  description: "Put in today's date."
61
68
 
62
69
  briefee_name:
63
70
  type: string
64
- required: true
71
+ default: ""
72
+ example: "Doe, John"
65
73
  ui:
66
74
  compact: true
67
75
  description: "Put in your Name (Last, First)."
68
76
 
69
77
  briefee_grade:
70
78
  type: string
79
+ default: ""
71
80
  ui:
72
81
  compact: true
73
82
  description: "Put in your Grade."
74
83
 
75
84
  emergency_contact_name:
76
85
  type: string
86
+ default: ""
77
87
  description: "Put in your Emergency Contact Name."
78
88
 
79
89
  emergency_contact_phone:
80
90
  type: string
91
+ default: ""
81
92
  description: "Put in your Emergency Contact's Phone Number."
82
93
 
83
94
  card_kinds:
@@ -90,30 +101,35 @@ card_kinds:
90
101
  fields:
91
102
  date:
92
103
  type: date
104
+ default: ""
93
105
  ui:
94
106
  group: Itinerary Entry
95
107
  compact: true
96
108
  description: "Date for the itinerary row."
97
109
  departure_point:
98
110
  type: string
111
+ default: ""
99
112
  ui:
100
113
  group: Itinerary Entry
101
114
  compact: true
102
115
  description: "Point of departure."
103
116
  arrival_point:
104
117
  type: string
118
+ default: ""
105
119
  ui:
106
120
  group: Itinerary Entry
107
121
  compact: true
108
122
  description: "Point of arrival."
109
123
  rest_length:
110
124
  type: string
125
+ default: ""
111
126
  ui:
112
127
  group: Itinerary Entry
113
128
  compact: true
114
129
  description: "Duration of stay at arrival point"
115
130
  mileage:
116
131
  type: string
132
+ default: ""
117
133
  ui:
118
134
  group: Itinerary Entry
119
135
  compact: true
@@ -18,8 +18,8 @@
18
18
  #let itin-cols = ("date", "departure_point", "arrival_point", "rest_length", "mileage")
19
19
  #{
20
20
  let row = 0
21
- for card in data.at("CARDS", default: ()) {
22
- if card.CARD == "itinerary" and row < 10 {
21
+ for card in data.at("$cards", default: ()) {
22
+ if card.at("$kind") == "itinerary" and row < 10 {
23
23
  let n = str(row + 1)
24
24
  for col in itin-cols {
25
25
  let v = card.at(col, default: none)
@@ -14,7 +14,7 @@ main:
14
14
  fields:
15
15
  memo_for:
16
16
  type: array
17
- required: true
17
+ default: []
18
18
  example:
19
19
  - ORG1/SYMBOL
20
20
  - ORG2/SYMBOL
@@ -36,7 +36,7 @@ main:
36
36
 
37
37
  subject:
38
38
  type: string
39
- required: true
39
+ default: ""
40
40
  example: Subject of the Memorandum
41
41
  ui:
42
42
  group: Addressing
@@ -44,7 +44,7 @@ main:
44
44
 
45
45
  signature_block:
46
46
  type: array
47
- required: true
47
+ default: []
48
48
  example:
49
49
  - "FIRST M. LAST, Rank, USSF"
50
50
  - Duty Title
@@ -96,6 +96,7 @@ main:
96
96
 
97
97
  freedom250:
98
98
  type: boolean
99
+ default: false
99
100
  ui:
100
101
  group: Letterhead
101
102
  compact: true
@@ -209,7 +210,6 @@ card_kinds:
209
210
  description: Office symbol or organization receiving the endorsed memo.
210
211
  signature_block:
211
212
  type: array
212
- required: true
213
213
  default:
214
214
  - "FIRST M. LAST, Rank, USAF"
215
215
  - Duty Title
@@ -242,16 +242,19 @@ card_kinds:
242
242
  description: "Action taken by the endorser. Leave blank to hide the Approve/Disapprove line entirely, 'undecided' to display the line with neither option circled, 'approve' or 'disapprove' to circle the selected option."
243
243
  attachments:
244
244
  type: array
245
+ default: []
245
246
  ui:
246
247
  group: Additional
247
248
  description: List of attachments specific to this endorsement.
248
249
  cc:
249
250
  type: array
251
+ default: []
250
252
  ui:
251
253
  group: Additional
252
254
  description: List of office symbols to receive copies of this endorsement.
253
255
  date:
254
256
  type: date
257
+ default: ""
255
258
  ui:
256
259
  group: Additional
257
260
  description: "YYYY-MM-DD. Date the endorser signs/forwards the memo (per AFH 33-337 Ch. 14, this is distinct from the originating memo's date). Leave blank to use today's date."
@@ -55,7 +55,7 @@
55
55
 
56
56
  // Mainmatter configuration
57
57
  #mainmatter[
58
- #data.BODY
58
+ #data.at("$body")
59
59
  ]
60
60
 
61
61
  // Backmatter
@@ -75,13 +75,13 @@
75
75
  )
76
76
 
77
77
  // Indorsements - iterate through CARDS array and filter by CARD tag
78
- #for (i, card) in data.CARDS.enumerate() {
79
- if card.CARD == "indorsement" {
78
+ #for (i, card) in data.at("$cards").enumerate() {
79
+ if card.at("$kind") == "indorsement" {
80
80
  // The quillmark helper leaves an unset/whitespace-only markdown body as
81
81
  // the empty string `""`; only non-empty bodies are eval'd into content.
82
82
  // Pass truly empty content (`[]`) in the empty case so indorsement can
83
83
  // collapse the body's surrounding spacing.
84
- let body = card.at("BODY", default: "")
84
+ let body = card.at("$body", default: "")
85
85
  let body_content = if type(body) == str { [] } else { body }
86
86
  // Per AFH 33-337 Ch. 14, an indorsement is dated when the endorser signs
87
87
  // it (distinct from the originating memo's date). Default to today when