npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@parameter1/base-cms-marko-web-native-x

v4.80.0

Published

NativeX Marko components for BaseCMS websites

Downloads

3,699

Readme

BaseCMS Marko Web NativeX Components

NativeX components for BaseCMS/Marko websites.

Configuration

All NativeX components rely upon an instance of the NativeXConfiguration class being provided. For ease of use, this configuration is typically set into the Express app locals via the start-server utility, but must be provided when querying for an advertisement or a story. This configuration defines (at minimum) the NativeX instance URI and the default template alias. If website section-based templates are in use, they must be defined after creation:

const NativeXConfiguration = require('@parameter1/base-cms-marko-web-native-x/config');

const config = new NativeXConfiguration('https://example.native-x.parameter1.com',
  {
    enabled: true,
    defaultAlias: 'default',
  }
);

// Configure a placement
config.setPlacement({
  alias: 'default',
  name: 'default',
  id: '5d4b04769f69b200013ab109',
});

// Configure multiple placements for an alias
config.setAliasPlacements('my-custom-alias', [
  { name: 'custom-placement-1', id: '95d4b04769f69b200013ab10' },
  { name: 'custom-placement-2', id: '095d4b04769f69b200013ab1' },
]);

module.exports = config;

Usage

Advertisements

Rendering NativeX advertisements is typically done by using the <marko-web-native-x-render> component. If NativeX is enabled, this component then uses the <marko-web-native-x-retrieve> component to query NativeX for an advertisement. When an advertisement is available, the content node will be replaced by the ad details.

The render component requires the following properties:

  • config: An instance of the NativeXConfiguration class.
  • name: The name of the placement to use (as defined by setPlacement and setAliasPlacements)
  • aliases: An array of active aliases to use. (See aliases below)
  • node: The content node that may become a NativeX ad.
  • when: A boolean. When truthy, the content node will be replaced by the ad (if available)
  • sectionName: Used by the conversion utilities. Because ads do not have website context, indicate the name of the primary section of the "content" (the ad, once replaced)

Aliases

When registering an placement, you must specify an alias. If you are not using any alias-aware placements, you should use the value default for the alias field. This is the most common!

In an atypical website deployment, multiple NativeX placements may be used to further segment NativeX metrics. When a placement is requested, the supplied aliases are checked against registered placements. If a more specific placement exists, it is used preferentially over the default placement with a matching name.

For example, consider the following:

const config = new NativeXConfiguration(...);

// The default placement
config.setPlacement({ alias: 'default', name: 'default', id: '5d4b04769f69b200013ab109' });
config.setPlacement({ alias: 'section-1', name: 'default', id: '95d4b04769f69b200013ab10' });
config.setPlacement({ alias: 'section-2', name: 'default', id: '095d4b04769f69b200013ab1' });

const aliases = ['section-1/child-section/grand-child', 'section-1/child-section', 'section-1'];

const placement = config.getPlacement({ name: 'default', aliases });
console.log(placement.id);
// 95d4b04769f69b200013ab10

Stories

To render a NativeX story in a consuming application, import the with-story middleware. This middleware requires a NativeX configuration and a Marko template to render a response. It also supports sending a custom queryFragment to return additional fields, if needed.

An Express route

// my-site/routes/native-x-story.js
const withNativeXStory = require('@parameter1/base-cms-marko-web-native-x/middleware/with-story.js');
const config = require('../config/native-x');
const template = require('../templates/native-x-story');

module.exports = (app) => {
  app.use('/some-path/:id', withNativeXStory({
    config,         // Required. An instance of the NativeXConfiguration class.
    template,       // Required. A Marko template used to render the story.
    queryFragment,  // Optional. A GraphQL query fragment specifying included fields.
  }));
};

A minimal Marko template

<!-- my-site/templates/native-x-story.marko -->
$ const { document } = out.global;
$ const { story } = input;

<${document}>
  <@container>
    <@page>
      <if(imgSrc)>
        <marko-web-img class="img-fluid" src=story.primaryImage.src />
      </if>
      <h1>${story.title}</h1>
      <if(story.teaser)>
        <p>${story.teaser}</p>
      </if>
      <hr>
      $!{story.body}
    </@page>
  </@container>
</>

A GraphQL fragment definition

// my-site/graphql/fragments/story.js

const gql = require('graphql-tag');

module.exports = gql`
  fragment MyCustomStoryFragment on Story {
    id
    title
    campaigns {
      totalCount
      edges {
        id
        name
      }
    }
  }
`;

Event Tracking and analytics

To utilize NativeX's story analytics, you must use the event tracking utility functions to send events to the NativeX GTM container.

The GTM container can be initialized by including the <marko-web-native-x-gtm-init> component within your document's <head>:

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
</>

Before sending any events, make sure to include the <marko-web-native-x-story-track-init> component. This component initializes the data layer with the story data that other events rely upon.

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
  <@page>
    <marko-web-native-x-story-track-init story=story />
  </@page>
</>

See examples of available events below. By default, including the <marko-web-native-x-story-track-page-view> component will populate the datalayer with the story details. To disable this behavior, send the push=false parameter when including the component. All other story components assume this has already happened -- to force population of the data layer, send the push=true parameter when including the relevant component.

Page View

To send a page view, include the <marko-web-native-x-story-track-page-view> and pass the story property through (from the Nx middleware):

$ const { story } = input;

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
  <@page>
    <marko-web-native-x-story-track-page-view />
    <h1>${story.title}</h1>
  </@page>
</>
Outbound Links

To automatically track outbound links, include the <marko-web-native-x-story-track-outbound-links> component. This component requires a DOM selector in order to limit the tracking to a subset of links:

$ const { story } = input;

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
  <@page>
    <h1>${story.title}</h1>
    <div id="my-story-body">
      <a href="https://google.com">This will be tracked when clicked!</a>
    </div>
    <marko-web-native-x-story-track-outbound-links container="#my-story-body" />
  </@page>
</>
Social Sharing

If using the marko-web-social-sharing package, you can automatically track any share attempts by including the <marko-web-native-x-story-track-social-share> component in your story template:

$ const { story } = input;

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
  <@page>
    <marko-web-native-x-story-track-social-share />
    <h1>${story.title}</h1>
    <marko-web-social-sharing path=story.url providers=["facebook", "email"] />
  </@page>
</>
End of content

To automatically track when the user reaches the bottom of the page, include the <marko-web-native-x-story-track-end-of-content> component below your story. This event will fire when the element comes into view:

$ const { story } = input;

<${document}>
  <@head>
    <marko-web-native-x-gtm-init />
  </@head>
  <@page>
    <h1>${story.title}</h1>
    <p>...</p>
    <p>...</p>
    <p>...</p>
    <marko-web-native-x-story-track-end-of-content />
  </@page>
</>
Manual/advanced implementations

You can also send an event directly by using one of the available utility functions:

<script>
import { endOfContent } from "@parameter1/base-cms-marko-web-native-x/utils/gtm-events";

export default {
  created() {
    endOfContent();
  }
};
</script>