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

@igomoon/hubspot-fields-js

v1.5.3

Published

A webpack plugin to generate HubSpot module fields.json files with js

Downloads

261

Readme

HubSpot Fields JS

1.5.2

The package makes using JavaScript to generate HubSpot module fields.json files on local development straightforward.

Table of Contents

Requirements

This is a webpack plugin designed to be a companion for (but not dependant on) the Hubspot Webpack Plugin created by our friends at HubSpot (Found here: @hubspot/webpack-cms-plugins).

Why is it needed?

If you're here, then you probably love HubSpot almost as much as we do, and when creating and maintaining the fields.json files for modules, they can quickly become long, arduous to read and difficult to update over time. "Fields JS" gives you the ease of working with webpack with your HubSpot modules.

How does it work?

Within your modules, you create a fields.js file in place of fields.json and during compilation, the plugin will convert your fields.js files to fields.json that can be uploaded to your HubSpot Account. After copying to the dist folder, the plugin will search your "dist" folder for fields.js and then replace those with transformed fields.json files.

Installation

Install the package

npm install @igomoon/hubspot-fields-js --save-dev

Configure Webpack Config

  1. Set up a hubspot.config.yml using the HubSpot CMS local development instructions.
  2. Add the hubspot-fields-js plugin to your webpack.config.js.
    • Options
      • src: The starting directory to search for field.js files eg. "./src"
      • extraDirsToWatch: an array of relative paths to directories that will trigger a recompilation. Useful for FieldJS partials
      • ignore: An array of relative paths to ignore when searching for field.js files

Example webpack.config.js

const HubSpotAutoUploadPlugin = require("@hubspot/webpack-cms-plugins/HubSpotAutoUploadPlugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
// STEP 1 : Include the Fields JS Plugin
const { FieldsPlugin } = require("@igomoon/hubspot-fields-js");

module.exports = ({ account, autoupload }) => ({
  entry: "./src/index.js",
  output: {
    filename: "js/main.js",
  },
  module: {
    rules: [
		//...
	]
  },
  plugins: [

    // STEP 2 : Add to the top of  your plugins
    new FieldsPlugin({
		src: "",
		extraDirsToWatch : ["./src/fields"],
		ignore: []
	}),

    new HubSpotAutoUploadPlugin({
      autoupload,
      account,
      src: "dist",
      dest: "my-project",
    }),

    new CopyWebpackPlugin([
      { from: "src/images", to: "images" },
      { from: "src/modules", to: "modules" },
      { from: "src/templates", to: "templates" },
    ]),

  ],
});
  1. Run webpack as normal to compile your project and convert fields.js to fields.json.

Example fields.js file

Example fields.js within a module.

const { Field } = require("@igomoon/hubspot-fields-js");

module.exports = [

	Field.text()
		.name("title","Title")
		.default("Text"),
	
	Field.richText()
		.name("text","Text")
		.default("<p>This is just some placeholder text in a rich text field</p>")

]; 

Usage : Field Types

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields

Blog Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#blog

Field.blog()
	.name("blog_field","Blog Field")

Boolean Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#boolean

Field.boolean()
	.name("boolean_field","Boolean Field")

Setting additional options with set helper method

Field.boolean()
	.name("boolean_field","Boolean Field")
	.set("display","toggle")
	.default(false)

Choice Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#choice

Field.choice()
	.name("choice_field","Choice Field")
	.choices([])

Setting additional options with set helper method

Field.choice()
	.name("choice_field","Choice Field")
	.choices([
		["choice-1", "Choice 1"]
	])
	.set("display","select")
	.default("choice-1")

Color Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#color

Field.color()
	.name("color_field","color Field")
	.default("#ffffff")

Setting additional options with set helper method

Field.color()
	.name("color_field","color Field")
	.set("default",{
		"color": "#ffffff",
		"opacity": 80
	})

CTA Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#cta

Field.cta()
	.name("cta_field","CTA Field")

CRM Object Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#crm-object

Field.crmObject()
	.name("crmobject_field","CRM Object Field")

Setting additional options with set helper method

Field.crmObject()
	.name("crmobject_field","CRM Object Field")
	.set("object_type","CONTACT")
	.set("properties_to_fetch",[])

Date Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#date

Field.date()
	.name("date_field","Date Field")

Date and Time Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#date-and-time

Field.dateTime()
	.name("datetime_field","Date and Time Field")

Setting additional options with set helper method

Field.dateTime()
	.name("datetime_field","Date and Time Field")
	.set("step",30)

Email Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#email

Field.email()
	.name("email_field","Email Field")

Embed Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#embed

Field.embed()
	.name("embed_field","Embed Field")

Setting additional options with set helper method

Field.embed()
	.name("embed_field","Embed Field")
	.set("supported_source_types",[ "oembed", "html" ])
	.set("supported_oembed_types",[ [ "photo", "video", "link", "rich" ] ])

File Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#file

Field.file()
	.name("file_field","File Field")

Setting additional options with set helper method

Field.file()
	.name("file_field","File Field")
	.set("picker","document")

Followup Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#followup-email

Field.followUpEmail()
	.name("followupemail_field","Followup Field")

Font Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#font

Field.font()
	.name("font_field","Font Field")

Setting additional options with set helper method

Field.font()
	.name("font_field","Font Field")
	.set("load_external_fonts", true)
	.set("default",{
		"size": 12,
		"font": "Merriweather",
		"font_set": "GOOGLE",
		"size_unit": "px",
		"color": "#000",
		"styles": {}
	})

Form Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#form

Field.form()
	.name("form_field","Form Field")
	.default("form_id")

Setting additional options with set helper method

Field.form()
	.name("form_field","Form Field")
	.set("default",{
		"response_type": "inline",
		"message": "Thanks for submitting the form."
	})

HubDB Row Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#hubdb-row

Field.hubdbRow()
	.name("hubdbrow_field","HubDB Row Field")
	.set("table_name_or_id","4357464")
	.default("row_id")

Setting additional options with set helper method

Field.hubdbRow()
	.name("hubdbrow_field","HubDB Row Field")
	.set("table_name_or_id","4357464")
	.set("columns_to_fetch",[])
	.set("display_columns",[])
	.set("display_format","%0 - %1")

HubDB Table Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#hubdb-table

Field.hubdbTable()
	.name("hubdbtable_field","HubDB Table Field")

Icon Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#icon

Field.icon()
	.name("icon_field","Icon Field")

Setting additional options with set helper method

Field.icon()
	.name("icon_field","Icon Field")
	.set("icon_set", "fontawesome-5.14.0")
	.set("default",{
		"name" : "accessible-icon",
		"unicode" : "f368",
		"type" : "REGULAR"
	})

Image Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#image

Field.image()
	.name("image_field","Image Field")
	.default("image_field","Image Field")

Setting additional options with set helper method

Field.icon()
	.name("image_field","Image Field")
	.set("responsive",true)
	.set("resizable",true)
	.set("show_loading",false)
	.set("default",{
		"size_type" : "auto",
		"src" : "",
		"alt" : null,
		"loading": "disabled"
	})

Link Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#link

Field.link()
	.name("link_field","Link Field")
	.default("https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields")

Setting additional options with set helper method

Field.link()
	.name("link_field","Link Field")
	.set("supported_types",["EXTERNAL", "CONTENT", "FILE", "EMAIL_ADDRESS", "BLOG"])
	.set("default",{
		"url" : {
			"content_id" : null,
			"type" : "EXTERNAL",
			"href" : ""
		},
		"open_in_new_tab" : false,
		"no_follow" : false
	})

Logo Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#logo

Field.logo()
	.name("logo_field","Logo Field")
	.default("https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields")

Setting additional options with set helper method

Field.logo()
	.name("logo_field","Logo Field")
	.set("default",{
		"override_inherited_src" : false,
		"src" : null,
		"alt" : null
	})

Menu Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#menu

Field.menu()
	.name("menu_field","Menu Field")

Number Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#number

Field.number()
	.name("number_field","Number Field")

Setting additional options with set helper method

Field.number()
	.name("number_field","Number Field")
	.set("display","slider")
	.set("step",1)
	.set("min",0)
	.set("max",100)
	.set("prefix","$")
	.set("suffix","K")

Page Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#page

Field.page()
	.name("page_field","Page Field")

Setting additional options with set helper method

Field.page()
	.name("page_field","Page Field")
	.set("placeholder","Page to pull from")

Rich Text Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#rich-text

Field.richText()
	.name("richtext_field","Rich Text Field")

Setting additional options with set helper method

Field.richText()
	.name("richtext_field","Rich Text Field")
	.set("enabled_features",["bold","link","image"])

Simple menu Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#simple-menu

Field.simpleMenu()
	.name("simplemenu_field","Simple menu Field")

Tag Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#tag

Field.tag()
	.name("tag_field","Tag Field")

Setting additional options with set helper method

Field.tag()
	.name("tag_field","Tag Field")
	.set("tag_value","SLUG")

Text Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#text

Field.text()
	.name("text_field","Text Field")

Setting additional options with set helper method

Field.text()
	.name("text_field","Text Field")
	.set("placeholder","Enter text here")
	.set("allow_new_line",false)
	.set("show_emoji_picker",false)
	.set("validation_regex","")

URL Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#url

Field.url()
	.name("url_field","URL Field")

Setting additional options with set helper method

Field.url()
	.name("url_field","URL Field")
	.set("supported_types",["EXTERNAL", "CONTENT", "FILE", "EMAIL_ADDRESS", "BLOG"])
	.set("default",{
		"content_id" : null,
		"href" : "http://example.com",
		"type" : "EXTERNAL"
	})

Video Field

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields#video

Field.video()
	.name("video_field","Video Field")

Setting additional options with set helper method

Field.video()
	.name("video_field","Video Field")
	.set("default",{
		"player_id" : 32173842991,
		"height" : 1224,
		"width" : 1872,
		"conversion_asset" : {
			"type" : "CTA",
			"id" : "c3e4fa03-2c69-461d-b9af-22b2fde86bc7",
			"position" : "POST"
		}
	})

Salesforce Campaign Field

Field.sfCampaign()
	.name("sfdc_campaign","Salesforce Campaign Field")

Usage: Groups

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields-overview#field-groups

You can create a field group (and nested groups) like this:

const { Group, Field } = require("@igomoon/hubspot-fields-js");

new Group()
	.name("group", "Group")
	.children([	
		Field.text(),		
		// Other Fields/Groups
		new Group()
			.name("sub_content", "SubContent")
			.children([				
				Field.text(),				
				// Other Fields/Groups
			])		
	])

IMPORTANT: Make sure to pull in the Group class from the package at the top of you file. const { Group, Field } = require("@igomoon/hubspot-fields-js");

Looking for Repeating Groups? See the Helper Methods below. https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields-overview#repeating-groups

Usage: Helper Methods

Name + Label

name(name, label)

Field.text()
	.name("field_name","Field Label")

ID

id(id)

Field.text()
	.id("321732-3231-3213554-21")

Default

default(value)

Field.text()
	.default("value to set")

Set

set(key,value)

Field.text()
	.set("placeholder","Placeholder Text")

Visibility

visibleIf(controllingField, regex, type = "EQUAL")

Sets controlling field options under visibility

Field.text()
	.visibleIf("other_field_id","value to test")
Field.text()
	.visibleIf("other_field_id","value to test","NOT_EQUAL")

Repeater

https://developers.hubspot.com/docs/cms/building-blocks/module-theme-fields-overview#repeaters

repeat(overrides = {})

Field.text()
	.repeat()
new Group()
	.name("group","Group")
	.children([])
	.repeat()

Override the repeat options like so:

new Group()
	.name("group","Group")
	.children([])
	.repeat({
		"min": null,
		"max": 5,
		"sorting_label_field": 'group.name',
		"default": 1
	})

Help Text

helpText(text)

Field.text()
	.helpText("Help text")

Inline Help Text

inlineHelpText(text)

Field.text()
	.inlineHelpText("Inline Help Text")

Label

label(value)

Field.text()
	.label("Label Value")

Required

required(required = true)

Field.text()
	.required()
Field.text()
	.required(false)

Hidden Sub Fields

hiddenSubfields(subFields)

Sets hidden_subfields under visibility

Field.text()
	.hiddenSubfields({
      "font": true,
      "size": true
    })

Locked

locked(locked = true)

Field.text()
	.locked()
Field.text()
	.locked(false)

Choices

For choice Field only choices(choices = [])

Field.choice()
	.choices([])

Children

For Groups Only children(children = [])

new Group()
	.children([])

Advanced Usage

What's the best feature of all? Hubspot Fields JS allows you to abstract your fields into partials. Giving you the ability to create common fields once and then pull them into any Fields-JS enabled module that you like. Removing the pain of constant duplication and allowing you to make global changes by just changing a sinle partial file.

The example below creates a text field partial with a validation regex for an id attribut, then in 2 different module fields.js file, that partial is pulled in and inserted.

src/fields/cssID.js

const { Field } = require('@igomoon/hubspot-fields-js');
module.exports = function () {
	return Field
		.text()
		.name('css_id', 'CSS ID');
		.set("validation_regex","-?[a-zA-Z]+[a-zA-Z0-9-]+")
}

src/modules/example.module/fields.js

const { Field } = require("@igomoon/hubspot-fields-js");

// Pull in the Partial (IMPROTANT: Relative to the modules final destination in the dist folder) 
let cssID = require('../../../src/fields/cssID');

module.exports = [
	Field.text()
		.name("title","Title")
		.default("Text"),
	// This will insert the CSS ID field for this module
	cssID()
]; 

src/modules/second-example.module/fields.js

const { Group, Field } = require("@igomoon/hubspot-fields-js");

// Pull in the Partial (IMPROTANT: Relative to the modules final destination in the dist folder) 
let cssID = require('../../../src/fields/cssID');

module.exports = [
	new Group()
		.name("group","Group")
		.children([
			Field.text()
				.name("title","Title")
				.default("Text"),			
			Field.richText()
				.name("text","Text")
				.default("<p>This is just some placeholder text in a rich text field</p>")
		])
	// This will insert the CSS ID field for this module
	cssID()
]; 

About iGoMoon

iGoMoon’s mission is to help companies grow through data-driven communication, smart technology and relevant content. We live and breathe HubSpot and being Certified in Advanced CMS Implementation we are constantly improving our development process to better serve our customers.

Get to know us more on our Vlog Månresan (The moonshot journey)

We're Hiring

We are always looking for skilled developers at iGoMoon, if you have HubSpot experience then there may be a spot for you here. Think you have what it takes? Then try our HubSpot Developer Coding Task and connect with us on our career page here: https://careers.igomoon.com/connect

Contributing

For more information on developing, see the Contributing Guide.

License

Apache 2.0