Fetch exercise from server

This commit is contained in:
Ibitoye Rotimi Best
2021-07-25 17:44:11 +03:00
parent 29d3e6b7e0
commit c35d79fa5f
16 changed files with 313 additions and 87 deletions
+1
View File
@@ -3,3 +3,4 @@
/src/node_modules/@sapper/ /src/node_modules/@sapper/
yarn-error.log yarn-error.log
/__sapper__/ /__sapper__/
.env
+181 -2
View File
@@ -1332,6 +1332,50 @@
"picomatch": "^2.2.2" "picomatch": "^2.2.2"
} }
}, },
"@supabase/gotrue-js": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-1.17.0.tgz",
"integrity": "sha512-c+GSSoW+PIT3/r7TnBdc4gPjtWDutO/2ROafSKUFl39Pb8aHIUbUvzK9sjuedaaLKH7bV8VefuRy2L8c0BUAzg==",
"requires": {
"cross-fetch": "^3.0.6"
}
},
"@supabase/postgrest-js": {
"version": "0.33.0",
"resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-0.33.0.tgz",
"integrity": "sha512-og6Evdkan7Qp6+tOch7Pyq+ZWMnrCQtPHWwPpsN5A3iYQSro2yn21Yvazs9qAFoWAeTGNkuTOVpShT5Mbc9WcQ==",
"requires": {
"cross-fetch": "^3.0.6"
}
},
"@supabase/realtime-js": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-1.1.1.tgz",
"integrity": "sha512-kUew5KPjgWYtenxrQJWZ/tHMGlg5Qz++bbsiY8Y89AjZQioSO557MlGHaEoT6k4s7CJ6e/ctNsT7tRhCKJimcQ==",
"requires": {
"@types/websocket": "^1.0.3",
"websocket": "^1.0.34"
}
},
"@supabase/storage-js": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-1.4.0.tgz",
"integrity": "sha512-7+SGyXOgdhtz8qHzXo64HiS66PT/y4F8YFNMtXqYOu1LjHh0YwtOgpPLDA8obiSsNVwZiKwpgBJkz4LHG1YvRQ==",
"requires": {
"cross-fetch": "^3.1.0"
}
},
"@supabase/supabase-js": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-1.20.0.tgz",
"integrity": "sha512-G+BKKlr6a+q5Rf6OcNP3LInTih+hP92gmWp6zQZL2rYVvCa51LLhAtu+NrgMR6+AYs1D7ipLKYYiiq85Oerazg==",
"requires": {
"@supabase/gotrue-js": "^1.16.6",
"@supabase/postgrest-js": "^0.33.0",
"@supabase/realtime-js": "^1.1.1",
"@supabase/storage-js": "^1.4.0"
}
},
"@tailwindcss/forms": { "@tailwindcss/forms": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.2.tgz",
@@ -1355,8 +1399,7 @@
"@types/node": { "@types/node": {
"version": "15.6.0", "version": "15.6.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz",
"integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A==", "integrity": "sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A=="
"dev": true
}, },
"@types/pug": { "@types/pug": {
"version": "2.0.4", "version": "2.0.4",
@@ -1382,6 +1425,14 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/websocket": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.3.tgz",
"integrity": "sha512-ZdoTSwmDsKR7l1I8fpfQtmTI/hUwlOvE3q0iyJsp4tXU0MkdrYowimDzwxjhQvxU4qjhHLd3a6ig0OXRbLgIdw==",
"requires": {
"@types/node": "*"
}
},
"abbrev": { "abbrev": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -1621,6 +1672,14 @@
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true "dev": true
}, },
"bufferutil": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz",
"integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==",
"requires": {
"node-gyp-build": "^4.2.0"
}
},
"builtin-modules": { "builtin-modules": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
@@ -1974,6 +2033,14 @@
} }
} }
}, },
"cross-fetch": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
"integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
"requires": {
"node-fetch": "2.6.1"
}
},
"cross-spawn": { "cross-spawn": {
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -2004,6 +2071,15 @@
"array-find-index": "^1.0.1" "array-find-index": "^1.0.1"
} }
}, },
"d": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"requires": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"dashdash": { "dashdash": {
"version": "1.14.1", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -2091,6 +2167,11 @@
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"dev": true "dev": true
}, },
"dotenv": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz",
"integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="
},
"ecc-jsbn": { "ecc-jsbn": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -2124,6 +2205,35 @@
"is-arrayish": "^0.2.1" "is-arrayish": "^0.2.1"
} }
}, },
"es5-ext": {
"version": "0.10.53",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
"integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
"requires": {
"es6-iterator": "~2.0.3",
"es6-symbol": "~3.1.3",
"next-tick": "~1.0.0"
}
},
"es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
"requires": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"es6-symbol": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"requires": {
"d": "^1.0.1",
"ext": "^1.1.2"
}
},
"escalade": { "escalade": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -2153,6 +2263,21 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true "dev": true
}, },
"ext": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
"integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
"requires": {
"type": "^2.0.0"
},
"dependencies": {
"type": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
"integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
}
}
},
"extend": { "extend": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -2996,6 +3121,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
}, },
"next-tick": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
},
"no-case": { "no-case": {
"version": "2.3.2", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
@@ -3014,6 +3144,11 @@
"lodash.toarray": "^4.4.0" "lodash.toarray": "^4.4.0"
} }
}, },
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
},
"node-gyp": { "node-gyp": {
"version": "7.1.2", "version": "7.1.2",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
@@ -3041,6 +3176,11 @@
} }
} }
}, },
"node-gyp-build": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz",
"integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg=="
},
"node-releases": { "node-releases": {
"version": "1.1.72", "version": "1.1.72",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
@@ -4289,6 +4429,19 @@
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
}, },
"type": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
},
"typedarray-to-buffer": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"requires": {
"is-typedarray": "^1.0.0"
}
},
"typescript": { "typescript": {
"version": "4.2.4", "version": "4.2.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
@@ -4349,6 +4502,14 @@
"punycode": "^2.1.0" "punycode": "^2.1.0"
} }
}, },
"utf-8-validate": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.5.tgz",
"integrity": "sha512-+pnxRYsS/axEpkrrEpzYfNZGXp0IjC/9RIxwM5gntY4Koi8SHmUGSfxfWqxZdRxrtaoVstuOzUp/rbs3JSPELQ==",
"requires": {
"node-gyp-build": "^4.2.0"
}
},
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -4383,6 +4544,19 @@
"extsprintf": "^1.2.0" "extsprintf": "^1.2.0"
} }
}, },
"websocket": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz",
"integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==",
"requires": {
"bufferutil": "^4.0.1",
"debug": "^2.2.0",
"es5-ext": "^0.10.50",
"typedarray-to-buffer": "^3.1.5",
"utf-8-validate": "^5.0.2",
"yaeti": "^0.0.6"
}
},
"which": { "which": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4468,6 +4642,11 @@
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
}, },
"yaeti": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
"integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc="
},
"yallist": { "yallist": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+2
View File
@@ -9,8 +9,10 @@
"start": "node __sapper__/build" "start": "node __sapper__/build"
}, },
"dependencies": { "dependencies": {
"@supabase/supabase-js": "^1.20.0",
"@tailwindcss/forms": "^0.3.2", "@tailwindcss/forms": "^0.3.2",
"compression": "^1.7.1", "compression": "^1.7.1",
"dotenv": "^10.0.0",
"hotkeys-js": "^3.8.5", "hotkeys-js": "^3.8.5",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"marked": "^1.2.7", "marked": "^1.2.7",
+43 -43
View File
@@ -1,21 +1,21 @@
import resolve from "@rollup/plugin-node-resolve"; import resolve from '@rollup/plugin-node-resolve';
import replace from "@rollup/plugin-replace"; import replace from '@rollup/plugin-replace';
import commonjs from "@rollup/plugin-commonjs"; import commonjs from '@rollup/plugin-commonjs';
import svelte from "rollup-plugin-svelte"; import svelte from 'rollup-plugin-svelte';
import babel from "@rollup/plugin-babel"; import babel from '@rollup/plugin-babel';
import { terser } from "rollup-plugin-terser"; import { terser } from 'rollup-plugin-terser';
import config from "sapper/config/rollup.js"; import config from 'sapper/config/rollup.js';
import sveltePreprocess from "svelte-preprocess"; import sveltePreprocess from 'svelte-preprocess';
import pkg from "./package.json"; import pkg from './package.json';
const mode = process.env.NODE_ENV; const mode = process.env.NODE_ENV;
const dev = mode === "development"; const dev = mode === 'development';
const legacy = !!process.env.SAPPER_LEGACY_BUILD; const legacy = !!process.env.SAPPER_LEGACY_BUILD;
const onwarn = (warning, onwarn) => const onwarn = (warning, onwarn) =>
(warning.code === "MISSING_EXPORT" && /'preload'/.test(warning.message)) || (warning.code === 'MISSING_EXPORT' && /'preload'/.test(warning.message)) ||
(warning.code === "CIRCULAR_DEPENDENCY" && (warning.code === 'CIRCULAR_DEPENDENCY' &&
/[/\\]@sapper[/\\]/.test(warning.message)) || /[/\\]@sapper[/\\]/.test(warning.message)) ||
onwarn(warning); onwarn(warning);
@@ -27,54 +27,54 @@ export default {
output: config.client.output(), output: config.client.output(),
plugins: [ plugins: [
replace({ replace({
"process.browser": true, 'process.browser': true,
"process.env.NODE_ENV": JSON.stringify(mode), 'process.env.NODE_ENV': JSON.stringify(mode),
preventAssignment: true preventAssignment: true,
}), }),
svelte({ svelte({
preprocess, preprocess,
dev, dev,
hydratable: true, hydratable: true,
emitCss: true emitCss: true,
}), }),
resolve({ resolve({
browser: true, browser: true,
dedupe: ["svelte"] dedupe: ['svelte'],
}), }),
commonjs(), commonjs(),
legacy && legacy &&
babel({ babel({
extensions: [".js", ".mjs", ".html", ".svelte"], extensions: ['.js', '.mjs', '.html', '.svelte'],
babelHelpers: "runtime", babelHelpers: 'runtime',
exclude: ["node_modules/@babel/**"], exclude: ['node_modules/@babel/**'],
presets: [ presets: [
[ [
"@babel/preset-env", '@babel/preset-env',
{ {
targets: "> 0.25%, not dead" targets: '> 0.25%, not dead',
} },
] ],
], ],
plugins: [ plugins: [
"@babel/plugin-syntax-dynamic-import", '@babel/plugin-syntax-dynamic-import',
[ [
"@babel/plugin-transform-runtime", '@babel/plugin-transform-runtime',
{ {
useESModules: true useESModules: true,
} },
] ],
] ],
}), }),
!dev && !dev &&
terser({ terser({
module: true module: true,
}) }),
], ],
preserveEntrySignatures: false, preserveEntrySignatures: false,
onwarn onwarn,
}, },
server: { server: {
@@ -82,27 +82,27 @@ export default {
output: config.server.output(), output: config.server.output(),
plugins: [ plugins: [
replace({ replace({
"process.browser": false, 'process.browser': false,
"process.env.NODE_ENV": JSON.stringify(mode), 'process.env.NODE_ENV': JSON.stringify(mode),
preventAssignment: true preventAssignment: true,
}), }),
svelte({ svelte({
preprocess, preprocess,
generate: "ssr", generate: 'ssr',
hydratable: true, hydratable: true,
dev dev,
}), }),
resolve({ resolve({
dedupe: ["svelte"] dedupe: ['svelte'],
}), }),
commonjs() commonjs(),
], ],
external: Object.keys(pkg.dependencies).concat( external: Object.keys(pkg.dependencies).concat(
require("module").builtinModules require('module').builtinModules
), ),
preserveEntrySignatures: "strict", preserveEntrySignatures: 'strict',
onwarn onwarn,
}, },
// serviceworker: { // serviceworker: {
@@ -17,8 +17,6 @@
let currentQuestion = {}; let currentQuestion = {};
let renderProps = {}; let renderProps = {};
const { questions, title, description } = $questionnaire;
function handleStart() { function handleStart() {
$questionnaireMetaData.currentQuestionIndex += 1; $questionnaireMetaData.currentQuestionIndex += 1;
} }
@@ -60,20 +58,22 @@
} }
return ( return (
Math.round(((currentQuestionIndex - 1) / questions.length) * 100) || 0 Math.round(
((currentQuestionIndex - 1) / $questionnaire.questions.length) * 100
) || 0
); );
} }
$: { $: {
currentQuestion = currentQuestion =
questions[$questionnaireMetaData.currentQuestionIndex - 1]; $questionnaire.questions[$questionnaireMetaData.currentQuestionIndex - 1];
if ($questionnaireMetaData.currentQuestionIndex > 0 && !currentQuestion) { if ($questionnaireMetaData.currentQuestionIndex > 0 && !currentQuestion) {
$questionnaireMetaData.isFinished = true; $questionnaireMetaData.isFinished = true;
} }
if (currentQuestion) { if (currentQuestion) {
renderProps = getPropsForQuestion( renderProps = getPropsForQuestion(
questions, $questionnaire.questions,
currentQuestion, currentQuestion,
$questionnaireMetaData, $questionnaireMetaData,
$questionnaireMetaData.currentQuestionIndex, $questionnaireMetaData.currentQuestionIndex,
@@ -87,15 +87,20 @@
$: $questionnaireMetaData.progressValue = getProgressValue( $: $questionnaireMetaData.progressValue = getProgressValue(
$questionnaireMetaData.currentQuestionIndex $questionnaireMetaData.currentQuestionIndex
); );
$: console.log('$questionnaire', $questionnaire);
</script> </script>
{#if !preview && questions.length && !$questionnaireMetaData.isFinished} {#if !preview && $questionnaire.questions.length && !$questionnaireMetaData.isFinished}
<Progress value={$questionnaireMetaData.progressValue} /> <Progress value={$questionnaireMetaData.progressValue} />
{/if} {/if}
{#if preview} {#if preview}
<Preview {questions} questionnaireMetaData={$questionnaireMetaData} /> <Preview
{:else if !questions.length} questions={$questionnaire.questions}
questionnaireMetaData={$questionnaireMetaData}
/>
{:else if !$questionnaire.questions.length}
<div <div
class="w-4/5 h-40 m-auto flex items-center justify-center text-center border-2 border-gray-200 rounded-md" class="w-4/5 h-40 m-auto flex items-center justify-center text-center border-2 border-gray-200 rounded-md"
> >
@@ -106,8 +111,8 @@
</div> </div>
{:else if $questionnaireMetaData.currentQuestionIndex === 0} {:else if $questionnaireMetaData.currentQuestionIndex === 0}
<div> <div>
<h2 class="my-1">{title}</h2> <h2 class="my-1">{$questionnaire.title}</h2>
<p>{description}</p> <p>{$questionnaire.description}</p>
<PrimaryButton <PrimaryButton
onClick={handleStart} onClick={handleStart}
@@ -119,7 +124,7 @@
{:else if $questionnaireMetaData.isFinished} {:else if $questionnaireMetaData.isFinished}
<div class="flex items-center justify-between"> <div class="flex items-center justify-between">
<div class="flex flex-col justify-between"> <div class="flex flex-col justify-between">
<h2 class="text-xl mb-2 mt-0">{title}</h2> <h2 class="text-xl mb-2 mt-0">{$questionnaire.title}</h2>
{#if STATUS.IN_PROGRESS === $questionnaireMetaData.status} {#if STATUS.IN_PROGRESS === $questionnaireMetaData.status}
<span <span
class="bg-yellow-600 text-white rounded-full py-2 px-6 text-center" class="bg-yellow-600 text-white rounded-full py-2 px-6 text-center"
@@ -144,7 +149,10 @@
{getTotalScores()}/100 {getTotalScores()}/100
</span> </span>
</div> </div>
<Preview {questions} questionnaireMetaData={$questionnaireMetaData} /> <Preview
questions={$questionnaire.questions}
questionnaireMetaData={$questionnaireMetaData}
/>
{:else if QUESTION_TYPE.RADIO === currentQuestion.type} {:else if QUESTION_TYPE.RADIO === currentQuestion.type}
<RadioQuestion {...renderProps} /> <RadioQuestion {...renderProps} />
{:else if QUESTION_TYPE.CHECKBOX === currentQuestion.type} {:else if QUESTION_TYPE.CHECKBOX === currentQuestion.type}
@@ -1,6 +1,6 @@
<script> <script>
import Tabs from '../../../../Tabs/index.svelte'; import Tabs from '../../../../Tabs/index.svelte';
import TabContent from '../../../../Tabs/index.svelte'; import TabContent from '../../../../TabContent/index.svelte';
import EditContent from '../../../../EditContent/index.svelte'; import EditContent from '../../../../EditContent/index.svelte';
import TextField from '../../../../Form/TextField.svelte'; import TextField from '../../../../Form/TextField.svelte';
import { lesson } from '../store/lessons'; import { lesson } from '../store/lessons';
@@ -22,6 +22,7 @@
let currentTab = tabs[0].value; let currentTab = tabs[0].value;
function onChange(tabValue) { function onChange(tabValue) {
console.log(`$lesson`, $lesson);
return () => { return () => {
currentTab = tabValue; currentTab = tabValue;
}; };
@@ -1,6 +1,6 @@
<script> <script>
import Tabs from '../../../../Tabs/index.svelte'; import Tabs from '../../../../Tabs/index.svelte';
import TabContent from '../../../../Tabs/index.svelte'; import TabContent from '../../../../TabContent/index.svelte';
import MarkdownRender from '../../../../MarkdownRender/index.svelte'; import MarkdownRender from '../../../../MarkdownRender/index.svelte';
import { lesson } from '../store/lessons'; import { lesson } from '../store/lessons';
+12 -8
View File
@@ -3,24 +3,28 @@
import Navigation from '../Course/components/Navigation/index.svelte'; import Navigation from '../Course/components/Navigation/index.svelte';
import { lessons, lesson } from '../Course/components/Lesson/store/lessons'; import { lessons, lesson } from '../Course/components/Lesson/store/lessons';
import { questionnaire } from '../Course/components/Lesson/Exercise/store';
import { questionnaireMetaData } from '../Course/components/Lesson/Exercise/store/answers';
export let courseData = {}; export let courseData = {};
export let path; export let path;
onMount(() => { function setStoreWithData() {
lessons.set(courseData.lessons); lessons.set(courseData.lessons);
console.log(`courseData`, courseData);
if (courseData.lesson) { if (courseData.lesson) {
lesson.set(courseData.lesson); lesson.set(courseData.lesson);
} }
});
afterUpdate(() => { if (courseData.exercise && courseData.exercise.data) {
lessons.set(courseData.lessons); questionnaire.set(courseData.exercise.data);
questionnaireMetaData.set(courseData.exercise.answers);
if (courseData.lesson) {
lesson.set(courseData.lesson);
} }
}); }
onMount(setStoreWithData);
afterUpdate(setStoreWithData);
</script> </script>
<svelte:head> <svelte:head>
@@ -65,7 +65,7 @@
<div class="ml-4"> <div class="ml-4">
{#each options as option} {#each options as option}
<button <button
class="cursor-pointer text-left my-2 border-2 border-gray-300 rounded-md cursor-pointer hover:bg-gray-200 w-full {getValidationClassName( class="cursor-pointer text-left my-2 border-2 border-gray-300 rounded-md hover:bg-gray-200 w-full {getValidationClassName(
option option
)}" )}"
type="button" type="button"
+4 -2
View File
@@ -4,7 +4,7 @@
export let onChange; export let onChange;
</script> </script>
<div class="w-full flex justify-center"> <div class="w-full flex justify-center flex-col">
<div class="flex items-center"> <div class="flex items-center">
{#each tabs as tab} {#each tabs as tab}
<button <button
@@ -23,5 +23,7 @@
{/each} {/each}
</div> </div>
<slot name="content" /> <div class="mt-4">
<slot name="content" />
</div>
</div> </div>
+17
View File
@@ -0,0 +1,17 @@
let ENV = process.env;
export const getConfig = (_env) => {
if (!!_env) {
ENV = { ...ENV, ..._env };
}
return {
port: ENV.PORT,
nodeEnv: ENV.NODE_ENV,
isProd: ENV.NODE_ENV === 'development',
supabaseConfig: {
url: ENV.SVELTE_APP_SUPABASE_URL,
anonKey: ENV.SVELTE_APP_SUPABASE_ANON_KEY,
},
};
};
+7 -7
View File
@@ -87,7 +87,7 @@ const lessons = [
{ {
id: 1, id: 1,
course_id: 1, course_id: 1,
title: 'Вступительное слово. Софт скилы', title: 'Introduction to soft skills',
to: '/courses/1/lessons/1', to: '/courses/1/lessons/1',
tutor: { tutor: {
userId: 1, userId: 1,
@@ -114,7 +114,7 @@ const lessons = [
{ {
id: 2, id: 2,
course_id: 1, course_id: 1,
title: 'Введение в ReactJS', title: 'Introduction to ReactJS',
to: '/courses/1/lessons/2', to: '/courses/1/lessons/2',
tutor: { tutor: {
userId: 1, userId: 1,
@@ -141,7 +141,7 @@ const lessons = [
{ {
id: 3, id: 3,
course_id: 1, course_id: 1,
title: 'Компоненты', title: 'Components - Functional and Class',
to: '/courses/1/lessons/3', to: '/courses/1/lessons/3',
tutor: { tutor: {
userId: 1, userId: 1,
@@ -168,7 +168,7 @@ const lessons = [
{ {
id: 4, id: 4,
course_id: 1, course_id: 1,
title: 'Состояние компонентов и пропсы', title: 'State and Props in components',
to: '/courses/1/lessons/4', to: '/courses/1/lessons/4',
tutor: { tutor: {
userId: 1, userId: 1,
@@ -195,7 +195,7 @@ const lessons = [
{ {
id: 5, id: 5,
course_id: 1, course_id: 1,
title: 'Жизненный цикл', title: 'Life cycle methods',
to: '/courses/1/lessons/5', to: '/courses/1/lessons/5',
tutor: { tutor: {
userId: 1, userId: 1,
@@ -381,7 +381,7 @@ export function getLesson(id) {
slide: '', slide: '',
video: '', video: '',
}, },
exercises: [], exercises: getExercises(id),
} }
); );
} }
@@ -392,7 +392,7 @@ export function getExercises(lessonId) {
export function getExercise(exerciseId) { export function getExercise(exerciseId) {
return { return {
exercise: lesson_exercise.find((exercise) => exercise.id === exerciseId), data: lesson_exercise.find((exercise) => exercise.id === exerciseId),
answers: exercise_answers.find( answers: exercise_answers.find(
(answer) => answer.exercise_id === exerciseId (answer) => answer.exercise_id === exerciseId
), ),
@@ -7,6 +7,7 @@
`api/course?id=${courseId}&lessonId=${lessonId}&exerciseId=${exerciseId}` `api/course?id=${courseId}&lessonId=${lessonId}&exerciseId=${exerciseId}`
); );
const data = await res.json(); const data = await res.json();
console.log(`data`, data);
if (res.status === 200) { if (res.status === 200) {
return { return {
+13 -10
View File
@@ -1,17 +1,20 @@
import dotenv from 'dotenv';
import sirv from 'sirv'; import sirv from 'sirv';
import polka from 'polka'; import polka from 'polka';
import compression from 'compression'; import compression from 'compression';
import * as sapper from '@sapper/server'; import * as sapper from '@sapper/server';
const { PORT, NODE_ENV } = process.env; import { getConfig } from './config';
const dev = NODE_ENV === 'development';
const config = getConfig(dotenv.config().parsed);
polka() // You can also use Express polka() // You can also use Express
.use( .use(
compression({ threshold: 0 }), compression({ threshold: 0 }),
sirv('static', { dev }), sirv('static', { dev: true }),
sapper.middleware() sapper.middleware()
) )
.listen(PORT, err => { .listen(config.port, (err) => {
if (err) console.log('error', err); if (err) console.log('error', err);
}); });
+8
View File
@@ -0,0 +1,8 @@
import { createClient } from '@supabase/supabase-js';
import config from '../../config';
export const supabase = createClient(
config.supabaseConfig.url,
config.supabaseConfig.anonKey
);