@teleporthq/teleport-plugin-next-data-source 0.42.34 → 0.43.0
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__/ecommerce-product-out-of-stock.test.ts +112 -0
- package/__tests__/fetchers.test.ts +0 -42
- package/__tests__/filter-utils.test.ts +149 -0
- package/__tests__/mocks.ts +0 -12
- package/__tests__/utils.test.ts +0 -2
- package/dist/cjs/array-mapper-registry.d.ts +2 -0
- package/dist/cjs/array-mapper-registry.d.ts.map +1 -1
- package/dist/cjs/array-mapper-registry.js +9 -1
- package/dist/cjs/array-mapper-registry.js.map +1 -1
- package/dist/cjs/count-fetchers.d.ts +2 -2
- package/dist/cjs/count-fetchers.d.ts.map +1 -1
- package/dist/cjs/count-fetchers.js +5 -5
- package/dist/cjs/count-fetchers.js.map +1 -1
- package/dist/cjs/data-source-fetchers.d.ts +2 -1
- package/dist/cjs/data-source-fetchers.d.ts.map +1 -1
- package/dist/cjs/data-source-fetchers.js +11 -9
- 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 +1 -1
- 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.js +1 -1
- package/dist/cjs/fetchers/csv-file.js.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.js +1 -1
- package/dist/cjs/fetchers/google-sheets.js.map +1 -1
- package/dist/cjs/fetchers/index.d.ts +2 -1
- package/dist/cjs/fetchers/index.d.ts.map +1 -1
- package/dist/cjs/fetchers/index.js +8 -5
- package/dist/cjs/fetchers/index.js.map +1 -1
- package/dist/cjs/fetchers/javascript.js +1 -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.js +1 -1
- 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 +2 -2
- package/dist/cjs/fetchers/postgresql.js.map +1 -1
- package/dist/cjs/fetchers/raw-query.d.ts +18 -0
- package/dist/cjs/fetchers/raw-query.d.ts.map +1 -0
- package/dist/cjs/fetchers/raw-query.js +70 -0
- package/dist/cjs/fetchers/raw-query.js.map +1 -0
- 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.js +1 -1
- package/dist/cjs/fetchers/rest-api.js.map +1 -1
- package/dist/cjs/fetchers/supabase.d.ts.map +1 -1
- package/dist/cjs/fetchers/supabase.js +62 -2
- package/dist/cjs/fetchers/supabase.js.map +1 -1
- package/dist/cjs/fetchers/teleport.d.ts +7 -0
- package/dist/cjs/fetchers/teleport.d.ts.map +1 -0
- package/dist/cjs/fetchers/teleport.js +63 -0
- package/dist/cjs/fetchers/teleport.js.map +1 -0
- 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/filter-utils.d.ts +13 -0
- package/dist/cjs/filter-utils.d.ts.map +1 -0
- package/dist/cjs/filter-utils.js +95 -0
- package/dist/cjs/filter-utils.js.map +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +112 -9
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/pagination-plugin.d.ts.map +1 -1
- package/dist/cjs/pagination-plugin.js +389 -128
- package/dist/cjs/pagination-plugin.js.map +1 -1
- package/dist/cjs/sort-utils.d.ts +10 -0
- package/dist/cjs/sort-utils.d.ts.map +1 -0
- package/dist/cjs/sort-utils.js +141 -0
- package/dist/cjs/sort-utils.js.map +1 -0
- package/dist/cjs/transformations/blog-post.d.ts +7 -0
- package/dist/cjs/transformations/blog-post.d.ts.map +1 -0
- package/dist/cjs/transformations/blog-post.js +13 -0
- package/dist/cjs/transformations/blog-post.js.map +1 -0
- package/dist/cjs/transformations/ecommerce-product.d.ts +7 -0
- package/dist/cjs/transformations/ecommerce-product.d.ts.map +1 -0
- package/dist/cjs/transformations/ecommerce-product.js +13 -0
- package/dist/cjs/transformations/ecommerce-product.js.map +1 -0
- package/dist/cjs/transformations/index.d.ts +26 -0
- package/dist/cjs/transformations/index.d.ts.map +1 -0
- package/dist/cjs/transformations/index.js +81 -0
- package/dist/cjs/transformations/index.js.map +1 -0
- package/dist/cjs/transformations/shared-utils.d.ts +7 -0
- package/dist/cjs/transformations/shared-utils.d.ts.map +1 -0
- package/dist/cjs/transformations/shared-utils.js +13 -0
- package/dist/cjs/transformations/shared-utils.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/utils.d.ts +30 -1
- package/dist/cjs/utils.d.ts.map +1 -1
- package/dist/cjs/utils.js +173 -10
- package/dist/cjs/utils.js.map +1 -1
- package/dist/esm/array-mapper-registry.d.ts +2 -0
- package/dist/esm/array-mapper-registry.d.ts.map +1 -1
- package/dist/esm/array-mapper-registry.js +9 -1
- package/dist/esm/array-mapper-registry.js.map +1 -1
- package/dist/esm/count-fetchers.d.ts +2 -2
- package/dist/esm/count-fetchers.d.ts.map +1 -1
- package/dist/esm/count-fetchers.js +4 -4
- package/dist/esm/count-fetchers.js.map +1 -1
- package/dist/esm/data-source-fetchers.d.ts +2 -1
- package/dist/esm/data-source-fetchers.d.ts.map +1 -1
- package/dist/esm/data-source-fetchers.js +10 -9
- 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 +1 -1
- 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 +1 -1
- package/dist/esm/fetchers/clickhouse.js.map +1 -1
- package/dist/esm/fetchers/csv-file.js +1 -1
- package/dist/esm/fetchers/csv-file.js.map +1 -1
- package/dist/esm/fetchers/firestore.js +1 -1
- package/dist/esm/fetchers/firestore.js.map +1 -1
- package/dist/esm/fetchers/google-sheets.js +1 -1
- package/dist/esm/fetchers/google-sheets.js.map +1 -1
- package/dist/esm/fetchers/index.d.ts +2 -1
- package/dist/esm/fetchers/index.d.ts.map +1 -1
- package/dist/esm/fetchers/index.js +2 -1
- package/dist/esm/fetchers/index.js.map +1 -1
- package/dist/esm/fetchers/javascript.js +1 -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.js +1 -1
- 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 +3 -3
- package/dist/esm/fetchers/postgresql.js.map +1 -1
- package/dist/esm/fetchers/raw-query.d.ts +18 -0
- package/dist/esm/fetchers/raw-query.d.ts.map +1 -0
- package/dist/esm/fetchers/raw-query.js +65 -0
- package/dist/esm/fetchers/raw-query.js.map +1 -0
- package/dist/esm/fetchers/redis.js +1 -1
- 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.js +1 -1
- package/dist/esm/fetchers/rest-api.js.map +1 -1
- package/dist/esm/fetchers/supabase.d.ts.map +1 -1
- package/dist/esm/fetchers/supabase.js +63 -3
- package/dist/esm/fetchers/supabase.js.map +1 -1
- package/dist/esm/fetchers/teleport.d.ts +7 -0
- package/dist/esm/fetchers/teleport.d.ts.map +1 -0
- package/dist/esm/fetchers/teleport.js +57 -0
- package/dist/esm/fetchers/teleport.js.map +1 -0
- 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/filter-utils.d.ts +13 -0
- package/dist/esm/filter-utils.d.ts.map +1 -0
- package/dist/esm/filter-utils.js +66 -0
- package/dist/esm/filter-utils.js.map +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +113 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pagination-plugin.d.ts.map +1 -1
- package/dist/esm/pagination-plugin.js +389 -128
- package/dist/esm/pagination-plugin.js.map +1 -1
- package/dist/esm/sort-utils.d.ts +10 -0
- package/dist/esm/sort-utils.d.ts.map +1 -0
- package/dist/esm/sort-utils.js +113 -0
- package/dist/esm/sort-utils.js.map +1 -0
- package/dist/esm/transformations/blog-post.d.ts +7 -0
- package/dist/esm/transformations/blog-post.d.ts.map +1 -0
- package/dist/esm/transformations/blog-post.js +9 -0
- package/dist/esm/transformations/blog-post.js.map +1 -0
- package/dist/esm/transformations/ecommerce-product.d.ts +7 -0
- package/dist/esm/transformations/ecommerce-product.d.ts.map +1 -0
- package/dist/esm/transformations/ecommerce-product.js +9 -0
- package/dist/esm/transformations/ecommerce-product.js.map +1 -0
- package/dist/esm/transformations/index.d.ts +26 -0
- package/dist/esm/transformations/index.d.ts.map +1 -0
- package/dist/esm/transformations/index.js +74 -0
- package/dist/esm/transformations/index.js.map +1 -0
- package/dist/esm/transformations/shared-utils.d.ts +7 -0
- package/dist/esm/transformations/shared-utils.d.ts.map +1 -0
- package/dist/esm/transformations/shared-utils.js +9 -0
- package/dist/esm/transformations/shared-utils.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/utils.d.ts +30 -1
- package/dist/esm/utils.d.ts.map +1 -1
- package/dist/esm/utils.js +170 -9
- package/dist/esm/utils.js.map +1 -1
- package/package.json +6 -5
- package/src/array-mapper-registry.ts +13 -0
- package/src/count-fetchers.ts +5 -5
- package/src/data-source-fetchers.ts +15 -11
- package/src/fetchers/airtable.ts +54 -8
- package/src/fetchers/clickhouse.ts +25 -19
- package/src/fetchers/csv-file.ts +2 -2
- package/src/fetchers/firestore.ts +2 -2
- package/src/fetchers/google-sheets.ts +2 -2
- package/src/fetchers/index.ts +6 -5
- package/src/fetchers/javascript.ts +2 -2
- package/src/fetchers/mariadb.ts +27 -12
- package/src/fetchers/mongodb.ts +2 -2
- package/src/fetchers/mysql.ts +27 -12
- package/src/fetchers/postgresql.ts +31 -18
- package/src/fetchers/raw-query.ts +178 -0
- package/src/fetchers/redis.ts +2 -2
- package/src/fetchers/redshift.ts +14 -10
- package/src/fetchers/rest-api.ts +2 -2
- package/src/fetchers/supabase.ts +97 -14
- package/src/fetchers/teleport.ts +485 -0
- package/src/fetchers/turso.ts +15 -7
- package/src/filter-utils.ts +111 -0
- package/src/index.ts +146 -6
- package/src/pagination-plugin.ts +547 -308
- package/src/sort-utils.ts +150 -0
- package/src/transformations/blog-post.ts +128 -0
- package/src/transformations/ecommerce-product.ts +173 -0
- package/src/transformations/index.ts +97 -0
- package/src/transformations/shared-utils.ts +271 -0
- package/src/utils.ts +227 -11
- package/dist/cjs/fetchers/static-collection.d.ts +0 -7
- package/dist/cjs/fetchers/static-collection.d.ts.map +0 -1
- package/dist/cjs/fetchers/static-collection.js +0 -25
- package/dist/cjs/fetchers/static-collection.js.map +0 -1
- package/dist/esm/fetchers/static-collection.d.ts +0 -7
- package/dist/esm/fetchers/static-collection.d.ts.map +0 -1
- package/dist/esm/fetchers/static-collection.js +0 -19
- package/dist/esm/fetchers/static-collection.js.map +0 -1
- package/src/fetchers/static-collection.ts +0 -231
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { generateDateFormatterCode, generateSortFilterHelperCode, generateSafeJSONParseCode, } from '../utils';
|
|
2
|
-
export var validateStaticCollectionConfig = function (config) {
|
|
3
|
-
if (!config || typeof config !== 'object') {
|
|
4
|
-
return { isValid: false, error: 'Config must be a valid object' };
|
|
5
|
-
}
|
|
6
|
-
if (!config.data || !Array.isArray(config.data)) {
|
|
7
|
-
return { isValid: false, error: 'Data must be an array' };
|
|
8
|
-
}
|
|
9
|
-
return { isValid: true };
|
|
10
|
-
};
|
|
11
|
-
export var generateStaticCollectionFetcher = function (config) {
|
|
12
|
-
var staticConfig = config;
|
|
13
|
-
return "const data = ".concat(JSON.stringify(staticConfig.data || []), "\n\n").concat(generateSafeJSONParseCode(), "\n\n").concat(generateDateFormatterCode(), "\n\n").concat(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");
|
|
14
|
-
};
|
|
15
|
-
// tslint:disable-next-line:variable-name
|
|
16
|
-
export var generateStaticCollectionCountFetcher = function (_config) {
|
|
17
|
-
return "\nasync function getCount(req, res) {\n try {\n const { query, queryColumns, filters } = req.query\n const fakeReq = { query: { query, queryColumns, filters }, method: 'GET' }\n let result = null\n let statusCode = 200\n \n const fakeRes = {\n status: (code) => {\n statusCode = code\n return fakeRes\n },\n json: (data) => {\n result = data\n return fakeRes\n },\n }\n \n await handler(fakeReq, fakeRes)\n \n if (statusCode !== 200 || !result || !result.success) {\n return res.status(500).json({\n success: false,\n error: 'Failed to get data for counting',\n timestamp: Date.now()\n })\n }\n \n const count = Array.isArray(result.data) ? result.data.length : 0\n \n return res.status(200).json({\n success: true,\n count: count,\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";
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=static-collection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static-collection.js","sourceRoot":"","sources":["../../../src/fetchers/static-collection.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,GAC1B,MAAM,UAAU,CAAA;AAEjB,MAAM,CAAC,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;AAMD,MAAM,CAAC,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,yBAAyB,EAAE,iBAE3B,yBAAyB,EAAE,iBAE3B,4BAA4B,EAAE,ypKAmJ/B,CAAA;AACD,CAAC,CAAA;AAED,yCAAyC;AACzC,MAAM,CAAC,IAAM,oCAAoC,GAAG,UAAC,OAAY;IAC/D,OAAO,knCA6CR,CAAA;AACD,CAAC,CAAA"}
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
generateDateFormatterCode,
|
|
3
|
-
generateSortFilterHelperCode,
|
|
4
|
-
generateSafeJSONParseCode,
|
|
5
|
-
} from '../utils'
|
|
6
|
-
|
|
7
|
-
export const validateStaticCollectionConfig = (
|
|
8
|
-
config: Record<string, unknown>
|
|
9
|
-
): { isValid: boolean; error?: string } => {
|
|
10
|
-
if (!config || typeof config !== 'object') {
|
|
11
|
-
return { isValid: false, error: 'Config must be a valid object' }
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (!config.data || !Array.isArray(config.data)) {
|
|
15
|
-
return { isValid: false, error: 'Data must be an array' }
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return { isValid: true }
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface StaticCollectionConfig {
|
|
22
|
-
data?: unknown[]
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const generateStaticCollectionFetcher = (config: Record<string, unknown>): string => {
|
|
26
|
-
const staticConfig = config as StaticCollectionConfig
|
|
27
|
-
return `const data = ${JSON.stringify(staticConfig.data || [])}
|
|
28
|
-
|
|
29
|
-
${generateSafeJSONParseCode()}
|
|
30
|
-
|
|
31
|
-
${generateDateFormatterCode()}
|
|
32
|
-
|
|
33
|
-
${generateSortFilterHelperCode()}
|
|
34
|
-
|
|
35
|
-
export default async function handler(req, res) {
|
|
36
|
-
try {
|
|
37
|
-
const { query, queryColumns, limit, page, perPage, sortBy, sortOrder, filters, sorts, offset: offsetParam } = req.query
|
|
38
|
-
|
|
39
|
-
let filteredData = [...data]
|
|
40
|
-
|
|
41
|
-
if (query) {
|
|
42
|
-
const searchQuery = query.toLowerCase()
|
|
43
|
-
|
|
44
|
-
if (queryColumns) {
|
|
45
|
-
const columns = safeJSONParse(queryColumns)
|
|
46
|
-
filteredData = filteredData.filter((item) => {
|
|
47
|
-
return columns.some((col) => {
|
|
48
|
-
const value = getNestedValue(item, col)
|
|
49
|
-
return value && String(value).toLowerCase().includes(searchQuery)
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
} else {
|
|
53
|
-
filteredData = filteredData.filter((item) => {
|
|
54
|
-
try {
|
|
55
|
-
const stringified = JSON.stringify(item).toLowerCase()
|
|
56
|
-
return stringified.includes(searchQuery)
|
|
57
|
-
} catch {
|
|
58
|
-
return false
|
|
59
|
-
}
|
|
60
|
-
})
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (filters) {
|
|
65
|
-
const parsedFilters = safeJSONParse(filters)
|
|
66
|
-
|
|
67
|
-
if (Array.isArray(parsedFilters)) {
|
|
68
|
-
filteredData = filteredData.filter((item) => {
|
|
69
|
-
return parsedFilters.every((filter) => {
|
|
70
|
-
if (!filter.source || filter.destination === undefined) return true
|
|
71
|
-
|
|
72
|
-
const field = filter.source
|
|
73
|
-
const value = getNestedValue(item, field)
|
|
74
|
-
const target = filter.destination
|
|
75
|
-
const operand = filter.operand || '='
|
|
76
|
-
|
|
77
|
-
if (Array.isArray(target)) {
|
|
78
|
-
if (operand === '!=') {
|
|
79
|
-
return !target.includes(value)
|
|
80
|
-
}
|
|
81
|
-
return target.includes(value)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return compareValues(value, target, operand)
|
|
85
|
-
})
|
|
86
|
-
})
|
|
87
|
-
} else {
|
|
88
|
-
filteredData = filteredData.filter((item) => {
|
|
89
|
-
return Object.entries(parsedFilters).every(([key, value]) => {
|
|
90
|
-
const itemValue = getNestedValue(item, key)
|
|
91
|
-
if (Array.isArray(value)) {
|
|
92
|
-
return value.includes(itemValue)
|
|
93
|
-
}
|
|
94
|
-
return compareValues(itemValue, value, '=')
|
|
95
|
-
})
|
|
96
|
-
})
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (sorts) {
|
|
101
|
-
const parsedSorts = safeJSONParse(sorts)
|
|
102
|
-
if (Array.isArray(parsedSorts) && parsedSorts.length > 0) {
|
|
103
|
-
filteredData.sort((a, b) => {
|
|
104
|
-
for (const sort of parsedSorts) {
|
|
105
|
-
if (!sort.field) continue
|
|
106
|
-
const aVal = getNestedValue(a, sort.field)
|
|
107
|
-
const bVal = getNestedValue(b, sort.field)
|
|
108
|
-
const sortOrderValue = sort.order?.toLowerCase() === 'desc' ? -1 : 1
|
|
109
|
-
|
|
110
|
-
let comparison = 0
|
|
111
|
-
if (aVal === null || aVal === undefined) {
|
|
112
|
-
comparison = bVal === null || bVal === undefined ? 0 : -1
|
|
113
|
-
} else if (bVal === null || bVal === undefined) {
|
|
114
|
-
comparison = 1
|
|
115
|
-
} else if (typeof aVal === 'number' && typeof bVal === 'number') {
|
|
116
|
-
comparison = aVal - bVal
|
|
117
|
-
} else if (aVal instanceof Date && bVal instanceof Date) {
|
|
118
|
-
comparison = aVal.getTime() - bVal.getTime()
|
|
119
|
-
} else {
|
|
120
|
-
const aStr = String(aVal)
|
|
121
|
-
const bStr = String(bVal)
|
|
122
|
-
if (aStr < bStr) comparison = -1
|
|
123
|
-
else if (aStr > bStr) comparison = 1
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (comparison !== 0) return comparison * sortOrderValue
|
|
127
|
-
}
|
|
128
|
-
return 0
|
|
129
|
-
})
|
|
130
|
-
}
|
|
131
|
-
} else if (sortBy) {
|
|
132
|
-
filteredData.sort((a, b) => {
|
|
133
|
-
const aVal = getNestedValue(a, sortBy)
|
|
134
|
-
const bVal = getNestedValue(b, sortBy)
|
|
135
|
-
const sortOrderValue = sortOrder?.toLowerCase() === 'desc' ? -1 : 1
|
|
136
|
-
|
|
137
|
-
let comparison = 0
|
|
138
|
-
if (aVal === null || aVal === undefined) {
|
|
139
|
-
comparison = bVal === null || bVal === undefined ? 0 : -1
|
|
140
|
-
} else if (bVal === null || bVal === undefined) {
|
|
141
|
-
comparison = 1
|
|
142
|
-
} else if (typeof aVal === 'number' && typeof bVal === 'number') {
|
|
143
|
-
comparison = aVal - bVal
|
|
144
|
-
} else if (aVal instanceof Date && bVal instanceof Date) {
|
|
145
|
-
comparison = aVal.getTime() - bVal.getTime()
|
|
146
|
-
} else {
|
|
147
|
-
const aStr = String(aVal)
|
|
148
|
-
const bStr = String(bVal)
|
|
149
|
-
if (aStr < bStr) comparison = -1
|
|
150
|
-
else if (aStr > bStr) comparison = 1
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return comparison * sortOrderValue
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const limitValue = limit || perPage
|
|
158
|
-
const offsetValue = offsetParam !== undefined ? parseInt(offsetParam) : (page && perPage ? (parseInt(page) - 1) * parseInt(perPage) : 0)
|
|
159
|
-
|
|
160
|
-
if (limitValue) {
|
|
161
|
-
filteredData = filteredData.slice(offsetValue, offsetValue + parseInt(limitValue))
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const safeData = JSON.parse(JSON.stringify(filteredData, dateReplacer))
|
|
165
|
-
|
|
166
|
-
return res.status(200).json({
|
|
167
|
-
success: true,
|
|
168
|
-
data: safeData,
|
|
169
|
-
timestamp: Date.now()
|
|
170
|
-
})
|
|
171
|
-
} catch (error) {
|
|
172
|
-
console.error('Static collection fetch error:', error)
|
|
173
|
-
return res.status(500).json({
|
|
174
|
-
success: false,
|
|
175
|
-
error: error.message || 'Failed to fetch data',
|
|
176
|
-
timestamp: Date.now()
|
|
177
|
-
})
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
`
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// tslint:disable-next-line:variable-name
|
|
184
|
-
export const generateStaticCollectionCountFetcher = (_config: any): string => {
|
|
185
|
-
return `
|
|
186
|
-
async function getCount(req, res) {
|
|
187
|
-
try {
|
|
188
|
-
const { query, queryColumns, filters } = req.query
|
|
189
|
-
const fakeReq = { query: { query, queryColumns, filters }, method: 'GET' }
|
|
190
|
-
let result = null
|
|
191
|
-
let statusCode = 200
|
|
192
|
-
|
|
193
|
-
const fakeRes = {
|
|
194
|
-
status: (code) => {
|
|
195
|
-
statusCode = code
|
|
196
|
-
return fakeRes
|
|
197
|
-
},
|
|
198
|
-
json: (data) => {
|
|
199
|
-
result = data
|
|
200
|
-
return fakeRes
|
|
201
|
-
},
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
await handler(fakeReq, fakeRes)
|
|
205
|
-
|
|
206
|
-
if (statusCode !== 200 || !result || !result.success) {
|
|
207
|
-
return res.status(500).json({
|
|
208
|
-
success: false,
|
|
209
|
-
error: 'Failed to get data for counting',
|
|
210
|
-
timestamp: Date.now()
|
|
211
|
-
})
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const count = Array.isArray(result.data) ? result.data.length : 0
|
|
215
|
-
|
|
216
|
-
return res.status(200).json({
|
|
217
|
-
success: true,
|
|
218
|
-
count: count,
|
|
219
|
-
timestamp: Date.now()
|
|
220
|
-
})
|
|
221
|
-
} catch (error) {
|
|
222
|
-
console.error('Error getting count:', error)
|
|
223
|
-
return res.status(500).json({
|
|
224
|
-
success: false,
|
|
225
|
-
error: error.message || 'Failed to get count',
|
|
226
|
-
timestamp: Date.now()
|
|
227
|
-
})
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
`
|
|
231
|
-
}
|