@teleporthq/teleport-plugin-common
Advanced tools
Comparing version
@@ -202,31 +202,51 @@ "use strict"; | ||
var _a = node.content.nodes, success = _a.success, empty = _a.empty, error = _a.error, loading = _a.loading; | ||
var statePersistanceName = node.content.statePersistanceName; | ||
var _b = node.content, loopItemsReference = _b.loopItemsReference, statePersistanceName = _b.statePersistanceName; | ||
var type = loopItemsReference.type; | ||
var errorNodeAST = null; | ||
var emptyNodeAST = null; | ||
var loadingNodeAST = null; | ||
var listNodeAST = null; | ||
var source = (0, utils_1.getRepeatSourceIdentifier)(node.content.loopItemsReference, options); | ||
/* | ||
* TODO: @JK move this too into validator | ||
* CMS list node can only be a dynamic !! | ||
*/ | ||
if (type !== 'dynamic') { | ||
throw new Error("Node ".concat(node, " is dynamic, but the referece link is missing. \n\n Missing loopItemsReference")); | ||
} | ||
var loadingStatePersistanceName = teleport_shared_1.StringUtils.createStateOrPropStoringValue("".concat(statePersistanceName, "Loading")); | ||
var errorStatePersistanceName = teleport_shared_1.StringUtils.createStateOrPropStoringValue("".concat(statePersistanceName, "Error")); | ||
var listNodeAST = !!success | ||
? generateNode(success, params, options)[0] | ||
: null; | ||
var source = (0, utils_1.getRepeatSourceIdentifier)(node.content.loopItemsReference, options); | ||
var emptyNodeAST = !!empty | ||
? generateNode(empty, params, options)[0] | ||
: null; | ||
if (empty) { | ||
emptyNodeAST = generateNode(empty, params, options)[0]; | ||
} | ||
if (error) { | ||
errorNodeAST = generateNode(error, params, options)[0]; | ||
params.stateDefinitions["".concat(statePersistanceName, "Error")] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
}; | ||
} | ||
if (loading) { | ||
loadingNodeAST = generateNode(loading, params, options)[0]; | ||
params.stateDefinitions["".concat(statePersistanceName, "Loading")] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
}; | ||
} | ||
if (success) { | ||
listNodeAST = generateNode(success, params, options)[0]; | ||
} | ||
var emptyNodeExpressionAST = empty | ||
? types.logicalExpression('&&', types.unaryExpression('!', types.memberExpression(source, types.identifier('length'))), emptyNodeAST) | ||
: null; | ||
var errorNodeAST = !!error | ||
? generateNode(error, params, options)[0] | ||
: null; | ||
var errorNodeExpressionAST = error && errorStatePersistanceName | ||
? types.logicalExpression('&&', types.identifier(errorStatePersistanceName), errorNodeAST) | ||
: null; | ||
var loadingNodeAST = !!loading | ||
? generateNode(loading, params, options)[0] | ||
: null; | ||
var loadingNodeExpressionAST = loading && loadingStatePersistanceName | ||
? types.logicalExpression('&&', types.identifier(loadingStatePersistanceName), loadingNodeAST) | ||
: null; | ||
var _b = teleport_shared_1.UIDLUtils.getRepeatIteratorNameAndKey({ | ||
var _c = teleport_shared_1.UIDLUtils.getRepeatIteratorNameAndKey({ | ||
useIndex: true, | ||
iteratorName: 'item', | ||
}), iteratorName = _b.iteratorName, iteratorKey = _b.iteratorKey; | ||
}), iteratorName = _c.iteratorName, iteratorKey = _c.iteratorKey; | ||
var localIteratorPrefix = options.dynamicReferencePrefixMap.local; | ||
@@ -233,0 +253,0 @@ (0, ast_utils_1.addDynamicAttributeToJSXTag)(listNodeAST, 'key', iteratorKey, localIteratorPrefix); |
import * as types from '@babel/types'; | ||
import ParsedASTNode from './parsed-ast'; | ||
import { UIDLStateDefinition, UIDLPropDefinition, UIDLRawValue, Resource, UIDLDynamicReference } from '@teleporthq/teleport-types'; | ||
import { UIDLStateDefinition, UIDLPropDefinition, UIDLRawValue, UIDLStaticValue, UIDLDynamicReference, UIDLResourceItem, UIDLPropValue, UIDLExpressionValue } from '@teleporthq/teleport-types'; | ||
import { JSXGenerationOptions, JSXGenerationParams } from '../node-handlers/node-to-jsx/types'; | ||
@@ -58,6 +58,7 @@ /** | ||
export declare const wrapObjectPropertiesWithExpression: (properties: types.ObjectProperty[]) => types.ObjectExpression; | ||
export declare const generateRemoteResourceASTs: (resource: Resource, propsPrefix?: string, extraUrlParamsGenerator?: () => types.ObjectProperty[]) => types.VariableDeclaration[]; | ||
export declare const generateRemoteResourceASTs: (resource: UIDLResourceItem) => types.VariableDeclaration[]; | ||
export declare const generateMemberExpressionASTFromBase: (base: types.MemberExpression | types.Identifier, path: string[]) => types.MemberExpression; | ||
export declare const generateMemberExpressionASTFromPath: (path: string[]) => types.MemberExpression | types.Identifier; | ||
export declare const generateMemberExpressionASTFromPath: (path: Array<string | number>) => types.MemberExpression | types.Identifier; | ||
export declare const resolveObjectValue: (prop: UIDLStaticValue | UIDLPropValue | UIDLExpressionValue) => types.BooleanLiteral | types.Identifier | types.NumericLiteral | types.StringLiteral; | ||
export {}; | ||
//# sourceMappingURL=ast-utils.d.ts.map |
@@ -38,3 +38,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.generateMemberExpressionASTFromPath = exports.generateMemberExpressionASTFromBase = exports.generateRemoteResourceASTs = exports.wrapObjectPropertiesWithExpression = exports.generateDynamicWindowImport = exports.createStateHookAST = exports.createReturnExpressionSyntax = exports.createPureComponent = exports.createClassComponent = exports.removeAttributeByName = exports.findAttributeByName = exports.getTSAnnotationForType = exports.addPropertyToASTObject = exports.convertValueToLiteral = exports.objectToObjectExpression = exports.renameJSXTag = exports.addSpreadAttributeToJSXTag = exports.addChildJSXText = exports.addChildJSXTag = exports.addRawAttributeToJSXTag = exports.addAttributeToJSXTag = exports.stringAsTemplateLiteral = exports.addMultipleDynamicAttributesToJSXTag = exports.addDynamicExpressionAttributeToJSXTag = exports.addDynamicCtxAttributeToJSXTag = exports.addDynamicAttributeToJSXTag = exports.addClassStringOnJSXTag = void 0; | ||
exports.resolveObjectValue = exports.generateMemberExpressionASTFromPath = exports.generateMemberExpressionASTFromBase = exports.generateRemoteResourceASTs = exports.wrapObjectPropertiesWithExpression = exports.generateDynamicWindowImport = exports.createStateHookAST = exports.createReturnExpressionSyntax = exports.createPureComponent = exports.createClassComponent = exports.removeAttributeByName = exports.findAttributeByName = exports.getTSAnnotationForType = exports.addPropertyToASTObject = exports.convertValueToLiteral = exports.objectToObjectExpression = exports.renameJSXTag = exports.addSpreadAttributeToJSXTag = exports.addChildJSXText = exports.addChildJSXTag = exports.addRawAttributeToJSXTag = exports.addAttributeToJSXTag = exports.stringAsTemplateLiteral = exports.addMultipleDynamicAttributesToJSXTag = exports.addDynamicExpressionAttributeToJSXTag = exports.addDynamicCtxAttributeToJSXTag = exports.addDynamicAttributeToJSXTag = exports.addClassStringOnJSXTag = void 0; | ||
var types = __importStar(require("@babel/types")); | ||
@@ -45,2 +45,3 @@ var core_1 = require("@babel/core"); | ||
var utils_1 = require("../node-handlers/node-to-jsx/utils"); | ||
var __1 = require(".."); | ||
/** | ||
@@ -107,2 +108,6 @@ * Adds a class definition string to an existing string of classes | ||
if (t === void 0) { t = types; } | ||
// TODO: Fix !! | ||
if (!value) { | ||
return; | ||
} | ||
var content = prefix === '' | ||
@@ -442,10 +447,15 @@ ? t.identifier(value) | ||
exports.wrapObjectPropertiesWithExpression = wrapObjectPropertiesWithExpression; | ||
var generateRemoteResourceASTs = function (resource, propsPrefix, extraUrlParamsGenerator) { | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
/* | ||
* TODO: Add the ability to support body and payload. | ||
* UIDLResourceItem['body'] | ||
* All the dynamic props are sent using the function props | ||
*/ | ||
var generateRemoteResourceASTs = function (resource) { | ||
var fetchUrl = computeFetchUrl(resource); | ||
var authHeaderAST = computeAuthorizationHeaderAST(resource); | ||
var queryParams = generateURLParamsAST(resource.urlParams, propsPrefix, extraUrlParamsGenerator); | ||
var authHeaderAST = computeAuthorizationHeaderAST(resource === null || resource === void 0 ? void 0 : resource.headers); | ||
var headersASTs = generateRESTHeadersAST(resource === null || resource === void 0 ? void 0 : resource.headers); | ||
var queryParams = generateURLParamsAST(resource === null || resource === void 0 ? void 0 : resource.params); | ||
var fetchUrlQuasis = fetchUrl.quasis; | ||
var queryParamsQuasis = queryParams.quasis; | ||
if (queryParams.expressions.length > 0) { | ||
var queryParamsQuasis = (queryParams === null || queryParams === void 0 ? void 0 : queryParams.quasis) || [types.templateElement({ raw: '', cooked: '' })]; | ||
if ((queryParams === null || queryParams === void 0 ? void 0 : queryParams.expressions.length) > 0) { | ||
fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw = | ||
@@ -457,3 +467,18 @@ fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw + '?'; | ||
} | ||
var url = queryParams | ||
var paramsDeclerations = Object.keys((resource === null || resource === void 0 ? void 0 : resource.params) || {}).reduce(function (acc, item) { | ||
var prop = resource.params[item]; | ||
if (prop.type === 'static') { | ||
acc.push(types.objectProperty(types.stringLiteral(item), __1.ASTUtils.resolveObjectValue(prop))); | ||
} | ||
if (prop.type === 'dynamic') { | ||
acc.push(types.spreadElement(types.logicalExpression('&&', types.memberExpression(types.identifier('params'), types.stringLiteral(prop.content.id), true, false), types.objectExpression([ | ||
types.objectProperty(types.stringLiteral(item), types.memberExpression(types.identifier('params'), types.stringLiteral(prop.content.id), true, false)), | ||
])))); | ||
} | ||
return acc; | ||
}, []); | ||
var paramsAST = types.variableDeclaration('const', [ | ||
types.variableDeclarator(types.identifier('urlParams'), types.objectExpression(paramsDeclerations)), | ||
]); | ||
var url = (queryParams === null || queryParams === void 0 ? void 0 : queryParams.quasis) | ||
? types.templateLiteral(__spreadArray(__spreadArray([], fetchUrlQuasis, true), queryParamsQuasis, true), __spreadArray([], fetchUrl.expressions.concat(queryParams.expressions), true)) | ||
@@ -465,6 +490,4 @@ : fetchUrl; | ||
types.objectExpression([ | ||
types.objectProperty(types.identifier('headers'), types.objectExpression([ | ||
types.objectProperty(types.identifier('"Content-Type"'), types.stringLiteral('application/json'), false, false), | ||
authHeaderAST, | ||
])), | ||
types.objectProperty(types.identifier('method'), types.stringLiteral(resource.method)), | ||
types.objectProperty(types.identifier('headers'), types.objectExpression(__spreadArray(__spreadArray([], headersASTs, true), [authHeaderAST], false))), | ||
]), | ||
@@ -476,5 +499,12 @@ ]))), | ||
]); | ||
return [fetchAST, responseJSONAST]; | ||
return [paramsAST, fetchAST, responseJSONAST]; | ||
}; | ||
exports.generateRemoteResourceASTs = generateRemoteResourceASTs; | ||
var generateRESTHeadersAST = function (headers) { | ||
return Object.keys(headers) | ||
.filter(function (header) { return header !== 'authToken'; }) | ||
.map(function (header) { | ||
return types.objectProperty(types.stringLiteral(header), types.stringLiteral(String(headers[header].content))); | ||
}); | ||
}; | ||
var generateMemberExpressionASTFromBase = function (base, path) { | ||
@@ -492,63 +522,44 @@ if (path.length === 1) { | ||
if (path.length === 1) { | ||
return types.identifier(path[0]); | ||
return types.identifier(path[0].toString()); | ||
} | ||
pathClone.pop(); | ||
return types.memberExpression((0, exports.generateMemberExpressionASTFromPath)(pathClone), types.identifier(path[path.length - 1]), false); | ||
var currentPath = path[path.length - 1]; | ||
if (typeof currentPath === 'number') { | ||
return types.memberExpression((0, exports.generateMemberExpressionASTFromPath)(pathClone), types.numericLiteral(currentPath), true); | ||
} | ||
var containsSpecial = currentPath.indexOf('.') !== -1 || currentPath.indexOf('-') !== -1; | ||
return types.memberExpression((0, exports.generateMemberExpressionASTFromPath)(pathClone), containsSpecial ? types.stringLiteral(currentPath) : types.identifier(currentPath), containsSpecial); | ||
}; | ||
exports.generateMemberExpressionASTFromPath = generateMemberExpressionASTFromPath; | ||
var generateURLParamsAST = function (urlParams, propsPrefix, extraUrlParamsGenerator) { | ||
var generateURLParamsAST = function (urlParams) { | ||
if (!urlParams) { | ||
return null; | ||
} | ||
var queryString = {}; | ||
Object.keys(urlParams).forEach(function (key) { | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key, propsPrefix); | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key); | ||
}); | ||
var urlObject = types.objectExpression(__spreadArray(__spreadArray([], Object.keys(queryString).map(function (key) { | ||
return types.objectProperty(types.stringLiteral("".concat(key)), queryString[key]); | ||
}), true), (extraUrlParamsGenerator ? extraUrlParamsGenerator() : []), true)); | ||
return types.templateLiteral([ | ||
types.templateElement({ raw: '', cooked: '' }, false), | ||
types.templateElement({ raw: '', cooked: '' }, true), | ||
], [types.newExpression(types.identifier('URLSearchParams'), [urlObject])]); | ||
], [types.newExpression(types.identifier('URLSearchParams'), [types.identifier('urlParams')])]); | ||
}; | ||
var resolveDynamicValuesFromUrlParams = function (field, query, prefix, propsPrefix) { | ||
var resolveDynamicValuesFromUrlParams = function (field, query, prefix) { | ||
if (prefix === void 0) { prefix = null; } | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
if (Array.isArray(field)) { | ||
var arrayValues = field.map(function (value) { | ||
return resolveUrlParamsValue(value, propsPrefix); | ||
}); | ||
query[prefix] = types.arrayExpression(arrayValues); | ||
if (field.type === 'dynamic' || field.type === 'static') { | ||
query[prefix] = resolveUrlParamsValue(field); | ||
return; | ||
} | ||
if (field.type === 'dynamic' || field.type === 'static' || field.type === 'expr') { | ||
query[prefix] = resolveUrlParamsValue(field, propsPrefix); | ||
return; | ||
} | ||
Object.keys(field).forEach(function (key) { | ||
var value = field[key]; | ||
var newPrefix = prefix ? "".concat(prefix, "[").concat(key, "]") : key; | ||
if (typeof value === 'object') { | ||
resolveDynamicValuesFromUrlParams(value, query, newPrefix, propsPrefix); | ||
return; | ||
} | ||
query[newPrefix] = resolveUrlParamsValue(value, propsPrefix); | ||
}); | ||
}; | ||
var resolveUrlParamsValue = function (urlParams, propsPrefix) { | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
if (urlParams.type === 'static') { | ||
return types.stringLiteral("".concat(urlParams.content)); | ||
var resolveUrlParamsValue = function (urlParam) { | ||
if (urlParam.type === 'static') { | ||
return types.stringLiteral("".concat(urlParam.content)); | ||
} | ||
if (urlParams.type === 'expr') { | ||
return types.identifier(urlParams.content); | ||
} | ||
if (urlParams.content.referenceType !== 'prop') { | ||
if (urlParam.content.referenceType !== 'prop') { | ||
throw new Error('Only prop references are supported for url params'); | ||
} | ||
var paramPath = __spreadArray(__spreadArray([], (propsPrefix ? [propsPrefix] : []), true), (urlParams.content.path || []), true); | ||
var paramPath = ['params', urlParam.content.id]; | ||
var templateLiteralElements = paramPath | ||
.map(function (_, index) { | ||
if (index === paramPath.length - 1) { | ||
return null; | ||
} | ||
var isTail = index === paramPath.length - 2; | ||
var isTail = index === paramPath.length - 1; | ||
return types.templateElement({ | ||
@@ -564,9 +575,9 @@ cooked: '', | ||
}; | ||
var computeAuthorizationHeaderAST = function (resource) { | ||
var computeAuthorizationHeaderAST = function (headers) { | ||
var _a; | ||
var authToken = resolveResourceValue(resource.authToken); | ||
var authToken = resolveResourceValue(headers.authToken); | ||
if (!authToken) { | ||
return null; | ||
} | ||
var authTokenType = (_a = resource.authToken) === null || _a === void 0 ? void 0 : _a.type; | ||
var authTokenType = (_a = headers.authToken) === null || _a === void 0 ? void 0 : _a.type; | ||
return types.objectProperty(types.identifier('Authorization'), types.templateLiteral(__spreadArray([ | ||
@@ -584,10 +595,11 @@ types.templateElement({ | ||
}, true), | ||
]), true), __spreadArray([], (authTokenType === 'static' ? [] : [types.identifier(authToken)]), true)), false, false); | ||
]), true), __spreadArray([], (authTokenType === 'static' ? [] : [types.identifier(String(authToken))]), true)), false, false); | ||
}; | ||
var computeFetchUrl = function (resource) { | ||
var _a, _b; | ||
var fetchBaseUrl = resolveResourceValue(resource.baseUrl); | ||
var resourceRoute = resolveResourceValue(resource.route); | ||
var baseUrlType = (_a = resource.baseUrl) === null || _a === void 0 ? void 0 : _a.type; | ||
var routeType = (_b = resource.route) === null || _b === void 0 ? void 0 : _b.type; | ||
var path = resource.path; | ||
var fetchBaseUrl = resolveResourceValue(path.baseUrl); | ||
var resourceRoute = resolveResourceValue(path.route); | ||
var baseUrlType = (_a = path.baseUrl) === null || _a === void 0 ? void 0 : _a.type; | ||
var routeType = (_b = path.route) === null || _b === void 0 ? void 0 : _b.type; | ||
if (baseUrlType === 'static' && routeType === 'static') { | ||
@@ -609,3 +621,3 @@ var stringsToJoin = [fetchBaseUrl, resourceRoute].filter(function (item) { return item; }).join('/'); | ||
}, true), | ||
], [types.identifier(fetchBaseUrl)]); | ||
], [types.identifier(String(fetchBaseUrl))]); | ||
} | ||
@@ -629,4 +641,4 @@ return types.templateLiteral(__spreadArray([ | ||
]), true), __spreadArray([ | ||
types.identifier(fetchBaseUrl) | ||
], (routeType === 'static' ? [] : [types.identifier(resourceRoute)]), true)); | ||
types.identifier(String(fetchBaseUrl)) | ||
], (routeType === 'static' ? [] : [types.identifier(String(resourceRoute))]), true)); | ||
}; | ||
@@ -638,6 +650,20 @@ var resolveResourceValue = function (value) { | ||
if (value.type === 'static') { | ||
return value.value; | ||
return value.content; | ||
} | ||
return "process.env.".concat(value.value) || value.fallback; | ||
return "process.env.".concat(value.content); | ||
}; | ||
var resolveObjectValue = function (prop) { | ||
if (prop.type === 'expr') { | ||
return types.identifier(prop.content); | ||
} | ||
var value = typeof prop.content === 'string' | ||
? types.stringLiteral(prop.content) | ||
: typeof prop.content === 'boolean' | ||
? types.booleanLiteral(prop.content) | ||
: typeof prop.content === 'number' | ||
? types.numericLiteral(prop.content) | ||
: types.identifier(String(prop.content)); | ||
return value; | ||
}; | ||
exports.resolveObjectValue = resolveObjectValue; | ||
//# sourceMappingURL=ast-utils.js.map |
@@ -177,31 +177,51 @@ var __assign = (this && this.__assign) || function () { | ||
var _a = node.content.nodes, success = _a.success, empty = _a.empty, error = _a.error, loading = _a.loading; | ||
var statePersistanceName = node.content.statePersistanceName; | ||
var _b = node.content, loopItemsReference = _b.loopItemsReference, statePersistanceName = _b.statePersistanceName; | ||
var type = loopItemsReference.type; | ||
var errorNodeAST = null; | ||
var emptyNodeAST = null; | ||
var loadingNodeAST = null; | ||
var listNodeAST = null; | ||
var source = getRepeatSourceIdentifier(node.content.loopItemsReference, options); | ||
/* | ||
* TODO: @JK move this too into validator | ||
* CMS list node can only be a dynamic !! | ||
*/ | ||
if (type !== 'dynamic') { | ||
throw new Error("Node ".concat(node, " is dynamic, but the referece link is missing. \n\n Missing loopItemsReference")); | ||
} | ||
var loadingStatePersistanceName = StringUtils.createStateOrPropStoringValue("".concat(statePersistanceName, "Loading")); | ||
var errorStatePersistanceName = StringUtils.createStateOrPropStoringValue("".concat(statePersistanceName, "Error")); | ||
var listNodeAST = !!success | ||
? generateNode(success, params, options)[0] | ||
: null; | ||
var source = getRepeatSourceIdentifier(node.content.loopItemsReference, options); | ||
var emptyNodeAST = !!empty | ||
? generateNode(empty, params, options)[0] | ||
: null; | ||
if (empty) { | ||
emptyNodeAST = generateNode(empty, params, options)[0]; | ||
} | ||
if (error) { | ||
errorNodeAST = generateNode(error, params, options)[0]; | ||
params.stateDefinitions["".concat(statePersistanceName, "Error")] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
}; | ||
} | ||
if (loading) { | ||
loadingNodeAST = generateNode(loading, params, options)[0]; | ||
params.stateDefinitions["".concat(statePersistanceName, "Loading")] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
}; | ||
} | ||
if (success) { | ||
listNodeAST = generateNode(success, params, options)[0]; | ||
} | ||
var emptyNodeExpressionAST = empty | ||
? types.logicalExpression('&&', types.unaryExpression('!', types.memberExpression(source, types.identifier('length'))), emptyNodeAST) | ||
: null; | ||
var errorNodeAST = !!error | ||
? generateNode(error, params, options)[0] | ||
: null; | ||
var errorNodeExpressionAST = error && errorStatePersistanceName | ||
? types.logicalExpression('&&', types.identifier(errorStatePersistanceName), errorNodeAST) | ||
: null; | ||
var loadingNodeAST = !!loading | ||
? generateNode(loading, params, options)[0] | ||
: null; | ||
var loadingNodeExpressionAST = loading && loadingStatePersistanceName | ||
? types.logicalExpression('&&', types.identifier(loadingStatePersistanceName), loadingNodeAST) | ||
: null; | ||
var _b = UIDLUtils.getRepeatIteratorNameAndKey({ | ||
var _c = UIDLUtils.getRepeatIteratorNameAndKey({ | ||
useIndex: true, | ||
iteratorName: 'item', | ||
}), iteratorName = _b.iteratorName, iteratorKey = _b.iteratorKey; | ||
}), iteratorName = _c.iteratorName, iteratorKey = _c.iteratorKey; | ||
var localIteratorPrefix = options.dynamicReferencePrefixMap.local; | ||
@@ -208,0 +228,0 @@ addDynamicAttributeToJSXTag(listNodeAST, 'key', iteratorKey, localIteratorPrefix); |
import * as types from '@babel/types'; | ||
import ParsedASTNode from './parsed-ast'; | ||
import { UIDLStateDefinition, UIDLPropDefinition, UIDLRawValue, Resource, UIDLDynamicReference } from '@teleporthq/teleport-types'; | ||
import { UIDLStateDefinition, UIDLPropDefinition, UIDLRawValue, UIDLStaticValue, UIDLDynamicReference, UIDLResourceItem, UIDLPropValue, UIDLExpressionValue } from '@teleporthq/teleport-types'; | ||
import { JSXGenerationOptions, JSXGenerationParams } from '../node-handlers/node-to-jsx/types'; | ||
@@ -58,6 +58,7 @@ /** | ||
export declare const wrapObjectPropertiesWithExpression: (properties: types.ObjectProperty[]) => types.ObjectExpression; | ||
export declare const generateRemoteResourceASTs: (resource: Resource, propsPrefix?: string, extraUrlParamsGenerator?: () => types.ObjectProperty[]) => types.VariableDeclaration[]; | ||
export declare const generateRemoteResourceASTs: (resource: UIDLResourceItem) => types.VariableDeclaration[]; | ||
export declare const generateMemberExpressionASTFromBase: (base: types.MemberExpression | types.Identifier, path: string[]) => types.MemberExpression; | ||
export declare const generateMemberExpressionASTFromPath: (path: string[]) => types.MemberExpression | types.Identifier; | ||
export declare const generateMemberExpressionASTFromPath: (path: Array<string | number>) => types.MemberExpression | types.Identifier; | ||
export declare const resolveObjectValue: (prop: UIDLStaticValue | UIDLPropValue | UIDLExpressionValue) => types.BooleanLiteral | types.Identifier | types.NumericLiteral | types.StringLiteral; | ||
export {}; | ||
//# sourceMappingURL=ast-utils.d.ts.map |
@@ -15,2 +15,3 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | ||
import { createDynamicValueExpression } from '../node-handlers/node-to-jsx/utils'; | ||
import { ASTUtils } from '..'; | ||
/** | ||
@@ -76,2 +77,6 @@ * Adds a class definition string to an existing string of classes | ||
if (t === void 0) { t = types; } | ||
// TODO: Fix !! | ||
if (!value) { | ||
return; | ||
} | ||
var content = prefix === '' | ||
@@ -388,10 +393,15 @@ ? t.identifier(value) | ||
}; | ||
export var generateRemoteResourceASTs = function (resource, propsPrefix, extraUrlParamsGenerator) { | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
/* | ||
* TODO: Add the ability to support body and payload. | ||
* UIDLResourceItem['body'] | ||
* All the dynamic props are sent using the function props | ||
*/ | ||
export var generateRemoteResourceASTs = function (resource) { | ||
var fetchUrl = computeFetchUrl(resource); | ||
var authHeaderAST = computeAuthorizationHeaderAST(resource); | ||
var queryParams = generateURLParamsAST(resource.urlParams, propsPrefix, extraUrlParamsGenerator); | ||
var authHeaderAST = computeAuthorizationHeaderAST(resource === null || resource === void 0 ? void 0 : resource.headers); | ||
var headersASTs = generateRESTHeadersAST(resource === null || resource === void 0 ? void 0 : resource.headers); | ||
var queryParams = generateURLParamsAST(resource === null || resource === void 0 ? void 0 : resource.params); | ||
var fetchUrlQuasis = fetchUrl.quasis; | ||
var queryParamsQuasis = queryParams.quasis; | ||
if (queryParams.expressions.length > 0) { | ||
var queryParamsQuasis = (queryParams === null || queryParams === void 0 ? void 0 : queryParams.quasis) || [types.templateElement({ raw: '', cooked: '' })]; | ||
if ((queryParams === null || queryParams === void 0 ? void 0 : queryParams.expressions.length) > 0) { | ||
fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw = | ||
@@ -403,3 +413,18 @@ fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw + '?'; | ||
} | ||
var url = queryParams | ||
var paramsDeclerations = Object.keys((resource === null || resource === void 0 ? void 0 : resource.params) || {}).reduce(function (acc, item) { | ||
var prop = resource.params[item]; | ||
if (prop.type === 'static') { | ||
acc.push(types.objectProperty(types.stringLiteral(item), ASTUtils.resolveObjectValue(prop))); | ||
} | ||
if (prop.type === 'dynamic') { | ||
acc.push(types.spreadElement(types.logicalExpression('&&', types.memberExpression(types.identifier('params'), types.stringLiteral(prop.content.id), true, false), types.objectExpression([ | ||
types.objectProperty(types.stringLiteral(item), types.memberExpression(types.identifier('params'), types.stringLiteral(prop.content.id), true, false)), | ||
])))); | ||
} | ||
return acc; | ||
}, []); | ||
var paramsAST = types.variableDeclaration('const', [ | ||
types.variableDeclarator(types.identifier('urlParams'), types.objectExpression(paramsDeclerations)), | ||
]); | ||
var url = (queryParams === null || queryParams === void 0 ? void 0 : queryParams.quasis) | ||
? types.templateLiteral(__spreadArray(__spreadArray([], fetchUrlQuasis, true), queryParamsQuasis, true), __spreadArray([], fetchUrl.expressions.concat(queryParams.expressions), true)) | ||
@@ -411,6 +436,4 @@ : fetchUrl; | ||
types.objectExpression([ | ||
types.objectProperty(types.identifier('headers'), types.objectExpression([ | ||
types.objectProperty(types.identifier('"Content-Type"'), types.stringLiteral('application/json'), false, false), | ||
authHeaderAST, | ||
])), | ||
types.objectProperty(types.identifier('method'), types.stringLiteral(resource.method)), | ||
types.objectProperty(types.identifier('headers'), types.objectExpression(__spreadArray(__spreadArray([], headersASTs, true), [authHeaderAST], false))), | ||
]), | ||
@@ -422,4 +445,11 @@ ]))), | ||
]); | ||
return [fetchAST, responseJSONAST]; | ||
return [paramsAST, fetchAST, responseJSONAST]; | ||
}; | ||
var generateRESTHeadersAST = function (headers) { | ||
return Object.keys(headers) | ||
.filter(function (header) { return header !== 'authToken'; }) | ||
.map(function (header) { | ||
return types.objectProperty(types.stringLiteral(header), types.stringLiteral(String(headers[header].content))); | ||
}); | ||
}; | ||
export var generateMemberExpressionASTFromBase = function (base, path) { | ||
@@ -436,62 +466,43 @@ if (path.length === 1) { | ||
if (path.length === 1) { | ||
return types.identifier(path[0]); | ||
return types.identifier(path[0].toString()); | ||
} | ||
pathClone.pop(); | ||
return types.memberExpression(generateMemberExpressionASTFromPath(pathClone), types.identifier(path[path.length - 1]), false); | ||
var currentPath = path[path.length - 1]; | ||
if (typeof currentPath === 'number') { | ||
return types.memberExpression(generateMemberExpressionASTFromPath(pathClone), types.numericLiteral(currentPath), true); | ||
} | ||
var containsSpecial = currentPath.indexOf('.') !== -1 || currentPath.indexOf('-') !== -1; | ||
return types.memberExpression(generateMemberExpressionASTFromPath(pathClone), containsSpecial ? types.stringLiteral(currentPath) : types.identifier(currentPath), containsSpecial); | ||
}; | ||
var generateURLParamsAST = function (urlParams, propsPrefix, extraUrlParamsGenerator) { | ||
var generateURLParamsAST = function (urlParams) { | ||
if (!urlParams) { | ||
return null; | ||
} | ||
var queryString = {}; | ||
Object.keys(urlParams).forEach(function (key) { | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key, propsPrefix); | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key); | ||
}); | ||
var urlObject = types.objectExpression(__spreadArray(__spreadArray([], Object.keys(queryString).map(function (key) { | ||
return types.objectProperty(types.stringLiteral("".concat(key)), queryString[key]); | ||
}), true), (extraUrlParamsGenerator ? extraUrlParamsGenerator() : []), true)); | ||
return types.templateLiteral([ | ||
types.templateElement({ raw: '', cooked: '' }, false), | ||
types.templateElement({ raw: '', cooked: '' }, true), | ||
], [types.newExpression(types.identifier('URLSearchParams'), [urlObject])]); | ||
], [types.newExpression(types.identifier('URLSearchParams'), [types.identifier('urlParams')])]); | ||
}; | ||
var resolveDynamicValuesFromUrlParams = function (field, query, prefix, propsPrefix) { | ||
var resolveDynamicValuesFromUrlParams = function (field, query, prefix) { | ||
if (prefix === void 0) { prefix = null; } | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
if (Array.isArray(field)) { | ||
var arrayValues = field.map(function (value) { | ||
return resolveUrlParamsValue(value, propsPrefix); | ||
}); | ||
query[prefix] = types.arrayExpression(arrayValues); | ||
if (field.type === 'dynamic' || field.type === 'static') { | ||
query[prefix] = resolveUrlParamsValue(field); | ||
return; | ||
} | ||
if (field.type === 'dynamic' || field.type === 'static' || field.type === 'expr') { | ||
query[prefix] = resolveUrlParamsValue(field, propsPrefix); | ||
return; | ||
} | ||
Object.keys(field).forEach(function (key) { | ||
var value = field[key]; | ||
var newPrefix = prefix ? "".concat(prefix, "[").concat(key, "]") : key; | ||
if (typeof value === 'object') { | ||
resolveDynamicValuesFromUrlParams(value, query, newPrefix, propsPrefix); | ||
return; | ||
} | ||
query[newPrefix] = resolveUrlParamsValue(value, propsPrefix); | ||
}); | ||
}; | ||
var resolveUrlParamsValue = function (urlParams, propsPrefix) { | ||
if (propsPrefix === void 0) { propsPrefix = ''; } | ||
if (urlParams.type === 'static') { | ||
return types.stringLiteral("".concat(urlParams.content)); | ||
var resolveUrlParamsValue = function (urlParam) { | ||
if (urlParam.type === 'static') { | ||
return types.stringLiteral("".concat(urlParam.content)); | ||
} | ||
if (urlParams.type === 'expr') { | ||
return types.identifier(urlParams.content); | ||
} | ||
if (urlParams.content.referenceType !== 'prop') { | ||
if (urlParam.content.referenceType !== 'prop') { | ||
throw new Error('Only prop references are supported for url params'); | ||
} | ||
var paramPath = __spreadArray(__spreadArray([], (propsPrefix ? [propsPrefix] : []), true), (urlParams.content.path || []), true); | ||
var paramPath = ['params', urlParam.content.id]; | ||
var templateLiteralElements = paramPath | ||
.map(function (_, index) { | ||
if (index === paramPath.length - 1) { | ||
return null; | ||
} | ||
var isTail = index === paramPath.length - 2; | ||
var isTail = index === paramPath.length - 1; | ||
return types.templateElement({ | ||
@@ -507,9 +518,9 @@ cooked: '', | ||
}; | ||
var computeAuthorizationHeaderAST = function (resource) { | ||
var computeAuthorizationHeaderAST = function (headers) { | ||
var _a; | ||
var authToken = resolveResourceValue(resource.authToken); | ||
var authToken = resolveResourceValue(headers.authToken); | ||
if (!authToken) { | ||
return null; | ||
} | ||
var authTokenType = (_a = resource.authToken) === null || _a === void 0 ? void 0 : _a.type; | ||
var authTokenType = (_a = headers.authToken) === null || _a === void 0 ? void 0 : _a.type; | ||
return types.objectProperty(types.identifier('Authorization'), types.templateLiteral(__spreadArray([ | ||
@@ -527,10 +538,11 @@ types.templateElement({ | ||
}, true), | ||
]), true), __spreadArray([], (authTokenType === 'static' ? [] : [types.identifier(authToken)]), true)), false, false); | ||
]), true), __spreadArray([], (authTokenType === 'static' ? [] : [types.identifier(String(authToken))]), true)), false, false); | ||
}; | ||
var computeFetchUrl = function (resource) { | ||
var _a, _b; | ||
var fetchBaseUrl = resolveResourceValue(resource.baseUrl); | ||
var resourceRoute = resolveResourceValue(resource.route); | ||
var baseUrlType = (_a = resource.baseUrl) === null || _a === void 0 ? void 0 : _a.type; | ||
var routeType = (_b = resource.route) === null || _b === void 0 ? void 0 : _b.type; | ||
var path = resource.path; | ||
var fetchBaseUrl = resolveResourceValue(path.baseUrl); | ||
var resourceRoute = resolveResourceValue(path.route); | ||
var baseUrlType = (_a = path.baseUrl) === null || _a === void 0 ? void 0 : _a.type; | ||
var routeType = (_b = path.route) === null || _b === void 0 ? void 0 : _b.type; | ||
if (baseUrlType === 'static' && routeType === 'static') { | ||
@@ -552,3 +564,3 @@ var stringsToJoin = [fetchBaseUrl, resourceRoute].filter(function (item) { return item; }).join('/'); | ||
}, true), | ||
], [types.identifier(fetchBaseUrl)]); | ||
], [types.identifier(String(fetchBaseUrl))]); | ||
} | ||
@@ -572,4 +584,4 @@ return types.templateLiteral(__spreadArray([ | ||
]), true), __spreadArray([ | ||
types.identifier(fetchBaseUrl) | ||
], (routeType === 'static' ? [] : [types.identifier(resourceRoute)]), true)); | ||
types.identifier(String(fetchBaseUrl)) | ||
], (routeType === 'static' ? [] : [types.identifier(String(resourceRoute))]), true)); | ||
}; | ||
@@ -581,6 +593,19 @@ var resolveResourceValue = function (value) { | ||
if (value.type === 'static') { | ||
return value.value; | ||
return value.content; | ||
} | ||
return "process.env.".concat(value.value) || value.fallback; | ||
return "process.env.".concat(value.content); | ||
}; | ||
export var resolveObjectValue = function (prop) { | ||
if (prop.type === 'expr') { | ||
return types.identifier(prop.content); | ||
} | ||
var value = typeof prop.content === 'string' | ||
? types.stringLiteral(prop.content) | ||
: typeof prop.content === 'boolean' | ||
? types.booleanLiteral(prop.content) | ||
: typeof prop.content === 'number' | ||
? types.numericLiteral(prop.content) | ||
: types.identifier(String(prop.content)); | ||
return value; | ||
}; | ||
//# sourceMappingURL=ast-utils.js.map |
{ | ||
"name": "@teleporthq/teleport-plugin-common", | ||
"version": "0.27.3-alpha.5", | ||
"version": "0.27.3-alpha.6", | ||
"description": "Common building and modelating functions for ASTs and HASTs", | ||
@@ -28,8 +28,8 @@ "author": "teleportHQ", | ||
"@babel/types": "^7.5.5", | ||
"@teleporthq/teleport-shared": "^0.27.3-alpha.5", | ||
"@teleporthq/teleport-types": "^0.27.3-alpha.2", | ||
"@teleporthq/teleport-shared": "^0.27.3-alpha.6", | ||
"@teleporthq/teleport-types": "^0.27.3-alpha.4", | ||
"jss": "^10.0.0", | ||
"jss-preset-default": "^10.0.0" | ||
}, | ||
"gitHead": "c7a1ae9cf5878d2390df5dbeb2db5349d16744c3" | ||
"gitHead": "1eaf52c9af73559b516d0d8f42919836f5f4f4d8" | ||
} |
@@ -261,3 +261,20 @@ import * as types from '@babel/types' | ||
const { success, empty, error, loading } = node.content.nodes | ||
const { statePersistanceName } = node.content | ||
const { loopItemsReference, statePersistanceName } = node.content | ||
const { type } = loopItemsReference | ||
let errorNodeAST: types.JSXElement | null = null | ||
let emptyNodeAST: types.JSXElement | null = null | ||
let loadingNodeAST: types.JSXElement | null = null | ||
let listNodeAST: types.JSXElement | null = null | ||
const source = getRepeatSourceIdentifier(node.content.loopItemsReference, options) | ||
/* | ||
* TODO: @JK move this too into validator | ||
* CMS list node can only be a dynamic !! | ||
*/ | ||
if (type !== 'dynamic') { | ||
throw new Error(`Node ${node} is dynamic, but the referece link is missing. \n | ||
Missing loopItemsReference`) | ||
} | ||
const loadingStatePersistanceName = StringUtils.createStateOrPropStoringValue( | ||
@@ -270,10 +287,26 @@ `${statePersistanceName}Loading` | ||
const listNodeAST = !!success | ||
? (generateNode(success, params, options) as types.JSXElement[])[0] | ||
: null | ||
const source = getRepeatSourceIdentifier(node.content.loopItemsReference, options) | ||
if (empty) { | ||
emptyNodeAST = generateNode(empty, params, options)[0] as types.JSXElement | ||
} | ||
const emptyNodeAST = !!empty | ||
? (generateNode(empty, params, options)[0] as types.JSXElement) | ||
: null | ||
if (error) { | ||
errorNodeAST = generateNode(error, params, options)[0] as types.JSXElement | ||
params.stateDefinitions[`${statePersistanceName}Error`] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
} | ||
} | ||
if (loading) { | ||
loadingNodeAST = generateNode(loading, params, options)[0] as types.JSXElement | ||
params.stateDefinitions[`${statePersistanceName}Loading`] = { | ||
type: 'boolean', | ||
defaultValue: false, | ||
} | ||
} | ||
if (success) { | ||
listNodeAST = (generateNode(success, params, options) as types.JSXElement[])[0] | ||
} | ||
const emptyNodeExpressionAST = empty | ||
@@ -287,5 +320,2 @@ ? types.logicalExpression( | ||
const errorNodeAST = !!error | ||
? (generateNode(error, params, options)[0] as types.JSXElement) | ||
: null | ||
const errorNodeExpressionAST = | ||
@@ -296,5 +326,2 @@ error && errorStatePersistanceName | ||
const loadingNodeAST = !!loading | ||
? (generateNode(loading, params, options)[0] as types.JSXElement) | ||
: null | ||
const loadingNodeExpressionAST = | ||
@@ -301,0 +328,0 @@ loading && loadingStatePersistanceName |
@@ -9,8 +9,7 @@ import * as types from '@babel/types' | ||
UIDLRawValue, | ||
Resource, | ||
ResourceValue, | ||
ResourceUrlParams, | ||
UIDLStaticValue, | ||
UIDLDynamicReference, | ||
ResourceUrlValues, | ||
UIDLResourceItem, | ||
UIDLENVValue, | ||
UIDLPropValue, | ||
UIDLExpressionValue, | ||
@@ -20,2 +19,4 @@ } from '@teleporthq/teleport-types' | ||
import { createDynamicValueExpression } from '../node-handlers/node-to-jsx/utils' | ||
import { ASTUtils } from '..' | ||
/** | ||
@@ -108,2 +109,7 @@ * Adds a class definition string to an existing string of classes | ||
) => { | ||
// TODO: Fix !! | ||
if (!value) { | ||
return | ||
} | ||
const content = | ||
@@ -600,20 +606,17 @@ prefix === '' | ||
export const generateRemoteResourceASTs = ( | ||
resource: Resource, | ||
propsPrefix: string = '', | ||
extraUrlParamsGenerator?: () => types.ObjectProperty[] | ||
) => { | ||
/* | ||
* TODO: Add the ability to support body and payload. | ||
* UIDLResourceItem['body'] | ||
* All the dynamic props are sent using the function props | ||
*/ | ||
export const generateRemoteResourceASTs = (resource: UIDLResourceItem) => { | ||
const fetchUrl = computeFetchUrl(resource) | ||
const authHeaderAST = computeAuthorizationHeaderAST(resource) | ||
const authHeaderAST = computeAuthorizationHeaderAST(resource?.headers) | ||
const headersASTs = generateRESTHeadersAST(resource?.headers) | ||
const queryParams = generateURLParamsAST( | ||
resource.urlParams as ResourceUrlParams, | ||
propsPrefix, | ||
extraUrlParamsGenerator | ||
) | ||
const queryParams = generateURLParamsAST(resource?.params) | ||
const fetchUrlQuasis = fetchUrl.quasis | ||
const queryParamsQuasis = queryParams.quasis | ||
const queryParamsQuasis = queryParams?.quasis || [types.templateElement({ raw: '', cooked: '' })] | ||
if (queryParams.expressions.length > 0) { | ||
if (queryParams?.expressions.length > 0) { | ||
fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw = | ||
@@ -628,3 +631,48 @@ fetchUrlQuasis[fetchUrlQuasis.length - 1].value.raw + '?' | ||
const url = queryParams | ||
const paramsDeclerations: Array<types.ObjectProperty | types.SpreadElement> = Object.keys( | ||
resource?.params || {} | ||
).reduce((acc: Array<types.ObjectProperty | types.SpreadElement>, item) => { | ||
const prop = resource.params[item] | ||
if (prop.type === 'static') { | ||
acc.push(types.objectProperty(types.stringLiteral(item), ASTUtils.resolveObjectValue(prop))) | ||
} | ||
if (prop.type === 'dynamic') { | ||
acc.push( | ||
types.spreadElement( | ||
types.logicalExpression( | ||
'&&', | ||
types.memberExpression( | ||
types.identifier('params'), | ||
types.stringLiteral(prop.content.id), | ||
true, | ||
false | ||
), | ||
types.objectExpression([ | ||
types.objectProperty( | ||
types.stringLiteral(item), | ||
types.memberExpression( | ||
types.identifier('params'), | ||
types.stringLiteral(prop.content.id), | ||
true, | ||
false | ||
) | ||
), | ||
]) | ||
) | ||
) | ||
) | ||
} | ||
return acc | ||
}, []) | ||
const paramsAST = types.variableDeclaration('const', [ | ||
types.variableDeclarator( | ||
types.identifier('urlParams'), | ||
types.objectExpression(paramsDeclerations) | ||
), | ||
]) | ||
const url = queryParams?.quasis | ||
? types.templateLiteral( | ||
@@ -643,13 +691,6 @@ [...fetchUrlQuasis, ...queryParamsQuasis], | ||
types.objectExpression([ | ||
types.objectProperty(types.identifier('method'), types.stringLiteral(resource.method)), | ||
types.objectProperty( | ||
types.identifier('headers'), | ||
types.objectExpression([ | ||
types.objectProperty( | ||
types.identifier('"Content-Type"'), | ||
types.stringLiteral('application/json'), | ||
false, | ||
false | ||
), | ||
authHeaderAST, | ||
]) | ||
types.objectExpression([...headersASTs, authHeaderAST]) | ||
), | ||
@@ -674,5 +715,16 @@ ]), | ||
return [fetchAST, responseJSONAST] | ||
return [paramsAST, fetchAST, responseJSONAST] | ||
} | ||
const generateRESTHeadersAST = (headers: UIDLResourceItem['headers']): types.ObjectProperty[] => { | ||
return Object.keys(headers) | ||
.filter((header) => header !== 'authToken') | ||
.map((header) => { | ||
return types.objectProperty( | ||
types.stringLiteral(header), | ||
types.stringLiteral(String(headers[header].content)) | ||
) | ||
}) | ||
} | ||
export const generateMemberExpressionASTFromBase = ( | ||
@@ -697,7 +749,7 @@ base: types.MemberExpression | types.Identifier, | ||
export const generateMemberExpressionASTFromPath = ( | ||
path: string[] | ||
path: Array<string | number> | ||
): types.MemberExpression | types.Identifier => { | ||
const pathClone = [...path] | ||
if (path.length === 1) { | ||
return types.identifier(path[0]) | ||
return types.identifier(path[0].toString()) | ||
} | ||
@@ -707,6 +759,17 @@ | ||
const currentPath = path[path.length - 1] | ||
if (typeof currentPath === 'number') { | ||
return types.memberExpression( | ||
generateMemberExpressionASTFromPath(pathClone), | ||
types.numericLiteral(currentPath), | ||
true | ||
) | ||
} | ||
const containsSpecial = currentPath.indexOf('.') !== -1 || currentPath.indexOf('-') !== -1 | ||
return types.memberExpression( | ||
generateMemberExpressionASTFromPath(pathClone), | ||
types.identifier(path[path.length - 1]), | ||
false | ||
containsSpecial ? types.stringLiteral(currentPath) : types.identifier(currentPath), | ||
containsSpecial | ||
) | ||
@@ -716,18 +779,13 @@ } | ||
const generateURLParamsAST = ( | ||
urlParams: ResourceUrlParams, | ||
propsPrefix?: string, | ||
extraUrlParamsGenerator?: () => types.ObjectProperty[] | ||
) => { | ||
urlParams: Record<string, UIDLStaticValue | UIDLPropValue> | ||
): types.TemplateLiteral | null => { | ||
if (!urlParams) { | ||
return null | ||
} | ||
const queryString: Record<string, types.Expression> = {} | ||
Object.keys(urlParams).forEach((key) => { | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key, propsPrefix) | ||
resolveDynamicValuesFromUrlParams(urlParams[key], queryString, key) | ||
}) | ||
const urlObject = types.objectExpression([ | ||
...Object.keys(queryString).map((key) => { | ||
return types.objectProperty(types.stringLiteral(`${key}`), queryString[key]) | ||
}), | ||
...(extraUrlParamsGenerator ? extraUrlParamsGenerator() : []), | ||
]) | ||
return types.templateLiteral( | ||
@@ -738,3 +796,3 @@ [ | ||
], | ||
[types.newExpression(types.identifier('URLSearchParams'), [urlObject])] | ||
[types.newExpression(types.identifier('URLSearchParams'), [types.identifier('urlParams')])] | ||
) | ||
@@ -744,57 +802,25 @@ } | ||
const resolveDynamicValuesFromUrlParams = ( | ||
field: ResourceUrlValues, | ||
field: UIDLStaticValue | UIDLPropValue, | ||
query: Record<string, types.Expression>, | ||
prefix: string = null, | ||
propsPrefix: string = '' | ||
prefix: string = null | ||
) => { | ||
if (Array.isArray(field)) { | ||
const arrayValues = field.map((value) => { | ||
return resolveUrlParamsValue(value, propsPrefix) | ||
}) | ||
query[prefix] = types.arrayExpression(arrayValues) | ||
if (field.type === 'dynamic' || field.type === 'static') { | ||
query[prefix] = resolveUrlParamsValue(field) | ||
return | ||
} | ||
if (field.type === 'dynamic' || field.type === 'static' || field.type === 'expr') { | ||
query[prefix] = resolveUrlParamsValue(field, propsPrefix) | ||
return | ||
} | ||
Object.keys(field).forEach((key) => { | ||
const value = field[key] | ||
const newPrefix = prefix ? `${prefix}[${key}]` : key | ||
if (typeof value === 'object') { | ||
resolveDynamicValuesFromUrlParams(value, query, newPrefix, propsPrefix) | ||
return | ||
} | ||
query[newPrefix] = resolveUrlParamsValue(value, propsPrefix) | ||
}) | ||
} | ||
const resolveUrlParamsValue = ( | ||
urlParams: UIDLStaticValue | UIDLDynamicReference | UIDLExpressionValue, | ||
propsPrefix: string = '' | ||
) => { | ||
if (urlParams.type === 'static') { | ||
return types.stringLiteral(`${urlParams.content}`) | ||
const resolveUrlParamsValue = (urlParam: UIDLStaticValue | UIDLPropValue) => { | ||
if (urlParam.type === 'static') { | ||
return types.stringLiteral(`${urlParam.content}`) | ||
} | ||
if (urlParams.type === 'expr') { | ||
return types.identifier(urlParams.content) | ||
} | ||
if (urlParams.content.referenceType !== 'prop') { | ||
if (urlParam.content.referenceType !== 'prop') { | ||
throw new Error('Only prop references are supported for url params') | ||
} | ||
const paramPath = [...(propsPrefix ? [propsPrefix] : []), ...(urlParams.content.path || [])] | ||
const paramPath = ['params', urlParam.content.id] | ||
const templateLiteralElements = paramPath | ||
.map((_, index) => { | ||
if (index === paramPath.length - 1) { | ||
return null | ||
} | ||
const isTail = index === paramPath.length - 2 | ||
const isTail = index === paramPath.length - 1 | ||
return types.templateElement( | ||
@@ -815,4 +841,4 @@ { | ||
const computeAuthorizationHeaderAST = (resource: Resource) => { | ||
const authToken = resolveResourceValue(resource.authToken) | ||
const computeAuthorizationHeaderAST = (headers: UIDLResourceItem['headers']) => { | ||
const authToken = resolveResourceValue(headers.authToken) | ||
if (!authToken) { | ||
@@ -822,3 +848,3 @@ return null | ||
const authTokenType = resource.authToken?.type | ||
const authTokenType = headers.authToken?.type | ||
@@ -848,3 +874,3 @@ return types.objectProperty( | ||
], | ||
[...(authTokenType === 'static' ? [] : [types.identifier(authToken)])] | ||
[...(authTokenType === 'static' ? [] : [types.identifier(String(authToken))])] | ||
), | ||
@@ -856,8 +882,9 @@ false, | ||
const computeFetchUrl = (resource: Resource) => { | ||
const fetchBaseUrl = resolveResourceValue(resource.baseUrl) | ||
const resourceRoute = resolveResourceValue(resource.route) | ||
const computeFetchUrl = (resource: UIDLResourceItem) => { | ||
const { path } = resource | ||
const fetchBaseUrl = resolveResourceValue(path.baseUrl) | ||
const resourceRoute = resolveResourceValue(path.route) | ||
const baseUrlType = resource.baseUrl?.type | ||
const routeType = resource.route?.type | ||
const baseUrlType = path.baseUrl?.type | ||
const routeType = path.route?.type | ||
@@ -895,3 +922,3 @@ if (baseUrlType === 'static' && routeType === 'static') { | ||
], | ||
[types.identifier(fetchBaseUrl)] | ||
[types.identifier(String(fetchBaseUrl))] | ||
) | ||
@@ -929,4 +956,4 @@ } | ||
[ | ||
types.identifier(fetchBaseUrl), | ||
...(routeType === 'static' ? [] : [types.identifier(resourceRoute)]), | ||
types.identifier(String(fetchBaseUrl)), | ||
...(routeType === 'static' ? [] : [types.identifier(String(resourceRoute))]), | ||
] | ||
@@ -936,3 +963,3 @@ ) | ||
const resolveResourceValue = (value: ResourceValue) => { | ||
const resolveResourceValue = (value: UIDLStaticValue | UIDLENVValue) => { | ||
if (!value) { | ||
@@ -943,6 +970,23 @@ return '' | ||
if (value.type === 'static') { | ||
return value.value | ||
return value.content | ||
} | ||
return `process.env.${value.value}` || value.fallback | ||
return `process.env.${value.content}` | ||
} | ||
export const resolveObjectValue = (prop: UIDLStaticValue | UIDLPropValue | UIDLExpressionValue) => { | ||
if (prop.type === 'expr') { | ||
return types.identifier(prop.content) | ||
} | ||
const value = | ||
typeof prop.content === 'string' | ||
? types.stringLiteral(prop.content) | ||
: typeof prop.content === 'boolean' | ||
? types.booleanLiteral(prop.content) | ||
: typeof prop.content === 'number' | ||
? types.numericLiteral(prop.content) | ||
: types.identifier(String(prop.content)) | ||
return value | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
579973
1.97%7850
1.99%