mirror of
https://github.com/lyx0/noury.li.git
synced 2024-11-13 19:49:54 +01:00
init commit
This commit is contained in:
commit
e463e9675f
31 changed files with 18412 additions and 0 deletions
74
CODE_OF_CONDUCT.md
Normal file
74
CODE_OF_CONDUCT.md
Normal file
|
@ -0,0 +1,74 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
- Using welcoming and inclusive language
|
||||
- Being respectful of differing viewpoints and experiences
|
||||
- Gracefully accepting constructive criticism
|
||||
- Focusing on what is best for the community
|
||||
- Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
- The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
- Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at office[AT]zeplia[DOT]com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
25
LICENSE
Normal file
25
LICENSE
Normal file
|
@ -0,0 +1,25 @@
|
|||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2020, Zeplia
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
40
README.md
Normal file
40
README.md
Normal file
|
@ -0,0 +1,40 @@
|
|||
# MinWiz - Minimal starter kit for under 2 KB sites
|
||||
|
||||
Use this starter kit to create a **viable, good looking, production-ready website** whose entire size does not exceed 2 KB compressed when opened in a browser. Ideally, the total size of all assets (HTML, CSS, favicon, etc.) downloaded by the browser when opening the page will be under 2 KB. You can see a live version at [MinWiz.com](https://minwiz.com).
|
||||
|
||||
## Getting started
|
||||
|
||||
Make sure you have Node and npm installed. Any version will do.
|
||||
|
||||
If you're doing web development you probably already have gulp-cli globally installed (you can test with `gulp -v`). If you don't have it, run `npm install --global gulp-cli`
|
||||
|
||||
- clone the repo
|
||||
- install the dependencies with `npm install`
|
||||
- build the site (in the _dist_ folder) with `npm run build`
|
||||
- at this point, the _dist_ folder contains all assets in a minified form, ready to be copied/deployed to your web hosting service
|
||||
|
||||
If you want to live edit the site, there is a handy-dandy `gulp dev` command and the Live Server extension for VS Code is configured to open the site from _dist_ folder. Run the command, click _Go Live_ in the status panel of VS Code and you're good to go.
|
||||
|
||||
## Contributing
|
||||
|
||||
If you have a creative idea for decreasing the size of the website **feel free to submit a PR!** You can learn how from this [Step-by-step guide to contributing on GitHub](https://www.dataschool.io/how-to-contribute-on-github/).
|
||||
|
||||
If it's not obvious how your PR will help, please conceptually explain it. Ex:
|
||||
|
||||
> As the stylesheet.css already includes the text "section {", rearranging the order in "section, p, h1," to "p, h1, section {" will pick-up more text during gzipping.
|
||||
|
||||
Please note that I'm using package-lock with lockfileVersion 2. If you submit a PR and you're using lockfileVersion 1, make sure not to include the _package-lock.json_ file.
|
||||
|
||||
## Thank you
|
||||
|
||||
- Color scheme inspired from [john-doe.neocities.org](https://john-doe.neocities.org/).
|
||||
- <del>Navigation inspired from [Functional CSS Tabs Revisited](https://css-tricks.com/functional-css-tabs-revisited/).</dev>
|
||||
- Navigation suggested by /u/trust_me_im_a_turtle on Reddit. Demo [here](https://codesandbox.io/s/hash-navigation-919fp?file=/index.html:226-397).
|
||||
|
||||
## CDK deployment notes
|
||||
|
||||
For `cdk deploy` to work we need to have a Github personal access token in the GITHUB_TOKEN variable:
|
||||
|
||||
```
|
||||
echo export GITHUB_TOKEN=REPLACE_ME_WITH_THE_REAL_GITHUB_TOKEN >> ~/.bashrc
|
||||
```
|
6
cdk/.npmignore
Normal file
6
cdk/.npmignore
Normal file
|
@ -0,0 +1,6 @@
|
|||
*.ts
|
||||
!*.d.ts
|
||||
|
||||
# CDK asset staging directory
|
||||
.cdk.staging
|
||||
cdk.out
|
14
cdk/README.md
Normal file
14
cdk/README.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
# Welcome to your CDK TypeScript project
|
||||
|
||||
This is a blank project for TypeScript development with CDK.
|
||||
|
||||
The `cdk.json` file tells the CDK Toolkit how to execute your app.
|
||||
|
||||
## Useful commands
|
||||
|
||||
* `npm run build` compile typescript to js
|
||||
* `npm run watch` watch for changes and compile
|
||||
* `npm run test` perform the jest unit tests
|
||||
* `cdk deploy` deploy this stack to your default AWS account/region
|
||||
* `cdk diff` compare deployed stack with current state
|
||||
* `cdk synth` emits the synthesized CloudFormation template
|
36
cdk/bin/cdk.ts
Normal file
36
cdk/bin/cdk.ts
Normal file
|
@ -0,0 +1,36 @@
|
|||
#!/usr/bin/env node
|
||||
import * as cdk from "aws-cdk-lib";
|
||||
import "source-map-support/register";
|
||||
import { CertificateStack } from "../lib/certificate-stack";
|
||||
import { CloudfrontStack } from "../lib/cloudfront";
|
||||
import { PipelineStack } from "../lib/pipeline-stack";
|
||||
|
||||
if (!process.env.GITHUB_TOKEN) {
|
||||
console.log("No Github Token present");
|
||||
}
|
||||
|
||||
const app = new cdk.App();
|
||||
|
||||
const certStack = new CertificateStack(app, "CertificateStack", {
|
||||
env: {
|
||||
region: "us-east-1",
|
||||
},
|
||||
});
|
||||
|
||||
const cloudfrontStack = new CloudfrontStack(app, "CloudfrontStack", {
|
||||
websiteCert: certStack.websiteCert,
|
||||
hostedZone: certStack.hostedZone,
|
||||
env: {
|
||||
region: "us-east-1",
|
||||
},
|
||||
});
|
||||
|
||||
new PipelineStack(app, "PipelineStack", {
|
||||
githubToken: process.env.GITHUB_TOKEN || "",
|
||||
websiteBucket: cloudfrontStack.websiteBucket,
|
||||
env: {
|
||||
region: "us-east-1",
|
||||
},
|
||||
});
|
||||
|
||||
app.synth();
|
32
cdk/cdk.json
Normal file
32
cdk/cdk.json
Normal file
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"app": "npx ts-node --prefer-ts-exts bin/cdk.ts",
|
||||
"watch": {
|
||||
"include": [
|
||||
"**"
|
||||
],
|
||||
"exclude": [
|
||||
"README.md",
|
||||
"cdk*.json",
|
||||
"**/*.d.ts",
|
||||
"**/*.js",
|
||||
"tsconfig.json",
|
||||
"package*.json",
|
||||
"yarn.lock",
|
||||
"node_modules",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
"context": {
|
||||
"@aws-cdk/aws-apigateway:usagePlanKeyOrderInsensitiveId": true,
|
||||
"@aws-cdk/core:stackRelativeExports": true,
|
||||
"@aws-cdk/aws-rds:lowercaseDbIdentifier": true,
|
||||
"@aws-cdk/aws-lambda:recognizeVersionProps": true,
|
||||
"@aws-cdk/aws-cloudfront:defaultSecurityPolicyTLSv1.2_2021": true,
|
||||
"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
|
||||
"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
|
||||
"@aws-cdk/core:target-partitions": [
|
||||
"aws",
|
||||
"aws-cn"
|
||||
]
|
||||
}
|
||||
}
|
8
cdk/jest.config.js
Normal file
8
cdk/jest.config.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
module.exports = {
|
||||
testEnvironment: 'node',
|
||||
roots: ['<rootDir>/test'],
|
||||
testMatch: ['**/*.test.ts'],
|
||||
transform: {
|
||||
'^.+\\.tsx?$': 'ts-jest'
|
||||
}
|
||||
};
|
33
cdk/lib/certificate-stack.ts
Normal file
33
cdk/lib/certificate-stack.ts
Normal file
|
@ -0,0 +1,33 @@
|
|||
import { CfnOutput, Stack, StackProps } from "aws-cdk-lib";
|
||||
import { DnsValidatedCertificate } from "aws-cdk-lib/aws-certificatemanager";
|
||||
import { HostedZone, IHostedZone } from "aws-cdk-lib/aws-route53";
|
||||
import { Construct } from "constructs";
|
||||
import { hostedZoneId, website_domain } from "./variables";
|
||||
|
||||
export class CertificateStack extends Stack {
|
||||
public readonly websiteCert: DnsValidatedCertificate;
|
||||
public readonly hostedZone: IHostedZone;
|
||||
|
||||
constructor(scope: Construct, id: string, props?: StackProps) {
|
||||
super(scope, id, props);
|
||||
|
||||
this.hostedZone = HostedZone.fromHostedZoneAttributes(
|
||||
this,
|
||||
"HostedZoneWithAttrs",
|
||||
{
|
||||
hostedZoneId,
|
||||
zoneName: website_domain,
|
||||
}
|
||||
);
|
||||
|
||||
this.websiteCert = new DnsValidatedCertificate(this, "MinWizSSL", {
|
||||
domainName: website_domain,
|
||||
subjectAlternativeNames: [`www.${website_domain}`],
|
||||
hostedZone: this.hostedZone,
|
||||
});
|
||||
|
||||
new CfnOutput(this, "WebsiteCertArn", {
|
||||
value: this.websiteCert.certificateArn,
|
||||
});
|
||||
}
|
||||
}
|
85
cdk/lib/cloudfront.ts
Normal file
85
cdk/lib/cloudfront.ts
Normal file
|
@ -0,0 +1,85 @@
|
|||
import {
|
||||
CfnOutput,
|
||||
Duration,
|
||||
RemovalPolicy,
|
||||
Stack,
|
||||
StackProps,
|
||||
} from "aws-cdk-lib";
|
||||
import { DnsValidatedCertificate } from "aws-cdk-lib/aws-certificatemanager";
|
||||
import {
|
||||
AllowedMethods,
|
||||
CachePolicy,
|
||||
Distribution,
|
||||
HttpVersion,
|
||||
PriceClass,
|
||||
SecurityPolicyProtocol,
|
||||
ViewerProtocolPolicy,
|
||||
} from "aws-cdk-lib/aws-cloudfront";
|
||||
import { S3Origin } from "aws-cdk-lib/aws-cloudfront-origins";
|
||||
import { ARecord, IHostedZone, RecordTarget } from "aws-cdk-lib/aws-route53";
|
||||
import { HttpsRedirect } from "aws-cdk-lib/aws-route53-patterns";
|
||||
import { CloudFrontTarget } from "aws-cdk-lib/aws-route53-targets";
|
||||
import { Bucket } from "aws-cdk-lib/aws-s3";
|
||||
import { Construct } from "constructs";
|
||||
import { website_domain } from "./variables";
|
||||
|
||||
export interface CloudfrontStackProps extends StackProps {
|
||||
readonly websiteCert: DnsValidatedCertificate;
|
||||
readonly hostedZone: IHostedZone;
|
||||
}
|
||||
|
||||
export class CloudfrontStack extends Stack {
|
||||
public readonly websiteBucket: Bucket;
|
||||
|
||||
constructor(scope: Construct, id: string, props: CloudfrontStackProps) {
|
||||
super(scope, id, props);
|
||||
|
||||
this.websiteBucket = new Bucket(this, "websiteBucket", {
|
||||
removalPolicy: RemovalPolicy.DESTROY,
|
||||
bucketName: website_domain,
|
||||
autoDeleteObjects: true,
|
||||
});
|
||||
|
||||
new CfnOutput(this, "websiteBucketArn", {
|
||||
value: this.websiteBucket.bucketArn,
|
||||
});
|
||||
|
||||
const cachePolicy = new CachePolicy(this, "MinWizPolicy", {
|
||||
defaultTtl: Duration.hours(24),
|
||||
minTtl: Duration.hours(24),
|
||||
maxTtl: Duration.hours(24),
|
||||
enableAcceptEncodingGzip: true,
|
||||
enableAcceptEncodingBrotli: true,
|
||||
});
|
||||
|
||||
const distribution = new Distribution(this, "MinWizDistribution", {
|
||||
defaultBehavior: {
|
||||
origin: new S3Origin(this.websiteBucket),
|
||||
allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
|
||||
cachePolicy,
|
||||
compress: true,
|
||||
viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
|
||||
},
|
||||
domainNames: [website_domain /*, `www.${website_domain}`*/],
|
||||
certificate: props.websiteCert,
|
||||
minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2019,
|
||||
defaultRootObject: "index.html",
|
||||
enableIpv6: true,
|
||||
enabled: true,
|
||||
httpVersion: HttpVersion.HTTP2,
|
||||
priceClass: PriceClass.PRICE_CLASS_ALL,
|
||||
});
|
||||
|
||||
new ARecord(this, "aliasForCloudfront", {
|
||||
target: RecordTarget.fromAlias(new CloudFrontTarget(distribution)),
|
||||
zone: props.hostedZone,
|
||||
recordName: website_domain,
|
||||
});
|
||||
|
||||
new HttpsRedirect(this, "wwwToNonWww", {
|
||||
recordNames: [`www.${website_domain}`],
|
||||
targetDomain: website_domain,
|
||||
zone: props.hostedZone,
|
||||
});
|
||||
}
|
||||
}
|
111
cdk/lib/pipeline-stack.ts
Normal file
111
cdk/lib/pipeline-stack.ts
Normal file
|
@ -0,0 +1,111 @@
|
|||
import {
|
||||
App,
|
||||
RemovalPolicy,
|
||||
SecretValue,
|
||||
Stack,
|
||||
StackProps,
|
||||
} from "aws-cdk-lib";
|
||||
import {
|
||||
BuildSpec,
|
||||
ComputeType,
|
||||
LinuxBuildImage,
|
||||
PipelineProject,
|
||||
} from "aws-cdk-lib/aws-codebuild";
|
||||
import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline";
|
||||
import {
|
||||
CodeBuildAction,
|
||||
GitHubSourceAction,
|
||||
GitHubTrigger,
|
||||
S3DeployAction,
|
||||
} from "aws-cdk-lib/aws-codepipeline-actions";
|
||||
import {
|
||||
BlockPublicAccess,
|
||||
Bucket,
|
||||
BucketEncryption,
|
||||
} from "aws-cdk-lib/aws-s3";
|
||||
|
||||
export interface PipelineStackProps extends StackProps {
|
||||
readonly githubToken: string;
|
||||
readonly websiteBucket: Bucket;
|
||||
}
|
||||
|
||||
export class PipelineStack extends Stack {
|
||||
constructor(app: App, id: string, props: PipelineStackProps) {
|
||||
super(app, id, props);
|
||||
|
||||
const siteBuild = new PipelineProject(this, "MinWizBuild", {
|
||||
description: "minwiz.com site build",
|
||||
buildSpec: BuildSpec.fromObject({
|
||||
version: "0.2",
|
||||
phases: {
|
||||
install: {
|
||||
commands: ["npm ci"],
|
||||
},
|
||||
build: {
|
||||
commands: "npm run build",
|
||||
},
|
||||
},
|
||||
artifacts: {
|
||||
"base-directory": "dist",
|
||||
files: ["**/*"],
|
||||
},
|
||||
}),
|
||||
environment: {
|
||||
buildImage: LinuxBuildImage.STANDARD_5_0,
|
||||
computeType: ComputeType.SMALL,
|
||||
},
|
||||
});
|
||||
|
||||
const siteBuildOutput = new Artifact("SiteBuildOutput");
|
||||
|
||||
const sourceOutput = new Artifact("SrcOutput");
|
||||
|
||||
const artifactBucket = new Bucket(this, "MinWizPipelineArtifacts", {
|
||||
removalPolicy: RemovalPolicy.DESTROY,
|
||||
encryption: BucketEncryption.S3_MANAGED,
|
||||
blockPublicAccess: BlockPublicAccess.BLOCK_ALL,
|
||||
autoDeleteObjects: true,
|
||||
});
|
||||
|
||||
new Pipeline(this, "MinWiz", {
|
||||
restartExecutionOnUpdate: true,
|
||||
artifactBucket,
|
||||
stages: [
|
||||
{
|
||||
stageName: "Source",
|
||||
actions: [
|
||||
new GitHubSourceAction({
|
||||
actionName: "Checkout",
|
||||
output: sourceOutput,
|
||||
owner: "zeplia",
|
||||
repo: "minwiz",
|
||||
oauthToken: SecretValue.plainText(props.githubToken),
|
||||
trigger: GitHubTrigger.WEBHOOK,
|
||||
}),
|
||||
],
|
||||
},
|
||||
{
|
||||
stageName: "Build",
|
||||
actions: [
|
||||
new CodeBuildAction({
|
||||
actionName: "Site_Build",
|
||||
project: siteBuild,
|
||||
input: sourceOutput,
|
||||
outputs: [siteBuildOutput],
|
||||
}),
|
||||
],
|
||||
},
|
||||
{
|
||||
stageName: "Deploy",
|
||||
actions: [
|
||||
new S3DeployAction({
|
||||
actionName: "DeployStaticSite",
|
||||
input: siteBuildOutput,
|
||||
bucket: props.websiteBucket,
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
}
|
3
cdk/lib/variables.ts
Normal file
3
cdk/lib/variables.ts
Normal file
|
@ -0,0 +1,3 @@
|
|||
export const hostedZoneId = "Z02664723UDHCHU1STAVT";
|
||||
|
||||
export const website_domain = "minwiz.com";
|
4882
cdk/package-lock.json
generated
Normal file
4882
cdk/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
30
cdk/package.json
Normal file
30
cdk/package.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"name": "cdk",
|
||||
"version": "0.1.0",
|
||||
"bin": {
|
||||
"cdk": "bin/cdk.js"https://github.com/noury-ee/noury.ee/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc
|
||||
},
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"watch": "tsc -w",
|
||||
"test": "jest",
|
||||
"cdk": "cdk",
|
||||
"diff": "cdk diff CertificateStack CloudfrontStack PipelineStack --profile iamadmin-general",
|
||||
"deploy": "cdk deploy CertificateStack CloudfrontStack PipelineStack --profile iamadmin-general",
|
||||
"destroy": "cdk destroy PipelineStack --profile iamadmin-general"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/node": "^18.8.5",
|
||||
"jest": "^26.4.2",
|
||||
"ts-jest": "^26.2.0",
|
||||
"aws-cdk": "^2.46.0",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^4.8.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"aws-cdk-lib": "^2.46.0",
|
||||
"constructs": "^10.1.131",
|
||||
"source-map-support": "^0.5.16"
|
||||
}
|
||||
}
|
17
cdk/test/cdk.test.ts
Normal file
17
cdk/test/cdk.test.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
// import * as cdk from 'aws-cdk-lib';
|
||||
// import { Template } from 'aws-cdk-lib/assertions';
|
||||
// import * as Cdk from '../lib/cdk-stack';
|
||||
|
||||
// example test. To run these tests, uncomment this file along with the
|
||||
// example resource in lib/cdk-stack.ts
|
||||
test('SQS Queue Created', () => {
|
||||
// const app = new cdk.App();
|
||||
// // WHEN
|
||||
// const stack = new Cdk.CdkStack(app, 'MyTestStack');
|
||||
// // THEN
|
||||
// const template = Template.fromStack(stack);
|
||||
|
||||
// template.hasResourceProperties('AWS::SQS::Queue', {
|
||||
// VisibilityTimeout: 300
|
||||
// });
|
||||
});
|
30
cdk/tsconfig.json
Normal file
30
cdk/tsconfig.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2018",
|
||||
"module": "commonjs",
|
||||
"lib": [
|
||||
"es2018"
|
||||
],
|
||||
"declaration": true,
|
||||
"strict": true,
|
||||
"noImplicitAny": true,
|
||||
"strictNullChecks": true,
|
||||
"noImplicitThis": true,
|
||||
"alwaysStrict": true,
|
||||
"noUnusedLocals": false,
|
||||
"noUnusedParameters": false,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": false,
|
||||
"inlineSourceMap": true,
|
||||
"inlineSources": true,
|
||||
"experimentalDecorators": true,
|
||||
"strictPropertyInitialization": false,
|
||||
"typeRoots": [
|
||||
"./node_modules/@types"
|
||||
]
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"cdk.out"
|
||||
]
|
||||
}
|
BIN
design/icon.pxd
Normal file
BIN
design/icon.pxd
Normal file
Binary file not shown.
0
dist/.gitkeep
vendored
Normal file
0
dist/.gitkeep
vendored
Normal file
47
gulpfile.js
Normal file
47
gulpfile.js
Normal file
|
@ -0,0 +1,47 @@
|
|||
/* eslint-disable no-console */
|
||||
const gulp = require("gulp");
|
||||
const htmlmin = require("gulp-htmlmin");
|
||||
const cleanCSS = require("gulp-clean-css");
|
||||
const inlinesource = require("gulp-inline-source");
|
||||
const path = require("path");
|
||||
const del = require("del");
|
||||
|
||||
const html = () =>
|
||||
gulp
|
||||
.src("src/*.html")
|
||||
.pipe(inlinesource({ rootpath: path.resolve("dist") }))
|
||||
.pipe(
|
||||
htmlmin({
|
||||
collapseWhitespace: true,
|
||||
// removeOptionalTags: true,
|
||||
collapseBooleanAttributes: true,
|
||||
})
|
||||
)
|
||||
.pipe(gulp.dest("dist"));
|
||||
|
||||
const css = () =>
|
||||
gulp
|
||||
.src("src/styles/*.css")
|
||||
.pipe(
|
||||
cleanCSS({ debug: true, level: 2 }, (details) => {
|
||||
console.log(`${details.name}: ${details.stats.originalSize}`);
|
||||
console.log(`${details.name}: ${details.stats.minifiedSize}`);
|
||||
})
|
||||
)
|
||||
.pipe(gulp.dest("dist/styles"));
|
||||
|
||||
const purge = () => del(["dist/styles"]);
|
||||
|
||||
const assets = () => gulp.src("public/*").pipe(gulp.dest("dist"));
|
||||
|
||||
const dev = () =>
|
||||
gulp.watch(
|
||||
["src/**/*"],
|
||||
{ ignoreInitial: false },
|
||||
gulp.series(css, html, purge, assets)
|
||||
);
|
||||
|
||||
exports.html = html;
|
||||
exports.css = css;
|
||||
exports.dev = dev;
|
||||
exports.default = gulp.series(css, html, purge, assets);
|
12490
package-lock.json
generated
Normal file
12490
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
33
package.json
Normal file
33
package.json
Normal file
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"name": "minwiz",
|
||||
"version": "1.0.0",
|
||||
"description": "MinWiz - Minimal starter kit for under 2 KB sites",
|
||||
"scripts": {
|
||||
"lint": "eslint . --ignore-path ./.gitignore",
|
||||
"build": "gulp",
|
||||
"deploy": "cd cdk && npm run deploy && cd .."
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/zeplia/minwiz.git"
|
||||
},
|
||||
"author": "Zeplia",
|
||||
"license": "BSD-2-Clause",
|
||||
"bugs": {
|
||||
"url": "https://github.com/zeplia/minwiz/issues"
|
||||
},
|
||||
"homepage": "https://github.com/zeplia/minwiz#readme",
|
||||
"devDependencies": {
|
||||
"del": "^6.1.1",
|
||||
"eslint": "^8.25.0",
|
||||
"eslint-config-airbnb-base": "^15.0.0",
|
||||
"eslint-config-standard": "^17.0.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^6.1.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-clean-css": "^4.3.0",
|
||||
"gulp-htmlmin": "^5.0.1",
|
||||
"gulp-inline-source": "^4.0.0"
|
||||
}
|
||||
}
|
BIN
public/android-chrome-192x192.png
Normal file
BIN
public/android-chrome-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
BIN
public/android-chrome-512x512.png
Normal file
BIN
public/android-chrome-512x512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 138 KiB |
BIN
public/apple-touch-icon.png
Normal file
BIN
public/apple-touch-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
BIN
public/favicon-16x16.png
Normal file
BIN
public/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 768 B |
BIN
public/favicon-32x32.png
Normal file
BIN
public/favicon-32x32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
public/favicon.ico
Normal file
BIN
public/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
2
public/robots.txt
Normal file
2
public/robots.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
User-agent: *
|
||||
Disallow: /*
|
1
public/site.webmanifest
Normal file
1
public/site.webmanifest
Normal file
|
@ -0,0 +1 @@
|
|||
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
328
src/index.html
Normal file
328
src/index.html
Normal file
|
@ -0,0 +1,328 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta content="width=device-width,initial-scale=1" name="viewport" />
|
||||
<title>dank.pw - home</title>
|
||||
<meta property="og:title" content="dank.pw" />
|
||||
<meta property="og:description" content="Dank Privacy" />
|
||||
<meta property="og:image" content="https://dank.pw/og.png" />
|
||||
|
||||
<link inline rel="stylesheet" href="styles/stylesheet.css" />
|
||||
<link rel="canonical" href="https://minwiz.com/" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<a href="#h">dank.pw</a></h1>
|
||||
<nav>
|
||||
<a href="#s">Site Template Used</a>
|
||||
<a href="#c">Contact</a>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<section id="s">
|
||||
<h1>Minwiz - Starter kit for lightweight sites</h1>
|
||||
Starter kit for good looking, viable, lightweight (under 2 KB
|
||||
compressed), production-ready sites with all the bells and whistles of
|
||||
modern web included. Ideally, the total size of all assets (HTML, CSS,
|
||||
favicon, etc.) downloaded by the browser when opening the page is under
|
||||
2 KB.
|
||||
<br />
|
||||
This is an open source project hosted on
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
href="https://github.com/zeplia/minwiz"
|
||||
>GitHub</a
|
||||
>
|
||||
with a very permissive license. Feel free to fork and use as you see fit
|
||||
(PRs are welcome). It features:
|
||||
<br />
|
||||
<ul>
|
||||
<li>
|
||||
💯 score on Lighthouse and
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
href="https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fminwiz.com%2F"
|
||||
>PageSpeed Insights</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
✅
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fminwiz.com%2F"
|
||||
>HTML5 & CSS3 valid</a
|
||||
>
|
||||
</li>
|
||||
<li>favicon</li>
|
||||
<li>robots.txt and sitemap</li>
|
||||
<li>responsive design</li>
|
||||
<li>
|
||||
light/dark scheme depending on user's operating system current theme
|
||||
preference
|
||||
</li>
|
||||
</ul>
|
||||
<h3>How lightweight is it?</h3>
|
||||
|
||||
To check the site size on Firefox or Chrome, open a new
|
||||
private/incognito window, right click on the blank page, select
|
||||
<i>Inspect</i>, go to the <i>Network</i> tab, enter the URL in the
|
||||
address bar and press <i>Enter</i>. The transferred size appears in the status
|
||||
bar at the bottom of the <i>Network</i> tab.
|
||||
<br />
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
href="https://gtmetrix.com/reports/minwiz.com/xzAvYUKq/#waterfall"
|
||||
>GTmetrix</a
|
||||
>
|
||||
site size: 1.7 KB, 4.1 KB uncompressed
|
||||
</section>
|
||||
|
||||
<section id="c">
|
||||
<h3>Contact info</h3>
|
||||
|
||||
<br />
|
||||
Email: noury[AT]dank[DOT]pw
|
||||
<br />
|
||||
</section>
|
||||
|
||||
<section id="h">
|
||||
<h1>Dank Privacy:</h1>
|
||||
<h3>> AnonymousOverflow</h3>
|
||||
<p>
|
||||
View StackOverflow in privacy and without the clutter.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/httpjamesm/AnonymousOverflow">https://github.com/httpjamesm/AnonymousOverflow</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://stackoverflow.dank.pw">https://stackoverflow.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> BiblioReads</h3>
|
||||
<p>
|
||||
An Alternative Private Goodreads Front-End.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/nesaku/BiblioReads">https://github.com/nesaku/BiblioReads</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://biblioreads.dank.pw">https://biblioreads.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> BreezeWiki</h3>
|
||||
<p>
|
||||
An alternative frontend for Fandom.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://gitdab.com/cadence/breezewiki">https://gitdab.com/cadence/breezewiki</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://breezewiki.dank.pw">https://breezewiki.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> CyberChef</h3>
|
||||
<p>
|
||||
The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/gchq/CyberChef">https://github.com/gchq/CyberChef</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://cyberchef.dank.pw">https://cyberchef.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Gothub</h3>
|
||||
<p>
|
||||
Alternative front-end for GitHub written with Go.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://codeberg.org/gothub/gothub">https://codeberg.org/gothub/gothub</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://gothub.dank.pw">https://gothub.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Libreddit</h3>
|
||||
<p>
|
||||
Private front-end for Reddit
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/spikecodes/libreddit">https://github.com/spikecodes/libreddit</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://reddit.dank.pw">https://reddit.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Libremdb</h3>
|
||||
<p>
|
||||
A free & open source IMDb front-end.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/zyachel/libremdb">https://github.com/zyachel/libremdb</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://imdb.dank.pw">https://imdb.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Lingva</h3>
|
||||
<p>
|
||||
Alternative front-end for Google Translate
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/thedaviddelta/lingva-translate">https://github.com/thedaviddelta/lingva-translate</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://lingva.dank.pw">https://lingva.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Piped</h3>
|
||||
<p>
|
||||
An open-source alternative frontend for YouTube which is efficient by design.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/TeamPiped/Piped">https://github.com/TeamPiped/Piped</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://piped.dank.pw">https://piped.dank.pw</a> (Note: Signups currently disabled)
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> PrivateBin</h3>
|
||||
<p>
|
||||
A minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted in the browser using 256 bits AES.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/PrivateBin/PrivateBin">https://github.com/PrivateBin/PrivateBin</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://bin.dank.pw">https://bin.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Quetre</h3>
|
||||
<p>
|
||||
A libre front-end for Quora
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/zyachel/quetre">https://github.com/zyachel/quetre</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://quora.dank.pw">https://quora.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Rimgo</h3>
|
||||
<p>
|
||||
Rimgo is an alternative frontend for Imgur.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://codeberg.org/video-prize-ranch/rimgo">https://codeberg.org/video-prize-ranch/rimgo</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://imgur.dank.pw">https://imgur.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> SearXNG</h3>
|
||||
<p>
|
||||
SearXNG is a free internet metasearch engine which aggregates results from various search services and databases.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/searxng/searxng">https://github.com/searxng/searxng</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://searx.dank.pw">https://searx.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Send</h3>
|
||||
<p>
|
||||
Easily and securely share files from the command line. A fully featured Firefox Send client.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/timvisee/ffsend">https://github.com/timvisee/ffsend</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://send.dank.pw">https://send.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Teddit</h3>
|
||||
<p>
|
||||
Teddit is a free and open source alternative Reddit front-end focused on privacy.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://codeberg.org/teddit/teddit">https://codeberg.org/teddit/teddit</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://teddit.dank.pw">https://teddit.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> IT-Tools</h3>
|
||||
<p>
|
||||
Collection of handy online tools for developers, with great UX.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/CorentinTh/it-tools">https://github.com/CorentinTh/it-tools</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://tools.dank.pw">https://tools.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h3>> Wikiless</h3>
|
||||
<p>
|
||||
A free open source alternative Wikipedia front-end focused on privacy.
|
||||
</p>
|
||||
<p>
|
||||
Source: <a href="https://github.com/Metastem/wikiless">https://github.com/Metastem/wikiless</a>
|
||||
</p>
|
||||
<p>
|
||||
Instance: <a href="https://wikipedia.dank.pw">https://wikipedia.dank.pw</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<h4>> Disclaimer </h4>
|
||||
<p>
|
||||
I try my best to keep this service up to date and running but there is absolutely no guarantee or warranty for anything.
|
||||
</p>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
Site source: <a target="_blank" rel="noopener" href="https://github.com/lyx0/dank.pw/">Github</a> | Status: <a target="_blank" rel="noopener" href="https://status.dank.pw">Uptime</a>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
85
src/styles/stylesheet.css
Normal file
85
src/styles/stylesheet.css
Normal file
|
@ -0,0 +1,85 @@
|
|||
* {
|
||||
margin: 0;
|
||||
--tc: #fff;
|
||||
--bc: #111;
|
||||
--hc: #fb0;
|
||||
}
|
||||
|
||||
|
||||
body {
|
||||
font: 18px -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
line-height: 1.4;
|
||||
color: var(--tc);
|
||||
background: var(--bc);
|
||||
max-width: 36em;
|
||||
margin: 0 auto;
|
||||
padding: 0 0.7em;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
main {
|
||||
margin-bottom: 3em;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: var(--hc);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
h1,
|
||||
br,
|
||||
header,
|
||||
ul {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-bottom: 0.3em;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
br {
|
||||
content: " ";
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* navigation */
|
||||
section,
|
||||
section:target ~ section:last-of-type {
|
||||
display: none;
|
||||
}
|
||||
|
||||
section:target,
|
||||
section:last-of-type {
|
||||
display: inherit;
|
||||
}
|
||||
/* end navigation */
|
||||
|
||||
header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
header > a {
|
||||
font-size: 1.7em;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
nav a {
|
||||
margin-left: 0.75em;
|
||||
}
|
||||
|
||||
footer {
|
||||
max-width: 36em;
|
||||
margin: 0 auto;
|
||||
padding: 0 0.7em;
|
||||
text-align: center;
|
||||
}
|
Loading…
Reference in a new issue