Updating to have real auto-completion on string templates library.
This commit is contained in:
parent
fcad70967c
commit
759a106d2d
|
@ -31,7 +31,7 @@ const {
|
||||||
createLoginScreen,
|
createLoginScreen,
|
||||||
} = require("../../constants/screens")
|
} = require("../../constants/screens")
|
||||||
const { cloneDeep } = require("lodash/fp")
|
const { cloneDeep } = require("lodash/fp")
|
||||||
const { recurseHandlebars } = require("../../utilities/handlebars")
|
const { objectHandlebars } = require("../../utilities/handlebars")
|
||||||
const { USERS_TABLE_SCHEMA } = require("../../constants")
|
const { USERS_TABLE_SCHEMA } = require("../../constants")
|
||||||
|
|
||||||
const APP_PREFIX = DocumentTypes.APP + SEPARATOR
|
const APP_PREFIX = DocumentTypes.APP + SEPARATOR
|
||||||
|
@ -213,8 +213,7 @@ const createEmptyAppPackage = async (ctx, app) => {
|
||||||
let screensAndLayouts = []
|
let screensAndLayouts = []
|
||||||
for (let layout of BASE_LAYOUTS) {
|
for (let layout of BASE_LAYOUTS) {
|
||||||
const cloned = cloneDeep(layout)
|
const cloned = cloneDeep(layout)
|
||||||
cloned.title = app.name
|
screensAndLayouts.push(objectHandlebars(cloned, app))
|
||||||
screensAndLayouts.push(recurseHandlebars(cloned, app))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const homeScreen = createHomeScreen(app)
|
const homeScreen = createHomeScreen(app)
|
||||||
|
|
|
@ -7,7 +7,7 @@ const fs = require("fs-extra")
|
||||||
const uuid = require("uuid")
|
const uuid = require("uuid")
|
||||||
const AWS = require("aws-sdk")
|
const AWS = require("aws-sdk")
|
||||||
const { prepareUpload } = require("../deploy/utils")
|
const { prepareUpload } = require("../deploy/utils")
|
||||||
const handlebars = require("handlebars")
|
const { stringHandlebars } = require("../../../utilities/handlebars")
|
||||||
const {
|
const {
|
||||||
budibaseAppsDir,
|
budibaseAppsDir,
|
||||||
budibaseTempDir,
|
budibaseTempDir,
|
||||||
|
@ -160,11 +160,8 @@ exports.serveApp = async function(ctx) {
|
||||||
objectStoreUrl: objectStoreUrl(),
|
objectStoreUrl: objectStoreUrl(),
|
||||||
})
|
})
|
||||||
|
|
||||||
const template = handlebars.compile(
|
const appHbs = fs.readFileSync(`${__dirname}/templates/app.hbs`, "utf8")
|
||||||
fs.readFileSync(`${__dirname}/templates/app.hbs`, "utf8")
|
ctx.body = stringHandlebars(appHbs, {
|
||||||
)
|
|
||||||
|
|
||||||
ctx.body = template({
|
|
||||||
head,
|
head,
|
||||||
body: html,
|
body: html,
|
||||||
style: css.code,
|
style: css.code,
|
||||||
|
|
|
@ -3,7 +3,7 @@ const actions = require("./actions")
|
||||||
const logic = require("./logic")
|
const logic = require("./logic")
|
||||||
const automationUtils = require("./automationUtils")
|
const automationUtils = require("./automationUtils")
|
||||||
const AutomationEmitter = require("../events/AutomationEmitter")
|
const AutomationEmitter = require("../events/AutomationEmitter")
|
||||||
const { recurseHandlebars } = require("../utilities/handlebars")
|
const { objectHandlebars } = require("../utilities/handlebars")
|
||||||
|
|
||||||
handlebars.registerHelper("object", value => {
|
handlebars.registerHelper("object", value => {
|
||||||
return new handlebars.SafeString(JSON.stringify(value))
|
return new handlebars.SafeString(JSON.stringify(value))
|
||||||
|
@ -49,7 +49,7 @@ class Orchestrator {
|
||||||
let automation = this._automation
|
let automation = this._automation
|
||||||
for (let step of automation.definition.steps) {
|
for (let step of automation.definition.steps) {
|
||||||
let stepFn = await this.getStepFunctionality(step.type, step.stepId)
|
let stepFn = await this.getStepFunctionality(step.type, step.stepId)
|
||||||
step.inputs = recurseHandlebars(step.inputs, this._context)
|
step.inputs = objectHandlebars(step.inputs, this._context)
|
||||||
step.inputs = automationUtils.cleanInputValues(
|
step.inputs = automationUtils.cleanInputValues(
|
||||||
step.inputs,
|
step.inputs,
|
||||||
step.schema.inputs
|
step.schema.inputs
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
const stringTemplates = require("@budibase/string-templates")
|
const stringTemplates = require("@budibase/string-templates")
|
||||||
|
|
||||||
exports.recurseHandlebars = stringTemplates.recurseHandlebars
|
exports.objectHandlebars = stringTemplates.processObject
|
||||||
|
exports.stringHandlebars = stringTemplates.processString
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
build/
|
dist/
|
||||||
node_modules/
|
node_modules/
|
||||||
|
|
|
@ -2,17 +2,20 @@
|
||||||
"name": "@budibase/string-templates",
|
"name": "@budibase/string-templates",
|
||||||
"version": "0.5.3",
|
"version": "0.5.3",
|
||||||
"description": "Handlebars wrapper for Budibase templating.",
|
"description": "Handlebars wrapper for Budibase templating.",
|
||||||
"main": "build/bundle.js",
|
"main": "dist/bundle.js",
|
||||||
|
"module": "dist/bundle.js",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"types": "dist/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "rollup -c",
|
"build": "rollup -c",
|
||||||
"dev:builder": "rollup -cw"
|
"dev:builder": "tsc && rollup -cw"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"handlebars": "^4.7.6"
|
"handlebars": "^4.7.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"typescript": "^4.1.3",
|
||||||
"rollup": "^2.36.2",
|
"rollup": "^2.36.2",
|
||||||
"rollup-plugin-commonjs": "^10.1.0",
|
"rollup-plugin-commonjs": "^10.1.0",
|
||||||
"rollup-plugin-node-builtins": "^2.1.2",
|
"rollup-plugin-node-builtins": "^2.1.2",
|
||||||
|
|
|
@ -6,9 +6,13 @@ import builtins from "rollup-plugin-node-builtins"
|
||||||
export default {
|
export default {
|
||||||
input: "src/index.js",
|
input: "src/index.js",
|
||||||
output: {
|
output: {
|
||||||
file: "build/bundle.js",
|
file: "dist/bundle.js",
|
||||||
format: "umd",
|
format: "umd",
|
||||||
name: "string-templates",
|
name: "string-templates",
|
||||||
|
exports: "named",
|
||||||
|
globals: {
|
||||||
|
"fs": "fs",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
external: ["fs"],
|
external: ["fs"],
|
||||||
plugins: [
|
plugins: [
|
||||||
|
|
|
@ -3,13 +3,6 @@ const { registerAll } = require("./helpers/index")
|
||||||
|
|
||||||
const HBS_CLEANING_REGEX = /{{[^}}]*}}/g
|
const HBS_CLEANING_REGEX = /{{[^}}]*}}/g
|
||||||
|
|
||||||
/**
|
|
||||||
* Templates are produced after an input string has been compiled, we store these templates in-case the same
|
|
||||||
* string will be processed multiple times after the app has been loaded.
|
|
||||||
* In the future storing these templates somewhere could save some processing time for large template runs.
|
|
||||||
*/
|
|
||||||
const COMPILED_TEMPLATES = {}
|
|
||||||
|
|
||||||
const hbsInstance = handlebars.create()
|
const hbsInstance = handlebars.create()
|
||||||
registerAll(hbsInstance)
|
registerAll(hbsInstance)
|
||||||
|
|
||||||
|
@ -61,7 +54,7 @@ function cleanHandlebars(string) {
|
||||||
* @param {object} context The context that handlebars should fill data from.
|
* @param {object} context The context that handlebars should fill data from.
|
||||||
* @returns {object|array} The structure input, as fully updated as possible.
|
* @returns {object|array} The structure input, as fully updated as possible.
|
||||||
*/
|
*/
|
||||||
module.exports.object = (object, context) => {
|
module.exports.processObject = (object, context) => {
|
||||||
// JSON stringify will fail if there are any cycles, stops infinite recursion
|
// JSON stringify will fail if there are any cycles, stops infinite recursion
|
||||||
try {
|
try {
|
||||||
JSON.stringify(object)
|
JSON.stringify(object)
|
||||||
|
@ -71,11 +64,11 @@ module.exports.object = (object, context) => {
|
||||||
for (let key of Object.keys(object)) {
|
for (let key of Object.keys(object)) {
|
||||||
let val = object[key]
|
let val = object[key]
|
||||||
if (typeof val === "string") {
|
if (typeof val === "string") {
|
||||||
module.exports.string(object[key], context)
|
object[key] = module.exports.processString(object[key], context)
|
||||||
}
|
}
|
||||||
// this covers objects and arrays
|
// this covers objects and arrays
|
||||||
else if (typeof val === "object") {
|
else if (typeof val === "object") {
|
||||||
object[key] = module.exports.object(object[key], context)
|
object[key] = module.exports.processObject(object[key], context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return object
|
return object
|
||||||
|
@ -88,18 +81,14 @@ module.exports.object = (object, context) => {
|
||||||
* @param {object} context An object of information which will be used to enrich the string.
|
* @param {object} context An object of information which will be used to enrich the string.
|
||||||
* @returns {string} The enriched string, all templates should have been replaced if they can be.
|
* @returns {string} The enriched string, all templates should have been replaced if they can be.
|
||||||
*/
|
*/
|
||||||
module.exports.string = (string, context) => {
|
module.exports.processString = (string, context) => {
|
||||||
let template = COMPILED_TEMPLATES[string]
|
let template
|
||||||
if (template == null) {
|
try {
|
||||||
try {
|
string = cleanHandlebars(string)
|
||||||
string = cleanHandlebars(string)
|
template = hbsInstance.compile(string)
|
||||||
template = hbsInstance.compile(string)
|
} catch (err) {
|
||||||
} catch (err) {
|
string = attemptToCorrectError(string)
|
||||||
string = attemptToCorrectError(string)
|
template = hbsInstance.compile(string)
|
||||||
template = hbsInstance.compile(string)
|
|
||||||
}
|
|
||||||
// store the template for later, only after we know it worked
|
|
||||||
COMPILED_TEMPLATES[string] = template
|
|
||||||
}
|
}
|
||||||
return template(context)
|
return template(context)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
|
||||||
|
"compilerOptions": {
|
||||||
|
"allowJs": true,
|
||||||
|
"declaration": true,
|
||||||
|
"emitDeclarationOnly": true,
|
||||||
|
"outDir": "dist"
|
||||||
|
}
|
||||||
|
}
|
|
@ -839,6 +839,11 @@ typedarray@^0.0.6:
|
||||||
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
|
||||||
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
|
||||||
|
|
||||||
|
typescript@^4.1.3:
|
||||||
|
version "4.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7"
|
||||||
|
integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
|
||||||
|
|
||||||
uglify-js@^3.1.4:
|
uglify-js@^3.1.4:
|
||||||
version "3.12.4"
|
version "3.12.4"
|
||||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee"
|
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee"
|
||||||
|
|
Loading…
Reference in New Issue