From 21d579b0d1d43d649fe051c18ca1cd42569a9eb2 Mon Sep 17 00:00:00 2001 From: Jack Le Hamster Date: Wed, 15 May 2024 19:31:48 -0700 Subject: [PATCH] Refactor into typescript, allowing export to other repo. --- .babelrc | 6 + .gitignore | 175 +++++++++++++++++++++++++++ babel | 0 bun.lockb | Bin 0 -> 204444 bytes bundler/bundler.ts | 10 ++ demo.sh | 4 + examples/.gitignore | 175 +++++++++++++++++++++++++++ examples/README.md | 15 +++ examples/bun.lockb | Bin 0 -> 3424 bytes examples/index.html | 66 ++++++++++ examples/package.json | 15 +++ examples/server.sh | 4 + examples/src/index.ts | 25 ++++ examples/tsconfig.json | 22 ++++ package.json | 35 ++++++ scripts/githubAPI/githubConnector.js | 87 +++---------- server.sh | 2 + src/github-api/github-api.ts | 101 ++++++++++++++++ src/index.ts | 3 + tsconfig.json | 7 ++ tsconfig.types.json | 32 +++++ types/github-api/github-api.d.ts | 14 +++ types/index.d.ts | 2 + webpack.config.js | 23 ++++ 24 files changed, 750 insertions(+), 73 deletions(-) create mode 100644 .babelrc create mode 100644 .gitignore create mode 100644 babel create mode 100755 bun.lockb create mode 100644 bundler/bundler.ts create mode 100755 demo.sh create mode 100644 examples/.gitignore create mode 100644 examples/README.md create mode 100755 examples/bun.lockb create mode 100644 examples/index.html create mode 100644 examples/package.json create mode 100755 examples/server.sh create mode 100644 examples/src/index.ts create mode 100644 examples/tsconfig.json create mode 100644 package.json create mode 100644 src/github-api/github-api.ts create mode 100644 src/index.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.types.json create mode 100644 types/github-api/github-api.d.ts create mode 100644 types/index.d.ts create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..25db6f9 --- /dev/null +++ b/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-typescript" + ] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/babel b/babel new file mode 100644 index 0000000..e69de29 diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..6f95db2f5f42ff395bcfdcb7e4e42242beecb70e GIT binary patch literal 204444 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 PJwReP05|iR)ycVSpYm)&({_}jWD zDzTpcenK^^A3#a15sccPqScDOLRz(LDybrkMXN$)XJpzQSo}0$5!?@hS@X%5VQ>QtNP$3Wqnt(v^A`k< z>+z(A$2|7GEN+7|WMiuY^ATUVza?R;>c zvuXcrdHSXY>ks(NU3Ow?Xk&!@M5+1e(HGzKP7JbFsbrSLr^2p_cyZlO+OjOKEYUJbrxV^2WB{pr#;u%f$tiOGaEcJp0n3?M?2jm;jxyKvJ@Muem6vaK zO-Djm#KPT+DwKuQ=M#5%`LElsCi-NaEbwOaLlG~kD>hk<^{c?;brGso>4VT5KfjwA z?^!;=;AKToX$?bo=vRc_PZ|mHKS2eW-rAu;# zFVhsRK2)N7)O;#_OzPd-auF};KWwtvGsgK_-dWd>rW`Z;^n|gq@-KanWD7a$Hk(HW z{Z_Ph-=SqayDFqi*QYV#;x^PNjrz}37xRATGTkhy()}pecv{4Z`gzCK&M;=L)@Zvlxc)5vXl1bXZau&Ot#BzgNz))0-La$Y@bS~vgouUX=SnRaT z;Y<~M(7Jni4Q&+l^X~%ZC=d?FnW^@q>}gaT2iMcjpgtZl6GU|1W$~lfz)ZA zf(eCKWLTA9bp;p$sh>)Q6P3cg@AU0oTyK_2&!iY~W;RDL4vYOQj-eg47=_MrG)B+S z@GEg_GVj0a45(nX6a^r`ithQ|C^NN9SapnJS&9M9q^pYj`Kj@Lra_UBUMw&g>LuAe z-GLw?kzEjk4fF`qLie;%@Nst9u`&`Dh0AeKY%)W;xM}>Q1|)JC$GO-@jfSCYG|MqL zq{EfIf+d}dP2&mDs8OgI9loCAY`JK{GxUS*ixI$lJWpXn6au-!nL-JdS!_RSeKEk6 z#j1NNig*Ubpd|o>oVvG1piKao;YgvA=>hj44g(tTRLwVufj<$xj=i<(CnZk>fXXug PqHyR@NQy7obNKT&R0m=t literal 0 HcmV?d00001 diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 0000000..eb763f9 --- /dev/null +++ b/examples/index.html @@ -0,0 +1,66 @@ + + + + + + + Testing API after imported + + + +
+ + +
+
+ + +
+
+ + +
+
+ + + +
You can set a query parameter: ?authToken=[YOUR TOKEN]>
+
+
+
+ +
+
+ +
+ + diff --git a/examples/package.json b/examples/package.json new file mode 100644 index 0000000..f50538a --- /dev/null +++ b/examples/package.json @@ -0,0 +1,15 @@ +{ + "name": "examples", + "module": "index.ts", + "type": "module", + "scripts": { + "build": "rm -rf node_modules && bun i && bun build --target=node ./src/index.ts --outfile=dist/index.js" + }, + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0", + "githubdb": "link:githubdb" + } +} diff --git a/examples/server.sh b/examples/server.sh new file mode 100755 index 0000000..35b1171 --- /dev/null +++ b/examples/server.sh @@ -0,0 +1,4 @@ +bun run build + +npx local-web-server \ + --directory . diff --git a/examples/src/index.ts b/examples/src/index.ts new file mode 100644 index 0000000..d977736 --- /dev/null +++ b/examples/src/index.ts @@ -0,0 +1,25 @@ +import { GithubApi } from "../../out"; + +export const DEFAULT_OPTIONS = { + username: "jacklehamster", + authToken: "", + organizationName: "jacklehamster", + databaseStorageRepoName: "github-datastore", +}; + +interface Options { + username: string; + authToken: string; + organizationName: string; + databaseStorageRepoName: string; +} + +export async function getData(key: string, options?: Options) { + const api = new GithubApi({ ...DEFAULT_OPTIONS, ...options}); + return api.getData(key); +} + +export async function setData(key: string, value: any, options?: Options) { + const api = new GithubApi({ ...DEFAULT_OPTIONS, ...options}); + return api.setData(key, value); +} diff --git a/examples/tsconfig.json b/examples/tsconfig.json new file mode 100644 index 0000000..dcd8fc5 --- /dev/null +++ b/examples/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": ["ESNext"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + /* Linting */ + "skipLibCheck": true, + "strict": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3ae27c1 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "githubdb", + "module": "src/index.ts", + "license": "MIT", + "main": "out/index.js", + "types": "out/index.d.ts", + "engines": { + "node": ">=14.0.0" + }, + "scripts": { + "build": "bun i && bun run bundler/bundler.ts && bun run build:declaration && npx webpack", + "build:declaration": "tsc --emitDeclarationOnly --project tsconfig.types.json" + }, + "devDependencies": { + "@babel/cli": "^7.24.5", + "@babel/core": "^7.24.5", + "@babel/preset-env": "^7.24.5", + "@babel/preset-typescript": "^7.24.1", + "@types/bun": "latest", + "@types/jquery": "^3.5.30", + "@types/lodash": "^4.17.1", + "@types/lodash.isequal": "^4.5.8", + "@types/node": "^20.12.12", + "@types/requirejs": "^2.1.37", + "babel-cli": "^6.26.0", + "babel-loader": "^9.1.3", + "bun-types": "^1.1.8", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": {} +} diff --git a/scripts/githubAPI/githubConnector.js b/scripts/githubAPI/githubConnector.js index cdcae72..04efa13 100644 --- a/scripts/githubAPI/githubConnector.js +++ b/scripts/githubAPI/githubConnector.js @@ -1,95 +1,36 @@ define([ - 'jquery', - 'lodash', '../util/find-get-param.js', - ], function($, _, FindGetParam) { + '../../dist/index.js', + ], function(FindGetParam, {GithubApi}) { const authToken = FindGetParam('token') const username = FindGetParam('username') const rootURL = 'https://api.github.com'; const organizationName = FindGetParam('owner') ?? 'The-Brains'; const databaseStorageRepoName = FindGetParam('repo') ?? 'database-storage'; + const api = new GithubApi({ + rootURL, + organizationName, + databaseStorageRepoName, + authToken, + username, + }); + var Github = function() { var myself = this; }; - Github.authToken = authToken; - Github.username = username; + Github.authToken = api.authToken; + Github.username = api.username; if (!Github.authToken || !Github.username) { throw 'Need to set GET request with "token" and "username".'; } - Github.getData = function(key) { - var my_atob = atob; - return $.ajax({ - url: `${rootURL}/repos/${organizationName}/${databaseStorageRepoName}` - + `/contents/data/${key}.json`, - beforeSend: function(xhr) { - xhr.setRequestHeader( - "Authorization", - "Basic " + btoa(`${Github.username}:${Github.authToken}`)); - }, - type: 'GET', - }) - .then(function(data) { - var content = my_atob(data.content); - var parsed = $.parseJSON(content); - return Promise.resolve({ - data: parsed, - sha: data.sha - }); - }) - .catch(function(error) { - if (error.responseJSON?.message === 'Not Found') { - return Promise.resolve({ - data: null, - sha: null, - }); - } - - return Promise.reject(error); - }); + return api.getData(key); }; Github.setData = function(key, value) { - - return Github.getData(key).then(function(data) { - if (_.isEqual(value, data.data)) { - return Promise.resolve({ - data: value, - sha: data.sha, - }); - } - - var content = btoa(JSON.stringify(value)); - var url = `${rootURL}/repos/${organizationName}/${databaseStorageRepoName}` - + `/contents/data/${key}.json` - var newData = JSON.stringify({ - message: `Creating key/value for key: '${key}'`, - content: content, - sha: data.sha - }); - var headers = {}; - - return $.ajax({ - url: url, - beforeSend: function(xhr) { - xhr.setRequestHeader( - "Authorization", - "Basic " + btoa(`${Github.username}:${Github.authToken}`)); - }, - dataType: 'json', - method: 'PUT', - headers: headers, - data: newData, - }) - .then(function(data) { - return Promise.resolve({ - data: value, - sha: data.content.sha - }); - }); - }); + return api.setData(key, value); }; return Github; diff --git a/server.sh b/server.sh index 1d2c5bf..35b1171 100755 --- a/server.sh +++ b/server.sh @@ -1,2 +1,4 @@ +bun run build + npx local-web-server \ --directory . diff --git a/src/github-api/github-api.ts b/src/github-api/github-api.ts new file mode 100644 index 0000000..182f05c --- /dev/null +++ b/src/github-api/github-api.ts @@ -0,0 +1,101 @@ +import {isEqual} from "lodash" + +export class GithubApi { + authToken: string; + username: string; + rootURL: string; + organizationName: string; + databaseStorageRepoName: string; + constructor({ + authToken, + username, + rootURL = 'https://api.github.com', + organizationName = 'The-Brains', + databaseStorageRepoName = 'database-storage', + }: { + authToken: string; + username: string; + rootURL?: string; + organizationName?: string; + databaseStorageRepoName?: string; + }) { + this.authToken = authToken; + this.username = username; + this.rootURL = rootURL; + this.organizationName = organizationName; + this.databaseStorageRepoName = databaseStorageRepoName; + + if (!this.authToken || !this.username) { + throw 'Need to set GET request with "token" and "username".'; + } + } + + headerAuthorization() { + return "Basic " + btoa(`${this.username}:${this.authToken}`); + } + + async getData(key: string) { + const path = `contents/data/${key}.json`; + const url = `${this.rootURL}/repos/${this.organizationName}/${this.databaseStorageRepoName}/${path}`; + + try { + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: this.headerAuthorization(), + }, + }); + const data: any = await response.json(); + if (data.content) { + const content = atob(data.content); + const parsed = JSON.parse(content); + return { + data: parsed, + sha: data.sha, + }; + } else if (data.message === "Not Found") { + return { + data: null, sha: null, + } + } else { + throw new Error("Unable to parse response."); + } + } catch (e: any) { + if (e.responseJSON?.message === "Not Found") { + return { + data: null, sha: null, + } + } else { + throw e; + } + } + } + + async setData(key: string, value: any) { + const data = await this.getData(key); + if (isEqual(value, data.data)) { + return data; + } + const content = btoa(JSON.stringify(value)); + const path = `contents/data/${key}.json`; + const url = `${this.rootURL}/repos/${this.organizationName}/${this.databaseStorageRepoName}/${path}`; + + const newData = JSON.stringify({ + message: `Creating key/value for key: '${key}'`, + content: content, + sha: data.sha + }); + const response = await fetch(url, { + method: "PUT", + headers: { + Authorization: this.headerAuthorization(), + }, + body: newData, + }); + const jsonResponse: any = await response.json(); + return { + data: value, + sha: jsonResponse.content.sha, + }; + } +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..b822620 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,3 @@ +import { GithubApi } from './github-api/github-api' + +export { GithubApi }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ce04f76 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "module": "amd", + "target": "es5", + "strict": true, + }, +} diff --git a/tsconfig.types.json b/tsconfig.types.json new file mode 100644 index 0000000..7cb556b --- /dev/null +++ b/tsconfig.types.json @@ -0,0 +1,32 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "outDir": "./out", + "declarationDir": "./out", + "noEmit": false, + "emitDeclarationOnly": true, + "declaration": true, + "esModuleInterop": true, + "baseUrl": ".", + "types": ["bun-types"], + + "rootDir": "src", + "paths": { + "@/*": ["src/*"] + }, + "lib": ["ESNext"], + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "composite": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "lib", "types"] +} diff --git a/types/github-api/github-api.d.ts b/types/github-api/github-api.d.ts new file mode 100644 index 0000000..ed215a1 --- /dev/null +++ b/types/github-api/github-api.d.ts @@ -0,0 +1,14 @@ +export declare class GithubApi { + authToken: string; + username: string; + rootURL: string; + organizationName: string; + databaseStorageRepoName: string; + constructor({ authToken, username, rootURL, organizationName, databaseStorageRepoName, }: { + authToken: string; + username: string; + rootURL: string; + organizationName: string; + databaseStorageRepoName: string; + }); +} diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 0000000..dbe6cd3 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,2 @@ +import { GithubApi } from './github-api/github-api'; +export { GithubApi }; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..13d0862 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,23 @@ +const path = require('path'); + +module.exports = { + entry: './src/index.ts', + output: { + filename: 'index.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'amd', // Specify AMD format for RequireJS + }, + resolve: { + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'babel-loader', + exclude: /node_modules/, + }, + ], + }, + mode: "production", +};