@teleporthq/teleport-plugin-next-data-source 0.42.8 → 0.42.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/csv-header-detection.test.ts +212 -0
- package/__tests__/validation.test.ts +33 -2
- package/dist/cjs/data-source-fetchers.d.ts +2 -2
- package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
- package/dist/cjs/data-source-fetchers.js +30 -7
- package/dist/cjs/data-source-fetchers.js.map +1 -1
- package/dist/cjs/fetchers/airtable.d.ts.map +1 -1
- package/dist/cjs/fetchers/airtable.js +2 -2
- package/dist/cjs/fetchers/airtable.js.map +1 -1
- package/dist/cjs/fetchers/clickhouse.d.ts.map +1 -1
- package/dist/cjs/fetchers/clickhouse.js +1 -1
- package/dist/cjs/fetchers/clickhouse.js.map +1 -1
- package/dist/cjs/fetchers/csv-file.d.ts.map +1 -1
- package/dist/cjs/fetchers/csv-file.js +23 -3
- package/dist/cjs/fetchers/csv-file.js.map +1 -1
- package/dist/cjs/fetchers/firestore.d.ts.map +1 -1
- package/dist/cjs/fetchers/firestore.js +1 -1
- package/dist/cjs/fetchers/firestore.js.map +1 -1
- package/dist/cjs/fetchers/google-sheets.d.ts.map +1 -1
- package/dist/cjs/fetchers/google-sheets.js +6 -1
- package/dist/cjs/fetchers/google-sheets.js.map +1 -1
- package/dist/cjs/fetchers/javascript.d.ts.map +1 -1
- package/dist/cjs/fetchers/javascript.js +2 -1
- package/dist/cjs/fetchers/javascript.js.map +1 -1
- package/dist/cjs/fetchers/mariadb.d.ts.map +1 -1
- package/dist/cjs/fetchers/mariadb.js +3 -3
- package/dist/cjs/fetchers/mariadb.js.map +1 -1
- package/dist/cjs/fetchers/mongodb.d.ts +1 -1
- package/dist/cjs/fetchers/mongodb.d.ts.map +1 -1
- package/dist/cjs/fetchers/mongodb.js +11 -3
- package/dist/cjs/fetchers/mongodb.js.map +1 -1
- package/dist/cjs/fetchers/mysql.d.ts.map +1 -1
- package/dist/cjs/fetchers/mysql.js +2 -2
- package/dist/cjs/fetchers/mysql.js.map +1 -1
- package/dist/cjs/fetchers/postgresql.d.ts.map +1 -1
- package/dist/cjs/fetchers/postgresql.js +3 -3
- package/dist/cjs/fetchers/postgresql.js.map +1 -1
- package/dist/cjs/fetchers/redis.d.ts.map +1 -1
- package/dist/cjs/fetchers/redis.js +1 -1
- package/dist/cjs/fetchers/redis.js.map +1 -1
- package/dist/cjs/fetchers/redshift.d.ts.map +1 -1
- package/dist/cjs/fetchers/redshift.js +2 -2
- package/dist/cjs/fetchers/redshift.js.map +1 -1
- package/dist/cjs/fetchers/rest-api.d.ts.map +1 -1
- package/dist/cjs/fetchers/rest-api.js +3 -2
- package/dist/cjs/fetchers/rest-api.js.map +1 -1
- package/dist/cjs/fetchers/static-collection.d.ts.map +1 -1
- package/dist/cjs/fetchers/static-collection.js +2 -1
- package/dist/cjs/fetchers/static-collection.js.map +1 -1
- package/dist/cjs/fetchers/supabase.d.ts.map +1 -1
- package/dist/cjs/fetchers/supabase.js +2 -2
- package/dist/cjs/fetchers/supabase.js.map +1 -1
- package/dist/cjs/fetchers/turso.d.ts.map +1 -1
- package/dist/cjs/fetchers/turso.js +1 -1
- package/dist/cjs/fetchers/turso.js.map +1 -1
- package/dist/cjs/fetchers/utils/header-detection.d.ts +2 -0
- package/dist/cjs/fetchers/utils/header-detection.d.ts.map +1 -0
- package/dist/cjs/fetchers/utils/header-detection.js +8 -0
- package/dist/cjs/fetchers/utils/header-detection.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +168 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/pagination-plugin.d.ts.map +1 -1
- package/dist/cjs/pagination-plugin.js +320 -65
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +3 -0
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +218 -46
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/data-source-fetchers.d.ts +2 -2
- package/dist/esm/data-source-fetchers.d.ts.map +1 -1
- package/dist/esm/data-source-fetchers.js +29 -6
- package/dist/esm/data-source-fetchers.js.map +1 -1
- package/dist/esm/fetchers/airtable.d.ts.map +1 -1
- package/dist/esm/fetchers/airtable.js +3 -3
- package/dist/esm/fetchers/airtable.js.map +1 -1
- package/dist/esm/fetchers/clickhouse.d.ts.map +1 -1
- package/dist/esm/fetchers/clickhouse.js +2 -2
- package/dist/esm/fetchers/clickhouse.js.map +1 -1
- package/dist/esm/fetchers/csv-file.d.ts.map +1 -1
- package/dist/esm/fetchers/csv-file.js +23 -3
- package/dist/esm/fetchers/csv-file.js.map +1 -1
- package/dist/esm/fetchers/firestore.d.ts.map +1 -1
- package/dist/esm/fetchers/firestore.js +2 -2
- package/dist/esm/fetchers/firestore.js.map +1 -1
- package/dist/esm/fetchers/google-sheets.d.ts.map +1 -1
- package/dist/esm/fetchers/google-sheets.js +6 -1
- package/dist/esm/fetchers/google-sheets.js.map +1 -1
- package/dist/esm/fetchers/javascript.d.ts.map +1 -1
- package/dist/esm/fetchers/javascript.js +2 -1
- package/dist/esm/fetchers/javascript.js.map +1 -1
- package/dist/esm/fetchers/mariadb.d.ts.map +1 -1
- package/dist/esm/fetchers/mariadb.js +4 -4
- package/dist/esm/fetchers/mariadb.js.map +1 -1
- package/dist/esm/fetchers/mongodb.d.ts +1 -1
- package/dist/esm/fetchers/mongodb.d.ts.map +1 -1
- package/dist/esm/fetchers/mongodb.js +12 -4
- package/dist/esm/fetchers/mongodb.js.map +1 -1
- package/dist/esm/fetchers/mysql.d.ts.map +1 -1
- package/dist/esm/fetchers/mysql.js +3 -3
- package/dist/esm/fetchers/mysql.js.map +1 -1
- package/dist/esm/fetchers/postgresql.d.ts.map +1 -1
- package/dist/esm/fetchers/postgresql.js +4 -4
- package/dist/esm/fetchers/postgresql.js.map +1 -1
- package/dist/esm/fetchers/redis.d.ts.map +1 -1
- package/dist/esm/fetchers/redis.js +2 -2
- package/dist/esm/fetchers/redis.js.map +1 -1
- package/dist/esm/fetchers/redshift.d.ts.map +1 -1
- package/dist/esm/fetchers/redshift.js +3 -3
- package/dist/esm/fetchers/redshift.js.map +1 -1
- package/dist/esm/fetchers/rest-api.d.ts.map +1 -1
- package/dist/esm/fetchers/rest-api.js +3 -2
- package/dist/esm/fetchers/rest-api.js.map +1 -1
- package/dist/esm/fetchers/static-collection.d.ts.map +1 -1
- package/dist/esm/fetchers/static-collection.js +2 -1
- package/dist/esm/fetchers/static-collection.js.map +1 -1
- package/dist/esm/fetchers/supabase.d.ts.map +1 -1
- package/dist/esm/fetchers/supabase.js +3 -3
- package/dist/esm/fetchers/supabase.js.map +1 -1
- package/dist/esm/fetchers/turso.d.ts.map +1 -1
- package/dist/esm/fetchers/turso.js +2 -2
- package/dist/esm/fetchers/turso.js.map +1 -1
- package/dist/esm/fetchers/utils/header-detection.d.ts +2 -0
- package/dist/esm/fetchers/utils/header-detection.d.ts.map +1 -0
- package/dist/esm/fetchers/utils/header-detection.js +4 -0
- package/dist/esm/fetchers/utils/header-detection.js.map +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +169 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pagination-plugin.d.ts.map +1 -1
- package/dist/esm/pagination-plugin.js +320 -65
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +3 -0
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +214 -45
- package/dist/esm/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/data-source-fetchers.ts +29 -13
- package/src/fetchers/airtable.ts +81 -31
- package/src/fetchers/clickhouse.ts +88 -19
- package/src/fetchers/csv-file.ts +256 -27
- package/src/fetchers/firestore.ts +65 -13
- package/src/fetchers/google-sheets.ts +243 -26
- package/src/fetchers/javascript.ts +106 -23
- package/src/fetchers/mariadb.ts +85 -26
- package/src/fetchers/mongodb.ts +156 -37
- package/src/fetchers/mysql.ts +86 -26
- package/src/fetchers/postgresql.ts +89 -27
- package/src/fetchers/redis.ts +43 -5
- package/src/fetchers/redshift.ts +87 -18
- package/src/fetchers/rest-api.ts +105 -24
- package/src/fetchers/static-collection.ts +100 -18
- package/src/fetchers/supabase.ts +178 -54
- package/src/fetchers/turso.ts +87 -18
- package/src/fetchers/utils/header-detection.ts +200 -0
- package/src/index.ts +248 -2
- package/src/pagination-plugin.ts +708 -191
- package/src/utils.ts +374 -38
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateRESTAPIFetcher = exports.validateRESTAPIConfig = void 0;
|
|
4
|
+
var utils_1 = require("../utils");
|
|
4
5
|
var validateRESTAPIConfig = function (config) {
|
|
5
6
|
if (!config || typeof config !== 'object') {
|
|
6
7
|
return { isValid: false, error: 'Config must be a valid object' };
|
|
@@ -48,11 +49,11 @@ var generateAuthCode = function (authorization) {
|
|
|
48
49
|
var generateRESTAPIFetcher = function (config) {
|
|
49
50
|
var restConfig = config;
|
|
50
51
|
var authCode = generateAuthCode(restConfig.authorization || {});
|
|
51
|
-
return "import fetch from 'node-fetch'\n\nexport default async function handler(req, res) {\n try {\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, offset } = req.query\n \n const url = ".concat(JSON.stringify(restConfig.url), "\n const method = ").concat(JSON.stringify(restConfig.method || 'GET'), "\n \n const headers = ").concat(JSON.stringify(restConfig.headers || {}), "\n ").concat(authCode, "\n \n const options = {\n method,\n headers\n }\n \n ").concat(restConfig.method === 'POST' || restConfig.method === 'PUT' || restConfig.method === 'PATCH'
|
|
52
|
+
return "import fetch from 'node-fetch'\n\n".concat((0, utils_1.generateSafeJSONParseCode)(), "\n\n").concat((0, utils_1.generateDateFormatterCode)(), "\n\n").concat((0, utils_1.generateSortFilterHelperCode)(), "\n\nexport default async function handler(req, res) {\n try {\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n \n const url = ").concat(JSON.stringify(restConfig.url), "\n const method = ").concat(JSON.stringify(restConfig.method || 'GET'), "\n \n const headers = ").concat(JSON.stringify(restConfig.headers || {}), "\n ").concat(authCode, "\n \n const options = {\n method,\n headers\n }\n \n ").concat(restConfig.method === 'POST' || restConfig.method === 'PUT' || restConfig.method === 'PATCH'
|
|
52
53
|
? "\n if (req.body) {\n options.body = ".concat(restConfig.bodyType === 'json' || !restConfig.bodyType
|
|
53
54
|
? 'JSON.stringify(req.body)'
|
|
54
55
|
: 'req.body', "\n }\n ")
|
|
55
|
-
: '', "\n \n const response = await fetch(url, options)\n \n if (!response.ok) {\n return res.status(response.status).json({\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n timestamp: Date.now()\n })\n }\n \n let data = await response.json()\n \n
|
|
56
|
+
: '', "\n \n const response = await fetch(url, options)\n \n if (!response.ok) {\n return res.status(response.status).json({\n success: false,\n error: `HTTP ${response.status}: ${response.statusText}`,\n timestamp: Date.now()\n })\n }\n \n let data = await response.json()\n \n if (Array.isArray(data)) {\n if (query && query.trim()) {\n const searchQuery = query.toLowerCase()\n \n if (queryColumns) {\n try {\n const parsed = safeJSONParse(queryColumns)\n const columns = Array.isArray(parsed) ? parsed : [parsed]\n data = data.filter((item) => {\n return columns.some((col) => {\n const value = getNestedValue(item, col)\n if (value === null || value === undefined) return false\n return String(value).toLowerCase().includes(searchQuery)\n })\n })\n } catch (err) {\n console.error('Error parsing queryColumns:', err)\n }\n } else {\n data = data.filter((item) => {\n try {\n const stringified = JSON.stringify(item).toLowerCase()\n return stringified.includes(searchQuery)\n } catch {\n return false\n }\n })\n }\n }\n \n if (filters) {\n try {\n const parsedFilters = safeJSONParse(filters)\n \n if (Array.isArray(parsedFilters)) {\n data = data.filter((item) => {\n return parsedFilters.every((filter) => {\n if (!filter.source || filter.destination === undefined) return true\n \n const field = filter.source\n const value = getNestedValue(item, field)\n const target = filter.destination\n const operand = filter.operand || '='\n \n if (Array.isArray(target)) {\n if (operand === '!=') {\n return !target.includes(value)\n }\n return target.includes(value)\n }\n \n return compareValues(value, target, operand)\n })\n })\n } else {\n data = data.filter((item) => {\n return Object.entries(parsedFilters).every(([key, value]) => {\n const itemValue = getNestedValue(item, key)\n if (Array.isArray(value)) {\n return value.includes(itemValue)\n }\n return compareValues(itemValue, value, '=')\n })\n })\n }\n } catch (err) {\n console.error('Error parsing filters:', err)\n }\n }\n \n if (sorts) {\n try {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {\n data.sort((a, b) => {\n for (const sort of parsedSorts) {\n if (!sort.field) continue\n const aVal = getNestedValue(a, sort.field)\n const bVal = getNestedValue(b, sort.field)\n const sortOrderValue = sort.order?.toLowerCase() === 'desc' ? -1 : 1\n \n let comparison = 0\n if (aVal === null || aVal === undefined) {\n comparison = bVal === null || bVal === undefined ? 0 : -1\n } else if (bVal === null || bVal === undefined) {\n comparison = 1\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal\n } else if (aVal instanceof Date && bVal instanceof Date) {\n comparison = aVal.getTime() - bVal.getTime()\n } else {\n const aStr = String(aVal)\n const bStr = String(bVal)\n if (aStr < bStr) comparison = -1\n else if (aStr > bStr) comparison = 1\n }\n \n if (comparison !== 0) return comparison * sortOrderValue\n }\n return 0\n })\n }\n } catch (err) {\n console.error('Error parsing sorts:', err)\n }\n } else if (sortBy && sortBy.trim()) {\n data.sort((a, b) => {\n const aVal = getNestedValue(a, sortBy)\n const bVal = getNestedValue(b, sortBy)\n const sortOrderValue = sortOrder?.toLowerCase() === 'desc' ? -1 : 1\n \n let comparison = 0\n if (aVal === null || aVal === undefined) {\n comparison = bVal === null || bVal === undefined ? 0 : -1\n } else if (bVal === null || bVal === undefined) {\n comparison = 1\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal\n } else if (aVal instanceof Date && bVal instanceof Date) {\n comparison = aVal.getTime() - bVal.getTime()\n } else {\n const aStr = String(aVal)\n const bStr = String(bVal)\n if (aStr < bStr) comparison = -1\n else if (aStr > bStr) comparison = 1\n }\n \n return comparison * sortOrderValue\n })\n }\n \n const limitValue = limit || perPage\n const pageValue = page ? Math.max(1, parseInt(page)) : undefined\n const offsetValue = offset !== undefined ? Math.max(0, parseInt(offset)) : (pageValue && perPage ? (pageValue - 1) * Math.max(1, parseInt(perPage)) : 0)\n \n if (limitValue) {\n const limitInt = Math.max(1, parseInt(limitValue))\n data = data.slice(offsetValue, offsetValue + limitInt)\n } else if (offsetValue > 0) {\n data = data.slice(offsetValue)\n }\n }\n \n const safeData = JSON.parse(JSON.stringify(data, dateReplacer))\n \n return res.status(200).json({\n success: true,\n data: safeData,\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('REST API fetch error:', error)\n return res.status(500).json({\n success: false,\n error: error.message || 'Failed to fetch data',\n timestamp: Date.now()\n })\n }\n}\n");
|
|
56
57
|
};
|
|
57
58
|
exports.generateRESTAPIFetcher = generateRESTAPIFetcher;
|
|
58
59
|
//# sourceMappingURL=rest-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-api.js","sourceRoot":"","sources":["../../../src/fetchers/rest-api.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"rest-api.js","sourceRoot":"","sources":["../../../src/fetchers/rest-api.ts"],"names":[],"mappings":";;;AAAA,kCAIiB;AAEV,IAAM,qBAAqB,GAAG,UACnC,MAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAA;KAClE;IAED,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;KACpD;IAED,IAAI;QACF,IAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAA;SACxE;KACF;IAAC,WAAM;QACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAA;KACvD;IAED,IAAI,MAAM,CAAC,MAAM,EAAE;QACjB,IAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC9D,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE;YAC5F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;SACxD;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC,CAAA;AA5BY,QAAA,qBAAqB,yBA4BjC;AAaD,IAAM,gBAAgB,GAAG,UAAC,aAA4B;IACpD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,KAAK,MAAM,EAAE;QACnD,OAAO,EAAE,CAAA;KACV;IAEO,IAAA,IAAI,GAAkB,aAAa,KAA/B,EAAE,WAAW,GAAK,aAAa,YAAlB,CAAkB;IAE3C,QAAQ,IAAI,EAAE;QACZ,KAAK,SAAS;YACZ,OAAO,6CAAsC,WAAW,CAAC,MAAM,MAAG,CAAA;QACpE,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,6CAAsC,WAAW,CAAC,KAAK,MAAG,CAAA;QACnE,KAAK,YAAY;YACf,OAAO,6DAAsD,WAAW,CAAC,QAAQ,cAAI,WAAW,CAAC,QAAQ,0BAAuB,CAAA;QAClI,KAAK,QAAQ;YACX,OAAO,6CAAsC,WAAW,CAAC,YAAY,MAAG,CAAA;QAC1E;YACE,OAAO,EAAE,CAAA;KACZ;AACH,CAAC,CAAA;AAUM,IAAM,sBAAsB,GAAG,UAAC,MAA+B;IACpE,IAAM,UAAU,GAAG,MAAuB,CAAA;IAC1C,IAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IAEjE,OAAO,4CAEP,IAAA,iCAAyB,GAAE,iBAE3B,IAAA,iCAAyB,GAAE,iBAE3B,IAAA,oCAA4B,GAAE,mNAMd,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,kCAC3B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,yCAEzC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,mBACxD,QAAQ,2FAQR,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO;QAC1F,CAAC,CAAC,sDAGF,UAAU,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ;YACpD,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,UAAU,kBAGjB;QACG,CAAC,CAAC,EAAE,kvMA8KX,CAAA;AACD,CAAC,CAAA;AArNY,QAAA,sBAAsB,0BAqNlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-collection.d.ts","sourceRoot":"","sources":["../../../src/fetchers/static-collection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"static-collection.d.ts","sourceRoot":"","sources":["../../../src/fetchers/static-collection.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,8BAA8B,WACjC,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAUpC,CAAA;AAMD,eAAO,MAAM,+BAA+B,WAAY,OAAO,MAAM,EAAE,OAAO,CAAC,KAAG,MA4JjF,CAAA;AAGD,eAAO,MAAM,oCAAoC,YAAa,GAAG,KAAG,MA+CnE,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateStaticCollectionCountFetcher = exports.generateStaticCollectionFetcher = exports.validateStaticCollectionConfig = void 0;
|
|
4
|
+
var utils_1 = require("../utils");
|
|
4
5
|
var validateStaticCollectionConfig = function (config) {
|
|
5
6
|
if (!config || typeof config !== 'object') {
|
|
6
7
|
return { isValid: false, error: 'Config must be a valid object' };
|
|
@@ -13,7 +14,7 @@ var validateStaticCollectionConfig = function (config) {
|
|
|
13
14
|
exports.validateStaticCollectionConfig = validateStaticCollectionConfig;
|
|
14
15
|
var generateStaticCollectionFetcher = function (config) {
|
|
15
16
|
var staticConfig = config;
|
|
16
|
-
return "const data = ".concat(JSON.stringify(staticConfig.data || []), "\n\nexport default async function handler(req, res) {\n try {\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, offset: offsetParam } = req.query\n \n let filteredData = [...data]\n \n if (query) {\n const searchQuery = query.toLowerCase()\n \n if (queryColumns) {\n const columns =
|
|
17
|
+
return "const data = ".concat(JSON.stringify(staticConfig.data || []), "\n\n").concat((0, utils_1.generateSafeJSONParseCode)(), "\n\n").concat((0, utils_1.generateDateFormatterCode)(), "\n\n").concat((0, utils_1.generateSortFilterHelperCode)(), "\n\nexport default async function handler(req, res) {\n try {\n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset: offsetParam } = req.query\n \n let filteredData = [...data]\n \n if (query) {\n const searchQuery = query.toLowerCase()\n \n if (queryColumns) {\n const columns = safeJSONParse(queryColumns)\n filteredData = filteredData.filter((item) => {\n return columns.some((col) => {\n const value = getNestedValue(item, col)\n return value && String(value).toLowerCase().includes(searchQuery)\n })\n })\n } else {\n filteredData = filteredData.filter((item) => {\n try {\n const stringified = JSON.stringify(item).toLowerCase()\n return stringified.includes(searchQuery)\n } catch {\n return false\n }\n })\n }\n }\n \n if (filters) {\n const parsedFilters = safeJSONParse(filters)\n \n if (Array.isArray(parsedFilters)) {\n filteredData = filteredData.filter((item) => {\n return parsedFilters.every((filter) => {\n if (!filter.source || filter.destination === undefined) return true\n \n const field = filter.source\n const value = getNestedValue(item, field)\n const target = filter.destination\n const operand = filter.operand || '='\n \n if (Array.isArray(target)) {\n if (operand === '!=') {\n return !target.includes(value)\n }\n return target.includes(value)\n }\n \n return compareValues(value, target, operand)\n })\n })\n } else {\n filteredData = filteredData.filter((item) => {\n return Object.entries(parsedFilters).every(([key, value]) => {\n const itemValue = getNestedValue(item, key)\n if (Array.isArray(value)) {\n return value.includes(itemValue)\n }\n return compareValues(itemValue, value, '=')\n })\n })\n }\n }\n \n if (sorts) {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {\n filteredData.sort((a, b) => {\n for (const sort of parsedSorts) {\n if (!sort.field) continue\n const aVal = getNestedValue(a, sort.field)\n const bVal = getNestedValue(b, sort.field)\n const sortOrderValue = sort.order?.toLowerCase() === 'desc' ? -1 : 1\n \n let comparison = 0\n if (aVal === null || aVal === undefined) {\n comparison = bVal === null || bVal === undefined ? 0 : -1\n } else if (bVal === null || bVal === undefined) {\n comparison = 1\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal\n } else if (aVal instanceof Date && bVal instanceof Date) {\n comparison = aVal.getTime() - bVal.getTime()\n } else {\n const aStr = String(aVal)\n const bStr = String(bVal)\n if (aStr < bStr) comparison = -1\n else if (aStr > bStr) comparison = 1\n }\n \n if (comparison !== 0) return comparison * sortOrderValue\n }\n return 0\n })\n }\n } else if (sortBy) {\n filteredData.sort((a, b) => {\n const aVal = getNestedValue(a, sortBy)\n const bVal = getNestedValue(b, sortBy)\n const sortOrderValue = sortOrder?.toLowerCase() === 'desc' ? -1 : 1\n \n let comparison = 0\n if (aVal === null || aVal === undefined) {\n comparison = bVal === null || bVal === undefined ? 0 : -1\n } else if (bVal === null || bVal === undefined) {\n comparison = 1\n } else if (typeof aVal === 'number' && typeof bVal === 'number') {\n comparison = aVal - bVal\n } else if (aVal instanceof Date && bVal instanceof Date) {\n comparison = aVal.getTime() - bVal.getTime()\n } else {\n const aStr = String(aVal)\n const bStr = String(bVal)\n if (aStr < bStr) comparison = -1\n else if (aStr > bStr) comparison = 1\n }\n \n return comparison * sortOrderValue\n })\n }\n \n const limitValue = limit || perPage\n const offsetValue = offsetParam !== undefined ? parseInt(offsetParam) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : 0)\n \n if (limitValue) {\n filteredData = filteredData.slice(offsetValue, offsetValue + parseInt(limitValue))\n }\n \n const safeData = JSON.parse(JSON.stringify(filteredData, dateReplacer))\n \n return res.status(200).json({\n success: true,\n data: safeData,\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('Static collection fetch error:', error)\n return res.status(500).json({\n success: false,\n error: error.message || 'Failed to fetch data',\n timestamp: Date.now()\n })\n }\n}\n");
|
|
17
18
|
};
|
|
18
19
|
exports.generateStaticCollectionFetcher = generateStaticCollectionFetcher;
|
|
19
20
|
// tslint:disable-next-line:variable-name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-collection.js","sourceRoot":"","sources":["../../../src/fetchers/static-collection.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"static-collection.js","sourceRoot":"","sources":["../../../src/fetchers/static-collection.ts"],"names":[],"mappings":";;;AAAA,kCAIiB;AAEV,IAAM,8BAA8B,GAAG,UAC5C,MAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAA;KAClE;IAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC/C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAA;KAC1D;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC,CAAA;AAZY,QAAA,8BAA8B,kCAY1C;AAMM,IAAM,+BAA+B,GAAG,UAAC,MAA+B;IAC7E,IAAM,YAAY,GAAG,MAAgC,CAAA;IACrD,OAAO,uBAAgB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,iBAE9D,IAAA,iCAAyB,GAAE,iBAE3B,IAAA,iCAAyB,GAAE,iBAE3B,IAAA,oCAA4B,GAAE,ypKAmJ/B,CAAA;AACD,CAAC,CAAA;AA5JY,QAAA,+BAA+B,mCA4J3C;AAED,yCAAyC;AAClC,IAAM,oCAAoC,GAAG,UAAC,OAAY;IAC/D,OAAO,knCA6CR,CAAA;AACD,CAAC,CAAA;AA/CY,QAAA,oCAAoC,wCA+ChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/fetchers/supabase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../../../src/fetchers/supabase.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,WACzB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CA0BpC,CAAA;AAUD,eAAO,MAAM,uBAAuB,WAC1B,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,KAChB,MA8OF,CAAA;AAGD,eAAO,MAAM,4BAA4B,YAAa,GAAG,aAAa,MAAM,KAAG,MAiF9E,CAAA"}
|
|
@@ -31,12 +31,12 @@ var generateSupabaseFetcher = function (config, tableName) {
|
|
|
31
31
|
var supabaseConfig = config;
|
|
32
32
|
var supabaseUrl = supabaseConfig.supabaseUrl;
|
|
33
33
|
var apiKey = supabaseConfig.serviceRoleKey || supabaseConfig.publicApiKey;
|
|
34
|
-
return "import { createClient } from '@supabase/supabase-js'\n\nlet client = null\n\nconst getClient = () => {\n if (client) return client\n \n client = createClient(\n ".concat(JSON.stringify(supabaseUrl), ",\n ").concat((0, utils_1.replaceSecretReference)(apiKey), "\n )\n \n return client\n}\n\
|
|
34
|
+
return "import { createClient } from '@supabase/supabase-js'\n\nlet client = null\n\nconst getClient = () => {\n if (client) return client\n \n client = createClient(\n ".concat(JSON.stringify(supabaseUrl), ",\n ").concat((0, utils_1.replaceSecretReference)(apiKey), "\n )\n \n return client\n}\n\n").concat((0, utils_1.generateSafeJSONParseCode)(), "\n\n// Helper function to process filter values\nconst processFilterValue = (value) => {\n if (typeof value === 'string' && !isNaN(Number(value))) {\n return Number(value)\n }\n return value\n}\n\n// Helper function to apply filters to a query\nconst applyFilters = (queryRef, filters) => {\n if (!filters) return queryRef\n \n const parsedFilters = safeJSONParse(filters)\n \n if (Array.isArray(parsedFilters)) {\n parsedFilters.forEach((filter) => {\n if (!filter.source || filter.destination === undefined) return\n \n const field = filter.source\n const value = filter.destination\n const operand = filter.operand || '='\n \n if (Array.isArray(value)) {\n const processedValues = value.map(processFilterValue)\n if (operand === '!=') {\n queryRef = queryRef.not(field, 'in', processedValues)\n } else {\n queryRef = queryRef.in(field, processedValues)\n }\n } else {\n const processedValue = processFilterValue(value)\n \n // Handle null values\n if (processedValue === null) {\n if (operand === '=') {\n queryRef = queryRef.is(field, null)\n } else if (operand === '!=') {\n queryRef = queryRef.not(field, 'is', null)\n }\n } else {\n // Map operand to Supabase methods\n switch (operand) {\n case '=':\n queryRef = queryRef.eq(field, processedValue)\n break\n case '!=':\n queryRef = queryRef.neq(field, processedValue)\n break\n case '>':\n queryRef = queryRef.gt(field, processedValue)\n break\n case '>=':\n queryRef = queryRef.gte(field, processedValue)\n break\n case '<':\n queryRef = queryRef.lt(field, processedValue)\n break\n case '<=':\n queryRef = queryRef.lte(field, processedValue)\n break\n default:\n queryRef = queryRef.eq(field, processedValue)\n }\n }\n }\n })\n } else {\n // Old format: object with key-value pairs (backward compatibility)\n Object.entries(parsedFilters).forEach(([key, value]) => {\n if (Array.isArray(value)) {\n const processedValues = value.map(processFilterValue)\n queryRef = queryRef.in(key, processedValues)\n } else if (typeof value === 'object' && value !== null) {\n const operator = Object.keys(value)[0]\n let operatorValue = value[operator]\n if (typeof operatorValue === 'string' && !isNaN(Number(operatorValue))) {\n operatorValue = Number(operatorValue)\n }\n switch (operator) {\n case 'eq': queryRef = queryRef.eq(key, operatorValue); break\n case 'neq': queryRef = queryRef.neq(key, operatorValue); break\n case 'gt': queryRef = queryRef.gt(key, operatorValue); break\n case 'gte': queryRef = queryRef.gte(key, operatorValue); break\n case 'lt': queryRef = queryRef.lt(key, operatorValue); break\n case 'lte': queryRef = queryRef.lte(key, operatorValue); break\n case 'like': queryRef = queryRef.like(key, operatorValue); break\n case 'ilike': queryRef = queryRef.ilike(key, operatorValue); break\n case 'in': queryRef = queryRef.in(key, operatorValue); break\n default: queryRef = queryRef.eq(key, operatorValue)\n }\n } else {\n let processedValue = value\n if (typeof value === 'string' && !isNaN(Number(value))) {\n processedValue = Number(value)\n }\n queryRef = queryRef.eq(key, processedValue)\n }\n })\n }\n \n return queryRef\n}\n\n").concat((0, utils_1.generateDateFormatterCode)(), "\n\nexport default async function handler(req, res) {\n try {\n const client = getClient()\n const { query, queryColumns, select, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n \n let queryRef = client.from('").concat(tableName, "').select(select || '*')\n \n if (query) {\n let columns = []\n \n if (queryColumns) {\n // Use specified columns\n columns = safeJSONParse(queryColumns)\n } else {\n // Fallback: Get text-searchable columns from a sample row\n try {\n const { data: sampleData, error: sampleError } = await client.from('").concat(tableName, "').select('*').limit(1).single()\n if (sampleError) {\n throw sampleError\n }\n if (sampleData) {\n // Filter out columns that are likely non-text types\n // Note: This is heuristic-based since we don't have schema info\n columns = Object.keys(sampleData).filter(col => {\n const value = sampleData[col]\n const colLower = col.toLowerCase()\n \n // Exclude common timestamp/date column names\n if (colLower.includes('_at') || colLower.includes('date') || colLower === 'timestamp') {\n return false\n }\n \n // Exclude if value is a number, boolean, null, or object (non-string)\n if (value === null || value === undefined) {\n return true // Include null columns, let the query handle it\n }\n \n const type = typeof value\n return type === 'string' // Only include string values\n })\n }\n } catch (schemaError) {\n console.warn('Failed to fetch sample row for column names:', schemaError.message)\n // Continue without search if we can't get columns\n }\n }\n \n if (columns.length > 0) {\n const searchPattern = `%${query}%`\n // Note: Supabase PostgREST doesn't support ::text casting in .or() syntax\n // Only text/varchar columns will match; non-text columns will be skipped\n const orConditions = columns.map((col) => `${col}.ilike.${searchPattern}`).join(',')\n queryRef = queryRef.or(orConditions)\n }\n }\n \n // Apply filters using helper function\n queryRef = applyFilters(queryRef, filters)\n \n // Handle sorts - new array format\n if (sorts) {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts)) {\n parsedSorts.forEach((sort) => {\n if (sort.field) {\n queryRef = queryRef.order(sort.field, { \n ascending: sort.order?.toLowerCase() !== 'desc' \n })\n }\n })\n }\n } else if (sortBy) {\n queryRef = queryRef.order(sortBy, { ascending: sortOrder !== 'desc' })\n }\n \n const limitValue = limit || perPage\n const offsetValue = offset !== undefined ? parseInt(offset) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : undefined)\n \n if (offsetValue !== undefined && limitValue) {\n queryRef = queryRef.range(offsetValue, offsetValue + parseInt(limitValue) - 1)\n } else if (limitValue) {\n queryRef = queryRef.limit(parseInt(limitValue))\n }\n \n const { data, error } = await queryRef\n \n if (error) {\n return res.status(500).json({\n success: false,\n error: error.message,\n timestamp: Date.now()\n })\n }\n \n const safeData = JSON.parse(JSON.stringify(data, dateReplacer))\n \n return res.status(200).json({\n success: true,\n data: safeData,\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('Supabase fetch error:', error)\n return res.status(500).json({\n success: false,\n error: error.message || 'Failed to fetch data',\n timestamp: Date.now()\n })\n }\n}\n");
|
|
35
35
|
};
|
|
36
36
|
exports.generateSupabaseFetcher = generateSupabaseFetcher;
|
|
37
37
|
// tslint:disable-next-line:variable-name
|
|
38
38
|
var generateSupabaseCountFetcher = function (_config, tableName) {
|
|
39
|
-
return "\nasync function getCount(req, res) {\n const supabase = getClient()\n\n try {\n const { query, queryColumns, filters } = req.query\n let countQuery = supabase.from('".concat(tableName, "').select('*', { count: 'exact', head: true })\n\n if (query) {\n let columns = []\n \n if (queryColumns) {\n // Use specified columns\n
|
|
39
|
+
return "\nasync function getCount(req, res) {\n const supabase = getClient()\n\n try {\n const { query, queryColumns, filters } = req.query\n let countQuery = supabase.from('".concat(tableName, "').select('*', { count: 'exact', head: true })\n\n if (query) {\n let columns = []\n \n if (queryColumns) {\n // Use specified columns\n const parsed = safeJSONParse(queryColumns)\n columns = Array.isArray(parsed) ? parsed : [parsed]\n } else {\n // Fallback: Get text-searchable columns from a sample row\n try {\n const { data: sampleData, error: sampleError } = await supabase.from('").concat(tableName, "').select('*').limit(1).single()\n if (sampleError) {\n throw sampleError\n }\n if (sampleData) {\n // Filter out columns that are likely non-text types\n // Note: This is heuristic-based since we don't have schema info\n columns = Object.keys(sampleData).filter(col => {\n const value = sampleData[col]\n const colLower = col.toLowerCase()\n \n // Exclude common timestamp/date column names\n if (colLower.includes('_at') || colLower.includes('date') || colLower === 'timestamp') {\n return false\n }\n \n // Exclude if value is a number, boolean, null, or object (non-string)\n if (value === null || value === undefined) {\n return true // Include null columns, let the query handle it\n }\n \n const type = typeof value\n return type === 'string' // Only include string values\n })\n }\n } catch (schemaError) {\n console.warn('Failed to fetch sample row for column names:', schemaError.message)\n // Continue without search if we can't get columns\n }\n }\n \n if (columns.length > 0) {\n const searchPattern = `%${query}%`\n // Note: Supabase PostgREST doesn't support ::text casting in .or() syntax\n // Only text/varchar columns will match; non-text columns will be skipped\n const orConditions = columns.map((col) => `${col}.ilike.${searchPattern}`).join(',')\n countQuery = countQuery.or(orConditions)\n }\n }\n\n // Apply filters using helper function\n countQuery = applyFilters(countQuery, filters)\n\n const { count, error } = await countQuery\n \n if (error) throw error\n\n return res.status(200).json({\n success: true,\n count: count || 0,\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('Error getting count:', error)\n return res.status(500).json({\n success: false,\n error: error.message || 'Failed to get count',\n timestamp: Date.now()\n })\n }\n}\n");
|
|
40
40
|
};
|
|
41
41
|
exports.generateSupabaseCountFetcher = generateSupabaseCountFetcher;
|
|
42
42
|
//# sourceMappingURL=supabase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../../src/fetchers/supabase.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../../src/fetchers/supabase.ts"],"names":[],"mappings":";;;AAAA,kCAIiB;AAEV,IAAM,sBAAsB,GAAG,UACpC,MAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAA;KAClE;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAA;KAC7D;IAED,IAAI;QACF,IAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACvC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;YACpF,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAA;SACnF;KACF;IAAC,WAAM;QACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAA;KAChE;IAED,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;QAClD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,+DAA+D;SACvE,CAAA;KACF;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC,CAAA;AA5BY,QAAA,sBAAsB,0BA4BlC;AAUM,IAAM,uBAAuB,GAAG,UACrC,MAA+B,EAC/B,SAAiB;IAEjB,IAAM,cAAc,GAAG,MAAwB,CAAA;IAC/C,IAAM,WAAW,GAAG,cAAc,CAAC,WAAW,CAAA;IAC9C,IAAM,MAAM,GAAG,cAAc,CAAC,cAAc,IAAI,cAAc,CAAC,YAAY,CAAA;IAE3E,OAAO,iLAQH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,oBAC3B,IAAA,8BAAsB,EAAC,MAAM,CAAC,8CAMlC,IAAA,iCAAyB,GAAE,uuHAyG3B,IAAA,iCAAyB,GAAE,2QAOK,SAAS,4XAWqC,SAAS,uyGA8FxF,CAAA;AACD,CAAC,CAAA;AAjPY,QAAA,uBAAuB,2BAiPnC;AAED,yCAAyC;AAClC,IAAM,4BAA4B,GAAG,UAAC,OAAY,EAAE,SAAiB;IAC1E,OAAO,wLAM6B,SAAS,kdAYmC,SAAS,4rEA6D1F,CAAA;AACD,CAAC,CAAA;AAjFY,QAAA,4BAA4B,gCAiFxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso.d.ts","sourceRoot":"","sources":["../../../src/fetchers/turso.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"turso.d.ts","sourceRoot":"","sources":["../../../src/fetchers/turso.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,mBAAmB,WACtB,OAAO,MAAM,EAAE,OAAO,CAAC,KAC9B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAcpC,CAAA;AASD,eAAO,MAAM,oBAAoB,WACvB,OAAO,MAAM,EAAE,OAAO,CAAC,aACpB,MAAM,KAChB,MAuMF,CAAA"}
|
|
@@ -19,7 +19,7 @@ var generateTursoFetcher = function (config, tableName) {
|
|
|
19
19
|
var tursoConfig = config;
|
|
20
20
|
var databaseUrl = tursoConfig.databaseUrl;
|
|
21
21
|
var token = tursoConfig.token;
|
|
22
|
-
return "import { createClient } from '@libsql/client'\n\nexport default async function handler(req, res) {\n let client = null\n try {\n client = createClient({\n url: ".concat(JSON.stringify(databaseUrl), ",\n authToken: ").concat((0, utils_1.replaceSecretReference)(token), "\n })\n \n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, offset } = req.query\n \n let sql = `SELECT * FROM ").concat(tableName, "`\n const whereClauses = []\n const queryParams = []\n let searchQueryColumns = null\n \n if (query) {\n if (queryColumns) {\n const
|
|
22
|
+
return "import { createClient } from '@libsql/client'\n\n".concat((0, utils_1.generateSafeJSONParseCode)(), "\n\n").concat((0, utils_1.generateDateFormatterCode)(), "\n\nexport default async function handler(req, res) {\n let client = null\n try {\n client = createClient({\n url: ").concat(JSON.stringify(databaseUrl), ",\n authToken: ").concat((0, utils_1.replaceSecretReference)(token), "\n })\n \n const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset } = req.query\n \n let sql = `SELECT * FROM ").concat(tableName, "`\n const whereClauses = []\n const queryParams = []\n let searchQueryColumns = null\n \n if (query) {\n if (queryColumns) {\n const parsed = safeJSONParse(queryColumns)\n const columns = Array.isArray(parsed) ? parsed : [parsed]\n // Cast columns to TEXT to support searching on non-text columns (dates, numbers, etc.)\n const searchConditions = columns.map((col) => `CAST(${col} AS TEXT) LIKE ?`)\n whereClauses.push(`(${searchConditions.join(' OR ')})`)\n columns.forEach(() => {\n queryParams.push(`%${query}%`)\n })\n } else {\n // Store query for post-filtering if columns not specified\n searchQueryColumns = query\n }\n }\n \n // Helper to sanitize identifier (prevent SQL injection in column names)\n const sanitizeIdentifier = (name) => {\n // Only allow alphanumeric and underscore\n if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {\n throw new Error(`Invalid identifier: ${name}`)\n }\n return `\"${name}\"`\n }\n \n if (filters) {\n const parsedFilters = safeJSONParse(filters)\n \n if (Array.isArray(parsedFilters)) {\n parsedFilters.forEach((filter) => {\n if (!filter.source || filter.destination === undefined) return\n \n const field = sanitizeIdentifier(filter.source)\n const value = filter.destination\n const operand = filter.operand || '='\n \n if (Array.isArray(value)) {\n if (value.length === 0) return\n const placeholders = value.map(() => '?').join(', ')\n queryParams.push(...value)\n if (operand === '!=') {\n whereClauses.push(`${field} NOT IN (${placeholders})`)\n } else {\n whereClauses.push(`${field} IN (${placeholders})`)\n }\n } else {\n if (value === null) {\n if (operand === '=') {\n whereClauses.push(`${field} IS NULL`)\n } else if (operand === '!=') {\n whereClauses.push(`${field} IS NOT NULL`)\n }\n } else {\n const validOps = ['=', '!=', '>', '<', '>=', '<=']\n const sqlOperator = validOps.includes(operand) ? operand : '='\n whereClauses.push(`${field} ${sqlOperator} ?`)\n queryParams.push(value)\n }\n }\n })\n } else {\n Object.entries(parsedFilters).forEach(([key, value]) => {\n const field = sanitizeIdentifier(key)\n if (Array.isArray(value)) {\n const placeholders = value.map(() => '?').join(', ')\n queryParams.push(...value)\n whereClauses.push(`${field} IN (${placeholders})`)\n } else {\n whereClauses.push(`${field} = ?`)\n queryParams.push(value)\n }\n })\n }\n }\n \n if (whereClauses.length > 0) {\n sql += ` WHERE ${whereClauses.join(' AND ')}`\n }\n \n // Handle sorts - new array format\n if (sorts) {\n const parsedSorts = safeJSONParse(sorts)\n if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {\n const orderClauses = parsedSorts.map((sort) => {\n if (!sort.field) return null\n const order = sort.order?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC'\n return `${sanitizeIdentifier(sort.field)} ${order}`\n }).filter(Boolean)\n \n if (orderClauses.length > 0) {\n sql += ` ORDER BY ${orderClauses.join(', ')}`\n }\n }\n } else if (sortBy) {\n const sortOrderValue = sortOrder?.toUpperCase() === 'DESC' ? 'DESC' : 'ASC'\n sql += ` ORDER BY ${sanitizeIdentifier(sortBy)} ${sortOrderValue}`\n }\n \n const limitValue = limit || perPage\n const offsetValue = offset !== undefined ? parseInt(offset) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : undefined)\n \n // Only apply SQL pagination if we're not doing post-filtering\n if (!searchQueryColumns) {\n if (limitValue) {\n sql += ` LIMIT ?`\n queryParams.push(parseInt(limitValue))\n }\n \n if (offsetValue !== undefined) {\n sql += ` OFFSET ?`\n queryParams.push(offsetValue)\n }\n }\n \n const result = await client.execute({\n sql,\n args: queryParams\n })\n \n let data = result.rows.map((row) => {\n const obj = {}\n result.columns.forEach((col, idx) => {\n obj[col] = row[col]\n })\n return obj\n })\n \n // Apply post-filtering for search without queryColumns\n if (searchQueryColumns) {\n const searchQuery = searchQueryColumns.toLowerCase()\n data = data.filter((item) => {\n try {\n const stringified = JSON.stringify(item).toLowerCase()\n return stringified.includes(searchQuery)\n } catch {\n return false\n }\n })\n \n // Apply pagination after filtering\n if (limitValue) {\n const start = offsetValue || 0\n data = data.slice(start, start + parseInt(limitValue))\n } else if (offsetValue) {\n data = data.slice(offsetValue)\n }\n }\n \n const safeData = JSON.parse(JSON.stringify(data, dateReplacer))\n \n return res.status(200).json({\n success: true,\n data: safeData,\n timestamp: Date.now()\n })\n } catch (error) {\n console.error('Turso fetch error:', error)\n return res.status(500).json({\n success: false,\n error: error.message || 'Failed to fetch data',\n timestamp: Date.now()\n })\n } finally {\n if (client) {\n try {\n await client.close()\n } catch (error) {\n console.error('Error closing Turso client:', error)\n }\n }\n }\n}\n");
|
|
23
23
|
};
|
|
24
24
|
exports.generateTursoFetcher = generateTursoFetcher;
|
|
25
25
|
//# sourceMappingURL=turso.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turso.js","sourceRoot":"","sources":["../../../src/fetchers/turso.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"turso.js","sourceRoot":"","sources":["../../../src/fetchers/turso.ts"],"names":[],"mappings":";;;AAAA,kCAIiB;AAEV,IAAM,mBAAmB,GAAG,UACjC,MAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAA;KAClE;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAA;KACnE;IAED,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wCAAwC,EAAE,CAAA;KAC3E;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AAC1B,CAAC,CAAA;AAhBY,QAAA,mBAAmB,uBAgB/B;AASM,IAAM,oBAAoB,GAAG,UAClC,MAA+B,EAC/B,SAAiB;IAEjB,IAAM,WAAW,GAAG,MAAqB,CAAA;IACzC,IAAM,WAAW,GAAG,WAAW,CAAC,WAAW,CAAA;IAC3C,IAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAA;IAE/B,OAAO,2DAEP,IAAA,iCAAyB,GAAE,iBAE3B,IAAA,iCAAyB,GAAE,0IAMhB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,iCACrB,IAAA,8BAAsB,EAAC,KAAK,CAAC,gLAKhB,SAAS,0wLAiLxC,CAAA;AACD,CAAC,CAAA;AA1MY,QAAA,oBAAoB,wBA0MhC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-detection.d.ts","sourceRoot":"","sources":["../../../../src/fetchers/utils/header-detection.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,QAAO,MAuM9C,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateHeaderDetectionCode = void 0;
|
|
4
|
+
var generateHeaderDetectionCode = function () {
|
|
5
|
+
return "const COMMON_HEADER_PATTERNS = [\n /^id$/i,\n /^name$/i,\n /^email$/i,\n /^date$/i,\n /^time$/i,\n /^status$/i,\n /^type$/i,\n /^title$/i,\n /^description$/i,\n /^price$/i,\n /^amount$/i,\n /^quantity$/i,\n /^total$/i,\n /^url$/i,\n /^link$/i,\n /^image$/i,\n /^phone$/i,\n /^address$/i,\n /^city$/i,\n /^country$/i,\n /^category$/i,\n /^tag$/i,\n /^created/i,\n /^updated/i,\n /^modified/i,\n /_id$/i,\n /_at$/i,\n /_date$/i,\n /_name$/i,\n /_url$/i,\n]\n\nconst DATA_PATTERNS = {\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n url: /^https?:\\/\\//i,\n phone: /^[+]?[\\d\\s()-]{7,}$/,\n date: /^\\d{1,4}[-/]\\d{1,2}[-/]\\d{1,4}$/,\n currency: /^[$\u20AC\u00A3\u00A5]\\s*[\\d,]+\\.?\\d*$/,\n percentage: /^\\d+\\.?\\d*%$/,\n pureNumber: /^-?\\d+\\.?\\d*$/,\n}\n\nfunction looksLikeDataValue(val) {\n if (val === null || val === undefined) {\n return false\n }\n if (typeof val === 'number' || typeof val === 'boolean') {\n return true\n }\n if (val instanceof Date) {\n return true\n }\n if (typeof val === 'string') {\n const str = val.trim()\n return Object.values(DATA_PATTERNS).some((pattern) => pattern.test(str))\n }\n return false\n}\n\nfunction looksLikeHeaderValue(val) {\n if (typeof val !== 'string') {\n return false\n }\n const str = val.trim()\n if (str.length === 0 || str.length > 50) {\n return false\n }\n if (looksLikeDataValue(str)) {\n return false\n }\n if (COMMON_HEADER_PATTERNS.some((pattern) => pattern.test(str))) {\n return true\n }\n const isTitleCase = /^[A-Z][a-z]*(\\s+[A-Z][a-z]*)*$/.test(str)\n const isSnakeCase = /^[a-z]+(_[a-z]+)*$/i.test(str)\n const isCamelCase = /^[a-z]+([A-Z][a-z]*)*$/.test(str)\n const isPascalCase = /^[A-Z][a-z]+([A-Z][a-z]*)*$/.test(str)\n const isUpperCase = /^[A-Z][A-Z\\s_]+$/.test(str) && str.length > 1\n return isTitleCase || isSnakeCase || isCamelCase || isPascalCase || isUpperCase\n}\n\nfunction detectHeaderRow(\n firstRowValues, \n allRows,\n minConfidenceScore = 4\n) {\n if (allRows.length < 2) {\n return false\n }\n\n // Helper to extract values from a row (handles both CSV arrays and Google Sheets objects)\n const getRowValues = (row) => {\n if (Array.isArray(row)) {\n return row\n }\n // Google Sheets format: row has a 'c' property with cells\n if (row && row.c && Array.isArray(row.c)) {\n return row.c.map((cell) => cell?.v ?? cell?.f ?? null)\n }\n return []\n }\n\n const nonEmptyFirstRowValues = firstRowValues.filter(\n (v) => v !== null && v !== undefined && v !== ''\n )\n if (nonEmptyFirstRowValues.length === 0) {\n return false\n }\n\n let score = 0\n\n const allStrings = nonEmptyFirstRowValues.every((val) => typeof val === 'string')\n if (allStrings) {\n score += 1\n } else {\n return false\n }\n\n const hasUniqueValues =\n nonEmptyFirstRowValues.length ===\n new Set(nonEmptyFirstRowValues.map((v) => String(v).toLowerCase().trim())).size\n if (hasUniqueValues) {\n score += 1\n }\n\n const headerLikeCount = nonEmptyFirstRowValues.filter((v) => looksLikeHeaderValue(v)).length\n const headerLikeRatio = headerLikeCount / nonEmptyFirstRowValues.length\n if (headerLikeRatio >= 0.5) {\n score += 2\n } else if (headerLikeRatio >= 0.3) {\n score += 1\n }\n\n const commonHeaderCount = nonEmptyFirstRowValues.filter((v) =>\n COMMON_HEADER_PATTERNS.some((pattern) => pattern.test(String(v).trim()))\n ).length\n if (commonHeaderCount >= 2) {\n score += 2\n } else if (commonHeaderCount >= 1) {\n score += 1\n }\n\n const dataLikeInFirstRow = nonEmptyFirstRowValues.filter((v) => looksLikeDataValue(v)).length\n if (dataLikeInFirstRow > 0) {\n score -= dataLikeInFirstRow * 2\n }\n\n const sampleSize = Math.min(5, allRows.length - 1)\n let dataRowsWithDataPatterns = 0\n for (let i = 1; i <= sampleSize; i++) {\n const rowValues = getRowValues(allRows[i])\n const hasDataPattern = rowValues.some((v) => looksLikeDataValue(v))\n if (hasDataPattern) {\n dataRowsWithDataPatterns++\n }\n }\n if (dataRowsWithDataPatterns >= sampleSize * 0.6) {\n score += 2\n }\n\n const firstRowTypesSet = new Set(nonEmptyFirstRowValues.map((v) => typeof v))\n const secondRowValues = getRowValues(allRows[1]).filter((v) => v !== null && v !== undefined && v !== '')\n const secondRowTypesSet = new Set(secondRowValues.map((v) => typeof v))\n\n const firstRowOnlyStrings = firstRowTypesSet.size === 1 && firstRowTypesSet.has('string')\n const secondRowHasOtherTypes = secondRowTypesSet.has('number') || secondRowTypesSet.has('boolean')\n if (firstRowOnlyStrings && secondRowHasOtherTypes) {\n score += 2\n }\n\n const firstRowSimilarToDataRows = nonEmptyFirstRowValues.some((v) => looksLikeDataValue(v))\n const secondRowHasData = secondRowValues.some((v) => looksLikeDataValue(v))\n if (firstRowSimilarToDataRows && secondRowHasData) {\n score -= 2\n }\n\n // Check if subsequent rows also look like headers\n // If they do, the first row is likely data, not a header\n const subsequentRowsSample = Math.min(3, allRows.length - 1)\n let subsequentHeaderLikeCount = 0\n for (let i = 1; i <= subsequentRowsSample; i++) {\n const rowValues = getRowValues(allRows[i]).filter((v) => v !== null && v !== undefined && v !== '')\n if (rowValues.length > 0) {\n const headerLikeInRow = rowValues.filter((v) => looksLikeHeaderValue(v)).length\n const headerLikeRatioInRow = headerLikeInRow / rowValues.length\n if (headerLikeRatioInRow >= 0.5) {\n subsequentHeaderLikeCount++\n }\n }\n }\n // If most subsequent rows also look like headers, first row is probably data\n if (subsequentHeaderLikeCount >= subsequentRowsSample * 0.6) {\n score -= 4\n }\n\n return score >= minConfidenceScore\n}";
|
|
6
|
+
};
|
|
7
|
+
exports.generateHeaderDetectionCode = generateHeaderDetectionCode;
|
|
8
|
+
//# sourceMappingURL=header-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-detection.js","sourceRoot":"","sources":["../../../../src/fetchers/utils/header-detection.ts"],"names":[],"mappings":";;;AAAO,IAAM,2BAA2B,GAAG;IACzC,OAAO,qtLAqMP,CAAA;AACF,CAAC,CAAA;AAvMY,QAAA,2BAA2B,+BAuMvC"}
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EAGvB,MAAM,4BAA4B,CAAA;AA4anC,eAAO,MAAM,+BAA+B,EAAE,sBAAsB,CAAC,EAAE,CAoetE,CAAA;AAiGD,eAAO,MAAM,mCAAmC,EAAE,sBAAsB,CAAC,EAAE,CA0O1E,CAAA;AAED,cAAc,wBAAwB,CAAA;AACtC,cAAc,SAAS,CAAA;AACvB,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -311,7 +311,7 @@ function extractPaginationConfigEarly(uidlNode, resources) {
|
|
|
311
311
|
}
|
|
312
312
|
var createNextPagesDataSourcePlugin = function () {
|
|
313
313
|
var nextPagesDataSourcePlugin = function (structure) { return __awaiter(void 0, void 0, void 0, function () {
|
|
314
|
-
var uidl, chunks, options, dependencies, dataSources, componentChunk, opts, pageConfig, getStaticPropsChunk, processedDataSources, firstDataSourceInfo, fetcherImportName, existingPropKeys, funcDecl, tryStmt, retStmt, propsProp, propsVal, _i, _a, prop, keyName, wrapContext, functionDeclaration, functionBody, tryBlock, returnStatement, propsObject, propsValue, meta, _b, _c, wrapped, fetchCallExpression, safeFetchExpression, existingIndex, promiseAllCall, arrayPattern, paginationPlugin;
|
|
314
|
+
var uidl, chunks, options, dependencies, dataSources, componentChunk, opts, pageConfig, getStaticPropsChunk, processedDataSources, firstDataSourceInfo, fetcherImportName, dataProviderPositionCounters, existingPropKeys, funcDecl, tryStmt, retStmt, propsProp, propsVal, _i, _a, prop, keyName, wrapContext, functionDeclaration, functionBody, tryBlock, returnStatement, propsObject, propsValue, meta, _b, _c, wrapped, fetchCallExpression, safeFetchExpression, existingIndex, promiseAllCall, arrayPattern, hasPaginatedOrSearchDataSources, getStaticPropsAST, paginationPlugin;
|
|
315
315
|
var _d;
|
|
316
316
|
return __generator(this, function (_e) {
|
|
317
317
|
uidl = structure.uidl, chunks = structure.chunks, options = structure.options, dependencies = structure.dependencies;
|
|
@@ -358,11 +358,12 @@ var createNextPagesDataSourcePlugin = function () {
|
|
|
358
358
|
processedDataSources = new Set();
|
|
359
359
|
firstDataSourceInfo = null;
|
|
360
360
|
fetcherImportName = null;
|
|
361
|
+
dataProviderPositionCounters = new Map();
|
|
361
362
|
teleport_shared_1.UIDLUtils.traverseNodes(uidl.node, function (node) {
|
|
362
363
|
// Data source nodes can be either:
|
|
363
364
|
// 1. Direct: node.type === 'data-source-item' or 'data-source-list'
|
|
364
365
|
// 2. Wrapped in element: node.type === 'element' && node.content.type === 'data-source-item' or 'data-source-list'
|
|
365
|
-
var _a;
|
|
366
|
+
var _a, _b;
|
|
366
367
|
var dataSourceNode = null;
|
|
367
368
|
if (node.type === 'data-source-item' || node.type === 'data-source-list') {
|
|
368
369
|
// Direct data source node
|
|
@@ -390,10 +391,56 @@ var createNextPagesDataSourcePlugin = function () {
|
|
|
390
391
|
if (!resourceDef) {
|
|
391
392
|
return;
|
|
392
393
|
}
|
|
393
|
-
|
|
394
|
+
// Track the position of this data-source-list for matching the correct DataProvider
|
|
395
|
+
// The key is (dataSourceId, tableName) since all matching DataProviders share these
|
|
396
|
+
var positionKey = "".concat(resourceDef.dataSourceId, ":").concat(resourceDef.tableName || 'data');
|
|
397
|
+
var currentPosition = dataProviderPositionCounters.get(positionKey) || 0;
|
|
398
|
+
dataProviderPositionCounters.set(positionKey, currentPosition + 1);
|
|
399
|
+
// Check if this data-source-list contains a cms-list-repeater with pagination or search
|
|
400
|
+
// If so, skip it - the pagination plugin will handle the data fetching
|
|
401
|
+
// tslint:disable-next-line:no-any
|
|
402
|
+
var hasPaginatedOrSearchRepeater = function (nodeToCheck) {
|
|
403
|
+
var _a, _b;
|
|
404
|
+
if (!nodeToCheck || typeof nodeToCheck !== 'object') {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
if (nodeToCheck.type === 'cms-list-repeater') {
|
|
408
|
+
var content = nodeToCheck.content;
|
|
409
|
+
if ((content === null || content === void 0 ? void 0 : content.paginated) || (content === null || content === void 0 ? void 0 : content.searchEnabled)) {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// Check children array
|
|
414
|
+
if (((_a = nodeToCheck.content) === null || _a === void 0 ? void 0 : _a.children) && Array.isArray(nodeToCheck.content.children)) {
|
|
415
|
+
for (var _i = 0, _c = nodeToCheck.content.children; _i < _c.length; _i++) {
|
|
416
|
+
var child = _c[_i];
|
|
417
|
+
if (hasPaginatedOrSearchRepeater(child)) {
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// Check nodes object (data-source-list has nodes.success, nodes.error, etc.)
|
|
423
|
+
if (((_b = nodeToCheck.content) === null || _b === void 0 ? void 0 : _b.nodes) && typeof nodeToCheck.content.nodes === 'object') {
|
|
424
|
+
for (var _d = 0, _e = Object.keys(nodeToCheck.content.nodes); _d < _e.length; _d++) {
|
|
425
|
+
var nodeKey = _e[_d];
|
|
426
|
+
if (hasPaginatedOrSearchRepeater(nodeToCheck.content.nodes[nodeKey])) {
|
|
427
|
+
return true;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return false;
|
|
432
|
+
};
|
|
433
|
+
if (hasPaginatedOrSearchRepeater(dataSourceNode)) {
|
|
434
|
+
// Skip this node but position counter is already incremented above
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
// Include resource ID to differentiate between same dataSource/table with different params (sorts, filters, etc.)
|
|
438
|
+
// tslint:disable-next-line:no-any
|
|
439
|
+
var resourceId = ((_a = dataSourceNode.content.resource) === null || _a === void 0 ? void 0 : _a.id) || '';
|
|
440
|
+
var dataSourceKey = "".concat(resourceDef.dataSourceId, ":").concat(resourceDef.tableName || 'data', ":").concat(resourceId);
|
|
394
441
|
// Check if resource has dynamic parameters
|
|
395
442
|
// tslint:disable-next-line:no-any
|
|
396
|
-
var hasResourceDynamicParams = ((
|
|
443
|
+
var hasResourceDynamicParams = ((_b = dataSourceNode.content.resource) === null || _b === void 0 ? void 0 : _b.params)
|
|
397
444
|
? Object.values(dataSourceNode.content.resource.params).some(function (param) { return param.type === 'expr' || param.type === 'dynamic'; })
|
|
398
445
|
: false;
|
|
399
446
|
// If no dynamic params, extract to getStaticProps (server-side)
|
|
@@ -525,6 +572,46 @@ var createNextPagesDataSourcePlugin = function () {
|
|
|
525
572
|
}
|
|
526
573
|
}
|
|
527
574
|
}
|
|
575
|
+
// Stringify complex params in DataProvider components before pagination plugin runs
|
|
576
|
+
stringifyComplexParamsInDataProviders(componentChunk);
|
|
577
|
+
// If getStaticProps doesn't exist yet but we have paginated/search data sources,
|
|
578
|
+
// create a basic getStaticProps structure for the pagination plugin to populate
|
|
579
|
+
if (!getStaticPropsChunk && opts.paginationConfig) {
|
|
580
|
+
hasPaginatedOrSearchDataSources = opts.paginationConfig.perPageMap.size > 0 || opts.paginationConfig.searchConfigMap.size > 0;
|
|
581
|
+
if (hasPaginatedOrSearchDataSources) {
|
|
582
|
+
getStaticPropsAST = types.exportNamedDeclaration((function () {
|
|
583
|
+
var node = types.functionDeclaration(types.identifier('getStaticProps'), [types.identifier('context')], types.blockStatement([
|
|
584
|
+
types.tryStatement(types.blockStatement([
|
|
585
|
+
// Create Promise.all structure that updateGetStaticProps expects
|
|
586
|
+
types.variableDeclaration('const', [
|
|
587
|
+
types.variableDeclarator(types.arrayPattern([]), types.awaitExpression(types.callExpression(types.memberExpression(types.identifier('Promise'), types.identifier('all')), [types.arrayExpression([])]))),
|
|
588
|
+
]),
|
|
589
|
+
types.returnStatement(types.objectExpression([
|
|
590
|
+
types.objectProperty(types.identifier('props'), types.objectExpression([])),
|
|
591
|
+
])),
|
|
592
|
+
]), types.catchClause(types.identifier('error'), types.blockStatement([
|
|
593
|
+
types.expressionStatement(types.callExpression(types.memberExpression(types.identifier('console'), types.identifier('error')), [
|
|
594
|
+
types.stringLiteral('Error in getStaticProps:'),
|
|
595
|
+
types.identifier('error'),
|
|
596
|
+
])),
|
|
597
|
+
types.returnStatement(types.objectExpression([
|
|
598
|
+
types.objectProperty(types.identifier('props'), types.objectExpression([])),
|
|
599
|
+
])),
|
|
600
|
+
]))),
|
|
601
|
+
]), false, true);
|
|
602
|
+
node.async = true;
|
|
603
|
+
return node;
|
|
604
|
+
})());
|
|
605
|
+
getStaticPropsChunk = {
|
|
606
|
+
name: 'getStaticProps',
|
|
607
|
+
type: teleport_types_1.ChunkType.AST,
|
|
608
|
+
fileType: teleport_types_1.FileType.JS,
|
|
609
|
+
content: getStaticPropsAST,
|
|
610
|
+
linkAfter: ['jsx-component'],
|
|
611
|
+
};
|
|
612
|
+
chunks.push(getStaticPropsChunk);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
528
615
|
paginationPlugin = (0, pagination_plugin_1.createNextArrayMapperPaginationPlugin)();
|
|
529
616
|
return [2 /*return*/, paginationPlugin(structure)];
|
|
530
617
|
});
|
|
@@ -532,6 +619,81 @@ var createNextPagesDataSourcePlugin = function () {
|
|
|
532
619
|
return nextPagesDataSourcePlugin;
|
|
533
620
|
};
|
|
534
621
|
exports.createNextPagesDataSourcePlugin = createNextPagesDataSourcePlugin;
|
|
622
|
+
// Helper function to stringify complex params (sorts, filters) in DataProvider components
|
|
623
|
+
function stringifyComplexParamsInDataProviders(componentChunk) {
|
|
624
|
+
if (!componentChunk || !componentChunk.content) {
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
// tslint:disable-next-line:no-any
|
|
628
|
+
var traverseAST = function (astNode) {
|
|
629
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
630
|
+
if (!astNode || typeof astNode !== 'object') {
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
// Check if this is a DataProvider JSXElement
|
|
634
|
+
if (astNode.type === 'JSXElement' && ((_b = (_a = astNode.openingElement) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.name) === 'DataProvider') {
|
|
635
|
+
var attrs = astNode.openingElement.attributes;
|
|
636
|
+
// Find the params attribute
|
|
637
|
+
var paramsAttr = attrs.find(
|
|
638
|
+
// tslint:disable-next-line:no-any
|
|
639
|
+
function (attr) {
|
|
640
|
+
var _a, _b;
|
|
641
|
+
return attr.type === 'JSXAttribute' &&
|
|
642
|
+
((_a = attr.name) === null || _a === void 0 ? void 0 : _a.name) === 'params' &&
|
|
643
|
+
((_b = attr.value) === null || _b === void 0 ? void 0 : _b.type) === 'JSXExpressionContainer';
|
|
644
|
+
});
|
|
645
|
+
if (paramsAttr) {
|
|
646
|
+
var paramsObj = null;
|
|
647
|
+
// Handle direct ObjectExpression
|
|
648
|
+
if (((_d = (_c = paramsAttr.value) === null || _c === void 0 ? void 0 : _c.expression) === null || _d === void 0 ? void 0 : _d.type) === 'ObjectExpression') {
|
|
649
|
+
paramsObj = paramsAttr.value.expression;
|
|
650
|
+
}
|
|
651
|
+
// Handle useMemo wrapped params: useMemo(() => ({...}), [...])
|
|
652
|
+
else if (((_f = (_e = paramsAttr.value) === null || _e === void 0 ? void 0 : _e.expression) === null || _f === void 0 ? void 0 : _f.type) === 'CallExpression' &&
|
|
653
|
+
((_g = paramsAttr.value.expression.callee) === null || _g === void 0 ? void 0 : _g.name) === 'useMemo' &&
|
|
654
|
+
((_h = paramsAttr.value.expression.arguments) === null || _h === void 0 ? void 0 : _h.length) > 0) {
|
|
655
|
+
var firstArg = paramsAttr.value.expression.arguments[0];
|
|
656
|
+
// Check if it's an arrow function returning an object
|
|
657
|
+
if (firstArg.type === 'ArrowFunctionExpression' &&
|
|
658
|
+
((_j = firstArg.body) === null || _j === void 0 ? void 0 : _j.type) === 'ObjectExpression') {
|
|
659
|
+
paramsObj = firstArg.body;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
if (paramsObj && paramsObj.properties) {
|
|
663
|
+
var properties = paramsObj.properties;
|
|
664
|
+
// Find sorts, filters and queryColumns properties and stringify them
|
|
665
|
+
for (var i = 0; i < properties.length; i++) {
|
|
666
|
+
var prop = properties[i];
|
|
667
|
+
// Get the key name from either Identifier or StringLiteral
|
|
668
|
+
var keyName = ((_k = prop.key) === null || _k === void 0 ? void 0 : _k.type) === 'Identifier'
|
|
669
|
+
? prop.key.name
|
|
670
|
+
: ((_l = prop.key) === null || _l === void 0 ? void 0 : _l.type) === 'StringLiteral'
|
|
671
|
+
? prop.key.value
|
|
672
|
+
: undefined;
|
|
673
|
+
if (prop.type === 'ObjectProperty' &&
|
|
674
|
+
(keyName === 'sorts' || keyName === 'filters' || keyName === 'queryColumns') &&
|
|
675
|
+
((_m = prop.value) === null || _m === void 0 ? void 0 : _m.type) === 'ArrayExpression') {
|
|
676
|
+
// Replace the array with JSON.stringify(array)
|
|
677
|
+
properties[i] = types.objectProperty(prop.key, types.callExpression(types.memberExpression(types.identifier('JSON'), types.identifier('stringify')), [prop.value]));
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
// Recursively traverse all properties
|
|
684
|
+
for (var _i = 0, _o = Object.keys(astNode); _i < _o.length; _i++) {
|
|
685
|
+
var key = _o[_i];
|
|
686
|
+
var value = astNode[key];
|
|
687
|
+
if (Array.isArray(value)) {
|
|
688
|
+
value.forEach(function (item) { return traverseAST(item); });
|
|
689
|
+
}
|
|
690
|
+
else if (typeof value === 'object' && value !== null) {
|
|
691
|
+
traverseAST(value);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
};
|
|
695
|
+
traverseAST(componentChunk.content);
|
|
696
|
+
}
|
|
535
697
|
var createNextComponentDataSourcePlugin = function () {
|
|
536
698
|
var nextComponentDataSourcePlugin = function (structure) { return __awaiter(void 0, void 0, void 0, function () {
|
|
537
699
|
var uidl, chunks, options, dependencies, dataSources, opts, componentConfig, componentChunk, firstDataSourceInfo, firstDataSourceId, dataSource, dsIdPrefix, dsType, existingFileName, existingTableName, _i, _a, key, parts, tableName, sanitizedDsName, sanitizedTableName, fileName, existingPropKeys, wrapContext, dataSource, fileName, generateDataSourceFetcherWithCore, fetcherCode, apiRouteCode, paginationPlugin;
|
|
@@ -703,6 +865,8 @@ var createNextComponentDataSourcePlugin = function () {
|
|
|
703
865
|
}
|
|
704
866
|
}
|
|
705
867
|
}
|
|
868
|
+
// Stringify complex params in DataProvider components before pagination plugin runs
|
|
869
|
+
stringifyComplexParamsInDataProviders(componentChunk);
|
|
706
870
|
paginationPlugin = (0, pagination_plugin_1.createNextArrayMapperPaginationPlugin)();
|
|
707
871
|
return [2 /*return*/, paginationPlugin(structure)];
|
|
708
872
|
});
|