Skip to content
Merged
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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ jobs:
run: pnpm run typecheck
- name: Format Check
run: pnpm run format
- name: Lint Check (Packages)
run: pnpm run lint:packages
- name: Lint Check
run: pnpm run lint
- name: Test (Packages)
run: pnpm run test:packages
- name: Build (Packages)
Expand Down
4 changes: 0 additions & 4 deletions .husky/pre-commit

This file was deleted.

151 changes: 151 additions & 0 deletions eslint.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
import js from "@eslint/js";
import { defineConfig } from "eslint/config";
import react from "eslint-plugin-react";
import simpleImportSort from "eslint-plugin-simple-import-sort";
import solid from "eslint-plugin-solid/configs/typescript";
import globals from "globals";
import tseslint from "typescript-eslint";

export default defineConfig([
//
// ────────────────────────────────
// 1️⃣ Ignored paths (like .eslintignore)
// ────────────────────────────────
//
{
ignores: [
"**/build/**",
"**/coverage/**",
"**/dist/**",
"**/node_modules/**",
// TODO: Revisit these sections later so that we can have linting across everything
"examples/todo-server-tests/features/**",
"examples/todo-angular-featurehub-app/**",
"plugins/**",
],
},
//
// ────────────────────────────────
// 2️⃣ Base recommended rules
// ────────────────────────────────
//
js.configs.recommended,
tseslint.configs.strict,
//
// ────────────────────────────────
// 3️⃣ Import sorting
// ────────────────────────────────
//
{
plugins: {
"simple-import-sort": simpleImportSort,
},
rules: {
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
},
},
//
// ────────────────────────────────
// 3️⃣ TypeScript (General - Base rules)
// ────────────────────────────────
//
{
files: ["**/*.ts", "**/*.tsx"],
languageOptions: {
parser: tseslint.parser,
parserOptions: {
sourceType: "module",
ecmaFeatures: { jsx: true },
},
globals: {
...globals.browser,
...globals.es2022,
...globals.node,
},
},
rules: {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-extraneous-class": "warn",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unused-vars": [
"error",
{
args: "after-used",
argsIgnorePattern: "^_",
caughtErrors: "all",
caughtErrorsIgnorePattern: "^_",
},
],
},
},
//
// ────────────────────────────────
// 5️⃣ React
// ────────────────────────────────
//
{
files: [
"packages/react/**/*.{jsx,ts,tsx}",
"examples/todo-frontend-react-sdk/**/*.{jsx,ts,tsx}",
"examples/todo-frontend-react-typescript/**/*.{jsx,ts,tsx}",
"examples/todo-frontend-react-typescript-catch-and-release/**/*.{jsx,ts,tsx}",
"examples/todo-frontend-react-typescript-feature-override/**/*.{jsx,ts,tsx}",
],
...react.configs.flat.recommended,
...react.configs.flat["jsx-runtime"],
languageOptions: {
...react.configs.flat.recommended.languageOptions,
globals: {
...globals.browser,
},
},
},
//
// ────────────────────────────────
// 6️⃣ SolidJS
// ────────────────────────────────
//
{
files: [
"packages/solid/**/*.{jsx,ts,tsx}",
"examples/todo-frontend-solid-sdk/**/*.{jsx,ts,tsx}",
],
languageOptions: {
parser: tseslint.parser,
parserOptions: {
sourceType: "module",
ecmaFeatures: { jsx: true },
},
globals: {
...globals.browser,
},
},
plugins: {
solid: {
meta: solid.plugins.solid.meta,
// @ts-expect-error — Solid config typing is a bit off
rules: solid.plugins.solid.rules,
},
},
rules: solid.rules,
},
//
// ────────────────────────────────
// 7️⃣ Test environment (Vitest)
// ────────────────────────────────
//
{
files: ["**/*.test.{ts,tsx}", "**/*.spec.{ts,tsx}"],
languageOptions: {
globals: {
...globals.node,
...globals.vitest,
},
},
rules: {
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/naming-convention": "off",
},
},
]);
9 changes: 5 additions & 4 deletions examples/todo-backend-typescript/app/app.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
import * as restify from "restify";
import * as corsMiddleware from "restify-cors-middleware2";
import type { ITodoApiController } from "./generated-interface";
import { TodoApiRouter, Todo } from "./generated-interface";
import {
type ClientContext,
EdgeFeatureHubConfig,
Expand All @@ -13,6 +9,11 @@ import {
StrategyAttributeDeviceName,
StrategyAttributePlatformName,
} from "featurehub-javascript-node-sdk";
import * as restify from "restify";
import * as corsMiddleware from "restify-cors-middleware2";

import type { ITodoApiController } from "./generated-interface";
import { Todo, TodoApiRouter } from "./generated-interface";

if (
process.env["FEATUREHUB_EDGE_URL"] === undefined ||
Expand Down
7 changes: 0 additions & 7 deletions examples/todo-backend-typescript/app/generated-interface.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
/* tslint:disable:no-string-literal */
/* tslint:disable:member-ordering */
/* tslint:disable:quotemark */
/* tslint:disable:typedef-whitespace */

import type { Request, Server } from "restify";
import * as restify from "restify";

export class Todo {
"id": string;

"title": string;

"resolved": boolean;
}

Expand Down
10 changes: 6 additions & 4 deletions examples/todo-frontend-react-sdk/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { useEffect, useState } from "react";
import reactLogo from "./assets/react.svg";
import "./App.css";

import { FeatureHub, useFeature, useFeatureHub } from "featurehub-react-sdk";
import { useEffect, useState } from "react";

import reactLogo from "./assets/react.svg";

const SAMPLE_TEXT =
"This is some random text content which may have its case-sensitivity modified.";
Expand Down Expand Up @@ -66,10 +68,10 @@ function Main() {
return (
<div className="App">
<div>
<a href="https://vitejs.dev" target="_blank">
<a href="https://vitejs.dev" target="_blank" rel="noreferrer">
<img src="/vite.svg" className="logo" alt="Vite logo" />
</a>
<a href="https://reactjs.org" target="_blank">
<a href="https://reactjs.org" target="_blank" rel="noreferrer">
<img src={reactLogo} className="logo react" alt="React logo" />
</a>
</div>
Expand Down
4 changes: 3 additions & 1 deletion examples/todo-frontend-react-sdk/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import "./index.css";

import React from "react";
import ReactDOM from "react-dom/client";

import App from "./App";
import "./index.css";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<React.StrictMode>
Expand Down
2 changes: 1 addition & 1 deletion examples/todo-frontend-react-sdk/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from "vite";

// https://vitejs.dev/config/
export default defineConfig({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import * as React from "react";
import { Configuration, type Todo, TodoServiceApi } from "./api";
import "./App.css";

import globalAxios from "axios";
import {
type ClientContext,
EdgeFeatureHubConfig,
Readyness,
fhLog,
Readyness,
} from "featurehub-javascript-client-sdk";
import * as React from "react";

import { Configuration, type Todo, TodoServiceApi } from "./api";

let todoApi: TodoServiceApi;
let initialized = false;
Expand Down Expand Up @@ -49,7 +51,7 @@ class ConfigData {
fhApiKey: string = "";
}

class App extends React.Component<{}, { todos: TodoData }> {
class App extends React.Component<object, { todos: TodoData }> {
private titleInput!: HTMLInputElement;

constructor() {
Expand Down Expand Up @@ -151,7 +153,7 @@ class App extends React.Component<{}, { todos: TodoData }> {
</div>
);
}
let buttonStyle = {
const buttonStyle = {
color: this.state.todos.buttonColour,
};
return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* tslint:disable */
/* eslint-disable */

/**
* Todo
* Sample todo-api
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import "./index.css";

import * as React from "react";
import { createRoot } from "react-dom/client";

import App from "./App";
import registerServiceWorker from "./registerServiceWorker";
import "./index.css";

const container = document.getElementById("root");
const root = createRoot(container!);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";

export default defineConfig({
plugins: [react()],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import * as React from "react";
import { Configuration, TodoServiceApi, type Todo } from "./api";
import "./App.css";

import globalAxios from "axios";
import {
type ClientContext,
EdgeFeatureHubConfig,
FeatureHubPollingClient,
Readyness,
w3cBaggageHeader,
FeatureHubPollingClient,
} from "featurehub-javascript-client-sdk";
import * as React from "react";

import { Configuration, type Todo, TodoServiceApi } from "./api";

let todoApi: TodoServiceApi;
let initialized = false;
Expand Down Expand Up @@ -67,7 +69,7 @@ globalAxios.interceptors.request.use(
},
);

class App extends React.Component<{}, { todos: TodoData }> {
class App extends React.Component<object, { todos: TodoData }> {
private titleInput!: HTMLInputElement;
private userName!: HTMLInputElement;

Expand Down Expand Up @@ -172,7 +174,7 @@ class App extends React.Component<{}, { todos: TodoData }> {
);
}

let buttonStyle = {
const buttonStyle = {
color: this.state.todos.buttonColour,
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* tslint:disable */
/* eslint-disable */

/**
* Todo
* Sample todo-api
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import "./index.css";

import * as React from "react";
import { createRoot } from "react-dom/client";

import App from "./App";
import registerServiceWorker from "./registerServiceWorker";
import "./index.css";

const container = document.getElementById("root");
const root = createRoot(container!);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";

export default defineConfig({
plugins: [react()],
Expand Down
Loading
Loading