Initial commit

This commit is contained in:
Tyler 2022-04-27 20:48:21 -04:00
commit edaa99a45f
28 changed files with 21629 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

9
.idea/MinifyAPI.iml generated Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

14
.idea/deployment.xml generated Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" remoteFilesAllowedToDisappearOnAutoupload="false">
<serverData>
<paths name="Dev">
<serverdata>
<mappings>
<mapping local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
</component>
</project>

8
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SwUserDefinedSpecifications">
<option name="specTypeByUrl">
<map />
</option>
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/MinifyAPI.iml" filepath="$PROJECT_DIR$/.idea/MinifyAPI.iml" />
</modules>
</component>
</project>

15
Dockerfile Normal file
View File

@ -0,0 +1,15 @@
FROM node:alpine AS frontend-builder
RUN cd frontend && npm install && npm run build
FROM golang:alpine AS builder
COPY --from=frontend-builder frontend/dist frontend/dist
RUN go build -o minify
FROM alpine
COPY --from=builder minify /usr/bin/minify
CMD ["/usr/bin/minify"]

5
LICENSE.txt Normal file
View File

@ -0,0 +1,5 @@
Copyright 2022 ccatss
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

260
docs/docs.go Normal file
View File

@ -0,0 +1,260 @@
// Package docs GENERATED BY SWAG; DO NOT EDIT
// This file was generated by swaggo/swag
package docs
import "github.com/swaggo/swag"
const docTemplate = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "ccatss",
"url": "https://ccatss.dev",
"email": "admin@meow.tf"
},
"license": {
"name": "ISC License",
"url": "/LICENSE.txt"
},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/": {
"post": {
"description": "Minify content based on input type",
"consumes": [
"text/html",
"text/css",
"image/svg+xml",
"application/javascript",
"application/json",
"text/xml"
],
"produces": [
"text/plain"
],
"summary": "Minify content",
"parameters": [
{
"description": "Input text",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified content",
"schema": {
"type": "string"
}
}
}
}
},
"/css": {
"post": {
"description": "Minify CSS Input",
"consumes": [
"text/css"
],
"produces": [
"text/css"
],
"summary": "Minify CSS",
"parameters": [
{
"description": "Input CSS",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified CSS",
"schema": {
"type": "string"
}
}
}
}
},
"/html": {
"post": {
"description": "Minify HTML Input",
"consumes": [
"text/html"
],
"produces": [
"text/html"
],
"summary": "Minify HTML",
"parameters": [
{
"description": "Input HTML",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified HTML",
"schema": {
"type": "string"
}
}
}
}
},
"/js": {
"post": {
"description": "Minify JavaScript Input",
"consumes": [
"application/javascript"
],
"produces": [
"application/javascript"
],
"summary": "Minify JavaScript",
"parameters": [
{
"description": "Input JavaScript",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified JavaScript",
"schema": {
"type": "string"
}
}
}
}
},
"/json": {
"post": {
"description": "Minify JSON Input",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"summary": "Minify JSON",
"parameters": [
{
"description": "Input JSON",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified JSON",
"schema": {
"type": "string"
}
}
}
}
},
"/svg": {
"post": {
"description": "Minify SVG Input",
"consumes": [
"image/svg+xml"
],
"produces": [
"image/svg+xml"
],
"summary": "Minify SVG",
"parameters": [
{
"description": "Input SVG",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified SVG",
"schema": {
"type": "string"
}
}
}
}
},
"/xml": {
"post": {
"description": "Minify XML Input",
"consumes": [
"text/xml"
],
"produces": [
"text/xml"
],
"summary": "Minify XML",
"parameters": [
{
"description": "Input XML",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified XML",
"schema": {
"type": "string"
}
}
}
}
}
}
}`
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
Version: "1.0",
Host: "minify.ccatss.dev",
BasePath: "/api",
Schemes: []string{},
Title: "Minifier API",
Description: "An API Implementation of tdewolfe's minify package",
InfoInstanceName: "swagger",
SwaggerTemplate: docTemplate,
}
func init() {
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
}

237
docs/swagger.json Normal file
View File

@ -0,0 +1,237 @@
{
"swagger": "2.0",
"info": {
"description": "An API Implementation of tdewolfe's minify package",
"title": "Minifier API",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"name": "ccatss",
"url": "https://ccatss.dev",
"email": "admin@meow.tf"
},
"license": {
"name": "ISC License",
"url": "/LICENSE.txt"
},
"version": "1.0"
},
"host": "minify.ccatss.dev",
"basePath": "/api",
"paths": {
"/": {
"post": {
"description": "Minify content based on input type",
"consumes": [
"text/html",
"text/css",
"image/svg+xml",
"application/javascript",
"application/json",
"text/xml"
],
"produces": [
"text/plain"
],
"summary": "Minify content",
"parameters": [
{
"description": "Input text",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified content",
"schema": {
"type": "string"
}
}
}
}
},
"/css": {
"post": {
"description": "Minify CSS Input",
"consumes": [
"text/css"
],
"produces": [
"text/css"
],
"summary": "Minify CSS",
"parameters": [
{
"description": "Input CSS",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified CSS",
"schema": {
"type": "string"
}
}
}
}
},
"/html": {
"post": {
"description": "Minify HTML Input",
"consumes": [
"text/html"
],
"produces": [
"text/html"
],
"summary": "Minify HTML",
"parameters": [
{
"description": "Input HTML",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified HTML",
"schema": {
"type": "string"
}
}
}
}
},
"/js": {
"post": {
"description": "Minify JavaScript Input",
"consumes": [
"application/javascript"
],
"produces": [
"application/javascript"
],
"summary": "Minify JavaScript",
"parameters": [
{
"description": "Input JavaScript",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified JavaScript",
"schema": {
"type": "string"
}
}
}
}
},
"/json": {
"post": {
"description": "Minify JSON Input",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"summary": "Minify JSON",
"parameters": [
{
"description": "Input JSON",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified JSON",
"schema": {
"type": "string"
}
}
}
}
},
"/svg": {
"post": {
"description": "Minify SVG Input",
"consumes": [
"image/svg+xml"
],
"produces": [
"image/svg+xml"
],
"summary": "Minify SVG",
"parameters": [
{
"description": "Input SVG",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified SVG",
"schema": {
"type": "string"
}
}
}
}
},
"/xml": {
"post": {
"description": "Minify XML Input",
"consumes": [
"text/xml"
],
"produces": [
"text/xml"
],
"summary": "Minify XML",
"parameters": [
{
"description": "Input XML",
"name": "input",
"in": "body",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Minified XML",
"schema": {
"type": "string"
}
}
}
}
}
}
}

154
docs/swagger.yaml Normal file
View File

@ -0,0 +1,154 @@
basePath: /api
host: minify.ccatss.dev
info:
contact:
email: admin@meow.tf
name: ccatss
url: https://ccatss.dev
description: An API Implementation of tdewolfe's minify package
license:
name: ISC License
url: /LICENSE.txt
termsOfService: http://swagger.io/terms/
title: Minifier API
version: "1.0"
paths:
/:
post:
consumes:
- text/html
- text/css
- image/svg+xml
- application/javascript
- application/json
- text/xml
description: Minify content based on input type
parameters:
- description: Input text
in: body
name: input
schema:
type: string
produces:
- text/plain
responses:
"200":
description: Minified content
schema:
type: string
summary: Minify content
/css:
post:
consumes:
- text/css
description: Minify CSS Input
parameters:
- description: Input CSS
in: body
name: input
schema:
type: string
produces:
- text/css
responses:
"200":
description: Minified CSS
schema:
type: string
summary: Minify CSS
/html:
post:
consumes:
- text/html
description: Minify HTML Input
parameters:
- description: Input HTML
in: body
name: input
schema:
type: string
produces:
- text/html
responses:
"200":
description: Minified HTML
schema:
type: string
summary: Minify HTML
/js:
post:
consumes:
- application/javascript
description: Minify JavaScript Input
parameters:
- description: Input JavaScript
in: body
name: input
schema:
type: string
produces:
- application/javascript
responses:
"200":
description: Minified JavaScript
schema:
type: string
summary: Minify JavaScript
/json:
post:
consumes:
- application/json
description: Minify JSON Input
parameters:
- description: Input JSON
in: body
name: input
schema:
type: string
produces:
- application/json
responses:
"200":
description: Minified JSON
schema:
type: string
summary: Minify JSON
/svg:
post:
consumes:
- image/svg+xml
description: Minify SVG Input
parameters:
- description: Input SVG
in: body
name: input
schema:
type: string
produces:
- image/svg+xml
responses:
"200":
description: Minified SVG
schema:
type: string
summary: Minify SVG
/xml:
post:
consumes:
- text/xml
description: Minify XML Input
parameters:
- description: Input XML
in: body
name: input
schema:
type: string
produces:
- text/xml
responses:
"200":
description: Minified XML
schema:
type: string
summary: Minify XML
swagger: "2.0"

23
frontend/.gitignore vendored Normal file
View File

@ -0,0 +1,23 @@
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

24
frontend/README.md Normal file
View File

@ -0,0 +1,24 @@
# frontend
## Project setup
```
npm install
```
### Compiles and hot-reloads for development
```
npm run serve
```
### Compiles and minifies for production
```
npm run build
```
### Lints and fixes files
```
npm run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).

5
frontend/babel.config.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}

19
frontend/jsconfig.json Normal file
View File

@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"baseUrl": "./",
"moduleResolution": "node",
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
}
}

20249
frontend/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

50
frontend/package.json Normal file
View File

@ -0,0 +1,50 @@
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.27.2",
"core-js": "^3.8.3",
"vue": "^2.6.14",
"vue-codemirror": "^4.0.6",
"vuetify": "^2.6.0"
},
"devDependencies": {
"@babel/core": "^7.12.16",
"@babel/eslint-parser": "^7.12.16",
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3",
"sass": "~1.32.0",
"sass-loader": "^10.0.0",
"vue-cli-plugin-vuetify": "~2.4.8",
"vue-template-compiler": "^2.6.14",
"vuetify-loader": "^1.7.0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "@babel/eslint-parser"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}

BIN
frontend/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

27
frontend/src/App.vue Normal file
View File

@ -0,0 +1,27 @@
<template>
<v-app>
<v-container class="text-center">
<h1>Minify API</h1>
</v-container>
<v-main>
<MinifierEditor/>
</v-main>
</v-app>
</template>
<script>
import MinifierEditor from './components/MinifierEditor';
export default {
name: 'App',
components: {
MinifierEditor,
},
data: () => ({
//
}),
};
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 87.5 100"><defs><style>.cls-1{fill:#1697f6;}.cls-2{fill:#7bc6ff;}.cls-3{fill:#1867c0;}.cls-4{fill:#aeddff;}</style></defs><title>Artboard 46</title><polyline class="cls-1" points="43.75 0 23.31 0 43.75 48.32"/><polygon class="cls-2" points="43.75 62.5 43.75 100 0 14.58 22.92 14.58 43.75 62.5"/><polyline class="cls-3" points="43.75 0 64.19 0 43.75 48.32"/><polygon class="cls-4" points="64.58 14.58 87.5 14.58 43.75 100 43.75 62.5 64.58 14.58"/></svg>

After

Width:  |  Height:  |  Size: 539 B

View File

@ -0,0 +1,78 @@
<template>
<v-container>
<v-row>
<v-col cols="12">
<v-select block
v-model="language"
:items="languages"
label="Language"
item-value="mime"
item-text="name"
dense
></v-select>
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<codemirror v-model="code" :options="cmOptions" />
</v-col>
</v-row>
<v-row>
<v-col cols="12">
<v-btn v-on:click="minify" block>
Minify
</v-btn>
</v-col>
</v-row>
<v-row class="text-center">
<v-col cols="12">
<v-container fluid>
<v-textarea
label="Minified"
v-model="minified"
></v-textarea>
</v-container>
</v-col>
</v-row>
</v-container>
</template>
<script>
import axios from "axios";
export default {
name: 'MinifierEditor',
data () {
return {
code: '',
minified: '',
language: 'text/javascript',
languages: [
{ mime: 'text/html', name: 'HTML' },
{ mime: 'text/css', name: 'CSS' },
{ mime: 'text/javascript', name: 'JavaScript' },
{ mime: 'application/json', name: 'JSON' },
{ mime: 'text/xml', name: 'XML' },
],
cmOptions: {
// codemirror options
tabSize: 4,
mode: this.language,
lineNumbers: true,
line: true,
}
}
},
methods: {
async minify() {
const {data} = await axios.post('http://localhost:3000/api', this.code, {
headers: {
'Content-Type': this.language
}
});
this.minified = data;
}
},
}
</script>

15
frontend/src/main.js Normal file
View File

@ -0,0 +1,15 @@
import Vue from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify'
import VueCodemirror from 'vue-codemirror';
Vue.config.productionTip = false
import 'codemirror/lib/codemirror.css';
Vue.use(VueCodemirror);
new Vue({
vuetify,
render: h => h(App)
}).$mount('#app')

View File

@ -0,0 +1,7 @@
import Vue from 'vue';
import Vuetify from 'vuetify/lib/framework';
Vue.use(Vuetify);
export default new Vuetify({
});

12
frontend/vue.config.js Normal file
View File

@ -0,0 +1,12 @@
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
pages: {
index: {
entry: 'src/main.js',
title: 'MinifyAPI'
}
},
transpileDependencies: [
'vuetify'
]
})

34
go.mod Normal file
View File

@ -0,0 +1,34 @@
module minify.ccatss.dev
go 1.18
require (
github.com/chi-middleware/logrus-logger v0.2.0
github.com/go-chi/chi/v5 v5.0.7
github.com/go-chi/cors v1.2.1
github.com/go-chi/httprate v0.5.3
github.com/sirupsen/logrus v1.8.1
github.com/swaggo/http-swagger v1.2.6
github.com/swaggo/swag v1.8.1
github.com/tdewolff/minify/v2 v2.11.2
)
require (
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.4 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 // indirect
github.com/tdewolff/parse/v2 v2.5.29 // indirect
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.10 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

145
go.sum Normal file
View File

@ -0,0 +1,145 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs=
github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
github.com/chi-middleware/logrus-logger v0.2.0 h1:Do3vcVSRsLh7zSRKxsVg5Kr5//rTqytwprCR1HzVqT8=
github.com/chi-middleware/logrus-logger v0.2.0/go.mod h1:ie/rvKsXrtqqsnJd3qtSEnLxgCs1I758WYmHdv6CRt0=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/fsnotify/fsnotify v1.5.3/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8=
github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-chi/httprate v0.5.3 h1:5HPWb0N6ymIiuotMtCfOGpQKiKeqXVzMexHh1W1yXPc=
github.com/go-chi/httprate v0.5.3/go.mod h1:kYR4lorHX3It9tTh4eTdHhcF2bzrYnCrRNlv5+IBm2M=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2 h1:+iNTcqQJy0OZ5jk6a5NLib47eqXK8uYcPX+O4+cBpEM=
github.com/swaggo/files v0.0.0-20210815190702-a29dd2bc99b2/go.mod h1:lKJPbtWzJ9JhsTN1k1gZgleJWY/cqq0psdoMmaThG3w=
github.com/swaggo/http-swagger v1.2.6 h1:ihTjChUoSRMpFMjWw+0AkL1Ti4r6v8pCgVYLmQVRlRw=
github.com/swaggo/http-swagger v1.2.6/go.mod h1:CcoICgY3yVDk2u1LQUCMHbAj0fjlxIX+873psXlIKNA=
github.com/swaggo/swag v1.7.9/go.mod h1:gZ+TJ2w/Ve1RwQsA2IRoSOTidHz6DX+PIG8GWvbnoLU=
github.com/swaggo/swag v1.8.1 h1:JuARzFX1Z1njbCGz+ZytBR15TFJwF2Q7fu8puJHhQYI=
github.com/swaggo/swag v1.8.1/go.mod h1:ugemnJsPZm/kRwFUnzBlbHRd0JY9zE1M4F+uy2pAaPQ=
github.com/tdewolff/minify/v2 v2.11.2 h1:PpaPWhNlMVjkAKaOj0bbPv6KCVnrm8jbVwG7OtSdAqw=
github.com/tdewolff/minify/v2 v2.11.2/go.mod h1:NxozhBtgUVypPLzQdV96wkIu9J9vAiVmBcKhfC2zMfg=
github.com/tdewolff/parse/v2 v2.5.29 h1:Uf0OtZL9YaUXTuHEOitdo9lD90P0XTwCjZi+KbGChuM=
github.com/tdewolff/parse/v2 v2.5.29/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA=
golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

203
main.go Normal file
View File

@ -0,0 +1,203 @@
//go:generate npm --prefix frontend run build
package main
import (
"embed"
"github.com/chi-middleware/logrus-logger"
"github.com/go-chi/chi/v5"
"github.com/go-chi/cors"
"github.com/go-chi/httprate"
log "github.com/sirupsen/logrus"
httpSwagger "github.com/swaggo/http-swagger"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/css"
"github.com/tdewolff/minify/v2/html"
"github.com/tdewolff/minify/v2/js"
"github.com/tdewolff/minify/v2/json"
"github.com/tdewolff/minify/v2/svg"
"github.com/tdewolff/minify/v2/xml"
"io"
"io/fs"
_ "minify.ccatss.dev/docs"
"net/http"
"regexp"
"strings"
"time"
)
var (
//go:embed frontend/dist
frontendFs embed.FS
//go:embed LICENSE.txt
licenseBytes []byte
)
// @title Minifier API
// @version 1.0
// @description An API Implementation of tdewolfe's minify package
// @termsOfService http://swagger.io/terms/
// @contact.name ccatss
// @contact.url https://ccatss.dev
// @contact.email admin@meow.tf
// @license.name ISC License
// @license.url /LICENSE.txt
// @host minify.ccatss.dev
// @BasePath /api
func main() {
r := chi.NewRouter()
r.Use(logger.Logger("router", log.StandardLogger()))
m := minify.New()
m.AddFunc("text/css", css.Minify)
m.AddFunc("text/html", html.Minify)
m.AddFunc("image/svg+xml", svg.Minify)
m.AddFuncRegexp(regexp.MustCompile("^(application|text)/(x-)?(java|ecma)script$"), js.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]json$"), json.Minify)
m.AddFuncRegexp(regexp.MustCompile("[/+]xml$"), xml.Minify)
subFs, err := fs.Sub(frontendFs, "frontend/dist")
if err != nil {
log.WithError(err).Fatalln("Unable to load frontend")
}
httpFs := http.FileServer(http.FS(subFs))
r.Handle("/", httpFs)
r.Handle("/js/*", httpFs)
r.Handle("/css/*", httpFs)
r.Get("/LICENSE.txt", func(w http.ResponseWriter, r *http.Request) {
w.Write(licenseBytes)
})
r.Get("/swagger/*", httpSwagger.Handler(
httpSwagger.URL("/swagger/doc.json"), //The url pointing to API definition
))
r.Route("/api", func(r chi.Router) {
r.Use(httprate.LimitByIP(100, 1*time.Minute))
r.Use(cors.Handler(cors.Options{
AllowedOrigins: []string{"https://*", "http://*"},
AllowedMethods: []string{"GET", "POST", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Content-Type"},
ExposedHeaders: []string{"Link"},
AllowCredentials: false,
MaxAge: 300, // Maximum value not ignored by any of major browsers
}))
r.Post("/", minifyContent("", m))
r.Post("/css", minifyCss(m))
r.Post("/html", minifyHtml(m))
r.Post("/svg", minifySVG(m))
r.Post("/js", minifyJS(m))
r.Post("/json", minifyJSON(m))
r.Post("/xml", minifyXML(m))
})
http.ListenAndServe(":3000", r)
}
// Minify godoc
// @Summary Minify content
// @Description Minify content based on input type
// @Param input body string false "Input text"
// @Accept html,text/css,image/svg+xml,application/javascript,json,xml
// @Produce text/plain
// @Success 200 {string} string "Minified content"
// @Router / [post]
func minifyContent(mediaType string, min *minify.M) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if mediaType == "" {
mediaType = r.Header.Get("Content-Type")
if idx := strings.Index(mediaType, ";"); idx != -1 {
mediaType = mediaType[0:idx]
}
}
_, err := io.Copy(w, min.Reader(mediaType, r.Body))
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
}
}
// Minify CSS godoc
// @Summary Minify CSS
// @Description Minify CSS Input
// @Param input body string false "Input CSS"
// @Accept text/css
// @Produce text/css
// @Success 200 {string} string "Minified CSS"
// @Router /css [post]
func minifyCss(min *minify.M) http.HandlerFunc {
return minifyContent("text/css", min)
}
// Minify HTML godoc
// @Summary Minify HTML
// @Description Minify HTML Input
// @Param input body string false "Input HTML"
// @Accept html
// @Produce html
// @Success 200 {string} string "Minified HTML"
// @Router /html [post]
func minifyHtml(min *minify.M) http.HandlerFunc {
return minifyContent("text/html", min)
}
// Minify SVG godoc
// @Summary Minify SVG
// @Description Minify SVG Input
// @Param input body string false "Input SVG"
// @Accept image/svg+xml
// @Produce image/svg+xml
// @Success 200 {string} string "Minified SVG"
// @Router /svg [post]
func minifySVG(min *minify.M) http.HandlerFunc {
return minifyContent("image/svg+xml", min)
}
// Minify JS godoc
// @Summary Minify JavaScript
// @Description Minify JavaScript Input
// @Param input body string false "Input JavaScript"
// @Accept application/javascript
// @Produce application/javascript
// @Success 200 {string} string "Minified JavaScript"
// @Router /js [post]
func minifyJS(min *minify.M) http.HandlerFunc {
return minifyContent("application/javascript", min)
}
// Minify JSON godoc
// @Summary Minify JSON
// @Description Minify JSON Input
// @Param input body string false "Input JSON"
// @Accept application/json
// @Produce application/json
// @Success 200 {string} string "Minified JSON"
// @Router /json [post]
func minifyJSON(min *minify.M) http.HandlerFunc {
return minifyContent("application/json", min)
}
// Minify XML godoc
// @Summary Minify XML
// @Description Minify XML Input
// @Param input body string false "Input XML"
// @Accept xml
// @Produce xml
// @Success 200 {string} string "Minified XML"
// @Router /xml [post]
func minifyXML(min *minify.M) http.HandlerFunc {
return minifyContent("text/xml", min)
}