@tablecraft/engine 0.1.0-beta.1 → 0.1.0-beta.2
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/README.md +78 -0
- package/dist/core/aggregationBuilder.d.ts.map +1 -0
- package/dist/core/aggregationBuilder.js.map +1 -0
- package/dist/core/cursorPagination.d.ts.map +1 -0
- package/dist/core/cursorPagination.js.map +1 -0
- package/dist/core/datePresets.d.ts.map +1 -0
- package/dist/core/datePresets.js.map +1 -0
- package/dist/core/dialect.d.ts.map +1 -0
- package/dist/core/dialect.js.map +1 -0
- package/dist/core/fieldSelector.d.ts.map +1 -0
- package/dist/core/fieldSelector.js.map +1 -0
- package/dist/core/filterBuilder.d.ts.map +1 -0
- package/dist/core/filterBuilder.js.map +1 -0
- package/dist/core/filterGroupBuilder.d.ts.map +1 -0
- package/dist/core/filterGroupBuilder.js.map +1 -0
- package/dist/core/groupByBuilder.d.ts.map +1 -0
- package/dist/core/groupByBuilder.js.map +1 -0
- package/dist/core/inputValidator.d.ts.map +1 -0
- package/dist/core/inputValidator.js.map +1 -0
- package/dist/core/metadataBuilder.d.ts.map +1 -0
- package/dist/core/metadataBuilder.js.map +1 -0
- package/dist/core/paginationBuilder.d.ts.map +1 -0
- package/dist/core/paginationBuilder.js.map +1 -0
- package/dist/core/queryBuilder.d.ts.map +1 -0
- package/dist/core/queryBuilder.js.map +1 -0
- package/dist/core/recursiveBuilder.d.ts.map +1 -0
- package/dist/core/recursiveBuilder.js.map +1 -0
- package/dist/core/relationBuilder.d.ts.map +1 -0
- package/dist/core/relationBuilder.js.map +1 -0
- package/dist/core/roleFilter.d.ts.map +1 -0
- package/dist/core/roleFilter.js.map +1 -0
- package/dist/core/searchBuilder.d.ts.map +1 -0
- package/dist/core/searchBuilder.js.map +1 -0
- package/dist/core/softDelete.d.ts.map +1 -0
- package/dist/core/softDelete.js.map +1 -0
- package/dist/core/sortBuilder.d.ts.map +1 -0
- package/dist/core/sortBuilder.js.map +1 -0
- package/dist/core/subqueryBuilder.d.ts.map +1 -0
- package/dist/core/subqueryBuilder.js.map +1 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js.map +1 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/{src/types → types}/engine.js.map +1 -1
- package/dist/types/table.d.ts.map +1 -0
- package/dist/types/table.js.map +1 -0
- package/dist/utils/adapterUtils.d.ts.map +1 -0
- package/dist/utils/adapterUtils.js.map +1 -0
- package/dist/utils/codegen.d.ts.map +1 -0
- package/dist/utils/codegen.js.map +1 -0
- package/dist/utils/export.d.ts.map +1 -0
- package/dist/utils/export.js.map +1 -0
- package/dist/utils/introspect.d.ts.map +1 -0
- package/dist/utils/introspect.js.map +1 -0
- package/dist/utils/openapi.d.ts.map +1 -0
- package/dist/utils/openapi.js.map +1 -0
- package/dist/utils/operators.d.ts.map +1 -0
- package/dist/utils/operators.js.map +1 -0
- package/dist/utils/requestParser.d.ts.map +1 -0
- package/dist/utils/requestParser.js.map +1 -0
- package/dist/utils/responseFormatter.d.ts.map +1 -0
- package/dist/utils/responseFormatter.js.map +1 -0
- package/dist/utils/typedSql.d.ts.map +1 -0
- package/dist/utils/typedSql.js.map +1 -0
- package/package.json +8 -7
- package/dist/src/__tests__/inputValidator.test.d.ts +0 -2
- package/dist/src/__tests__/inputValidator.test.d.ts.map +0 -1
- package/dist/src/__tests__/inputValidator.test.js +0 -205
- package/dist/src/__tests__/inputValidator.test.js.map +0 -1
- package/dist/src/__tests__/metadataBuilder.test.d.ts +0 -2
- package/dist/src/__tests__/metadataBuilder.test.d.ts.map +0 -1
- package/dist/src/__tests__/metadataBuilder.test.js +0 -221
- package/dist/src/__tests__/metadataBuilder.test.js.map +0 -1
- package/dist/src/core/aggregationBuilder.d.ts.map +0 -1
- package/dist/src/core/aggregationBuilder.js.map +0 -1
- package/dist/src/core/cursorPagination.d.ts.map +0 -1
- package/dist/src/core/cursorPagination.js.map +0 -1
- package/dist/src/core/datePresets.d.ts.map +0 -1
- package/dist/src/core/datePresets.js.map +0 -1
- package/dist/src/core/dialect.d.ts.map +0 -1
- package/dist/src/core/dialect.js.map +0 -1
- package/dist/src/core/fieldSelector.d.ts.map +0 -1
- package/dist/src/core/fieldSelector.js.map +0 -1
- package/dist/src/core/filterBuilder.d.ts.map +0 -1
- package/dist/src/core/filterBuilder.js.map +0 -1
- package/dist/src/core/filterGroupBuilder.d.ts.map +0 -1
- package/dist/src/core/filterGroupBuilder.js.map +0 -1
- package/dist/src/core/groupByBuilder.d.ts.map +0 -1
- package/dist/src/core/groupByBuilder.js.map +0 -1
- package/dist/src/core/inputValidator.d.ts.map +0 -1
- package/dist/src/core/inputValidator.js.map +0 -1
- package/dist/src/core/metadataBuilder.d.ts.map +0 -1
- package/dist/src/core/metadataBuilder.js.map +0 -1
- package/dist/src/core/paginationBuilder.d.ts.map +0 -1
- package/dist/src/core/paginationBuilder.js.map +0 -1
- package/dist/src/core/queryBuilder.d.ts.map +0 -1
- package/dist/src/core/queryBuilder.js.map +0 -1
- package/dist/src/core/recursiveBuilder.d.ts.map +0 -1
- package/dist/src/core/recursiveBuilder.js.map +0 -1
- package/dist/src/core/relationBuilder.d.ts.map +0 -1
- package/dist/src/core/relationBuilder.js.map +0 -1
- package/dist/src/core/roleFilter.d.ts.map +0 -1
- package/dist/src/core/roleFilter.js.map +0 -1
- package/dist/src/core/searchBuilder.d.ts.map +0 -1
- package/dist/src/core/searchBuilder.js.map +0 -1
- package/dist/src/core/softDelete.d.ts.map +0 -1
- package/dist/src/core/softDelete.js.map +0 -1
- package/dist/src/core/sortBuilder.d.ts.map +0 -1
- package/dist/src/core/sortBuilder.js.map +0 -1
- package/dist/src/core/subqueryBuilder.d.ts.map +0 -1
- package/dist/src/core/subqueryBuilder.js.map +0 -1
- package/dist/src/core/validator.d.ts.map +0 -1
- package/dist/src/core/validator.js.map +0 -1
- package/dist/src/define.d.ts.map +0 -1
- package/dist/src/define.js.map +0 -1
- package/dist/src/engine.d.ts.map +0 -1
- package/dist/src/engine.js.map +0 -1
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js.map +0 -1
- package/dist/src/types/engine.d.ts.map +0 -1
- package/dist/src/types/table.d.ts.map +0 -1
- package/dist/src/types/table.js.map +0 -1
- package/dist/src/utils/adapterUtils.d.ts.map +0 -1
- package/dist/src/utils/adapterUtils.js.map +0 -1
- package/dist/src/utils/codegen.d.ts.map +0 -1
- package/dist/src/utils/codegen.js.map +0 -1
- package/dist/src/utils/export.d.ts.map +0 -1
- package/dist/src/utils/export.js.map +0 -1
- package/dist/src/utils/introspect.d.ts.map +0 -1
- package/dist/src/utils/introspect.js.map +0 -1
- package/dist/src/utils/openapi.d.ts.map +0 -1
- package/dist/src/utils/openapi.js.map +0 -1
- package/dist/src/utils/operators.d.ts.map +0 -1
- package/dist/src/utils/operators.js.map +0 -1
- package/dist/src/utils/requestParser.d.ts.map +0 -1
- package/dist/src/utils/requestParser.js.map +0 -1
- package/dist/src/utils/responseFormatter.d.ts.map +0 -1
- package/dist/src/utils/responseFormatter.js.map +0 -1
- package/dist/src/utils/typedSql.d.ts.map +0 -1
- package/dist/src/utils/typedSql.js.map +0 -1
- package/dist/test/columnMeta.test.d.ts +0 -2
- package/dist/test/columnMeta.test.d.ts.map +0 -1
- package/dist/test/columnMeta.test.js +0 -92
- package/dist/test/columnMeta.test.js.map +0 -1
- package/dist/test/core/aggregationBuilder.test.d.ts +0 -2
- package/dist/test/core/aggregationBuilder.test.d.ts.map +0 -1
- package/dist/test/core/aggregationBuilder.test.js +0 -64
- package/dist/test/core/aggregationBuilder.test.js.map +0 -1
- package/dist/test/core/filterBuilder.test.d.ts +0 -2
- package/dist/test/core/filterBuilder.test.d.ts.map +0 -1
- package/dist/test/core/filterBuilder.test.js +0 -80
- package/dist/test/core/filterBuilder.test.js.map +0 -1
- package/dist/test/core/paginationBuilder.test.d.ts +0 -2
- package/dist/test/core/paginationBuilder.test.d.ts.map +0 -1
- package/dist/test/core/paginationBuilder.test.js +0 -63
- package/dist/test/core/paginationBuilder.test.js.map +0 -1
- package/dist/test/core/queryBuilder.test.d.ts +0 -2
- package/dist/test/core/queryBuilder.test.d.ts.map +0 -1
- package/dist/test/core/queryBuilder.test.js +0 -92
- package/dist/test/core/queryBuilder.test.js.map +0 -1
- package/dist/test/core/searchBuilder.test.d.ts +0 -2
- package/dist/test/core/searchBuilder.test.d.ts.map +0 -1
- package/dist/test/core/searchBuilder.test.js +0 -68
- package/dist/test/core/searchBuilder.test.js.map +0 -1
- package/dist/test/core/softDelete.test.d.ts +0 -2
- package/dist/test/core/softDelete.test.d.ts.map +0 -1
- package/dist/test/core/softDelete.test.js +0 -60
- package/dist/test/core/softDelete.test.js.map +0 -1
- package/dist/test/core/sortBuilder.test.d.ts +0 -2
- package/dist/test/core/sortBuilder.test.d.ts.map +0 -1
- package/dist/test/core/sortBuilder.test.js +0 -59
- package/dist/test/core/sortBuilder.test.js.map +0 -1
- package/dist/test/core/subqueryBuilder.test.d.ts +0 -2
- package/dist/test/core/subqueryBuilder.test.d.ts.map +0 -1
- package/dist/test/core/subqueryBuilder.test.js +0 -48
- package/dist/test/core/subqueryBuilder.test.js.map +0 -1
- package/dist/test/core/validator.test.d.ts +0 -2
- package/dist/test/core/validator.test.d.ts.map +0 -1
- package/dist/test/core/validator.test.js +0 -81
- package/dist/test/core/validator.test.js.map +0 -1
- package/dist/test/datePresets.test.d.ts +0 -2
- package/dist/test/datePresets.test.d.ts.map +0 -1
- package/dist/test/datePresets.test.js +0 -57
- package/dist/test/datePresets.test.js.map +0 -1
- package/dist/test/errors.test.d.ts +0 -2
- package/dist/test/errors.test.d.ts.map +0 -1
- package/dist/test/errors.test.js +0 -62
- package/dist/test/errors.test.js.map +0 -1
- package/dist/test/inputValidator.test.d.ts +0 -2
- package/dist/test/inputValidator.test.d.ts.map +0 -1
- package/dist/test/inputValidator.test.js +0 -60
- package/dist/test/inputValidator.test.js.map +0 -1
- package/dist/test/metadata.test.d.ts +0 -2
- package/dist/test/metadata.test.d.ts.map +0 -1
- package/dist/test/metadata.test.js +0 -285
- package/dist/test/metadata.test.js.map +0 -1
- package/dist/test/metadataComplete.test.d.ts +0 -2
- package/dist/test/metadataComplete.test.d.ts.map +0 -1
- package/dist/test/metadataComplete.test.js +0 -113
- package/dist/test/metadataComplete.test.js.map +0 -1
- package/dist/test/roleFilter.test.d.ts +0 -2
- package/dist/test/roleFilter.test.d.ts.map +0 -1
- package/dist/test/roleFilter.test.js +0 -53
- package/dist/test/roleFilter.test.js.map +0 -1
- package/dist/test/typedSql.test.d.ts +0 -2
- package/dist/test/typedSql.test.d.ts.map +0 -1
- package/dist/test/typedSql.test.js +0 -63
- package/dist/test/typedSql.test.js.map +0 -1
- package/dist/test/utils/codegen.test.d.ts +0 -2
- package/dist/test/utils/codegen.test.d.ts.map +0 -1
- package/dist/test/utils/codegen.test.js +0 -65
- package/dist/test/utils/codegen.test.js.map +0 -1
- package/dist/test/utils/export.test.d.ts +0 -2
- package/dist/test/utils/export.test.d.ts.map +0 -1
- package/dist/test/utils/export.test.js +0 -54
- package/dist/test/utils/export.test.js.map +0 -1
- package/dist/test/utils/openapi.test.d.ts +0 -2
- package/dist/test/utils/openapi.test.d.ts.map +0 -1
- package/dist/test/utils/openapi.test.js +0 -65
- package/dist/test/utils/openapi.test.js.map +0 -1
- package/dist/test/utils/requestParser.test.d.ts +0 -2
- package/dist/test/utils/requestParser.test.d.ts.map +0 -1
- package/dist/test/utils/requestParser.test.js +0 -89
- package/dist/test/utils/requestParser.test.js.map +0 -1
- package/dist/test/utils/responseFormatter.test.d.ts +0 -2
- package/dist/test/utils/responseFormatter.test.d.ts.map +0 -1
- package/dist/test/utils/responseFormatter.test.js +0 -79
- package/dist/test/utils/responseFormatter.test.js.map +0 -1
- /package/dist/{src/core → core}/aggregationBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/aggregationBuilder.js +0 -0
- /package/dist/{src/core → core}/cursorPagination.d.ts +0 -0
- /package/dist/{src/core → core}/cursorPagination.js +0 -0
- /package/dist/{src/core → core}/datePresets.d.ts +0 -0
- /package/dist/{src/core → core}/datePresets.js +0 -0
- /package/dist/{src/core → core}/dialect.d.ts +0 -0
- /package/dist/{src/core → core}/dialect.js +0 -0
- /package/dist/{src/core → core}/fieldSelector.d.ts +0 -0
- /package/dist/{src/core → core}/fieldSelector.js +0 -0
- /package/dist/{src/core → core}/filterBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/filterBuilder.js +0 -0
- /package/dist/{src/core → core}/filterGroupBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/filterGroupBuilder.js +0 -0
- /package/dist/{src/core → core}/groupByBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/groupByBuilder.js +0 -0
- /package/dist/{src/core → core}/inputValidator.d.ts +0 -0
- /package/dist/{src/core → core}/inputValidator.js +0 -0
- /package/dist/{src/core → core}/metadataBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/metadataBuilder.js +0 -0
- /package/dist/{src/core → core}/paginationBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/paginationBuilder.js +0 -0
- /package/dist/{src/core → core}/queryBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/queryBuilder.js +0 -0
- /package/dist/{src/core → core}/recursiveBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/recursiveBuilder.js +0 -0
- /package/dist/{src/core → core}/relationBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/relationBuilder.js +0 -0
- /package/dist/{src/core → core}/roleFilter.d.ts +0 -0
- /package/dist/{src/core → core}/roleFilter.js +0 -0
- /package/dist/{src/core → core}/searchBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/searchBuilder.js +0 -0
- /package/dist/{src/core → core}/softDelete.d.ts +0 -0
- /package/dist/{src/core → core}/softDelete.js +0 -0
- /package/dist/{src/core → core}/sortBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/sortBuilder.js +0 -0
- /package/dist/{src/core → core}/subqueryBuilder.d.ts +0 -0
- /package/dist/{src/core → core}/subqueryBuilder.js +0 -0
- /package/dist/{src/core → core}/validator.d.ts +0 -0
- /package/dist/{src/core → core}/validator.js +0 -0
- /package/dist/{src/define.d.ts → define.d.ts} +0 -0
- /package/dist/{src/define.js → define.js} +0 -0
- /package/dist/{src/engine.d.ts → engine.d.ts} +0 -0
- /package/dist/{src/engine.js → engine.js} +0 -0
- /package/dist/{src/errors.d.ts → errors.d.ts} +0 -0
- /package/dist/{src/errors.js → errors.js} +0 -0
- /package/dist/{src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{src/index.js → index.js} +0 -0
- /package/dist/{src/types → types}/engine.d.ts +0 -0
- /package/dist/{src/types → types}/engine.js +0 -0
- /package/dist/{src/types → types}/table.d.ts +0 -0
- /package/dist/{src/types → types}/table.js +0 -0
- /package/dist/{src/utils → utils}/adapterUtils.d.ts +0 -0
- /package/dist/{src/utils → utils}/adapterUtils.js +0 -0
- /package/dist/{src/utils → utils}/codegen.d.ts +0 -0
- /package/dist/{src/utils → utils}/codegen.js +0 -0
- /package/dist/{src/utils → utils}/export.d.ts +0 -0
- /package/dist/{src/utils → utils}/export.js +0 -0
- /package/dist/{src/utils → utils}/introspect.d.ts +0 -0
- /package/dist/{src/utils → utils}/introspect.js +0 -0
- /package/dist/{src/utils → utils}/openapi.d.ts +0 -0
- /package/dist/{src/utils → utils}/openapi.js +0 -0
- /package/dist/{src/utils → utils}/operators.d.ts +0 -0
- /package/dist/{src/utils → utils}/operators.js +0 -0
- /package/dist/{src/utils → utils}/requestParser.d.ts +0 -0
- /package/dist/{src/utils → utils}/requestParser.js +0 -0
- /package/dist/{src/utils → utils}/responseFormatter.d.ts +0 -0
- /package/dist/{src/utils → utils}/responseFormatter.js +0 -0
- /package/dist/{src/utils → utils}/typedSql.d.ts +0 -0
- /package/dist/{src/utils → utils}/typedSql.js +0 -0
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { generateDrizzleCode } from '../../src/utils/codegen';
|
|
3
|
-
describe('generateDrizzleCode', () => {
|
|
4
|
-
it('should generate valid-looking TypeScript code', () => {
|
|
5
|
-
const config = {
|
|
6
|
-
name: 'users',
|
|
7
|
-
base: 'users',
|
|
8
|
-
columns: [
|
|
9
|
-
{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true },
|
|
10
|
-
{ name: 'email', type: 'string', hidden: false, sortable: true, filterable: true, dbTransform: ['lower'] },
|
|
11
|
-
{ name: 'name', type: 'string', hidden: false, sortable: true, filterable: true },
|
|
12
|
-
],
|
|
13
|
-
defaultSort: [{ field: 'name', order: 'asc' }],
|
|
14
|
-
pagination: { defaultPageSize: 20, maxPageSize: 50, enabled: true },
|
|
15
|
-
};
|
|
16
|
-
const code = generateDrizzleCode(config);
|
|
17
|
-
expect(code).toContain('import { eq, and, or, asc, desc');
|
|
18
|
-
expect(code).toContain('import { users }');
|
|
19
|
-
expect(code).toContain('export async function queryUsers');
|
|
20
|
-
expect(code).toContain('.select(');
|
|
21
|
-
expect(code).toContain('.from(users)');
|
|
22
|
-
expect(code).toContain('email: sql`lower(users.email)`');
|
|
23
|
-
expect(code).toContain('.orderBy(asc(users.name))');
|
|
24
|
-
expect(code).toContain('.limit(');
|
|
25
|
-
expect(code).toContain('return {');
|
|
26
|
-
});
|
|
27
|
-
it('should include join tables in imports', () => {
|
|
28
|
-
const config = {
|
|
29
|
-
name: 'orders',
|
|
30
|
-
base: 'orders',
|
|
31
|
-
columns: [
|
|
32
|
-
{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true },
|
|
33
|
-
],
|
|
34
|
-
joins: [
|
|
35
|
-
{ table: 'customers', type: 'left', on: 'orders.customerId = customers.id' },
|
|
36
|
-
],
|
|
37
|
-
};
|
|
38
|
-
const code = generateDrizzleCode(config);
|
|
39
|
-
expect(code).toContain('orders, customers');
|
|
40
|
-
expect(code).toContain('.leftJoin(customers');
|
|
41
|
-
});
|
|
42
|
-
it('should include backend conditions', () => {
|
|
43
|
-
const config = {
|
|
44
|
-
name: 'items',
|
|
45
|
-
base: 'items',
|
|
46
|
-
columns: [{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true }],
|
|
47
|
-
backendConditions: [
|
|
48
|
-
{ field: 'active', operator: 'eq', value: true },
|
|
49
|
-
],
|
|
50
|
-
};
|
|
51
|
-
const code = generateDrizzleCode(config);
|
|
52
|
-
expect(code).toContain('eq(items.active, true)');
|
|
53
|
-
});
|
|
54
|
-
it('should include soft delete condition', () => {
|
|
55
|
-
const config = {
|
|
56
|
-
name: 'posts',
|
|
57
|
-
base: 'posts',
|
|
58
|
-
columns: [{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true }],
|
|
59
|
-
softDelete: { field: 'deletedAt', enabled: true },
|
|
60
|
-
};
|
|
61
|
-
const code = generateDrizzleCode(config);
|
|
62
|
-
expect(code).toContain('deletedAt IS NULL');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=codegen.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.test.js","sourceRoot":"","sources":["../../../test/utils/codegen.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"export.test.d.ts","sourceRoot":"","sources":["../../../test/utils/export.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { toCSV, toJSON, exportData } from '../../src/utils/export';
|
|
3
|
-
const config = {
|
|
4
|
-
name: 'orders',
|
|
5
|
-
base: 'orders',
|
|
6
|
-
columns: [
|
|
7
|
-
{ name: 'id', type: 'uuid', label: 'ID', hidden: false, sortable: true, filterable: true },
|
|
8
|
-
{ name: 'total', type: 'number', label: 'Total Amount', hidden: false, sortable: true, filterable: true },
|
|
9
|
-
{ name: 'status', type: 'string', hidden: false, sortable: true, filterable: true },
|
|
10
|
-
{ name: 'secret', type: 'string', hidden: true, sortable: false, filterable: false },
|
|
11
|
-
],
|
|
12
|
-
};
|
|
13
|
-
const data = [
|
|
14
|
-
{ id: '1', total: 100, status: 'active', secret: 'x' },
|
|
15
|
-
{ id: '2', total: 200, status: 'pending', secret: 'y' },
|
|
16
|
-
];
|
|
17
|
-
describe('toCSV', () => {
|
|
18
|
-
it('should generate CSV with headers from visible columns', () => {
|
|
19
|
-
const csv = toCSV(data, config);
|
|
20
|
-
const lines = csv.split('\n');
|
|
21
|
-
expect(lines[0]).toBe('ID,Total Amount,status');
|
|
22
|
-
expect(lines[1]).toBe('1,100,active');
|
|
23
|
-
expect(lines[2]).toBe('2,200,pending');
|
|
24
|
-
// hidden column should not appear
|
|
25
|
-
expect(csv).not.toContain('secret');
|
|
26
|
-
});
|
|
27
|
-
it('should escape fields with commas', () => {
|
|
28
|
-
const d = [{ id: '1', total: 100, status: 'active, pending', secret: '' }];
|
|
29
|
-
const csv = toCSV(d, config);
|
|
30
|
-
expect(csv).toContain('"active, pending"');
|
|
31
|
-
});
|
|
32
|
-
it('should return empty string for empty data', () => {
|
|
33
|
-
expect(toCSV([], config)).toBe('');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
describe('toJSON', () => {
|
|
37
|
-
it('should return pretty-printed JSON', () => {
|
|
38
|
-
const json = toJSON(data, config);
|
|
39
|
-
const parsed = JSON.parse(json);
|
|
40
|
-
expect(parsed).toHaveLength(2);
|
|
41
|
-
expect(parsed[0].id).toBe('1');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe('exportData', () => {
|
|
45
|
-
it('should select csv exporter', () => {
|
|
46
|
-
const result = exportData(data, 'csv', config);
|
|
47
|
-
expect(result).toContain('ID,Total Amount');
|
|
48
|
-
});
|
|
49
|
-
it('should select json exporter', () => {
|
|
50
|
-
const result = exportData(data, 'json', config);
|
|
51
|
-
expect(JSON.parse(result)).toHaveLength(2);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
//# sourceMappingURL=export.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"export.test.js","sourceRoot":"","sources":["../../../test/utils/export.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.test.d.ts","sourceRoot":"","sources":["../../../test/utils/openapi.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { generateOpenApiSpec } from '../../src/utils/openapi';
|
|
3
|
-
describe('generateOpenApiSpec', () => {
|
|
4
|
-
it('should generate a valid OpenAPI 3 spec', () => {
|
|
5
|
-
const config = {
|
|
6
|
-
name: 'orders',
|
|
7
|
-
base: 'orders',
|
|
8
|
-
columns: [
|
|
9
|
-
{ name: 'id', type: 'uuid', label: 'Order ID', hidden: false, sortable: true, filterable: true },
|
|
10
|
-
{ name: 'total', type: 'number', label: 'Total', hidden: false, sortable: true, filterable: true },
|
|
11
|
-
{ name: 'status', type: 'string', hidden: false, sortable: true, filterable: true },
|
|
12
|
-
{ name: 'secret', type: 'string', hidden: true, sortable: false, filterable: false },
|
|
13
|
-
],
|
|
14
|
-
filters: [
|
|
15
|
-
{ field: 'status', operator: 'eq', type: 'dynamic', label: 'Status' },
|
|
16
|
-
{ field: 'archived', operator: 'eq', value: false, type: 'static' },
|
|
17
|
-
],
|
|
18
|
-
search: { fields: ['status'], enabled: true },
|
|
19
|
-
pagination: { defaultPageSize: 25, maxPageSize: 100, enabled: true },
|
|
20
|
-
aggregations: [
|
|
21
|
-
{ alias: 'totalRevenue', type: 'sum', field: 'total' },
|
|
22
|
-
],
|
|
23
|
-
export: { formats: ['csv', 'json'], enabled: true },
|
|
24
|
-
};
|
|
25
|
-
const spec = generateOpenApiSpec(config);
|
|
26
|
-
expect(spec.openapi).toBe('3.0.3');
|
|
27
|
-
expect(spec.info.title).toContain('orders');
|
|
28
|
-
const path = spec.paths['/api/orders'];
|
|
29
|
-
expect(path).toBeDefined();
|
|
30
|
-
expect(path.get).toBeDefined();
|
|
31
|
-
// Check parameters
|
|
32
|
-
const paramNames = path.get.parameters.map((p) => p.name);
|
|
33
|
-
expect(paramNames).toContain('page');
|
|
34
|
-
expect(paramNames).toContain('pageSize');
|
|
35
|
-
expect(paramNames).toContain('sort');
|
|
36
|
-
expect(paramNames).toContain('search');
|
|
37
|
-
expect(paramNames).toContain('export');
|
|
38
|
-
expect(paramNames).toContain('filter[status]');
|
|
39
|
-
// Static filters should not be in params
|
|
40
|
-
expect(paramNames).not.toContain('filter[archived]');
|
|
41
|
-
// Check response schema
|
|
42
|
-
const responseProps = path.get.responses['200'].content['application/json'].schema.properties;
|
|
43
|
-
expect(responseProps.data).toBeDefined();
|
|
44
|
-
expect(responseProps.meta).toBeDefined();
|
|
45
|
-
expect(responseProps.aggregations).toBeDefined();
|
|
46
|
-
// Hidden columns should not be in schema
|
|
47
|
-
const dataProps = responseProps.data.items.properties;
|
|
48
|
-
expect(dataProps.id).toBeDefined();
|
|
49
|
-
expect(dataProps.total).toBeDefined();
|
|
50
|
-
expect(dataProps.secret).toBeUndefined();
|
|
51
|
-
});
|
|
52
|
-
it('should include security when access is configured', () => {
|
|
53
|
-
const config = {
|
|
54
|
-
name: 'admin',
|
|
55
|
-
base: 'admin',
|
|
56
|
-
columns: [{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true }],
|
|
57
|
-
access: { roles: ['admin'] },
|
|
58
|
-
};
|
|
59
|
-
const spec = generateOpenApiSpec(config);
|
|
60
|
-
const getSec = spec.paths['/api/admin'].get;
|
|
61
|
-
expect(getSec.security).toBeDefined();
|
|
62
|
-
expect(spec.components.securitySchemes.bearerAuth).toBeDefined();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=openapi.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.test.js","sourceRoot":"","sources":["../../../test/utils/openapi.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"requestParser.test.d.ts","sourceRoot":"","sources":["../../../test/utils/requestParser.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { parseRequest } from '../../src/utils/requestParser';
|
|
3
|
-
describe('parseRequest', () => {
|
|
4
|
-
it('should parse page and pageSize', () => {
|
|
5
|
-
const result = parseRequest({ page: '2', pageSize: '25' });
|
|
6
|
-
expect(result.page).toBe(2);
|
|
7
|
-
expect(result.pageSize).toBe(25);
|
|
8
|
-
});
|
|
9
|
-
it('should parse sort with desc prefix', () => {
|
|
10
|
-
const result = parseRequest({ sort: '-createdAt,name' });
|
|
11
|
-
expect(result.sort).toEqual([
|
|
12
|
-
{ field: 'createdAt', order: 'desc' },
|
|
13
|
-
{ field: 'name', order: 'asc' },
|
|
14
|
-
]);
|
|
15
|
-
});
|
|
16
|
-
it('should parse sort with asc prefix', () => {
|
|
17
|
-
const result = parseRequest({ sort: '+name' });
|
|
18
|
-
expect(result.sort).toEqual([{ field: 'name', order: 'asc' }]);
|
|
19
|
-
});
|
|
20
|
-
it('should parse simple filter[field]=value as eq', () => {
|
|
21
|
-
const result = parseRequest({ 'filter[status]': 'active' });
|
|
22
|
-
expect(result.filters).toEqual({
|
|
23
|
-
status: { operator: 'eq', value: 'active' },
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
it('should parse filter[field][operator]=value', () => {
|
|
27
|
-
const result = parseRequest({ 'filter[amount][gte]': '100' });
|
|
28
|
-
expect(result.filters).toEqual({
|
|
29
|
-
amount: { operator: 'gte', value: 100 },
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
it('should coerce numeric values', () => {
|
|
33
|
-
const result = parseRequest({ 'filter[price]': '42.5' });
|
|
34
|
-
expect(result.filters.price.value).toBe(42.5);
|
|
35
|
-
});
|
|
36
|
-
it('should coerce boolean values', () => {
|
|
37
|
-
const result = parseRequest({ 'filter[active]': 'true' });
|
|
38
|
-
expect(result.filters.active.value).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
it('should coerce null values', () => {
|
|
41
|
-
const result = parseRequest({ 'filter[deleted]': 'null' });
|
|
42
|
-
expect(result.filters.deleted.value).toBeNull();
|
|
43
|
-
});
|
|
44
|
-
it('should coerce comma-separated to array', () => {
|
|
45
|
-
const result = parseRequest({ 'filter[status][in]': 'active,pending,done' });
|
|
46
|
-
expect(result.filters.status.value).toEqual(['active', 'pending', 'done']);
|
|
47
|
-
});
|
|
48
|
-
it('should parse search', () => {
|
|
49
|
-
const result = parseRequest({ search: 'hello world' });
|
|
50
|
-
expect(result.search).toBe('hello world');
|
|
51
|
-
});
|
|
52
|
-
it('should parse export format', () => {
|
|
53
|
-
const result = parseRequest({ export: 'csv' });
|
|
54
|
-
expect(result.export).toBe('csv');
|
|
55
|
-
});
|
|
56
|
-
it('should ignore invalid export format', () => {
|
|
57
|
-
const result = parseRequest({ export: 'xml' });
|
|
58
|
-
expect(result.export).toBeUndefined();
|
|
59
|
-
});
|
|
60
|
-
it('should parse includeDeleted', () => {
|
|
61
|
-
const result = parseRequest({ includeDeleted: 'true' });
|
|
62
|
-
expect(result.includeDeleted).toBe(true);
|
|
63
|
-
});
|
|
64
|
-
it('should reject invalid operators in filters', () => {
|
|
65
|
-
const result = parseRequest({ 'filter[x][INVALID]': '1' });
|
|
66
|
-
expect(result.filters).toBeUndefined();
|
|
67
|
-
});
|
|
68
|
-
it('should handle URLSearchParams', () => {
|
|
69
|
-
const sp = new URLSearchParams();
|
|
70
|
-
sp.set('page', '3');
|
|
71
|
-
sp.set('filter[name]', 'test');
|
|
72
|
-
sp.set('sort', '-id');
|
|
73
|
-
const result = parseRequest(sp);
|
|
74
|
-
expect(result.page).toBe(3);
|
|
75
|
-
expect(result.filters.name).toEqual({ operator: 'eq', value: 'test' });
|
|
76
|
-
expect(result.sort).toEqual([{ field: 'id', order: 'desc' }]);
|
|
77
|
-
});
|
|
78
|
-
it('should return empty for no params', () => {
|
|
79
|
-
const result = parseRequest({});
|
|
80
|
-
expect(result.page).toBeUndefined();
|
|
81
|
-
expect(result.pageSize).toBeUndefined();
|
|
82
|
-
expect(result.sort).toBeUndefined();
|
|
83
|
-
expect(result.filters).toBeUndefined();
|
|
84
|
-
expect(result.search).toBeUndefined();
|
|
85
|
-
expect(result.export).toBeUndefined();
|
|
86
|
-
expect(result.includeDeleted).toBe(false);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
//# sourceMappingURL=requestParser.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"requestParser.test.js","sourceRoot":"","sources":["../../../test/utils/requestParser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"responseFormatter.test.d.ts","sourceRoot":"","sources":["../../../test/utils/responseFormatter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { applyJsTransforms, formatResponse, registerTransform, } from '../../src/utils/responseFormatter';
|
|
3
|
-
const baseConfig = {
|
|
4
|
-
name: 'test',
|
|
5
|
-
base: 'test',
|
|
6
|
-
columns: [
|
|
7
|
-
{ name: 'id', type: 'uuid', hidden: false, sortable: true, filterable: true },
|
|
8
|
-
{ name: 'name', type: 'string', hidden: false, sortable: true, filterable: true, jsTransform: ['uppercase'] },
|
|
9
|
-
{ name: 'email', type: 'string', hidden: false, sortable: true, filterable: true, jsTransform: ['lowercase', 'trim'] },
|
|
10
|
-
{ name: 'secret', type: 'string', hidden: true, sortable: false, filterable: false },
|
|
11
|
-
{ name: 'code', type: 'string', hidden: false, sortable: true, filterable: true, jsTransform: ['slice(0,3)'] },
|
|
12
|
-
{ name: 'createdAt', type: 'date', hidden: false, sortable: true, filterable: true, jsTransform: ['formatDate'] },
|
|
13
|
-
],
|
|
14
|
-
};
|
|
15
|
-
describe('applyJsTransforms', () => {
|
|
16
|
-
it('should apply uppercase transform', () => {
|
|
17
|
-
const data = [{ id: '1', name: 'alice', email: 'test@test.com', code: 'ABCDEF', createdAt: '2024-01-01' }];
|
|
18
|
-
const result = applyJsTransforms(data, baseConfig);
|
|
19
|
-
expect(result[0].name).toBe('ALICE');
|
|
20
|
-
});
|
|
21
|
-
it('should chain lowercase + trim', () => {
|
|
22
|
-
const data = [{ id: '1', name: 'Bob', email: ' TEST@TEST.COM ', code: 'XYZ', createdAt: '2024-01-01' }];
|
|
23
|
-
const result = applyJsTransforms(data, baseConfig);
|
|
24
|
-
expect(result[0].email).toBe('test@test.com');
|
|
25
|
-
});
|
|
26
|
-
it('should apply slice(0,3)', () => {
|
|
27
|
-
const data = [{ id: '1', name: 'x', email: 'x', code: 'ABCDEF', createdAt: '2024-01-01' }];
|
|
28
|
-
const result = applyJsTransforms(data, baseConfig);
|
|
29
|
-
expect(result[0].code).toBe('ABC');
|
|
30
|
-
});
|
|
31
|
-
it('should apply formatDate', () => {
|
|
32
|
-
const d = new Date('2024-06-15T12:00:00Z');
|
|
33
|
-
const data = [{ id: '1', name: 'x', email: 'x', code: 'x', createdAt: d }];
|
|
34
|
-
const result = applyJsTransforms(data, baseConfig);
|
|
35
|
-
expect(result[0].createdAt).toBe('2024-06-15T12:00:00.000Z');
|
|
36
|
-
});
|
|
37
|
-
it('should not mutate original data', () => {
|
|
38
|
-
const original = [{ id: '1', name: 'alice', email: 'x', code: 'x', createdAt: 'x' }];
|
|
39
|
-
const result = applyJsTransforms(original, baseConfig);
|
|
40
|
-
expect(original[0].name).toBe('alice');
|
|
41
|
-
expect(result[0].name).toBe('ALICE');
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
describe('registerTransform', () => {
|
|
45
|
-
it('should allow custom transforms', () => {
|
|
46
|
-
registerTransform('reverse', (v) => typeof v === 'string' ? v.split('').reverse().join('') : v);
|
|
47
|
-
const cfg = {
|
|
48
|
-
name: 'test',
|
|
49
|
-
base: 'test',
|
|
50
|
-
columns: [
|
|
51
|
-
{ name: 'val', type: 'string', hidden: false, sortable: true, filterable: true, jsTransform: ['reverse'] },
|
|
52
|
-
],
|
|
53
|
-
};
|
|
54
|
-
const data = [{ val: 'hello' }];
|
|
55
|
-
const result = applyJsTransforms(data, cfg);
|
|
56
|
-
expect(result[0].val).toBe('olleh');
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
describe('formatResponse', () => {
|
|
60
|
-
it('should strip hidden columns and apply transforms', () => {
|
|
61
|
-
const data = [
|
|
62
|
-
{ id: '1', name: 'alice', email: ' BOB@X.COM ', secret: 'hide_me', code: 'ABCDEF', createdAt: '2024-01-01' },
|
|
63
|
-
];
|
|
64
|
-
const meta = { total: 1, page: 1, pageSize: 10, totalPages: 1 };
|
|
65
|
-
const result = formatResponse(data, meta, baseConfig);
|
|
66
|
-
expect(result.data[0].secret).toBeUndefined();
|
|
67
|
-
expect(result.data[0].name).toBe('ALICE');
|
|
68
|
-
expect(result.data[0].email).toBe('bob@x.com');
|
|
69
|
-
expect(result.meta.total).toBe(1);
|
|
70
|
-
});
|
|
71
|
-
it('should include aggregations when provided', () => {
|
|
72
|
-
const data = [];
|
|
73
|
-
const meta = { total: 0, page: 1, pageSize: 10, totalPages: 0 };
|
|
74
|
-
const aggs = { totalRevenue: 5000 };
|
|
75
|
-
const result = formatResponse(data, meta, baseConfig, aggs);
|
|
76
|
-
expect(result.aggregations).toEqual({ totalRevenue: 5000 });
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
//# sourceMappingURL=responseFormatter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"responseFormatter.test.js","sourceRoot":"","sources":["../../../test/utils/responseFormatter.test.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|