Skip to content

Commit

Permalink
♻️ 开始尝试monorepo的拆分
Browse files Browse the repository at this point in the history
SharedFlow现在独立到@gaubee/flow模块下
留下PureEvent在@gaubee/util中
PureEvent改进对onDispose的返回捕捉
新增PureEventDelegate,实现事件委托
  • Loading branch information
Gaubee committed Oct 11, 2024
1 parent 406da84 commit 361bc0f
Show file tree
Hide file tree
Showing 44 changed files with 603 additions and 341 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
npm
.npm
69 changes: 13 additions & 56 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,62 +1,19 @@
# @gaubee/util
# Gaubee Standard Library

## [docs 文档](https://jsr.io/@gaubee/util/doc)
[![JSR @gaubee](https://jsr.io/badges/@gaubee)](https://jsr.io/@gaubee)

**install:**
## Packages

```bash
npm install @gaubee/util
pnpm install @gaubee/util
yarn install @gaubee/util
deno add npm:@gaubee/util
bun add @gaubee/util
The following list contains links to the Standard Library's packages and
documentation:

deno add jsr:@gaubee/util
npx jsr add @gaubee/util
yarn dlx jsr add @gaubee/util
pnpm dlx jsr add @gaubee/util
bunx jsr add @gaubee/util
```
| Package | Latest version |
| ----------------------------------- | ------------------------------------------------------------------------- |
| [util](https://jsr.io/@gaubee/util) | [![JSR](https://jsr.io/badges/@gaubee/util)](https://jsr.io/@gaubee/util) |
| [flow](https://jsr.io/@gaubee/flow) | [![JSR](https://jsr.io/badges/@gaubee/flow)](https://jsr.io/@gaubee/flow) |

**example:**
## Releases

```ts
import * as gutil from "@gaubee/util";
import { ag_done } from "@gaubee/util/ag";
import { bigint_gcd } from "@gaubee/util/bigint";
import { iter_map_not_null } from "@gaubee/util/collections";
import { date_add_duration } from "@gaubee/util/date";
import { binary_to_hex_string } from "@gaubee/util/encoding";
import { event_target_on } from "@gaubee/util/event_target";
import { func_remember } from "@gaubee/util/func";
import { Lrc } from "@gaubee/util/lrc";
import { map_get_or_put_async } from "@gaubee/util/map";
import { number_gcd } from "@gaubee/util/number";
import { obj_lazify } from "@gaubee/util/object";
import { delay } from "@gaubee/util/promise";
import { rs_with_controller } from "@gaubee/util/readable_stream";
import { SharedFlow } from "@gaubee/util/shared_flow";

const flow = new SharedFlow<string>();
```

### 简介

1. 个人项目经验,涵盖大量常用函数集合,建议与 deno 的 [`@std/*`](https://jsr.io/@std) 互为补充。
> 这个库中与 @std 系列有一些交集,交集的部分通常是我个人觉得我自己的实现更好:
>
> - 可能是性能上更好
> - 可能是使用体验上更易用好用
> - 可能是条件边界覆盖更全。
1. 这个库不会包含垫片相关的,只要在 esnext 范畴内我都会使用,所以请自行处理垫片相关的问题

### 关于 @gaubee/util/global

> 如果你的项目是 application 级别,不会被其它项目所依赖,那么我建议导入 global 系列,它能大幅度提升你的 js 开发体验。
> 虽然大家都说“不要污染原型链”,但是辩证看待,我建议你在合适的时候,“应该充分利用原型链”。
> 在原型链上扩展函数,通过链式调用,可以达到很多符合直觉的开发体验。
>
> 并且,随着 [shadowrealm 提案](https://github.com/tc39/proposal-shadowrealm) 的演进,未来污染原型链在复杂项目里头就将不再是问题。
由于 jsr 上不允许上传污染全局的模块,所以如果需要,请使用 [npm 版本](https://www.npmjs.com/package/@gaubee/util)
**npm 版本还包含了 commonjs 的直接支持**
Package versions >=1.0.0 follow [Semantic Versioning](https://semver.org/), and
package versions <1.0.0 follow
[this proposal](https://github.com/semver/semver/pull/923).
57 changes: 15 additions & 42 deletions deno.json
Original file line number Diff line number Diff line change
@@ -1,63 +1,36 @@
{
"name": "@gaubee/util",
"version": "0.11.0",
"tasks": {
"build": "deno run -A ./dnt.ts",
"npm": "deno task build && deno task pub-npm",
"pub-npm": "cd npm && npm publish --access public",
"pub": "deno publish --allow-slow-types"
},
"imports": {
"@deno/dnt": "jsr:@deno/dnt@^0.41.3"
},
"exports": {
"./bigint": "./src/bigint.ts",
"./collections": "./src/collections.ts",
"./date": "./src/date.ts",
"./encoding": "./src/encoding.ts",
"./event_target": "./src/event_target.ts",
"./func": "./src/func.ts",
"./generator": "./src/generator.ts",
"./lrc": "./src/lrc.ts",
"./map": "./src/map.ts",
"./number": "./src/number.ts",
"./object": "./src/object.ts",
"./promise": "./src/promise.ts",
"./readable_stream": "./src/readable_stream.ts",
"./shared_flow": "./src/shared_flow.ts",
"./string": "./src/string.ts",
".": "./src/index.ts"
"compilerOptions": {
"lib": [
"deno.window",
"dom",
"ESNext"
]
},
"workspace": [
"flow",
"util"
],
"exclude": [
".npm"
],
"fmt": {
"lineWidth": 120
},
"lint": {
"include": [
"./src"
],
"rules": {
"exclude": [
"no-explicit-any",
"ban-ts-comment"
]
}
},
"publish": {
"include": [
"LICENSE",
"README.md",
"src/**/*.ts"
],
"exclude": [
"src/**/*.bench.ts",
"src/**/*.test.ts"
]
},
"compilerOptions": {
"lib": [
"deno.window",
"dom",
"ESNext"
]
"imports": {
"@deno/dnt": "jsr:@deno/dnt@^0.41.3"
}
}
9 changes: 1 addition & 8 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

110 changes: 68 additions & 42 deletions dnt.ts
Original file line number Diff line number Diff line change
@@ -1,48 +1,74 @@
import fs from "node:fs";
import { fileURLToPath } from "node:url";
import node_path from "node:path";
import { build, emptyDir } from "@deno/dnt";
import denoJson from "./deno.json" with { type: "json" };
await emptyDir("./npm");
import "./src/collections.global.ts";
import { iter_map_not_null } from "@gaubee/util/collections";
import { globToRegExp } from "jsr:@std/path@1/glob-to-regexp";
const root = fileURLToPath(import.meta.resolve("./"));
const rootResolve = (...paths: string[]) => node_path.resolve(root, ...paths);
const outputDir = rootResolve(".npm");

await build({
entryPoints: [
...Object.entries(denoJson.exports).map(([name, path]) => {
return { name, path };
}),
...fs.readdirSync("./src").mapNotNull((name) => {
if (name.endsWith("global.ts")) {
return { name: `./${name.slice(0, -3)}`, path: `./src/${name}` };
}
}),
],
outDir: "./npm",
test: true,
shims: {
deno: { test: true },
},
typeCheck: false,
packageManager: "pnpm",
package: {
// package.json properties
name: denoJson.name,
version: denoJson.version,
description: "个人项目经验,主要特点在于对原型链的扩展,以及对异步的简化",
license: "MIT",
repository: {
type: "git",
url: "git+https://github.com/gaubee/gaubee-util.git",
const buildPackage = async (packageName: string) => {
const denoJson = await import(`./${packageName}/deno.json`, { with: { type: "json" } }).then((j) => j.default);
const packageJson = await import(`./${packageName}/package.json`, { with: { type: "json" } }).then(
(j) => j.default,
() => ({}),
);
await emptyDir(`${outputDir}/${packageName}`);
await build({
entryPoints: [
...Object.entries(denoJson.exports as Record<string, string>).map(([name, path]) => {
return { name, path: rootResolve(packageName, path) };
}),
...iter_map_not_null(fs.readdirSync(`./${packageName}/src`), (name) => {
if (name.endsWith("global.ts")) {
return { name: `./${name.slice(0, -3)}`, path: rootResolve(packageName, "src", name) };
}
}),
],
outDir: `${outputDir}/${packageName}`,
test: false,
shims: {
deno: false,
},
bugs: {
url: "https://github.com/gaubee/gaubee-util/issues",
typeCheck: false,
packageManager: "pnpm",
package: {
// package.json properties
name: denoJson.name,
version: denoJson.version,
license: "MIT",
repository: {
type: "git",
url: `https://github.com/gaubee/std/tree/main/${packageName}`,
},
bugs: {
url: `https://github.com/gaubee/std/issues?q=label%3A${packageName}`,
},
...packageJson,
},
},
compilerOptions: {
target: "ES2023",
lib: ["ESNext"],
},
postBuild() {
// steps to run after building and before running the tests
Deno.copyFileSync("LICENSE", "npm/LICENSE");
Deno.copyFileSync("README.md", "npm/README.md");
},
});
compilerOptions: {
importHelpers: true,
target: "ES2023",
lib: ["ESNext"],
},
async postBuild() {
// steps to run after building and before running the tests
Deno.copyFileSync("LICENSE", `${outputDir}/${packageName}/LICENSE`);
await Deno.copyFile(`${packageName}/README.md`, `${outputDir}/${packageName}/README.md`).catch(() =>
console.warn("%cno found README.md", "color:yellow")
);
},
});
};

if (import.meta.main) {
const isMatchName = globToRegExp(Deno.args[0] ?? "*");
for (const packageName of denoJson.workspace) {
if (isMatchName.test(packageName)) {
console.log(`%cstart building %c./${packageName}/deno.json`, "color:gray", "color:green");
buildPackage(packageName);
}
}
}
22 changes: 22 additions & 0 deletions flow/deno.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"name": "@gaubee/flow",
"version": "0.12.0",
"exports": {
"./shared_flow": "./src/shared_flow.ts",
".": "./src/index.ts"
},
"license": "MIT",
"publish": {
"include": [
"README.md",
"src/**/*.ts"
],
"exclude": [
"src/**/*.bench.ts",
"src/**/*.test.ts"
]
},
"imports": {
"@gaubee/util": "../util"
}
}
11 changes: 11 additions & 0 deletions flow/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"description": "启发于 kotlin 的 flow,针对 js/ts 开发人员设计的接口,通常可以作为一个事件管理器",
"keywords": [
"kotlin",
"flow",
"shared flow",
"stream",
"event",
"evt"
]
}
1 change: 1 addition & 0 deletions flow/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./shared_flow.ts";
2 changes: 1 addition & 1 deletion src/shared_flow.test.ts → flow/src/shared_flow.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import assert from "node:assert";
import { delay } from "./promise.ts";
import { delay } from "@gaubee/util/promise";
import { SharedFlow } from "./shared_flow.ts";

Deno.test("stream", async () => {
Expand Down
Loading

0 comments on commit 361bc0f

Please sign in to comment.