@agiledigital/pingone-aic-script-tester 0.1.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 (169) hide show
  1. package/LICENSE-APACHE +201 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +274 -0
  4. package/dist/bin/fetch-jar.d.ts +2 -0
  5. package/dist/bin/fetch-jar.js +13 -0
  6. package/dist/bin/pull-profile.d.ts +2 -0
  7. package/dist/bin/pull-profile.js +40 -0
  8. package/dist/bin/show-log.d.ts +2 -0
  9. package/dist/bin/show-log.js +31 -0
  10. package/dist/classes/.complete +12 -0
  11. package/dist/classes/AmClassShutter.class +0 -0
  12. package/dist/classes/AmContextFactory$ObservedContext.class +0 -0
  13. package/dist/classes/AmContextFactory.class +0 -0
  14. package/dist/classes/AmScopes.class +0 -0
  15. package/dist/classes/HostOps.class +0 -0
  16. package/dist/classes/JsValues.class +0 -0
  17. package/dist/classes/Json$Parser.class +0 -0
  18. package/dist/classes/Json.class +0 -0
  19. package/dist/classes/LanguageVersions.class +0 -0
  20. package/dist/classes/Runner.class +0 -0
  21. package/dist/classes/ScriptContextScope.class +0 -0
  22. package/dist/src/aic/callbacks.d.ts +35 -0
  23. package/dist/src/aic/callbacks.js +130 -0
  24. package/dist/src/aic/conform.d.ts +90 -0
  25. package/dist/src/aic/conform.js +193 -0
  26. package/dist/src/aic/constants.d.ts +13 -0
  27. package/dist/src/aic/constants.js +13 -0
  28. package/dist/src/aic/diff.d.ts +25 -0
  29. package/dist/src/aic/diff.js +201 -0
  30. package/dist/src/aic/emit-journey.d.ts +64 -0
  31. package/dist/src/aic/emit-journey.js +254 -0
  32. package/dist/src/aic/emit-result.d.ts +10 -0
  33. package/dist/src/aic/emit-result.js +39 -0
  34. package/dist/src/aic/emit-session.d.ts +26 -0
  35. package/dist/src/aic/emit-session.js +132 -0
  36. package/dist/src/aic/emit-subject.d.ts +40 -0
  37. package/dist/src/aic/emit-subject.js +210 -0
  38. package/dist/src/aic/file-lease.d.ts +35 -0
  39. package/dist/src/aic/file-lease.js +543 -0
  40. package/dist/src/aic/http.d.ts +21 -0
  41. package/dist/src/aic/http.js +127 -0
  42. package/dist/src/aic/idm.d.ts +10 -0
  43. package/dist/src/aic/idm.js +112 -0
  44. package/dist/src/aic/index.d.ts +35 -0
  45. package/dist/src/aic/index.js +21 -0
  46. package/dist/src/aic/js.d.ts +8 -0
  47. package/dist/src/aic/js.js +11 -0
  48. package/dist/src/aic/lease-identity.d.ts +38 -0
  49. package/dist/src/aic/lease-identity.js +72 -0
  50. package/dist/src/aic/lease-lock.d.ts +45 -0
  51. package/dist/src/aic/lease-lock.js +173 -0
  52. package/dist/src/aic/managed.d.ts +28 -0
  53. package/dist/src/aic/managed.js +199 -0
  54. package/dist/src/aic/provider.d.ts +156 -0
  55. package/dist/src/aic/provider.js +416 -0
  56. package/dist/src/aic/record.d.ts +28 -0
  57. package/dist/src/aic/record.js +183 -0
  58. package/dist/src/aic/resource-snapshot.d.ts +12 -0
  59. package/dist/src/aic/resource-snapshot.js +116 -0
  60. package/dist/src/aic/run.d.ts +102 -0
  61. package/dist/src/aic/run.js +450 -0
  62. package/dist/src/aic/tenant.d.ts +107 -0
  63. package/dist/src/aic/tenant.js +307 -0
  64. package/dist/src/aic/trace.d.ts +25 -0
  65. package/dist/src/aic/trace.js +56 -0
  66. package/dist/src/aic/txid.d.ts +11 -0
  67. package/dist/src/aic/txid.js +25 -0
  68. package/dist/src/aic/unsupported.d.ts +15 -0
  69. package/dist/src/aic/unsupported.js +60 -0
  70. package/dist/src/bindings/allowlist.d.ts +42 -0
  71. package/dist/src/bindings/allowlist.js +62 -0
  72. package/dist/src/bindings/harvest.d.ts +7 -0
  73. package/dist/src/bindings/harvest.js +137 -0
  74. package/dist/src/bindings/index.d.ts +4 -0
  75. package/dist/src/bindings/index.js +3 -0
  76. package/dist/src/bindings/preamble.d.ts +23 -0
  77. package/dist/src/bindings/preamble.js +36 -0
  78. package/dist/src/bindings/run.d.ts +33 -0
  79. package/dist/src/bindings/run.js +55 -0
  80. package/dist/src/case/equal.d.ts +2 -0
  81. package/dist/src/case/equal.js +40 -0
  82. package/dist/src/case/index.d.ts +5 -0
  83. package/dist/src/case/index.js +4 -0
  84. package/dist/src/case/portable.d.ts +10 -0
  85. package/dist/src/case/portable.js +28 -0
  86. package/dist/src/case/session.d.ts +34 -0
  87. package/dist/src/case/session.js +66 -0
  88. package/dist/src/case/state.d.ts +4 -0
  89. package/dist/src/case/state.js +47 -0
  90. package/dist/src/case/types.d.ts +266 -0
  91. package/dist/src/case/types.js +106 -0
  92. package/dist/src/case/util.d.ts +7 -0
  93. package/dist/src/case/util.js +115 -0
  94. package/dist/src/case/validate.d.ts +8 -0
  95. package/dist/src/case/validate.js +463 -0
  96. package/dist/src/case/verdict.d.ts +6 -0
  97. package/dist/src/case/verdict.js +810 -0
  98. package/dist/src/diagnostics.d.ts +7 -0
  99. package/dist/src/diagnostics.js +5 -0
  100. package/dist/src/emit-dts.d.ts +2 -0
  101. package/dist/src/emit-dts.js +82 -0
  102. package/dist/src/emit-js.d.ts +3 -0
  103. package/dist/src/emit-js.js +149 -0
  104. package/dist/src/harness/failures.d.ts +26 -0
  105. package/dist/src/harness/failures.js +113 -0
  106. package/dist/src/harness/idm.d.ts +12 -0
  107. package/dist/src/harness/idm.js +44 -0
  108. package/dist/src/harness/index.d.ts +11 -0
  109. package/dist/src/harness/index.js +6 -0
  110. package/dist/src/harness/lease.d.ts +136 -0
  111. package/dist/src/harness/lease.js +286 -0
  112. package/dist/src/harness/residue.d.ts +23 -0
  113. package/dist/src/harness/residue.js +73 -0
  114. package/dist/src/harness/show-log.d.ts +43 -0
  115. package/dist/src/harness/show-log.js +253 -0
  116. package/dist/src/harness/spec.d.ts +67 -0
  117. package/dist/src/harness/spec.js +189 -0
  118. package/dist/src/harness/step.d.ts +80 -0
  119. package/dist/src/harness/step.js +97 -0
  120. package/dist/src/harness/types.d.ts +100 -0
  121. package/dist/src/harness/types.js +1 -0
  122. package/dist/src/harness/vitest.d.ts +52 -0
  123. package/dist/src/harness/vitest.js +155 -0
  124. package/dist/src/idents.d.ts +4 -0
  125. package/dist/src/idents.js +42 -0
  126. package/dist/src/jvm.d.ts +124 -0
  127. package/dist/src/jvm.js +432 -0
  128. package/dist/src/load.d.ts +2 -0
  129. package/dist/src/load.js +104 -0
  130. package/dist/src/paths.d.ts +36 -0
  131. package/dist/src/paths.js +50 -0
  132. package/dist/src/profile/index.d.ts +5 -0
  133. package/dist/src/profile/index.js +3 -0
  134. package/dist/src/profile/normalise.d.ts +16 -0
  135. package/dist/src/profile/normalise.js +106 -0
  136. package/dist/src/profile/pull.d.ts +22 -0
  137. package/dist/src/profile/pull.js +36 -0
  138. package/dist/src/profile/seed.d.ts +11 -0
  139. package/dist/src/profile/seed.js +28 -0
  140. package/dist/src/profile/store.d.ts +13 -0
  141. package/dist/src/profile/store.js +60 -0
  142. package/dist/src/profile/types.d.ts +45 -0
  143. package/dist/src/profile/types.js +1 -0
  144. package/dist/src/profile/validate.d.ts +38 -0
  145. package/dist/src/profile/validate.js +129 -0
  146. package/dist/src/project.d.ts +37 -0
  147. package/dist/src/project.js +93 -0
  148. package/dist/src/protocol.d.ts +62 -0
  149. package/dist/src/protocol.js +68 -0
  150. package/dist/src/provider-module.d.ts +11 -0
  151. package/dist/src/provider-module.js +46 -0
  152. package/dist/src/runner.d.ts +39 -0
  153. package/dist/src/runner.js +337 -0
  154. package/dist/src/schema.d.ts +48 -0
  155. package/dist/src/schema.js +93 -0
  156. package/generated/scripted-decision-mocks.cjs +722 -0
  157. package/generated/scripted-decision-mocks.d.ts +626 -0
  158. package/generated/scripted-decision-next.json +3640 -0
  159. package/java/AmClassShutter.java +98 -0
  160. package/java/AmContextFactory.java +69 -0
  161. package/java/AmScopes.java +49 -0
  162. package/java/HostOps.java +180 -0
  163. package/java/JsValues.java +39 -0
  164. package/java/Json.java +441 -0
  165. package/java/LanguageVersions.java +55 -0
  166. package/java/Runner.java +289 -0
  167. package/java/ScriptContextScope.java +147 -0
  168. package/package.json +88 -0
  169. package/src/bindings/rhino/runtime.cjs +3021 -0
package/java/Json.java ADDED
@@ -0,0 +1,441 @@
1
+ import java.util.ArrayList;
2
+ import java.util.LinkedHashMap;
3
+ import java.util.List;
4
+ import java.util.Map;
5
+
6
+ /**
7
+ * Minimal JSON parse/stringify for the runner protocol. No extra jars: the host
8
+ * has no JDK and the AM image classpath for this harness is Rhino only.
9
+ */
10
+ final class Json {
11
+
12
+ private Json() {}
13
+
14
+ static Object parse(String source) {
15
+ return new Parser(source).parse();
16
+ }
17
+
18
+ static String stringify(Object value) {
19
+ StringBuilder sb = new StringBuilder();
20
+ write(sb, value);
21
+ return sb.toString();
22
+ }
23
+
24
+ static String quote(String s) {
25
+ StringBuilder sb = new StringBuilder(s.length() + 2);
26
+ sb.append('"');
27
+ for (int i = 0; i < s.length(); i++) {
28
+ char c = s.charAt(i);
29
+ switch (c) {
30
+ case '"':
31
+ sb.append("\\\"");
32
+ break;
33
+ case '\\':
34
+ sb.append("\\\\");
35
+ break;
36
+ case '\n':
37
+ sb.append("\\n");
38
+ break;
39
+ case '\r':
40
+ sb.append("\\r");
41
+ break;
42
+ case '\t':
43
+ sb.append("\\t");
44
+ break;
45
+ case '\b':
46
+ sb.append("\\b");
47
+ break;
48
+ case '\f':
49
+ sb.append("\\f");
50
+ break;
51
+ default:
52
+ if (c < 0x20) {
53
+ sb.append(String.format("\\u%04x", (int) c));
54
+ } else {
55
+ sb.append(c);
56
+ }
57
+ }
58
+ }
59
+ sb.append('"');
60
+ return sb.toString();
61
+ }
62
+
63
+ @SuppressWarnings("unchecked")
64
+ static Map<String, Object> asObject(Object value, String what) {
65
+ if (!(value instanceof Map)) {
66
+ throw new IllegalArgumentException(what + " must be a JSON object");
67
+ }
68
+ return (Map<String, Object>) value;
69
+ }
70
+
71
+ static String asString(Object value, String what) {
72
+ if (!(value instanceof String)) {
73
+ throw new IllegalArgumentException(what + " must be a string");
74
+ }
75
+ return (String) value;
76
+ }
77
+
78
+ static String optionalString(Map<String, Object> obj, String key) {
79
+ if (!obj.containsKey(key) || obj.get(key) == null) {
80
+ return null;
81
+ }
82
+ return asString(obj.get(key), key);
83
+ }
84
+
85
+ static long optionalLong(Map<String, Object> obj, String key, long defaultValue) {
86
+ if (!obj.containsKey(key) || obj.get(key) == null) {
87
+ return defaultValue;
88
+ }
89
+ Object raw = obj.get(key);
90
+ if (raw instanceof Number) {
91
+ return ((Number) raw).longValue();
92
+ }
93
+ throw new IllegalArgumentException(key + " must be a number");
94
+ }
95
+
96
+ /** A JSON array of strings, or null when the key is absent. */
97
+ static List<String> optionalStringList(Map<String, Object> obj, String key) {
98
+ Object value = obj.get(key);
99
+ if (value == null) {
100
+ return null;
101
+ }
102
+ if (!(value instanceof List)) {
103
+ throw new IllegalArgumentException(key + " must be an array of strings");
104
+ }
105
+ List<String> out = new ArrayList<String>();
106
+ for (Object item : (List<?>) value) {
107
+ if (!(item instanceof String)) {
108
+ throw new IllegalArgumentException(key + " must contain only strings");
109
+ }
110
+ out.add((String) item);
111
+ }
112
+ return out;
113
+ }
114
+
115
+ static boolean optionalBoolean(Map<String, Object> obj, String key, boolean defaultValue) {
116
+ if (!obj.containsKey(key) || obj.get(key) == null) {
117
+ return defaultValue;
118
+ }
119
+ Object raw = obj.get(key);
120
+ if (raw instanceof Boolean) {
121
+ return ((Boolean) raw).booleanValue();
122
+ }
123
+ throw new IllegalArgumentException(key + " must be a boolean");
124
+ }
125
+
126
+ private static void write(StringBuilder sb, Object value) {
127
+ if (value == null) {
128
+ sb.append("null");
129
+ return;
130
+ }
131
+ if (value instanceof String) {
132
+ sb.append(quote((String) value));
133
+ return;
134
+ }
135
+ if (value instanceof Boolean) {
136
+ sb.append(value.toString());
137
+ return;
138
+ }
139
+ if (value instanceof Number) {
140
+ Number n = (Number) value;
141
+ double d = n.doubleValue();
142
+ if (Double.isNaN(d) || Double.isInfinite(d)) {
143
+ sb.append("null");
144
+ return;
145
+ }
146
+ if (n instanceof Double || n instanceof Float) {
147
+ sb.append(n.toString());
148
+ return;
149
+ }
150
+ sb.append(Long.toString(n.longValue()));
151
+ return;
152
+ }
153
+ if (value instanceof Map) {
154
+ sb.append('{');
155
+ boolean first = true;
156
+ for (Map.Entry<?, ?> e : ((Map<?, ?>) value).entrySet()) {
157
+ if (!first) {
158
+ sb.append(',');
159
+ }
160
+ first = false;
161
+ sb.append(quote(String.valueOf(e.getKey())));
162
+ sb.append(':');
163
+ write(sb, e.getValue());
164
+ }
165
+ sb.append('}');
166
+ return;
167
+ }
168
+ if (value instanceof List) {
169
+ sb.append('[');
170
+ boolean first = true;
171
+ for (Object item : (List<?>) value) {
172
+ if (!first) {
173
+ sb.append(',');
174
+ }
175
+ first = false;
176
+ write(sb, item);
177
+ }
178
+ sb.append(']');
179
+ return;
180
+ }
181
+ sb.append(quote(String.valueOf(value)));
182
+ }
183
+
184
+ private static final class Parser {
185
+ private final String src;
186
+ private final int length;
187
+ private int pos;
188
+
189
+ Parser(String src) {
190
+ this.src = src;
191
+ this.length = src.length();
192
+ }
193
+
194
+ Object parse() {
195
+ Object value = readValue();
196
+ skipWs();
197
+ if (pos != length) {
198
+ throw error("trailing junk after JSON value");
199
+ }
200
+ return value;
201
+ }
202
+
203
+ private Object readValue() {
204
+ skipWs();
205
+ if (pos >= length) {
206
+ throw error("unexpected end of JSON");
207
+ }
208
+ char c = src.charAt(pos);
209
+ switch (c) {
210
+ case '{':
211
+ return readObject();
212
+ case '[':
213
+ return readArray();
214
+ case '"':
215
+ return readString();
216
+ case 't':
217
+ return readLiteral("true", Boolean.TRUE);
218
+ case 'f':
219
+ return readLiteral("false", Boolean.FALSE);
220
+ case 'n':
221
+ return readLiteral("null", null);
222
+ case '-':
223
+ return readNumber();
224
+ default:
225
+ if (c >= '0' && c <= '9') {
226
+ return readNumber();
227
+ }
228
+ throw error("unexpected character '" + c + "'");
229
+ }
230
+ }
231
+
232
+ private Map<String, Object> readObject() {
233
+ consume('{');
234
+ Map<String, Object> obj = new LinkedHashMap<String, Object>();
235
+ skipWs();
236
+ if (peek('}')) {
237
+ consume('}');
238
+ return obj;
239
+ }
240
+ while (true) {
241
+ skipWs();
242
+ if (pos >= length || src.charAt(pos) != '"') {
243
+ throw error("expected string key");
244
+ }
245
+ String key = readString();
246
+ skipWs();
247
+ consume(':');
248
+ obj.put(key, readValue());
249
+ skipWs();
250
+ if (peek('}')) {
251
+ consume('}');
252
+ return obj;
253
+ }
254
+ consume(',');
255
+ }
256
+ }
257
+
258
+ private List<Object> readArray() {
259
+ consume('[');
260
+ List<Object> arr = new ArrayList<Object>();
261
+ skipWs();
262
+ if (peek(']')) {
263
+ consume(']');
264
+ return arr;
265
+ }
266
+ while (true) {
267
+ arr.add(readValue());
268
+ skipWs();
269
+ if (peek(']')) {
270
+ consume(']');
271
+ return arr;
272
+ }
273
+ consume(',');
274
+ }
275
+ }
276
+
277
+ private String readString() {
278
+ consume('"');
279
+ StringBuilder sb = new StringBuilder();
280
+ while (pos < length) {
281
+ char c = src.charAt(pos++);
282
+ if (c == '"') {
283
+ return sb.toString();
284
+ }
285
+ if (c == '\\') {
286
+ if (pos >= length) {
287
+ throw error("unterminated escape");
288
+ }
289
+ char e = src.charAt(pos++);
290
+ switch (e) {
291
+ case '"':
292
+ case '\\':
293
+ case '/':
294
+ sb.append(e);
295
+ break;
296
+ case 'b':
297
+ sb.append('\b');
298
+ break;
299
+ case 'f':
300
+ sb.append('\f');
301
+ break;
302
+ case 'n':
303
+ sb.append('\n');
304
+ break;
305
+ case 'r':
306
+ sb.append('\r');
307
+ break;
308
+ case 't':
309
+ sb.append('\t');
310
+ break;
311
+ case 'u':
312
+ if (pos + 4 > length) {
313
+ throw error("truncated \\u escape");
314
+ }
315
+ int cp = 0;
316
+ for (int i = 0; i < 4; i++) {
317
+ cp = (cp << 4) | fromHex(src.charAt(pos++));
318
+ }
319
+ sb.append((char) cp);
320
+ break;
321
+ default:
322
+ throw error("bad escape \\" + e);
323
+ }
324
+ } else if (c < 0x20) {
325
+ throw error("unescaped control character in string");
326
+ } else {
327
+ sb.append(c);
328
+ }
329
+ }
330
+ throw error("unterminated string");
331
+ }
332
+
333
+ private Object readLiteral(String lit, Object value) {
334
+ if (pos + lit.length() > length || !src.startsWith(lit, pos)) {
335
+ throw error("expected " + lit);
336
+ }
337
+ pos += lit.length();
338
+ return value;
339
+ }
340
+
341
+ private Number readNumber() {
342
+ int start = pos;
343
+ if (peek('-')) {
344
+ pos++;
345
+ }
346
+ if (pos >= length) {
347
+ throw error("expected number");
348
+ }
349
+ if (src.charAt(pos) == '0') {
350
+ pos++;
351
+ } else if (src.charAt(pos) >= '1' && src.charAt(pos) <= '9') {
352
+ while (pos < length && isDigit(src.charAt(pos))) {
353
+ pos++;
354
+ }
355
+ } else {
356
+ throw error("expected digit");
357
+ }
358
+ boolean frac = false;
359
+ if (peek('.')) {
360
+ frac = true;
361
+ pos++;
362
+ if (pos >= length || !isDigit(src.charAt(pos))) {
363
+ throw error("expected digit after decimal point");
364
+ }
365
+ while (pos < length && isDigit(src.charAt(pos))) {
366
+ pos++;
367
+ }
368
+ }
369
+ if (pos < length && (src.charAt(pos) == 'e' || src.charAt(pos) == 'E')) {
370
+ frac = true;
371
+ pos++;
372
+ if (pos < length && (src.charAt(pos) == '+' || src.charAt(pos) == '-')) {
373
+ pos++;
374
+ }
375
+ if (pos >= length || !isDigit(src.charAt(pos))) {
376
+ throw error("expected digit in exponent");
377
+ }
378
+ while (pos < length && isDigit(src.charAt(pos))) {
379
+ pos++;
380
+ }
381
+ }
382
+ String raw = src.substring(start, pos);
383
+ if (!frac) {
384
+ try {
385
+ long n = Long.parseLong(raw);
386
+ if (n >= Integer.MIN_VALUE && n <= Integer.MAX_VALUE) {
387
+ return Integer.valueOf((int) n);
388
+ }
389
+ return Long.valueOf(n);
390
+ } catch (NumberFormatException e) {
391
+ // fall through to double
392
+ }
393
+ }
394
+ return Double.valueOf(raw);
395
+ }
396
+
397
+ private void skipWs() {
398
+ while (pos < length) {
399
+ char c = src.charAt(pos);
400
+ if (c == ' ' || c == '\n' || c == '\r' || c == '\t') {
401
+ pos++;
402
+ } else {
403
+ return;
404
+ }
405
+ }
406
+ }
407
+
408
+ private boolean peek(char c) {
409
+ return pos < length && src.charAt(pos) == c;
410
+ }
411
+
412
+ private void consume(char c) {
413
+ skipWs();
414
+ if (pos >= length || src.charAt(pos) != c) {
415
+ throw error("expected '" + c + "'");
416
+ }
417
+ pos++;
418
+ }
419
+
420
+ private IllegalArgumentException error(String msg) {
421
+ return new IllegalArgumentException("JSON at " + pos + ": " + msg);
422
+ }
423
+
424
+ private static boolean isDigit(char c) {
425
+ return c >= '0' && c <= '9';
426
+ }
427
+
428
+ private int fromHex(char c) {
429
+ if (c >= '0' && c <= '9') {
430
+ return c - '0';
431
+ }
432
+ if (c >= 'a' && c <= 'f') {
433
+ return c - 'a' + 10;
434
+ }
435
+ if (c >= 'A' && c <= 'F') {
436
+ return c - 'A' + 10;
437
+ }
438
+ throw error("bad hex digit '" + c + "'");
439
+ }
440
+ }
441
+ }
@@ -0,0 +1,55 @@
1
+ import org.mozilla.javascript.Context;
2
+
3
+ /** Parse a Rhino {@link Context} language-version token the way {@code Probe} does. */
4
+ final class LanguageVersions {
5
+
6
+ private LanguageVersions() {}
7
+
8
+ static int parse(String raw) {
9
+ if (raw == null) {
10
+ return Context.VERSION_DEFAULT;
11
+ }
12
+ switch (raw) {
13
+ case "DEFAULT":
14
+ case "VERSION_DEFAULT":
15
+ return Context.VERSION_DEFAULT;
16
+ case "1.7":
17
+ case "VERSION_1_7":
18
+ return Context.VERSION_1_7;
19
+ case "1.8":
20
+ case "VERSION_1_8":
21
+ return Context.VERSION_1_8;
22
+ case "ES6":
23
+ case "VERSION_ES6":
24
+ return Context.VERSION_ES6;
25
+ default:
26
+ break;
27
+ }
28
+ try {
29
+ int n = Integer.parseInt(raw);
30
+ if (!Context.isValidLanguageVersion(n)) {
31
+ throw new IllegalArgumentException("not a Rhino language version: " + raw);
32
+ }
33
+ return n;
34
+ } catch (NumberFormatException e) {
35
+ throw new IllegalArgumentException("not a Rhino language version: " + raw);
36
+ }
37
+ }
38
+
39
+ static int parse(Object raw) {
40
+ if (raw == null) {
41
+ return Context.VERSION_DEFAULT;
42
+ }
43
+ if (raw instanceof Number) {
44
+ int n = ((Number) raw).intValue();
45
+ if (!Context.isValidLanguageVersion(n)) {
46
+ throw new IllegalArgumentException("not a Rhino language version: " + raw);
47
+ }
48
+ return n;
49
+ }
50
+ if (raw instanceof String) {
51
+ return parse((String) raw);
52
+ }
53
+ throw new IllegalArgumentException("languageVersion must be a number or string");
54
+ }
55
+ }