@bytecodealliance/jco 1.17.9-rc.0 → 1.18.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.
@@ -3,6 +3,7 @@ export function parse(wat: string): Uint8Array;
3
3
  export function print(binary: Uint8Array): string;
4
4
  export function componentNew(binary: Uint8Array, adapters: Array<[string, Uint8Array]> | undefined): Uint8Array;
5
5
  export function componentWit(binary: Uint8Array): string;
6
+ export function componentWitMetadataForWorld(wit: WitSpecifier, worldName: string | undefined): WitMetadata;
6
7
  export function componentEmbed(embedOpts: EmbedOpts): Uint8Array;
7
8
  export function metadataShow(binary: Uint8Array): Array<ModuleMetadata>;
8
9
  export function metadataAdd(binary: Uint8Array, metadata: ProducersFields): Uint8Array;
@@ -16,6 +17,32 @@ export function metadataAdd(binary: Uint8Array, metadata: ProducersFields): Uint
16
17
  * ## `"compact-utf16"`
17
18
  */
18
19
  export type StringEncoding = 'utf8' | 'utf16' | 'compact-utf16';
20
+ export interface SemverVersion {
21
+ major: bigint,
22
+ minor: bigint,
23
+ patch: bigint,
24
+ pre?: string,
25
+ build?: string,
26
+ }
27
+ export interface InterfaceMetadata {
28
+ namespace: string,
29
+ 'package': string,
30
+ 'interface': string,
31
+ version?: SemverVersion,
32
+ }
33
+ export interface WitMetadata {
34
+ imports: Array<InterfaceMetadata>,
35
+ exports: Array<InterfaceMetadata>,
36
+ }
37
+ export type WitSpecifier = WitSpecifierSource | WitSpecifierPath;
38
+ export interface WitSpecifierSource {
39
+ tag: 'source',
40
+ val: string,
41
+ }
42
+ export interface WitSpecifierPath {
43
+ tag: 'path',
44
+ val: string,
45
+ }
19
46
  export type ProducersFields = Array<[string, Array<[string, string]>]>;
20
47
  export type EnabledFeatureSet = EnabledFeatureSetList | EnabledFeatureSetAll;
21
48
  export interface EnabledFeatureSetList {
@@ -1,4 +1,4 @@
1
- "use jco";
1
+ "use components";
2
2
  import { environment, exit as exit$1, stderr, stdin, stdout, terminalInput, terminalOutput, terminalStderr, terminalStdin, terminalStdout } from '@bytecodealliance/preview2-shim/cli';
3
3
  import { preopens, types } from '@bytecodealliance/preview2-shim/filesystem';
4
4
  import { error, streams } from '@bytecodealliance/preview2-shim/io';
Binary file
package/obj/wasm-tools.js CHANGED
@@ -1,4 +1,4 @@
1
- "use jco";
1
+ "use components";
2
2
  import { environment, exit as exit$1, stderr, stdin, stdout, terminalInput, terminalOutput, terminalStderr, terminalStdin, terminalStdout } from '@bytecodealliance/preview2-shim/cli';
3
3
  import { preopens, types } from '@bytecodealliance/preview2-shim/filesystem';
4
4
  import { error, streams } from '@bytecodealliance/preview2-shim/io';
@@ -9058,6 +9058,8 @@ let postReturn0;
9058
9058
  let postReturn0Async;
9059
9059
  let postReturn1;
9060
9060
  let postReturn1Async;
9061
+ let postReturn2;
9062
+ let postReturn2Async;
9061
9063
  let toolsParse;
9062
9064
 
9063
9065
  function parse(arg0) {
@@ -9499,6 +9501,289 @@ function componentWit(arg0) {
9499
9501
 
9500
9502
 
9501
9503
 
9504
+ if (typeof retCopy === 'object' && retCopy.tag === 'err') {
9505
+ throw new ComponentError(retCopy.val);
9506
+ }
9507
+ return retCopy.val;
9508
+
9509
+ }
9510
+ let toolsComponentWitMetadataForWorld;
9511
+
9512
+ function componentWitMetadataForWorld(arg0, arg1) {
9513
+ if (!_initialized) throwUninitialized();
9514
+ var variant2 = arg0;
9515
+ let variant2_0;
9516
+ let variant2_1;
9517
+ let variant2_2;
9518
+ switch (variant2.tag) {
9519
+ case 'source': {
9520
+ const e = variant2.val;
9521
+
9522
+ var encodeRes = _utf8AllocateAndEncode(e, realloc1, memory0);
9523
+ var ptr0= encodeRes.ptr;
9524
+ var len0 = encodeRes.len;
9525
+
9526
+ variant2_0 = 0;
9527
+ variant2_1 = ptr0;
9528
+ variant2_2 = len0;
9529
+ break;
9530
+ }
9531
+ case 'path': {
9532
+ const e = variant2.val;
9533
+
9534
+ var encodeRes = _utf8AllocateAndEncode(e, realloc1, memory0);
9535
+ var ptr1= encodeRes.ptr;
9536
+ var len1 = encodeRes.len;
9537
+
9538
+ variant2_0 = 1;
9539
+ variant2_1 = ptr1;
9540
+ variant2_2 = len1;
9541
+ break;
9542
+ }
9543
+ default: {
9544
+ throw new TypeError(`invalid variant tag value \`${JSON.stringify(variant2.tag)}\` (received \`${variant2}\`) specified for \`WitSpecifier\``);
9545
+ }
9546
+ }
9547
+ var variant4 = arg1;
9548
+ let variant4_0;
9549
+ let variant4_1;
9550
+ let variant4_2;
9551
+ if (variant4 === null || variant4=== undefined) {
9552
+ variant4_0 = 0;
9553
+ variant4_1 = 0;
9554
+ variant4_2 = 0;
9555
+ } else {
9556
+ const e = variant4;
9557
+
9558
+ var encodeRes = _utf8AllocateAndEncode(e, realloc1, memory0);
9559
+ var ptr3= encodeRes.ptr;
9560
+ var len3 = encodeRes.len;
9561
+
9562
+ variant4_0 = 1;
9563
+ variant4_1 = ptr3;
9564
+ variant4_2 = len3;
9565
+ }
9566
+ _debugLog('[iface="local:wasm-tools/tools", function="component-wit-metadata-for-world"][Instruction::CallWasm] enter', {
9567
+ funcName: 'component-wit-metadata-for-world',
9568
+ paramCount: 6,
9569
+ async: false,
9570
+ postReturn: true,
9571
+ });
9572
+ const hostProvided = false;
9573
+
9574
+ const [task, _wasm_call_currentTaskID] = createNewCurrentTask({
9575
+ componentIdx: 0,
9576
+ isAsync: false,
9577
+ isManualAsync: false,
9578
+ entryFnName: 'toolsComponentWitMetadataForWorld',
9579
+ getCallbackFn: () => null,
9580
+ callbackFnName: 'null',
9581
+ errHandling: 'throw-result-err',
9582
+ callingWasmExport: true,
9583
+ });
9584
+
9585
+ const started = task.enterSync();
9586
+ task.setReturnMemoryIdx(0);
9587
+ task.setReturnMemory(memory0);
9588
+ let ret = _withGlobalCurrentTaskMeta({
9589
+ taskID: task.id(),
9590
+ componentIdx: task.componentIdx(),
9591
+ fn: () => toolsComponentWitMetadataForWorld(variant2_0, variant2_1, variant2_2, variant4_0, variant4_1, variant4_2),
9592
+ });
9593
+
9594
+ let variant24;
9595
+ switch (dataView(memory0).getUint8(ret + 0, true)) {
9596
+ case 0: {
9597
+ var len13 = dataView(memory0).getUint32(ret + 8, true);
9598
+ var base13 = dataView(memory0).getUint32(ret + 4, true);
9599
+ var result13 = [];
9600
+ for (let i = 0; i < len13; i++) {
9601
+ const base = base13 + i * 80;
9602
+ var ptr5 = dataView(memory0).getUint32(base + 0, true);
9603
+ var len5 = dataView(memory0).getUint32(base + 4, true);
9604
+ var result5 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr5, len5));
9605
+ var ptr6 = dataView(memory0).getUint32(base + 8, true);
9606
+ var len6 = dataView(memory0).getUint32(base + 12, true);
9607
+ var result6 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr6, len6));
9608
+ var ptr7 = dataView(memory0).getUint32(base + 16, true);
9609
+ var len7 = dataView(memory0).getUint32(base + 20, true);
9610
+ var result7 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr7, len7));
9611
+ let variant12;
9612
+ switch (dataView(memory0).getUint8(base + 24, true)) {
9613
+ case 0: {
9614
+ variant12 = undefined;
9615
+ break;
9616
+ }
9617
+ case 1: {
9618
+ let variant9;
9619
+ switch (dataView(memory0).getUint8(base + 56, true)) {
9620
+ case 0: {
9621
+ variant9 = undefined;
9622
+ break;
9623
+ }
9624
+ case 1: {
9625
+ var ptr8 = dataView(memory0).getUint32(base + 60, true);
9626
+ var len8 = dataView(memory0).getUint32(base + 64, true);
9627
+ var result8 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr8, len8));
9628
+ variant9 = result8;
9629
+ break;
9630
+ }
9631
+ default: {
9632
+ throw new TypeError('invalid variant discriminant for option');
9633
+ }
9634
+ }
9635
+ let variant11;
9636
+ switch (dataView(memory0).getUint8(base + 68, true)) {
9637
+ case 0: {
9638
+ variant11 = undefined;
9639
+ break;
9640
+ }
9641
+ case 1: {
9642
+ var ptr10 = dataView(memory0).getUint32(base + 72, true);
9643
+ var len10 = dataView(memory0).getUint32(base + 76, true);
9644
+ var result10 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr10, len10));
9645
+ variant11 = result10;
9646
+ break;
9647
+ }
9648
+ default: {
9649
+ throw new TypeError('invalid variant discriminant for option');
9650
+ }
9651
+ }
9652
+ variant12 = {
9653
+ major: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 32, true))),
9654
+ minor: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 40, true))),
9655
+ patch: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 48, true))),
9656
+ pre: variant9,
9657
+ build: variant11,
9658
+ };
9659
+ break;
9660
+ }
9661
+ default: {
9662
+ throw new TypeError('invalid variant discriminant for option');
9663
+ }
9664
+ }
9665
+ result13.push({
9666
+ namespace: result5,
9667
+ package: result6,
9668
+ interface: result7,
9669
+ version: variant12,
9670
+ });
9671
+ }
9672
+ var len22 = dataView(memory0).getUint32(ret + 16, true);
9673
+ var base22 = dataView(memory0).getUint32(ret + 12, true);
9674
+ var result22 = [];
9675
+ for (let i = 0; i < len22; i++) {
9676
+ const base = base22 + i * 80;
9677
+ var ptr14 = dataView(memory0).getUint32(base + 0, true);
9678
+ var len14 = dataView(memory0).getUint32(base + 4, true);
9679
+ var result14 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr14, len14));
9680
+ var ptr15 = dataView(memory0).getUint32(base + 8, true);
9681
+ var len15 = dataView(memory0).getUint32(base + 12, true);
9682
+ var result15 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr15, len15));
9683
+ var ptr16 = dataView(memory0).getUint32(base + 16, true);
9684
+ var len16 = dataView(memory0).getUint32(base + 20, true);
9685
+ var result16 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr16, len16));
9686
+ let variant21;
9687
+ switch (dataView(memory0).getUint8(base + 24, true)) {
9688
+ case 0: {
9689
+ variant21 = undefined;
9690
+ break;
9691
+ }
9692
+ case 1: {
9693
+ let variant18;
9694
+ switch (dataView(memory0).getUint8(base + 56, true)) {
9695
+ case 0: {
9696
+ variant18 = undefined;
9697
+ break;
9698
+ }
9699
+ case 1: {
9700
+ var ptr17 = dataView(memory0).getUint32(base + 60, true);
9701
+ var len17 = dataView(memory0).getUint32(base + 64, true);
9702
+ var result17 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr17, len17));
9703
+ variant18 = result17;
9704
+ break;
9705
+ }
9706
+ default: {
9707
+ throw new TypeError('invalid variant discriminant for option');
9708
+ }
9709
+ }
9710
+ let variant20;
9711
+ switch (dataView(memory0).getUint8(base + 68, true)) {
9712
+ case 0: {
9713
+ variant20 = undefined;
9714
+ break;
9715
+ }
9716
+ case 1: {
9717
+ var ptr19 = dataView(memory0).getUint32(base + 72, true);
9718
+ var len19 = dataView(memory0).getUint32(base + 76, true);
9719
+ var result19 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr19, len19));
9720
+ variant20 = result19;
9721
+ break;
9722
+ }
9723
+ default: {
9724
+ throw new TypeError('invalid variant discriminant for option');
9725
+ }
9726
+ }
9727
+ variant21 = {
9728
+ major: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 32, true))),
9729
+ minor: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 40, true))),
9730
+ patch: BigInt.asUintN(64, BigInt(dataView(memory0).getBigInt64(base + 48, true))),
9731
+ pre: variant18,
9732
+ build: variant20,
9733
+ };
9734
+ break;
9735
+ }
9736
+ default: {
9737
+ throw new TypeError('invalid variant discriminant for option');
9738
+ }
9739
+ }
9740
+ result22.push({
9741
+ namespace: result14,
9742
+ package: result15,
9743
+ interface: result16,
9744
+ version: variant21,
9745
+ });
9746
+ }
9747
+ variant24= {
9748
+ tag: 'ok',
9749
+ val: {
9750
+ imports: result13,
9751
+ exports: result22,
9752
+ }
9753
+ };
9754
+ break;
9755
+ }
9756
+ case 1: {
9757
+ var ptr23 = dataView(memory0).getUint32(ret + 4, true);
9758
+ var len23 = dataView(memory0).getUint32(ret + 8, true);
9759
+ var result23 = TEXT_DECODER_UTF8.decode(new Uint8Array(memory0.buffer, ptr23, len23));
9760
+ variant24= {
9761
+ tag: 'err',
9762
+ val: result23
9763
+ };
9764
+ break;
9765
+ }
9766
+ default: {
9767
+ throw new TypeError('invalid variant discriminant for expected');
9768
+ }
9769
+ }
9770
+ _debugLog('[iface="local:wasm-tools/tools", function="component-wit-metadata-for-world"][Instruction::Return]', {
9771
+ funcName: 'component-wit-metadata-for-world',
9772
+ paramCount: 1,
9773
+ async: false,
9774
+ postReturn: true
9775
+ });
9776
+ const retCopy = variant24;
9777
+ task.resolve([retCopy.val]);
9778
+
9779
+ let cstate = getOrCreateAsyncState(0);
9780
+ cstate.mayLeave = false;
9781
+ postReturn1(ret);
9782
+ cstate.mayLeave = true;
9783
+ task.exit();
9784
+
9785
+
9786
+
9502
9787
  if (typeof retCopy === 'object' && retCopy.tag === 'err') {
9503
9788
  throw new ComponentError(retCopy.val);
9504
9789
  }
@@ -9957,7 +10242,7 @@ function metadataShow(arg0) {
9957
10242
 
9958
10243
  let cstate = getOrCreateAsyncState(0);
9959
10244
  cstate.mayLeave = false;
9960
- postReturn1(ret);
10245
+ postReturn2(ret);
9961
10246
  cstate.mayLeave = true;
9962
10247
  task.exit();
9963
10248
 
@@ -11897,12 +12182,20 @@ export const $init = (() => {
11897
12182
  postReturn0Async = exports1['cabi_post_local:wasm-tools/tools#component-embed'];
11898
12183
  }
11899
12184
 
11900
- postReturn1 = exports1['cabi_post_local:wasm-tools/tools#metadata-show'];
12185
+ postReturn1 = exports1['cabi_post_local:wasm-tools/tools#component-wit-metadata-for-world'];
12186
+
12187
+ try {
12188
+ postReturn1Async = WebAssembly.promising(exports1['cabi_post_local:wasm-tools/tools#component-wit-metadata-for-world']);
12189
+ } catch(err) {
12190
+ postReturn1Async = exports1['cabi_post_local:wasm-tools/tools#component-wit-metadata-for-world'];
12191
+ }
12192
+
12193
+ postReturn2 = exports1['cabi_post_local:wasm-tools/tools#metadata-show'];
11901
12194
 
11902
12195
  try {
11903
- postReturn1Async = WebAssembly.promising(exports1['cabi_post_local:wasm-tools/tools#metadata-show']);
12196
+ postReturn2Async = WebAssembly.promising(exports1['cabi_post_local:wasm-tools/tools#metadata-show']);
11904
12197
  } catch(err) {
11905
- postReturn1Async = exports1['cabi_post_local:wasm-tools/tools#metadata-show'];
12198
+ postReturn2Async = exports1['cabi_post_local:wasm-tools/tools#metadata-show'];
11906
12199
  }
11907
12200
 
11908
12201
  _initialized = true;
@@ -11910,6 +12203,7 @@ export const $init = (() => {
11910
12203
  toolsPrint = exports1['local:wasm-tools/tools#print'];
11911
12204
  toolsComponentNew = exports1['local:wasm-tools/tools#component-new'];
11912
12205
  toolsComponentWit = exports1['local:wasm-tools/tools#component-wit'];
12206
+ toolsComponentWitMetadataForWorld = exports1['local:wasm-tools/tools#component-wit-metadata-for-world'];
11913
12207
  toolsComponentEmbed = exports1['local:wasm-tools/tools#component-embed'];
11914
12208
  toolsMetadataShow = exports1['local:wasm-tools/tools#metadata-show'];
11915
12209
  toolsMetadataAdd = exports1['local:wasm-tools/tools#metadata-add'];
@@ -11940,6 +12234,7 @@ const tools = {
11940
12234
  componentEmbed: componentEmbed,
11941
12235
  componentNew: componentNew,
11942
12236
  componentWit: componentWit,
12237
+ componentWitMetadataForWorld: componentWitMetadataForWorld,
11943
12238
  metadataAdd: metadataAdd,
11944
12239
  metadataShow: metadataShow,
11945
12240
  parse: parse,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bytecodealliance/jco",
3
- "version": "1.17.9-rc.0",
3
+ "version": "1.18.0",
4
4
  "description": "JavaScript tooling for working with WebAssembly Components",
5
5
  "keywords": [
6
6
  "Component",
@@ -73,8 +73,9 @@
73
73
  "prepack": "cargo xtask build release"
74
74
  },
75
75
  "dependencies": {
76
- "@bytecodealliance/componentize-js": "^0.19.3",
77
- "@bytecodealliance/preview2-shim": "^0.17.3",
76
+ "@bytecodealliance/componentize-js": "^0.20.0",
77
+ "@bytecodealliance/componentize-js-0-19-3": "npm:@bytecodealliance/componentize-js@^0.19.3",
78
+ "@bytecodealliance/preview2-shim": "^0.17.9",
78
79
  "binaryen": "^123.0.0",
79
80
  "commander": "^14",
80
81
  "mkdirp": "^3",
@@ -1,6 +1,9 @@
1
1
  import { stat, readFile, writeFile } from "node:fs/promises";
2
2
  import { resolve, basename } from "node:path";
3
- import { styleText } from "../common.js";
3
+
4
+ import * as wasmToolsComponent from "../../obj/wasm-tools.js";
5
+
6
+ import { styleText, isWindows } from "../common.js";
4
7
 
5
8
  /** All features that can be enabled/disabled */
6
9
  const ALL_FEATURES = ["clocks", "http", "random", "stdio", "fetch-event"];
@@ -8,19 +11,69 @@ const ALL_FEATURES = ["clocks", "http", "random", "stdio", "fetch-event"];
8
11
  /** Features that should be used for --debug mode */
9
12
  const DEBUG_FEATURES = ["stdio"];
10
13
 
11
- export async function componentize(jsSource, opts) {
12
- const { componentize: componentizeFn } = await eval('import("@bytecodealliance/componentize-js")');
14
+ /**
15
+ * Detect whether the WIT of a given component contains an older version of
16
+ * `wasi:http` which necessitates an older version of `componentize-js`
17
+ *
18
+ * @param {string} witPath
19
+ * @returns bool
20
+ */
21
+ async function usesOlderWasiHTTP(witPath, worldName) {
22
+ await wasmToolsComponent.$init;
23
+
24
+ witPath = (isWindows ? "//?/" : "") + resolve(witPath);
25
+ const worldMetadata = wasmToolsComponent.tools.componentWitMetadataForWorld(
26
+ { tag: "path", val: witPath },
27
+ worldName ?? null,
28
+ );
29
+
30
+ // Check if the an old `wasi:http/incoming-handler` version is exported
31
+ const exportsOldIncomingHandler = worldMetadata.exports.some((iface) => {
32
+ return (
33
+ iface.namespace === "wasi" &&
34
+ iface.version !== null &&
35
+ iface.version.major === 0n &&
36
+ iface.version.minor < 3n &&
37
+ iface.version.patch < 10n
38
+ );
39
+ });
13
40
 
41
+ const importsOldFetch = worldMetadata.imports.some((iface) => {
42
+ return (
43
+ iface.namespace === "wasi" &&
44
+ iface.version !== null &&
45
+ iface.version.major === 0n &&
46
+ iface.version.minor < 3n &&
47
+ iface.version.patch < 10n
48
+ );
49
+ });
50
+
51
+ return exportsOldIncomingHandler || importsOldFetch;
52
+ }
53
+ export async function componentize(jsSource, opts) {
14
54
  const { disableFeatures, enableFeatures } = calculateFeatureSet(opts);
15
55
 
16
56
  const source = await readFile(jsSource, "utf8");
17
-
18
57
  const witPath = resolve(opts.wit);
19
58
  const sourceName = basename(jsSource);
20
59
 
60
+ // Load an older version of componentize-js if we detect an older version of WASI HTTP in use
61
+ // as the version that is usable is baked into the StarlingMonkey version provided by a given version
62
+ // of componentize-js
63
+ let componentizeJSModule;
64
+ const useOldComponentizeJS = await usesOlderWasiHTTP(witPath, opts.worldName);
65
+ if (useOldComponentizeJS) {
66
+ // NOTE: if we were to use a version of componentize-js 0.20.0 or newer here,
67
+ // the build would fail, as newer versions do not support wasi:http < 0.2.10
68
+ // for fetch.
69
+ componentizeJSModule = await eval('import("@bytecodealliance/componentize-js-0-19-3")');
70
+ } else {
71
+ componentizeJSModule = await eval('import("@bytecodealliance/componentize-js")');
72
+ }
73
+
21
74
  let component;
22
75
  try {
23
- const result = await componentizeFn(source, {
76
+ const result = await componentizeJSModule.componentize(source, {
24
77
  enableAot: opts.aot,
25
78
  aotMinStackSizeBytes: opts.aotMinStackSizeBytes,
26
79
  wevalBin: opts.wevalBin,
@@ -41,7 +94,7 @@ export async function componentize(jsSource, opts) {
41
94
  },
42
95
  });
43
96
  if (result.debug) {
44
- console.error(`${styleText("cyan", "DEBUG")} Debug output\n${JSON.stringify(debug, null, 2)}\n`);
97
+ console.error(`${styleText("cyan", "DEBUG")} Debug output\n${JSON.stringify(result.debug, null, 2)}\n`);
45
98
  }
46
99
 
47
100
  component = result.component;
package/src/jco.js CHANGED
@@ -25,7 +25,7 @@ program
25
25
  )
26
26
  .usage("<command> [options]")
27
27
  .enablePositionalOptions()
28
- .version("1.17.9-rc.0");
28
+ .version("1.18.0");
29
29
 
30
30
  function myParseInt(value) {
31
31
  return parseInt(value, 10);