Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ module.exports = {
sourceType: 'module',
project: ['./tsconfig.eslint.json'],
},
plugins: ['@typescript-eslint', 'prettier', 'jest', 'jest-formatting'],
plugins: ['@typescript-eslint', 'prettier', 'jest', 'jest-formatting', 'unused-imports'],
rules: {
/**********/
/** Style */
Expand Down Expand Up @@ -49,12 +49,23 @@ module.exports = {
},
],

// Enforce import type for type-only imports
'@typescript-eslint/consistent-type-imports': [
'error',
{ prefer: 'type-imports', fixStyle: 'separate-type-imports' },
],

/***********************************/
/* Stricter rules than airbnb-base */
/***********************************/

// No unused variables
'@typescript-eslint/no-unused-vars': ['error'],
// No unused variables and imports
'@typescript-eslint/no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'error',
'unused-imports/no-unused-vars': [
'error',
{ vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' },
],

// No reassigning function parameters
'no-param-reassign': ['error', { props: false }],
Expand Down Expand Up @@ -116,10 +127,10 @@ module.exports = {
},
})),
{
// ESM package requiring .js extensions for imports
// mcp-server: disable import extensions rule (TypeScript handles module resolution)
files: ['packages/mcp-server/**/*'],
rules: {
'import/extensions': ['error', 'ignorePackages'],
'import/extensions': 'off',
},
},
],
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
"eslint-plugin-import": "^2.27.4",
"eslint-plugin-jest": "^27.2.1",
"eslint-plugin-jest-formatting": "^3.1.0",
"eslint-plugin-unused-imports": "^2.0.0",
"eslint-plugin-prettier": "^4.2.1",
"fishery": "^2.2.2",
"husky": "^8.0.3",
Expand Down
6 changes: 4 additions & 2 deletions packages/_example/src/forest/agent.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { AgentOptions, createAgent } from '@forestadmin/agent';
import type { Schema } from './typings';
import type { AgentOptions } from '@forestadmin/agent';

import { createAgent } from '@forestadmin/agent';
import { createMongoDataSource } from '@forestadmin/datasource-mongo';
import { createMongooseDataSource } from '@forestadmin/datasource-mongoose';
import { createSequelizeDataSource } from '@forestadmin/datasource-sequelize';
Expand All @@ -16,7 +19,6 @@ import customizeReview from './customizations/review';
import customizeSales from './customizations/sale';
import customizeStore from './customizations/store';
import createTypicode from './datasources/typicode';
import { Schema } from './typings';
import mongoose, { connectionString } from '../connections/mongoose';
import sequelizeMsSql from '../connections/sequelize-mssql';
import sequelizeMySql from '../connections/sequelize-mysql';
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/account.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { AccountCustomizer } from '../typings';
import type { AccountCustomizer } from '../typings';

export default (collection: AccountCustomizer) =>
collection.addManyToOneRelation('store', 'store', { foreignKey: 'storeId' });
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/card.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CardCustomizer } from '../typings';
import type { CardCustomizer } from '../typings';

export default (collection: CardCustomizer) =>
collection
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/comment.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CommentCustomizer } from '../typings';
import type { CommentCustomizer } from '../typings';

export default (collection: CommentCustomizer) =>
collection.addManyToOneRelation('post', 'post', { foreignKey: 'postId' });
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/customer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { CustomerCustomizer } from '../typings';
import type { CustomerCustomizer } from '../typings';

export default (collection: CustomerCustomizer) =>
collection
Expand Down
3 changes: 2 additions & 1 deletion packages/_example/src/forest/customizations/dvd.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { DvdCustomizer } from '../typings';

import sequelizeMsSql from '../../connections/sequelize-mssql';
import { DvdCustomizer } from '../typings';

export default (collection: DvdCustomizer) =>
collection
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/owner.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { OwnerCustomizer } from '../typings';
import type { OwnerCustomizer } from '../typings';

export default (collection: OwnerCustomizer) =>
collection
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/post.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PostCustomizer } from '../typings';
import type { PostCustomizer } from '../typings';

export default (collection: PostCustomizer) =>
collection
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/rental.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { RentalCustomizer } from '../typings';
import type { RentalCustomizer } from '../typings';

export default (collection: RentalCustomizer) =>
collection
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/review.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ReviewCustomizer } from '../typings';
import type { ReviewCustomizer } from '../typings';

export default (collection: ReviewCustomizer) =>
collection.addManyToOneRelation('store', 'store', { foreignKey: 'storeId' });
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/sale.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SalesCustomizer } from '../typings';
import type { SalesCustomizer } from '../typings';

export default (collection: SalesCustomizer) =>
collection.addManyToOneRelation('customerAccount', 'account', {
Expand Down
2 changes: 1 addition & 1 deletion packages/_example/src/forest/customizations/store.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { StoreCustomizer } from '../typings';
import type { StoreCustomizer } from '../typings';

export default (collection: StoreCustomizer) =>
collection
Expand Down
6 changes: 3 additions & 3 deletions packages/_example/src/forest/datasources/typicode.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
/* eslint-disable max-classes-per-file */

import {
import type {
AggregateResult,
Aggregation,
BaseCollection,
BaseDataSource,
Caller,
DataSource,
DataSourceFactory,
Expand All @@ -14,6 +12,8 @@ import {
Projection,
RecordData,
} from '@forestadmin/datasource-toolkit';

import { BaseCollection, BaseDataSource } from '@forestadmin/datasource-toolkit';
import superagent from 'superagent';

class TypicodeCollection extends BaseCollection {
Expand Down
7 changes: 5 additions & 2 deletions packages/_example/src/frameworks/nest-fastify-v8.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
/* eslint-disable max-classes-per-file */
import { Controller, Get, INestApplication, Module } from '@nestjs/common';
import type { INestApplication } from '@nestjs/common';
import type { NestFastifyApplication } from '@nestjs/platform-fastify';

import { Controller, Get, Module } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { FastifyAdapter } from '@nestjs/platform-fastify';

@Controller('/')
class BasicController {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { PlainFieldOption } from './types';

import ActionField from './action-field';
import { PlainFieldOption } from './types';

export default class ActionFieldCheckboxGroup<TypingsSchema> extends ActionField<TypingsSchema> {
getOptions(): PlainFieldOption[] | undefined {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { PlainFieldOption } from './types';

import ActionField from './action-field';
import { PlainFieldOption } from './types';

export default class ActionFieldDropdown<TypingsSchema> extends ActionField<TypingsSchema> {
getOptions(): PlainFieldOption[] | undefined {
Expand Down
3 changes: 2 additions & 1 deletion packages/agent-client/src/action-fields/action-field-enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ export default class ActionFieldEnum<TypingsSchema> extends ActionField<TypingsS
}

async select(option: string) {
if (!this.getOptions().some(o => o === option))
if (!this.getOptions().some(o => o === option)) {
throw new Error(`Option "${option}" not found in field "${this.name}"`);
}

await this.setValue(option);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { PlainFieldOption } from './types';

import FieldGetter from './field-getter';
import { PlainFieldOption } from './types';

export default class ActionFieldMultipleChoice extends FieldGetter {
getOptions(): PlainFieldOption[] | undefined {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { PlainFieldOption } from './types';

import ActionField from './action-field';
import { PlainFieldOption } from './types';

export default class ActionFieldRadioGroup<TypingsSchema> extends ActionField<TypingsSchema> {
async getOptions(): Promise<PlainFieldOption[] | undefined> {
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/action-fields/action-field.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import FieldFormStates from './field-form-states';
import type FieldFormStates from './field-form-states';

export default abstract class ActionField<TypingsSchema> {
private readonly fieldsFormStates: FieldFormStates<TypingsSchema>;
Expand Down
6 changes: 3 additions & 3 deletions packages/agent-client/src/action-fields/field-form-states.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
import type { PlainField, ResponseBody } from './types';
import type HttpRequester from '../http-requester';
import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';

import ActionFieldMultipleChoice from './action-field-multiple-choice';
import FieldGetter from './field-getter';
import { PlainField, ResponseBody } from './types';
import HttpRequester from '../http-requester';

export default class FieldFormStates<TypingsSchema> {
private readonly fields: FieldGetter[];
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/action-fields/field-getter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PlainField } from './types';
import type { PlainField } from './types';

export default class FieldGetter {
private readonly plainField: PlainField;
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/action-fields/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';

export type ResponseBody = {
fields: PlainField[];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';

import ActionLayoutElement from './action-layout-element';
import { NotFoundElementError, NotRightElementError } from './errors';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {
import type {
ForestServerActionFormElementFieldReference,
ForestServerActionFormLayoutElement,
} from '@forestadmin/forestadmin-client';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ForestServerActionFormElementFieldReference } from '@forestadmin/forestadmin-client';
import type { ForestServerActionFormElementFieldReference } from '@forestadmin/forestadmin-client';

export default class ActionLayoutInput {
protected readonly layoutItem: ForestServerActionFormElementFieldReference;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';

import ActionLayoutElementsContainer from './action-layout-container';
import { NotRightElementError } from './errors';
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/action-layout/errors.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// eslint-disable-next-line max-classes-per-file
import { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';
import type { ForestServerActionFormLayoutElement } from '@forestadmin/forestadmin-client';

export class NotRightElementError extends Error {
constructor(elementName: string, element: ForestServerActionFormLayoutElement) {
Expand Down
4 changes: 2 additions & 2 deletions packages/agent-client/src/domains/action.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type ActionField from '../action-fields/action-field';
import type FieldFormStates from '../action-fields/field-form-states';
import type HttpRequester from '../http-requester';

import ActionField from '../action-fields/action-field';
import ActionFieldCheckbox from '../action-fields/action-field-checkbox';
import ActionFieldCheckboxGroup from '../action-fields/action-field-checkbox-group';
import ActionFieldColorPicker from '../action-fields/action-field-color-picker';
Expand All @@ -13,7 +14,6 @@ import ActionFieldNumberList from '../action-fields/action-field-number-list';
import ActionFieldRadioGroup from '../action-fields/action-field-radio-group';
import ActionFieldString from '../action-fields/action-field-string';
import ActionFieldStringList from '../action-fields/action-field-string-list';
import FieldFormStates from '../action-fields/field-form-states';
import ActionLayoutRoot from '../action-layout/action-layout-root';

export type BaseActionContext = {
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/domains/chart.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {
import type {
DistributionChart,
LeaderboardChart,
ObjectiveChart,
Expand Down
4 changes: 2 additions & 2 deletions packages/agent-client/src/domains/collection-chart.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
import type { ChartInterface } from './chart';
import type {
DistributionChart,
LeaderboardChart,
ObjectiveChart,
Expand All @@ -7,7 +8,6 @@ import {
ValueChart,
} from '@forestadmin/datasource-toolkit';

import { ChartInterface } from './chart';
import HttpRequester from '../http-requester';

export type ChartContext = {
Expand Down
13 changes: 8 additions & 5 deletions packages/agent-client/src/domains/collection.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import type { ActionEndpointsByCollection, BaseActionContext } from './action';
import type HttpRequester from '../http-requester';
import type { ExportOptions, LiveQueryOptions, SelectOptions } from '../types';
import type { WriteStream } from 'fs';

import { WriteStream } from 'fs';

import Action, { ActionEndpointsByCollection, BaseActionContext } from './action';
import Action from './action';
import CollectionChart from './collection-chart';
import Relation from './relation';
import Segment from './segment';
import FieldFormStates from '../action-fields/field-form-states';
import HttpRequester from '../http-requester';
import QuerySerializer from '../query-serializer';

export default class Collection<TypingsSchema> extends CollectionChart {
Expand Down Expand Up @@ -106,7 +106,10 @@ export default class Collection<TypingsSchema> extends CollectionChart {
fields: { name: string; type: string; operators: string[] }[];
}> {
const result = await this.httpRequester.query<{
collections: { name: string; fields: { name: string; type: string; operators: string[] }[] }[];
collections: {
name: string;
fields: { name: string; type: string; operators: string[] }[];
}[];
}>({
method: 'post',
path: '/forest/_internal/capabilities',
Expand Down
6 changes: 3 additions & 3 deletions packages/agent-client/src/domains/remote-agent-client.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { RawTreeWithSources } from '@forestadmin/forestadmin-client';
import type { ActionEndpointsByCollection } from './action';
import type HttpRequester from '../http-requester';
import type { RawTreeWithSources } from '@forestadmin/forestadmin-client';

import { ActionEndpointsByCollection } from './action';
import Chart from './chart';
import Collection from './collection';
import HttpRequester from '../http-requester';

export type SmartActionPermissionsOverride = Partial<{
triggerEnabled: boolean;
Expand Down
3 changes: 1 addition & 2 deletions packages/agent-client/src/domains/segment.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import type HttpRequester from '../http-requester';
import type { ExportOptions, LiveQueryOptions, SelectOptions } from '../types';

import { WriteStream } from 'node:fs';
import type { WriteStream } from 'node:fs';

import QuerySerializer from '../query-serializer';

Expand Down
3 changes: 2 additions & 1 deletion packages/agent-client/src/http-requester.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { WriteStream } from 'fs';
import type { WriteStream } from 'fs';

import { Deserializer } from 'jsonapi-serializer';
import superagent from 'superagent';

Expand Down
6 changes: 4 additions & 2 deletions packages/agent-client/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { ActionEndpointsByCollection } from './domains/action';
import RemoteAgentClient, { PermissionsOverride } from './domains/remote-agent-client';
import type { ActionEndpointsByCollection } from './domains/action';
import type { PermissionsOverride } from './domains/remote-agent-client';

import RemoteAgentClient from './domains/remote-agent-client';
import HttpRequester from './http-requester';

// eslint-disable-next-line import/prefer-default-export
Expand Down
2 changes: 1 addition & 1 deletion packages/agent-client/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { PlainFilter, PlainSortClause } from '@forestadmin/datasource-toolkit';
import type { PlainFilter, PlainSortClause } from '@forestadmin/datasource-toolkit';

export type BaseOptions = {
filters?: PlainFilter['conditionTree']; // Filters to apply to the query
Expand Down
Loading
Loading