pricing4ts
Version:
 Pricing4TS is a TypeScript-based toolkit designed to enhance the server-side functionality of a pricing-driven SaaS by enabling the seamless integration of pricing plans into the application logic. T
173 lines (172 loc) • 8.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pricing2DZN = pricing2DZN;
var _1 = require(".");
var os_1 = require("os");
var addon_1 = require("../../../main/models/pricing2yaml/addon");
var plan_1 = require("../../../main/models/pricing2yaml/plan");
var feature_1 = require("../../../main/models/pricing2yaml/feature");
var usage_limit_1 = require("../../../main/models/pricing2yaml/usage-limit");
var string_utils_1 = require("./string-utils");
function pricing2DZN(pricing) {
var numFeatures = (0, feature_1.getNumberOfFeatures)(pricing.features);
var numUsageLimits = (0, usage_limit_1.getNumberOfUsageLimits)(pricing.usageLimits);
var numPlans = pricing.plans ? Object.keys(pricing.plans).length : 0;
var numAddOns = pricing.addOns ? Object.keys(pricing.addOns).length : 0;
var variableChunks = [
{
left: _1.DZNKeywords.NumberOfFeatures,
value: JSON.stringify(numFeatures),
},
{
left: _1.DZNKeywords.NumberOfUsageLimits,
value: JSON.stringify(numUsageLimits),
},
{ left: _1.DZNKeywords.NumberOfPlans, value: JSON.stringify(numPlans) },
{ left: _1.DZNKeywords.NumberOfAddOns, value: JSON.stringify(numAddOns) },
];
var variablesBlock = (0, string_utils_1.generateChunkBlock)(variableChunks);
var featureNames = (0, feature_1.getFeatureNames)(pricing.features);
var usageLimitNames = (0, usage_limit_1.getUsageLimitNames)(pricing.usageLimits);
var planNames = (0, plan_1.getPlanNames)(pricing.plans);
var addOnNames = (0, addon_1.getAddOnNames)(pricing.addOns);
var namesChunks = [
{ left: _1.DZNKeywords.Features, value: JSON.stringify(featureNames) },
{
left: _1.DZNKeywords.UsageLimits,
value: JSON.stringify(usageLimitNames),
},
{ left: _1.DZNKeywords.Plans, value: JSON.stringify(planNames) },
{ left: _1.DZNKeywords.AddOns, value: JSON.stringify(addOnNames) },
];
var namesBlock = (0, string_utils_1.generateChunkBlock)(namesChunks);
var pricesChunk = generatePricesChunk(pricing.plans, pricing.addOns);
var booleanUsageLimitsChunk = generateBooleanUsageLimitsChunk(pricing.usageLimits);
var planChunks = generatePlanChunks(pricing.usageLimits || {}, pricing.plans);
var linkedFeatures = generateLinkedFeaturesMatrix(pricing);
var addOnsChunks = generateAddOnsChunks(pricing);
return [variablesBlock, namesBlock, pricesChunk, booleanUsageLimitsChunk, linkedFeatures, planChunks, addOnsChunks].join(os_1.EOL);
}
function generatePricesChunk(plans, addOns) {
var plansPrices = (0, plan_1.getPlanPrices)(plans);
if (plans && Object.keys(plans).length !== 0 && plansPrices.every(function (p) { return p === null; })) {
throw new Error("Either prices are not defined for all plans, or they are not numbers. Current parsed prices: ".concat(plansPrices));
}
var addOnPrices = (0, addon_1.getAddOnPrices)(addOns);
var pricesChunks = [
{
left: _1.DZNKeywords.PlansPrices,
value: JSON.stringify(plansPrices),
},
{
left: _1.DZNKeywords.AddOnsPrices,
value: JSON.stringify(addOnPrices),
},
];
return (0, string_utils_1.generateChunkBlock)(pricesChunks);
}
function generateBooleanUsageLimitsChunk(usageLimits) {
if (!usageLimits) {
return '';
}
var booleanUsageLimits = Object.values(usageLimits).map(function (ul) { return ul.valueType === 'BOOLEAN' ? 1 : 0; });
var booleanUsageLimitsChunks = [
{
left: _1.DZNKeywords.BooleanUsageLimits,
value: JSON.stringify(booleanUsageLimits),
},
];
return (0, string_utils_1.generateChunkBlock)(booleanUsageLimitsChunks);
}
function generatePlanChunks(usageLimits, plans) {
if (!plans) {
return '';
}
var planNames = Object.values(plans).map(function (plan) { return plan.name; });
var planFeaturesMatrix = (0, plan_1.calculatePlanFeaturesMatrix)(plans);
var planUsageLimitsMatrix = (0, plan_1.calculatePlanUsageLimitsMatrix)(usageLimits, plans);
var addOnChunks = [
{
left: _1.DZNKeywords.PlansFeatures,
row: _1.DZNKeywords.Plans,
col: _1.DZNKeywords.Features,
value: (0, string_utils_1.formatMatrixToString)(planNames, planFeaturesMatrix),
},
{
left: _1.DZNKeywords.PlansUsageLimits,
row: _1.DZNKeywords.Plans,
col: _1.DZNKeywords.UsageLimits,
value: (0, string_utils_1.formatMatrixToString)(planNames, planUsageLimitsMatrix),
},
];
return (0, string_utils_1.generateChunkBlock)(addOnChunks);
}
function generateAddOnsChunks(pricing) {
if (!pricing.addOns) {
return '';
}
if (!pricing.usageLimits) {
return '';
}
var addOnNames = (0, addon_1.getAddOnNames)(pricing.addOns);
var planNames = (0, plan_1.getPlanNames)(pricing.plans);
var addOnsFeatureMatrix = (0, addon_1.calculateAddOnsFeaturesMatrix)(pricing.features, pricing.addOns);
var addOnsUsageLimitsMatrix = (0, addon_1.calculateAddOnsUsageLimitsMatrix)(pricing.usageLimits, pricing.addOns);
var addOnsUsageLimitsExtensionsMatrix = (0, addon_1.calculateAddOnsUsageLimitsExtensionsMatrix)(pricing.usageLimits, pricing.addOns);
var addOnsAvailableForMatrix = (0, addon_1.calculateAddOnAvailableForMatrix)(planNames, pricing.addOns);
var addOnsDependsOnMatrix = (0, addon_1.calculateAddOnsDependsOnOExcludesMatrix)(pricing.addOns);
var addOnsExcludesOnMatrix = (0, addon_1.calculateAddOnsDependsOnOExcludesMatrix)(pricing.addOns, "excludes");
var addOnChunks = [
{
left: _1.DZNKeywords.AddOnsFeatures,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.Features,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsFeatureMatrix),
},
{
left: _1.DZNKeywords.AddOnsUsageLimits,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.UsageLimits,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsUsageLimitsMatrix),
},
{
left: _1.DZNKeywords.AddOnsUsageLimitsExtensions,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.UsageLimits,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsUsageLimitsExtensionsMatrix),
},
{
left: _1.DZNKeywords.AddOnsAvailableFor,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.Plans,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsAvailableForMatrix),
},
{
left: _1.DZNKeywords.AddOnsDependsOn,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.AddOns,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsDependsOnMatrix),
},
{
left: _1.DZNKeywords.AddOnsExcludes,
row: _1.DZNKeywords.AddOns,
col: _1.DZNKeywords.AddOns,
value: (0, string_utils_1.formatMatrixToString)(addOnNames, addOnsExcludesOnMatrix),
},
];
return (0, string_utils_1.generateChunkBlock)(addOnChunks);
}
function generateLinkedFeaturesMatrix(pricing) {
if (!pricing.usageLimits) {
return '';
}
var usageLimitsNames = (0, usage_limit_1.getUsageLimitNames)(pricing.usageLimits);
var featureNames = (0, feature_1.getFeatureNames)(pricing.features);
var linkedFeaturesMatrix = (0, usage_limit_1.calculateLinkedFeaturesMatrix)(pricing.usageLimits, featureNames);
return (0, string_utils_1.generateChunk)({
left: _1.DZNKeywords.LinkedFeatures,
row: _1.DZNKeywords.UsageLimits,
col: _1.DZNKeywords.Features,
value: (0, string_utils_1.formatMatrixToString)(usageLimitsNames, linkedFeaturesMatrix),
});
}