Skip to content

Commit

Permalink
Merge pull request #319 from terwer/dev
Browse files Browse the repository at this point in the history
feat: support sm.ms in electron
  • Loading branch information
terwer committed Mar 20, 2024
2 parents cf15229 + 7a7cb59 commit 6b95cba
Show file tree
Hide file tree
Showing 99 changed files with 6,061 additions and 3,922 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -39,4 +39,5 @@ yarn-error.log*
.idea
artifacts
cookie.txt
token.txt
token.txt
__pycache__
23 changes: 21 additions & 2 deletions libs/Universal-PicGo-Core/.eslintrc.cjs
@@ -1,4 +1,23 @@
module.exports = {
root: true,
extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"],
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "turbo", "prettier"],

parser: "@typescript-eslint/parser",

plugins: ["@typescript-eslint", "prettier"],

rules: {
// Note: you must disable the base rule as it can report incorrect errors
semi: "off",
quotes: "off",
"no-undef": "off",
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/no-this-alias": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/ban-types": "off",
"turbo/no-undeclared-env-vars": "off",
"prettier/prettier": "error",
},
}
15 changes: 13 additions & 2 deletions libs/Universal-PicGo-Core/README.md
Expand Up @@ -6,12 +6,23 @@ picgo lib for node, browser and electron

```js
// usage
import { UniversalPicGo } from "universal-picgo"

try {
const picgo = new UniversalPicGo()
console.log("picgo =>", picgo)

const result = await picgo.upload()
console.log("upload success =>", result)
} catch (e: any) {
console.error(e)
}
```

## Deps

```
## Congregations! universal-picgo need no deps, it is just pure js code 🎉
├── universal-picgo-store
```

## Dev
Expand All @@ -38,4 +49,4 @@ pnpm test -F universal-picgo

```bash
pnpm publish -F universal-picgo --tag latest
```
```
4 changes: 4 additions & 0 deletions libs/Universal-PicGo-Core/custom.d.ts
@@ -0,0 +1,4 @@
declare module '*.json' {
const value: { [key: string]: any }
export default value
}
8 changes: 7 additions & 1 deletion libs/Universal-PicGo-Core/package.json
@@ -1,6 +1,6 @@
{
"name": "universal-picgo",
"version": "1.5.1",
"version": "1.5.6",
"type": "module",
"description": "picgo lib for node, browser and electron",
"main": "./dist/index.js",
Expand Down Expand Up @@ -30,6 +30,12 @@
"vite-plugin-node-polyfills": "^0.21.0"
},
"dependencies": {
"@picgo/i18n": "^1.0.0",
"axios": "^1.6.8",
"dayjs": "^1.11.10",
"js-yaml": "^4.1.0",
"queue": "^7.0.0",
"universal-picgo-store": "workspace:*",
"zhi-lib-base": "^0.8.0"
},
"publishConfig": {
Expand Down
157 changes: 157 additions & 0 deletions libs/Universal-PicGo-Core/src/core/Lifecycle.ts
@@ -0,0 +1,157 @@
/*
* GNU GENERAL PUBLIC LICENSE
* Version 3, 29 June 2007
*
* Copyright (C) 2024 Terwer, Inc. <https://terwer.space/>
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/

import { EventEmitter } from "../utils/nodePolyfill"
import { ILifecyclePlugins, IPicGo, IPlugin, Undefinable } from "../types"
import { ILogger } from "zhi-lib-base"
import { createContext } from "../utils/createContext"
import { IBuildInEvent } from "../utils/enums"
import { handleUrlEncode } from "../utils/common"

export class Lifecycle extends EventEmitter {
private readonly ctx: IPicGo
private readonly logger: ILogger

constructor(ctx: IPicGo) {
super()
this.ctx = ctx
this.logger = this.ctx.getLogger("lifecycle")
this.logger.debug("lifecycle is inited")
}

async start(input: any[]): Promise<IPicGo> {
// ensure every upload process has an unique context
const ctx = createContext(this.ctx)
try {
// images input
if (!Array.isArray(input)) {
throw new Error("Input must be an array.")
}
ctx.input = input
ctx.output = []

// lifecycle main
await this.beforeTransform(ctx)
await this.doTransform(ctx)
await this.beforeUpload(ctx)
await this.doUpload(ctx)
await this.afterUpload(ctx)
return ctx
} catch (e: any) {
ctx.log.warn(IBuildInEvent.FAILED)
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, -1)
ctx.emit(IBuildInEvent.FAILED, e)
ctx.log.error(e)
// if (ctx.getConfig<Undefinable<string>>("debug")) {
// }
// should throw error to stop the process
throw e
// return ctx
}
}

private async beforeTransform(ctx: IPicGo): Promise<IPicGo> {
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 0)
ctx.emit(IBuildInEvent.BEFORE_TRANSFORM, ctx)
ctx.log.info("Before transform")
await this.handlePlugins(ctx.helper.beforeTransformPlugins, ctx)
return ctx
}

private async doTransform(ctx: IPicGo): Promise<IPicGo> {
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 30)
const type = ctx.getConfig<Undefinable<string>>("picBed.transformer") || "path"
let currentTransformer = type
let transformer = ctx.helper.transformer.get(type)
if (!transformer) {
transformer = ctx.helper.transformer.get("path")
currentTransformer = "path"
ctx.log.warn(`Can't find transformer - ${type}, switch to default transformer - path`)
}
ctx.log.info(`Transforming... Current transformer is [${currentTransformer}]`)
await transformer?.handle(ctx)
return ctx
}

private async beforeUpload(ctx: IPicGo): Promise<IPicGo> {
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 60)
ctx.log.info("Before upload")
ctx.emit(IBuildInEvent.BEFORE_UPLOAD, ctx)
await this.handlePlugins(ctx.helper.beforeUploadPlugins, ctx)
return ctx
}

private async doUpload(ctx: IPicGo): Promise<IPicGo> {
let type =
ctx.getConfig<Undefinable<string>>("picBed.uploader") ||
ctx.getConfig<Undefinable<string>>("picBed.current") ||
"smms"
let uploader = ctx.helper.uploader.get(type)
let currentTransformer = type
if (!uploader) {
type = "smms"
currentTransformer = "smms"
uploader = ctx.helper.uploader.get("smms")
ctx.log.warn(`Can't find uploader - ${type}, switch to default uploader - smms`)
}
ctx.log.info(`Uploading... Current uploader is [${currentTransformer}]`)
await uploader?.handle(ctx)
for (const outputImg of ctx.output) {
outputImg.type = type
}
return ctx
}

private async afterUpload(ctx: IPicGo): Promise<IPicGo> {
ctx.emit(IBuildInEvent.AFTER_UPLOAD, ctx)
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 100)
await this.handlePlugins(ctx.helper.afterUploadPlugins, ctx)
let msg = ""
const length = ctx.output.length
// notice, now picgo builtin uploader will encodeOutputURL by default
const isEncodeOutputURL = ctx.getConfig<Undefinable<boolean>>("settings.encodeOutputURL") === true
for (let i = 0; i < length; i++) {
if (typeof ctx.output[i].imgUrl !== "undefined") {
msg += isEncodeOutputURL ? handleUrlEncode(ctx.output[i].imgUrl!) : ctx.output[i].imgUrl!
if (i !== length - 1) {
msg += "\n"
}
}
delete ctx.output[i].base64Image
delete ctx.output[i].buffer
}
ctx.emit(IBuildInEvent.FINISHED, ctx)
if (msg === "") {
ctx.log.warn("[after-upload] image upload occured an error, please read log for details")
} else {
ctx.log.info(`[after-upload] upload finishied => \n${msg}`)
}
return ctx
}

// ===================================================================================================================

private async handlePlugins(lifeCyclePlugins: ILifecyclePlugins, ctx: IPicGo): Promise<IPicGo> {
const plugins = lifeCyclePlugins.getList()
const pluginNames = lifeCyclePlugins.getIdList()
const lifeCycleName = lifeCyclePlugins.getName()
await Promise.all(
plugins.map(async (plugin: IPlugin, index: number) => {
try {
ctx.log.info(`${lifeCycleName}: ${pluginNames[index]} running`)
await plugin.handle(ctx)
} catch (e) {
ctx.log.error(`${lifeCycleName}: ${pluginNames[index]} error`)
throw e
}
})
)
return ctx
}
}

0 comments on commit 6b95cba

Please sign in to comment.