Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: public private routing #1474

Merged
merged 156 commits into from Nov 7, 2022
Merged
Show file tree
Hide file tree
Changes from 131 commits
Commits
Show all changes
156 commits
Select commit Hold shift + click to select a range
975017a
feat: init private and public routes
peterpeterparker Oct 12, 2022
6536ab8
chore: merge main
peterpeterparker Oct 12, 2022
71ee3f1
chore: merge main
peterpeterparker Oct 17, 2022
b8faa20
chore: merge main
peterpeterparker Oct 17, 2022
14c21dc
feat: wip
peterpeterparker Oct 18, 2022
8c7addd
feat: todo prerendering
peterpeterparker Oct 18, 2022
2f33e10
feat: signin promise
peterpeterparker Oct 18, 2022
b6cf5e8
feat: format and new routes
peterpeterparker Oct 18, 2022
8be9fa0
feat: signin sync
peterpeterparker Oct 18, 2022
5331c32
chore: format
peterpeterparker Oct 18, 2022
e6e7033
feat: use id to load wallet
peterpeterparker Oct 18, 2022
e5d33ad
feat: switch universe
peterpeterparker Oct 18, 2022
074fc1e
feat: todo
peterpeterparker Oct 18, 2022
e6bb7e2
feat: goto async
peterpeterparker Oct 18, 2022
ab3e126
feat: remove legacy wallet
peterpeterparker Oct 18, 2022
0e42565
feat: custom error page
peterpeterparker Oct 18, 2022
47ee51e
feat: load nns wallet
peterpeterparker Oct 18, 2022
a1db8e1
feat: simplify load
peterpeterparker Oct 18, 2022
a6f1ede
chore: format
peterpeterparker Oct 18, 2022
0ef1bca
refactor: simplify
peterpeterparker Oct 18, 2022
fe2da4b
chore: no dev
peterpeterparker Oct 18, 2022
446e898
refactor: rename store
peterpeterparker Oct 18, 2022
83990f8
feat: sns wallet back
peterpeterparker Oct 18, 2022
47caa7f
chore: lint
peterpeterparker Oct 18, 2022
46c701c
chore: format
peterpeterparker Oct 18, 2022
2fb23ac
test: layout
peterpeterparker Oct 18, 2022
445f825
feat: prerendering option and adapt few tests
peterpeterparker Oct 18, 2022
25a1bd0
feat: detail routing with properties
peterpeterparker Oct 18, 2022
69c73b5
test: adapt
peterpeterparker Oct 18, 2022
e0be725
test: routes
peterpeterparker Oct 18, 2022
b804e92
feat: menu and path
peterpeterparker Oct 18, 2022
6951996
feat: remove accounts component
peterpeterparker Oct 19, 2022
65604b4
feat: derived page store
peterpeterparker Oct 19, 2022
3744375
feat: menu items selected app path
peterpeterparker Oct 19, 2022
76f5c74
chore: lint
peterpeterparker Oct 19, 2022
b02c1af
feat: remove constant
peterpeterparker Oct 19, 2022
0036463
feat: redo use component to limit changes
peterpeterparker Oct 19, 2022
ec50458
feat: neurons and nns neuron
peterpeterparker Oct 19, 2022
3983656
test: page neurons
peterpeterparker Oct 19, 2022
d5708b6
feat: sns neuron
peterpeterparker Oct 19, 2022
9a27f74
chore: lint
peterpeterparker Oct 19, 2022
dfa2a81
feat: remove deprecated code
peterpeterparker Oct 19, 2022
109aab6
chore: merge main
peterpeterparker Oct 19, 2022
3be8fa3
feat: proposal
peterpeterparker Oct 19, 2022
a32a7d1
chore: merge main
peterpeterparker Oct 24, 2022
0443d1a
feat: navigate proposal
peterpeterparker Oct 24, 2022
d46adc4
feat: proposal go back
peterpeterparker Oct 24, 2022
ac5bc3b
feat: remove proposals path
peterpeterparker Oct 24, 2022
2ada1bb
feat: after navigate for referrer in proposals
peterpeterparker Oct 24, 2022
01f439c
chore: format
peterpeterparker Oct 24, 2022
c7f2134
refactor: move tests
peterpeterparker Oct 24, 2022
7b0081c
chore: remove todo
peterpeterparker Oct 24, 2022
3279314
feat: canisters page
peterpeterparker Oct 24, 2022
b7e8128
feat: canister page
peterpeterparker Oct 24, 2022
69abe19
feat: remove legacy canister constant
peterpeterparker Oct 24, 2022
9194656
feat: canister and canisters page
peterpeterparker Oct 24, 2022
3d514f3
feat: remove
peterpeterparker Oct 24, 2022
96b796f
feat: path
peterpeterparker Oct 24, 2022
842e712
feat: remove deprecated utils and constants
peterpeterparker Oct 24, 2022
e2eeb05
test: adapt for deprecated router store
peterpeterparker Oct 24, 2022
371905b
test: adapt for deprecated router store
peterpeterparker Oct 24, 2022
fa629c1
test: adapt for deprecated router store
peterpeterparker Oct 24, 2022
5c73d8a
test: adapt for deprecated router store
peterpeterparker Oct 24, 2022
f88d829
feat: deprecated route utils
peterpeterparker Oct 24, 2022
bda91c0
fix: revert wrongly pushed
peterpeterparker Oct 24, 2022
09080f0
chore: lint
peterpeterparker Oct 24, 2022
9d8587c
chore: lint
peterpeterparker Oct 24, 2022
0bda3bb
Merge branch 'main' into feat/public-private-routing
peterpeterparker Oct 25, 2022
6722d73
feat: title and back
peterpeterparker Oct 25, 2022
648c55a
fix: refresh selected path
peterpeterparker Oct 25, 2022
b7afa6d
feat: logout only if signed in
peterpeterparker Oct 25, 2022
05c1310
fix: glitch
peterpeterparker Oct 25, 2022
477e8bc
fix: back referrer
peterpeterparker Oct 25, 2022
e525e3e
fix: main not found
peterpeterparker Oct 25, 2022
77b5775
fix: main not found
peterpeterparker Oct 25, 2022
f2efbc1
feat: apply robots and csp to all html files
peterpeterparker Oct 25, 2022
ffd0c6b
feat: one main.js per route
peterpeterparker Oct 25, 2022
6af3804
chore: remove
peterpeterparker Oct 25, 2022
5d39e6c
feat: inject script loader
peterpeterparker Oct 25, 2022
20fc31f
fix: local storage server runtime
peterpeterparker Oct 25, 2022
30be709
chore: format
peterpeterparker Oct 25, 2022
b9fa8dc
chore: lint
peterpeterparker Oct 25, 2022
14dff54
feat: generic sign in page
peterpeterparker Oct 25, 2022
a38fdb4
chore: add todo
peterpeterparker Oct 25, 2022
1727c32
feat: get icp only if sign in
peterpeterparker Oct 25, 2022
3fb300c
feat: replace state in navigation
peterpeterparker Oct 25, 2022
4e0bf3a
feat: back async
peterpeterparker Oct 25, 2022
c95d67e
feat: light error page content
peterpeterparker Oct 25, 2022
aa92f27
chore: format
peterpeterparker Oct 25, 2022
42ae327
chore: remove error page
peterpeterparker Oct 25, 2022
ccf3770
build: remove sveltekit csp empty tag
peterpeterparker Oct 25, 2022
6d6894b
build: vite beta (forced) and disable module preload
peterpeterparker Oct 25, 2022
ec28279
build: revert does not bring much
peterpeterparker Oct 25, 2022
84808ae
build: remove preloaded scripts
peterpeterparker Oct 25, 2022
abda5d4
build: remove script
peterpeterparker Oct 25, 2022
a58a182
chore: format
peterpeterparker Oct 26, 2022
4c7dbd2
feat: lazy load routes
peterpeterparker Oct 26, 2022
11ae0aa
build: remove preloading scripts
peterpeterparker Oct 26, 2022
b3ce894
build: vite preload module false
peterpeterparker Oct 26, 2022
c5c1075
build: fix vite beta is buggy - do not render css on first page
peterpeterparker Oct 26, 2022
be7efae
feat: defer spinner
peterpeterparker Oct 26, 2022
40cde10
feat: smoothness sign out
peterpeterparker Oct 26, 2022
c5a674e
chore: format
peterpeterparker Oct 26, 2022
6062383
chore: no dev
peterpeterparker Oct 26, 2022
3d63a40
feat: toast and busy screen not needed on login screen
peterpeterparker Oct 26, 2022
fcbfea7
feat: lazy load app initializer
peterpeterparker Oct 26, 2022
4cbd4f6
style: sign-in button
peterpeterparker Oct 26, 2022
c7faabe
chore: format
peterpeterparker Oct 26, 2022
4da0a8b
feat: buffer needed only for app
peterpeterparker Oct 26, 2022
a9570b3
build: remove preload script
peterpeterparker Oct 26, 2022
05b51c7
build: bundle vendor in a single chunk
peterpeterparker Oct 26, 2022
0b04dd4
build: spare chunks
peterpeterparker Oct 26, 2022
0db1d1a
chore: format
peterpeterparker Oct 26, 2022
f77ba8b
build: update gix-cmp
peterpeterparker Oct 26, 2022
d5637a6
chore: merge main
peterpeterparker Oct 26, 2022
c785b54
fix: title
peterpeterparker Oct 26, 2022
390a43f
test: adapt
peterpeterparker Oct 27, 2022
61cbe63
feat: proxy to init app
peterpeterparker Oct 27, 2022
93dc3ac
chore: format
peterpeterparker Oct 27, 2022
6460537
test: mock proxy
peterpeterparker Oct 27, 2022
298ecba
chore: lint
peterpeterparker Oct 27, 2022
86f40d0
feat: goto proxy
peterpeterparker Oct 27, 2022
287d5c8
feat: app url
peterpeterparker Oct 27, 2022
277fad2
feat: solve todo
peterpeterparker Oct 27, 2022
863f7d1
test: sign-in pages
peterpeterparker Oct 27, 2022
c7a2b0b
test: path for route
peterpeterparker Oct 27, 2022
c1a3028
test: nav util
peterpeterparker Oct 27, 2022
a104bdc
chore: merge main
peterpeterparker Oct 27, 2022
f44945f
Merge branch 'main' into feat/public-private-routing
peterpeterparker Oct 27, 2022
9113db2
build: provide a config to run test and lint in the ci otherwise app …
peterpeterparker Oct 27, 2022
1daa961
build: fix working dir
peterpeterparker Oct 27, 2022
aa816e1
chore: use isNullish
peterpeterparker Oct 28, 2022
750bc04
feat: return
peterpeterparker Oct 28, 2022
6f8de04
build: custom chunks
peterpeterparker Oct 31, 2022
1648657
build: dapp and vendor chunks
peterpeterparker Oct 31, 2022
208b676
chore: merge main
peterpeterparker Oct 31, 2022
4f0c496
test: update after merge
peterpeterparker Oct 31, 2022
cbdc509
test: mock after navigate
peterpeterparker Oct 31, 2022
3e7d4e8
Merge branch 'main' into feat/public-private-routing
peterpeterparker Nov 1, 2022
d9d1a66
chore: format
peterpeterparker Nov 1, 2022
686c4a5
chore: merge main
peterpeterparker Nov 2, 2022
168970a
feat: backwards compatibility to redirect old #/proposal/xxxx url
peterpeterparker Nov 2, 2022
c0fecb3
fix: polyfill buffer from root for redirection
peterpeterparker Nov 2, 2022
7ac6251
chore: lint
peterpeterparker Nov 2, 2022
68da94c
test: auth forward
peterpeterparker Nov 2, 2022
9d75a75
test: review mock url
peterpeterparker Nov 2, 2022
9c035f5
feat: few build url shorthands
peterpeterparker Nov 2, 2022
d7a5ebe
feat: return after goto
peterpeterparker Nov 4, 2022
a283177
chore: merge main
peterpeterparker Nov 4, 2022
68a7542
test: mock
peterpeterparker Nov 4, 2022
c9fea3e
chore: lint
peterpeterparker Nov 4, 2022
ea3e515
style: sign in nns
peterpeterparker Nov 7, 2022
9ebb828
feat: sign in in toolbar
peterpeterparker Nov 7, 2022
39916f8
chore: merge main
peterpeterparker Nov 7, 2022
0b36afc
build: update gix
peterpeterparker Nov 7, 2022
e758ac3
test: adapted for new signin button
peterpeterparker Nov 7, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
14 changes: 12 additions & 2 deletions .github/workflows/checks.yml
Expand Up @@ -122,7 +122,6 @@ jobs:
defaults:
run:
shell: bash
working-directory: ./frontend
env:
DFX_NETWORK: mainnet

Expand All @@ -133,26 +132,31 @@ jobs:
- name: Install dfx
run: DFX_VERSION="$(jq -r .dfx dfx.json)" sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"

- name: Provide a config
run: ./config.sh

- name: Install dependencies
run: npm ci
working-directory: ./frontend

- name: Compile typescript
run: npm run build
working-directory: ./frontend

# Temporarily disabled:
#- name: Run linter
# run: npm run check

- name: Test
run: npm run test
working-directory: ./frontend

svelte-lint:
needs: formatting
runs-on: ubuntu-20.04
defaults:
run:
shell: bash
working-directory: ./frontend
env:
DFX_NETWORK: mainnet

Expand All @@ -163,14 +167,20 @@ jobs:
- name: Install dfx
run: DFX_VERSION="$(jq -r .dfx dfx.json)" sh -ci "$(curl -fsSL https://sdk.dfinity.org/install.sh)"

- name: Provide a config
run: ./config.sh

- name: Install dependencies
run: npm ci
working-directory: ./frontend

- name: Compile typescript
run: npm run build
working-directory: ./frontend

- name: Run linter
run: npm run check
working-directory: ./frontend

e2e-lint:
needs: formatting
Expand Down
1 change: 1 addition & 0 deletions frontend/__mocks__/$app/environment.ts
@@ -1 +1,2 @@
export const browser = false;
export const prerendering = false;
peterpeterparker marked this conversation as resolved.
Show resolved Hide resolved
28 changes: 28 additions & 0 deletions frontend/__mocks__/$app/navigation.ts
@@ -0,0 +1,28 @@
import { page } from "./stores";

export const goto = async (
peterpeterparker marked this conversation as resolved.
Show resolved Hide resolved
url: string | URL,
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
opts?: {
replaceState?: boolean;
noscroll?: boolean;
keepfocus?: boolean;
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
state?: any;
}
): Promise<void> => {
const { search, pathname: routeId } =
url instanceof URL ? url : new URL(`http://localhost:8080${url}`);
peterpeterparker marked this conversation as resolved.
Show resolved Hide resolved
peterpeterparker marked this conversation as resolved.
Show resolved Hide resolved

const { u: universe, ...rest }: Record<string, string> = Object.fromEntries(
new URLSearchParams(search)
);

page.mock({
data: {
universe,
...rest,
},
routeId,
});
};
30 changes: 30 additions & 0 deletions frontend/__mocks__/$app/stores.ts
@@ -0,0 +1,30 @@
import type { Page } from "@sveltejs/kit";
import { writable } from "svelte/store";
import { OWN_CANISTER_ID_TEXT } from "../../src/lib/constants/canister-ids.constants";

const initPageStoreMock = () => {
const { subscribe, set } = writable<Partial<Page>>({
data: {
universe: OWN_CANISTER_ID_TEXT,
path: undefined,
},
});

return {
subscribe,

mock: ({
routeId = undefined,
data = { universe: OWN_CANISTER_ID_TEXT },
}: {
routeId?: string;
data?: { universe: string | null } & Record<string, string>;
}) =>
set({
data,
routeId: `(app)${routeId}`,
}),
};
};

export const page = initPageStoreMock();
1 change: 1 addition & 0 deletions frontend/jest-setup.ts
Expand Up @@ -20,6 +20,7 @@ jest.mock("./src/lib/constants/identity.constants.ts", () => ({
}));

jest.mock("./src/lib/constants/canister-ids.constants.ts", () => ({
OWN_CANISTER_ID_TEXT: "qhbym-qaaaa-aaaaa-aaafq-cai",
OWN_CANISTER_ID: Principal.fromText("qhbym-qaaaa-aaaaa-aaafq-cai"),
LEDGER_CANISTER_ID: Principal.fromText("ryjl3-tyaaa-aaaaa-aaaba-cai"),
GOVERNANCE_CANISTER_ID: Principal.fromText("rrkah-fqaaa-aaaaa-aaaaq-cai"),
Expand Down
2 changes: 2 additions & 0 deletions frontend/jest.config.cjs
Expand Up @@ -22,6 +22,8 @@ module.exports = {
],
moduleNameMapper: {
"^\\$lib(.*)$": "<rootDir>/src/lib$1",
"^\\$routes(.*)$": "<rootDir>/src/routes$1",
"^\\$mocks(.*)$": "<rootDir>/__mocks__$1",
},
setupFiles: ["fake-indexeddb/auto"],
};
36 changes: 21 additions & 15 deletions frontend/package-lock.json

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

3 changes: 2 additions & 1 deletion frontend/package.json
Expand Up @@ -5,6 +5,7 @@
"scripts": {
"build:csp": "node scripts/build.csp.mjs",
"build:robots": "node scripts/build.robots.mjs",
"build:preload": "node scripts/build.preload.mjs",
"i18n": "node --experimental-json-modules scripts/i18n.types.js",
"dev": "npm run i18n && vite dev",
"build": "npm run i18n && vite build && npm run build:robots && npm run build:csp && ./scripts/make-reproducible",
Expand Down Expand Up @@ -52,7 +53,7 @@
"svelte2tsx": "^0.5.19",
"ts-jest": "^29.0.3",
"typescript": "^4.6.4",
"vite": "^3.1.4"
"vite": "^3.1.8"
},
"type": "module",
"dependencies": {
Expand Down
62 changes: 46 additions & 16 deletions frontend/scripts/build.csp.mjs
Expand Up @@ -3,14 +3,46 @@
import { createHash } from "crypto";
import * as dotenv from "dotenv";
import { readFileSync, writeFileSync } from "fs";
import { join } from "path";
import { dirname, join } from "path";
import { findHtmlFiles } from "./build.utils.mjs";

dotenv.config();

const buildCsp = () => {
const indexHTMLWithoutStartScript = extractStartScript();
const indexHTMLWithCSP = updateCSP(indexHTMLWithoutStartScript);
writeFileSync("./public/index.html", indexHTMLWithCSP);
const buildCsp = (htmlFile) => {
// 1. We extract the start script parsed by SvelteKit into the html file
const indexHTMLWithoutStartScript = extractStartScript(htmlFile);
// 2. We add our custom script loader - we inject it at build time because it would throw an error when developing locally if missing
const indexHTMLWithScriptLoader = injectScriptLoader(
indexHTMLWithoutStartScript
);
// 3. remove the content-security-policy tag injected by SvelteKit
const indexHTMLNoCSP = removeDefaultCspTag(indexHTMLWithScriptLoader);
// 4. We calculate the sha256 values for these scripts and update the CSP
const indexHTMLWithCSP = updateCSP(indexHTMLNoCSP);

writeFileSync(htmlFile, indexHTMLWithCSP);
};

const removeDefaultCspTag = (indexHtml) => {
return indexHtml.replace(
'<meta http-equiv="content-security-policy" content="">',
""
);
};

/**
* We need a script loader to implement a proper Content Security Policy. See `updateCSP` doc for more information.
*/
const injectScriptLoader = (indexHtml) => {
return indexHtml.replace(
"<!-- SCRIPT_LOADER -->",
`<script>
const loader = document.createElement("script");
loader.type = "module";
loader.src = "main.js";
document.head.appendChild(loader);
</script>`
);
};

/**
Expand All @@ -22,11 +54,8 @@ const buildCsp = () => {
* 2. we remove the script content from index.html but, let the script tag as anchor
* 3. we use our custom script loader to load the main.js script
*/
const extractStartScript = () => {
const indexHtml = readFileSync(
join(process.cwd(), "public", "index.html"),
"utf-8"
);
const extractStartScript = (htmlFile) => {
const indexHtml = readFileSync(htmlFile, "utf-8");

const svelteKitStartScript =
/(<script type=\"module\" data-sveltekit-hydrate[\s\S]*?>)([\s\S]*?)(<\/script>)/gm;
Expand All @@ -36,11 +65,11 @@ const extractStartScript = () => {
svelteKitStartScript.exec(indexHtml);
const inlineScript = content.replace(/^\s*/gm, "");

writeFileSync(
join(process.cwd(), "public", "main.js"),
inlineScript,
"utf-8"
);
// Each file needs its own main.js because the script that calls the SvelteKit start function contains information dedicated to the route
// i.e. the routeId and a particular id for the querySelector use to attach the content
const folderPath = dirname(htmlFile);

writeFileSync(join(folderPath, "main.js"), inlineScript, "utf-8");

// 2. replace SvelteKit script tag content with empty
return indexHtml.replace(svelteKitStartScript, "$1$3");
Expand Down Expand Up @@ -120,4 +149,5 @@ const cspConnectSrc = () => {
.trim();
};

buildCsp();
const htmlFiles = findHtmlFiles();
htmlFiles.forEach((htmlFile) => buildCsp(htmlFile));
18 changes: 8 additions & 10 deletions frontend/scripts/build.robots.mjs
Expand Up @@ -2,23 +2,20 @@

import * as dotenv from "dotenv";
import { readFileSync, writeFileSync } from "fs";
import { join } from "path";
import { findHtmlFiles } from "./build.utils.mjs";

dotenv.config();

const buildRobots = () => {
const updatedIndexHTML = updateRobots();
writeFileSync("./public/index.html", updatedIndexHTML);
const buildRobots = (htmlFile) => {
const updatedIndexHTML = updateRobots(htmlFile);
writeFileSync(htmlFile, updatedIndexHTML);
};

/**
* No search engines indexation locally or testnet otherwise remove comments.
*/
const updateRobots = () => {
const content = readFileSync(
join(process.cwd(), "public", "index.html"),
"utf-8"
);
const updateRobots = (htmlFile) => {
const content = readFileSync(htmlFile, "utf-8");

return content.replace(
"<!-- ROBOTS -->",
peterpeterparker marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -28,4 +25,5 @@ const updateRobots = () => {
);
};

buildRobots();
const htmlFiles = findHtmlFiles();
htmlFiles.forEach((htmlFile) => buildRobots(htmlFile));
20 changes: 20 additions & 0 deletions frontend/scripts/build.utils.mjs
@@ -0,0 +1,20 @@
import { lstatSync, readdirSync } from "fs";
import { extname, join } from "path";

const findFiles = ({ dir, files }) => {
readdirSync(dir).forEach((file) => {
const fullPath = join(dir, file);
if (lstatSync(fullPath).isDirectory()) {
findFiles({ dir: fullPath, files });
} else {
files.push(fullPath);
}
});
};

export const findHtmlFiles = (dir = join(process.cwd(), "public")) => {
const files = [];
findFiles({ dir, files });

return files.filter((entry) => [".html"].includes(extname(entry)));
};
7 changes: 1 addition & 6 deletions frontend/src/app.html
Expand Up @@ -107,12 +107,7 @@
}
</script>

<script>
const loader = document.createElement("script");
loader.type = "module";
loader.src = "./main.js";
document.head.appendChild(loader);
</script>
<!-- SCRIPT_LOADER -->

%sveltekit.head%
</head>
Expand Down