Hi I am trying to call a JS function from a depend...
# javascript
i
Hi I am trying to call a JS function from a dependency in Kotlin. The function
toASCII
here, my dependency definition looks like this
Copy code
jsMain {
      dependencies {
        api(npm("punycode", "2.1.1"))
        api(npm("urlencode", "1.1.0"))
        api(npm("buffer", "6.0.3"))
        api(npm("string_decoder", "1.3.0"))
      }
    }
and the file punycode.kt looks like this:
Copy code
@JsModule("punycode")
@JsNonModule
@JsName("toASCII")
public external val toASCII: (domain: String) -> String
But it fails with:
Copy code
Uncaught TypeError: toASCII is not a function
  at /var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:100744:17
  TypeError: toASCII is not a function
      at UriCompatibility.encodeDNSHost_6wfw3l_k$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:100744:17)
      at _no_name_provided__274.invoke_6wfw3l_k$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:97821:46)
Here is the entire stacktrace if it helps:
Copy code
> Task :core:jsGenerateExternalsIntegrated SKIPPED
No `types` or `typings` found for 'punycode: 2.1.1'.
To find d.ts for dependency, fields `types` and `typings` should be declared in `package.json`

> Task :core:compileKotlinJs
> Task :core:jsProcessResources NO-SOURCE
> Task :core:jsMainClasses
> Task :core:jsPublicPackageJson UP-TO-DATE
> Task :core:jsJar
> Task :core:compileTestKotlinJs
> Task :core:jsTestProcessResources NO-SOURCE
> Task :core:jsTestClasses
> Task :core:compileTestDevelopmentExecutableKotlinJs
> Task :core:jsTestTestDevelopmentExecutableCompileSync UP-TO-DATE

> Task :core:jsBrowserTest
Uncaught TypeError: toASCII is not a function
at /var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:100744:17
TypeError: toASCII is not a function
at UriCompatibility.encodeDNSHost_6wfw3l_k$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:100744:17)
at _no_name_provided__274.invoke_6wfw3l_k$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:97821:46)
at /var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:98101:16
at HostSegment.Segment_0.encoded_0_k$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:98037:38)
at Authority.toString (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:94984:35)
at Uri.toString (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:99166:81)
at new UriTest (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:140443:24)
at launcher$init$ (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:138942:156)
at Object.<anonymous> (/var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:142262:14)
at /var/folders/qq/0zkljkj12jb9m0jnwftykyd00000gn/T/_karma_webpack_216427/commons.js:6042:35
java.lang.IllegalStateException: command '/Users/ulti_mate/.gradle/nodejs/node-v14.17.0-darwin-x64/bin/node' exited with errors (exit code: 1)

> Task :core:jsNodeTest

TypeError: toASCII is not a function
at UriCompatibility.encodeDNSHost_6wfw3l_k$ (/Users/_arrow-endpoint/core/src/jsMain/kotlin/arrow/endpoint/model/UriCompatibility.kt:9:5)
at _no_name_provided__274.invoke_6wfw3l_k$ (/Users/_arrow-endpoint/core/src/commonMain/kotlin/arrow/endpoint/model/Segment.kt:25:34)
at /Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/kotlin/arrow-endpoint-core-test.js:92095:16
at HostSegment.Segment_0.encoded_0_k$ (/Users/_arrow-endpoint/core/src/commonMain/kotlin/arrow/endpoint/model/Segment.kt:11:34)
at Authority.toString (/Users/_arrow-endpoint/core/src/commonMain/kotlin/arrow/endpoint/model/Authority.kt:41:29)
at Uri.toString (/Users/_arrow-endpoint/core/src/commonMain/kotlin/arrow/endpoint/model/Uri.kt:200:33)
at new UriTest (/Users/_arrow-endpoint/core/src/commonTest/kotlin/arrow/endpoint/model/UriTest.kt:107:7)
at launcher$init$ (/Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/kotlin/arrow-endpoint-core-test.js:132984:156)
at /Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/kotlin/arrow-endpoint-core-test.js:136304:14
at /Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/kotlin/arrow-endpoint-core-test.js:5:5
at Object.<anonymous> (/Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/kotlin/arrow-endpoint-core-test.js:15:2)
at Module._compile (internal/modules/cjs/loader.js:1068:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:933:32)
at Function.Module._load (internal/modules/cjs/loader.js:774:14)
at Module.require (internal/modules/cjs/loader.js:957:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (/Users/_arrow-endpoint/build/js/packages/arrow-endpoint-core-test/adapter-nodejs.js:2:18)
at Module._compile (internal/modules/cjs/loader.js:1068:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:933:32)
at Function.Module._load (internal/modules/cjs/loader.js:774:14)
at ModuleWrap.<anonymous> (internal/modules/esm/translators.js:199:29)
at ModuleJob.run (internal/modules/esm/module_job.js:152:23)
at Loader.import (internal/modules/esm/loader.js:177:24)
at formattedImport (/Users/_arrow-endpoint/build/js/node_modules/mocha/lib/nodejs/esm-utils.js:7:14)
at Object.exports.requireOrImport (/Users/_arrow-endpoint/build/js/node_modules/mocha/lib/nodejs/esm-utils.js:48:32)
at Object.exports.loadFilesAsync (/Users/_arrow-endpoint/build/js/node_modules/mocha/lib/nodejs/esm-utils.js:88:20)
at singleRun (/Users/_arrow-endpoint/build/js/node_modules/mocha/lib/cli/run-helpers.js:125:3)
at Object.exports.handler (/Users/_arrow-endpoint/build/js/node_modules/mocha/lib/cli/run.js:374:5)
b
Your external declarations are wrong. Read through
NPM Package Object
section here
i
😄 Thank you, I’ve been struggling to understand the external declarations
b
Everyone is. That's why I wrote that shitty article. At least now people have something to start with
🙏 2
🙏🏾 1
i
Your blog post is awesome, but I think I don’t really understand how to apply it. the Js code I am trying to download is this
Copy code
/** Define the public API */
const punycode = {
	/**
	 * A string representing the current Punycode.js version number.
	 * @memberOf punycode
	 * @type String
	 */
	'version': '2.1.0',
	/**
	 * An object of methods to convert from JavaScript's internal character
	 * representation (UCS-2) to Unicode code points, and back.
	 * @see <<https://mathiasbynens.be/notes/javascript-encoding>>
	 * @memberOf punycode
	 * @type Object
	 */
	'ucs2': {
		'decode': ucs2decode,
		'encode': ucs2encode
	},
	'decode': decode,
	'encode': encode,
	'toASCII': toASCII,
	'toUnicode': toUnicode
};

module.exports = punycode;
and I created:
Copy code
@JsModule("punycode")
@JsNonModule
internal external object punycode {
  val version: String
  fun toASCII(input: String): String
}
it runs the tests but not sure if it’s correcct
b
Looks correct to me. To clarify, with this setup your
punycode
kt object maps 1:1 to
const punycode
(or
module.exports
) in JS
🙏 2
i
ok wow 🤩 thanks a lot