Skip to content
Open
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
15 changes: 14 additions & 1 deletion .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ on:
pull_request:
branches:
- main
- release-*

jobs:
quality_pipeline_lint:
quality_pipeline_lint_and_typecheck:
runs-on: ubuntu-24.04
timeout-minutes: 5

Expand All @@ -25,6 +26,9 @@ jobs:
- name: Lint
run: npm run lint

- name: Type Check
run: npm run test-types

quality_pipeline_nodejs:
runs-on: ubuntu-24.04
timeout-minutes: 5
Expand Down Expand Up @@ -68,6 +72,9 @@ jobs:
- name: Install
run: npm ci && npx playwright install --with-deps chromium

- name: Build
run: npm run build

- name: Test
run: npm run test:chromium

Expand Down Expand Up @@ -98,6 +105,9 @@ jobs:
- name: Install
run: npm ci && npx playwright install --with-deps firefox

- name: Build
run: npm run build

- name: Test
run: npm run test:firefox

Expand All @@ -122,6 +132,9 @@ jobs:
- name: Install
run: npm ci && npx playwright install --with-deps webkit

- name: Build
run: npm run build

- name: Test
run: npm run test:webkit

Expand Down
44 changes: 19 additions & 25 deletions ci/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,29 +1,23 @@
import globals from 'globals';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import js from '@eslint/js';
import { FlatCompat } from '@eslint/eslintrc';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
});
import { defineConfig } from 'eslint/config';
import tseslint from 'typescript-eslint';
import globals from 'globals';

export default [...compat.extends('eslint:recommended'), {
languageOptions: {
globals: {
...globals.browser,
...globals.node
export default defineConfig(
js.configs.recommended,
tseslint.configs.recommended,
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
},
ecmaVersion: 'latest',
sourceType: 'module'
},

ecmaVersion: 'latest',
sourceType: 'module'
},

rules: {
'no-shadow': 2
rules: {
'no-shadow': 'error',
semi: 'error'
}
}
}];
);
56 changes: 15 additions & 41 deletions ci/tools/build-utils.js
Original file line number Diff line number Diff line change
@@ -1,87 +1,62 @@
import path from 'node:path';
import fs from 'node:fs/promises';

import esbuild from 'esbuild';

import { calcIntegrity } from './integrity-utils.js';
import * as stdout from './stdout.js';

const SRC_DIR = 'src';
const DIST_DIR = 'dist';
const MAIN_FILE = 'object-observer.ts';
const ENTRY_POINT = path.join(SRC_DIR, MAIN_FILE);

stdout.writeGreen('Starting the build...');
stdout.writeNewline();
stdout.writeNewline();

try {
await cleanDistDir();
await buildESModule();
await buildCJSModule();
await buildCDNResources();
} catch (e) {
console.error(e);
}

stdout.writeGreen('... build done');
stdout.writeGreen('... done');
stdout.writeNewline();
stdout.writeNewline();

async function cleanDistDir() {
stdout.write(`\tcleaning "dist"...`);
stdout.write(`- cleaning "dist"...`);

await fs.rm(DIST_DIR, { recursive: true, force: true });
await fs.mkdir(DIST_DIR);

stdout.writeGreen('\tOK');
stdout.writeGreen('\t\tOK');
stdout.writeNewline();
}

async function buildESModule() {
stdout.write('\tbuilding ESM resources...');
stdout.write('- building ESM resources...');

await fs.copyFile(path.join(SRC_DIR, 'object-observer.d.ts'), path.join(DIST_DIR, 'object-observer.d.ts'));
await fs.copyFile(path.join(SRC_DIR, 'object-observer.js'), path.join(DIST_DIR, 'object-observer.js'));
await esbuild.build({
entryPoints: [path.join(DIST_DIR, 'object-observer.js')],
const config = {
entryPoints: [ENTRY_POINT],
bundle: true,
outdir: DIST_DIR,
minify: true,
format: 'esm',
minify: false,
sourcemap: true,
sourcesContent: false,
outExtension: { '.js': '.min.js' }
});

stdout.writeGreen('\tOK');
stdout.writeNewline();
}

async function buildCJSModule() {
stdout.write('\tbuilding CJS resources...');

const baseConfig = {
entryPoints: [path.join(SRC_DIR, 'object-observer.js')],
outdir: path.join(DIST_DIR, 'cjs'),
format: 'cjs',
outExtension: { '.js': '.cjs' }
sourcesContent: false
};
await esbuild.build(baseConfig);
await esbuild.build({
...baseConfig,
entryPoints: [path.join(DIST_DIR, 'cjs', 'object-observer.cjs')],
minify: true,
sourcemap: true,
sourcesContent: false,
outExtension: { '.js': '.min.cjs' }
});
await esbuild.build(config);
await esbuild.build({ ...config, minify: true, outExtension: { '.js': '.min.js' } });

stdout.writeGreen('\tOK');
stdout.writeNewline();
}

async function buildCDNResources() {
stdout.write('\tbuilding CDN resources...');
stdout.write('- building CDN resources...');

const CDN_DIR = path.join(DIST_DIR, 'cdn');

await fs.mkdir(CDN_DIR);

const files = (await fs.readdir(DIST_DIR))
Expand All @@ -92,7 +67,6 @@ async function buildCDNResources() {
}

const sriMap = await calcIntegrity(CDN_DIR);

await fs.writeFile('sri.json', JSON.stringify(sriMap, null, '\t'), { encoding: 'utf-8' });

stdout.writeGreen('\tOK');
Expand Down
12 changes: 12 additions & 0 deletions docs/architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Architecture

```mermaid
classDiagram
class ObservableBase {

}

ObservableBase <|-- ObservableObject
ObservableBase <|-- ObservableArray
ObservableBase <|-- ObservableTypedArray
```
Loading
Loading