Step 7: Tips and Tricks

Deno vs. Node

Deno is very similar to Node but there are gotchas to keep in mind. - All imports in Deno use the exact file path with the extension (e.g import xx from yy.ts) - You don’t use NPM with Deno and instead use exact file paths to modules. You can learn more here . - Deno has very strict permissions out of the box unlike node. When running functions the Yext hosting environment will use --allow-net so that you can make external API calls

Additional Files

You DON’T need to put everything in mod.ts. That’s the entry point but you can easily add additional .ts files to the folder and reference those using import.

Function Signatures

Depending on the use case for your function the input and the output might be a different format. Here are some input and output formats for different areas of the platform:

Use Case Input Output
Connector Source Optional next page token string { data: string, nextPageToken: string} (JSON Stringified)
Connector Transform string string

Connector Source

As you can see above, the connector source returns a JSON stringified object. Make sure to do this before returning data. For example:

export function sourceFunction(nextPageToken?: string) {
  //Logic goes here

 const data = [{ name: "Item 1" }, { name: "Item 2" }];
 const nextPageToken = "hello";
 if (nextPageToken) {
   return JSON.stringify({ data });
 } else {
   return JSON.stringify({ data, nextPageToken });
 }
}

Also note that if you return the nextPageToken your function will get called again. Make sure you don’t return the nextPageToken on the final page or else you will have an infinite loop.

If you want to test the connector function you should write a test function that looks something like this. This loops through the function until no page token is returned.

import { myConnectorSource } from "./mod.ts";

Deno.test("Test Connector Source", () => {
 let nextPageToken: string | undefined = undefined;
 let fullData: unknown[] = [];
 let pageNumber = 1;
 do {
   const res: string = myConnectorSource(nextPageToken);
   const resObj = JSON.parse(res);
   const data = resObj.data;
   nextPageToken = resObj.nextPageToken;

   console.log(`Found ${data.length} rows on page ${pageNumber}`);

   fullData = [...fullData, ...data];

   pageNumber += 1;
 } while (nextPageToken);
});

Check out this repo for an example that uses IMDB APIs to get movie details and images for every movie released in a given year.

Handling Global Variables in test.ts

Global variables declared in _resource.json are only accessible at runtime in the platform. Therefore, you need to redeclare globals in test.ts to avoid exceptions.

declare global {
  var API_KEY: string;
}

globalThis.API_KEY = 'abcd123';

If you don’t want the value of the global hardcoded in test.ts you could set the value as undefined.

declare global {
  var API_KEY: string | undefined;
}

globalThis.API_KEY = undefined;

Then, add the API Key to a .env file.

API_KEY=abcd123

And finally use dotenv to grab the value saved in your .env file if you’re running a test.

import { config } from "https://deno.land/x/dotenv/mod.ts";

declare const API_KEY: string;

export function sourceFunction(nextPageToken?: string) {
  const apiKey = API_KEY ?? config().API_KEY; 
  //Logic goes here
}