@striae-org/striae 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +100 -0
- package/LICENSE +190 -0
- package/NOTICE +18 -0
- package/README.md +133 -0
- package/app/components/actions/case-export/core-export.ts +328 -0
- package/app/components/actions/case-export/data-processing.ts +167 -0
- package/app/components/actions/case-export/download-handlers.ts +900 -0
- package/app/components/actions/case-export/index.ts +41 -0
- package/app/components/actions/case-export/metadata-helpers.ts +107 -0
- package/app/components/actions/case-export/types-constants.ts +56 -0
- package/app/components/actions/case-export/validation-utils.ts +25 -0
- package/app/components/actions/case-export.ts +4 -0
- package/app/components/actions/case-import/annotation-import.ts +35 -0
- package/app/components/actions/case-import/confirmation-import.ts +363 -0
- package/app/components/actions/case-import/image-operations.ts +61 -0
- package/app/components/actions/case-import/index.ts +39 -0
- package/app/components/actions/case-import/orchestrator.ts +420 -0
- package/app/components/actions/case-import/storage-operations.ts +270 -0
- package/app/components/actions/case-import/validation.ts +189 -0
- package/app/components/actions/case-import/zip-processing.ts +413 -0
- package/app/components/actions/case-manage.ts +524 -0
- package/app/components/actions/case-review.ts +4 -0
- package/app/components/actions/confirm-export.ts +351 -0
- package/app/components/actions/generate-pdf.ts +210 -0
- package/app/components/actions/image-manage.ts +385 -0
- package/app/components/actions/notes-manage.ts +33 -0
- package/app/components/actions/signout.module.css +15 -0
- package/app/components/actions/signout.tsx +50 -0
- package/app/components/audit/user-audit-viewer.tsx +975 -0
- package/app/components/audit/user-audit.module.css +568 -0
- package/app/components/auth/auth-provider.tsx +78 -0
- package/app/components/auth/mfa-enrollment.module.css +268 -0
- package/app/components/auth/mfa-enrollment.tsx +398 -0
- package/app/components/auth/mfa-verification.module.css +251 -0
- package/app/components/auth/mfa-verification.tsx +295 -0
- package/app/components/button/button.module.css +63 -0
- package/app/components/button/button.tsx +46 -0
- package/app/components/canvas/box-annotations/box-annotations.module.css +170 -0
- package/app/components/canvas/box-annotations/box-annotations.tsx +634 -0
- package/app/components/canvas/canvas.module.css +314 -0
- package/app/components/canvas/canvas.tsx +449 -0
- package/app/components/canvas/confirmation/confirmation.module.css +187 -0
- package/app/components/canvas/confirmation/confirmation.tsx +214 -0
- package/app/components/colors/colors.module.css +59 -0
- package/app/components/colors/colors.tsx +68 -0
- package/app/components/form/base-form.tsx +21 -0
- package/app/components/form/form-button.tsx +28 -0
- package/app/components/form/form-field.tsx +53 -0
- package/app/components/form/form-message.tsx +17 -0
- package/app/components/form/form-toggle.tsx +23 -0
- package/app/components/form/form.module.css +427 -0
- package/app/components/form/index.ts +6 -0
- package/app/components/icon/icon.module.css +3 -0
- package/app/components/icon/icon.tsx +27 -0
- package/app/components/icon/icons.svg +102 -0
- package/app/components/icon/manifest.json +110 -0
- package/app/components/sidebar/case-export/case-export.module.css +386 -0
- package/app/components/sidebar/case-export/case-export.tsx +317 -0
- package/app/components/sidebar/case-import/case-import.module.css +626 -0
- package/app/components/sidebar/case-import/case-import.tsx +404 -0
- package/app/components/sidebar/case-import/components/CasePreviewSection.tsx +72 -0
- package/app/components/sidebar/case-import/components/ConfirmationDialog.tsx +72 -0
- package/app/components/sidebar/case-import/components/ConfirmationPreviewSection.tsx +71 -0
- package/app/components/sidebar/case-import/components/ExistingCaseSection.tsx +40 -0
- package/app/components/sidebar/case-import/components/FileSelector.tsx +161 -0
- package/app/components/sidebar/case-import/components/ProgressSection.tsx +46 -0
- package/app/components/sidebar/case-import/hooks/useFilePreview.ts +101 -0
- package/app/components/sidebar/case-import/hooks/useImportExecution.ts +152 -0
- package/app/components/sidebar/case-import/hooks/useImportState.ts +88 -0
- package/app/components/sidebar/case-import/index.ts +18 -0
- package/app/components/sidebar/case-import/utils/file-validation.ts +43 -0
- package/app/components/sidebar/cases/case-sidebar.tsx +827 -0
- package/app/components/sidebar/cases/cases-modal.module.css +166 -0
- package/app/components/sidebar/cases/cases-modal.tsx +201 -0
- package/app/components/sidebar/cases/cases.module.css +713 -0
- package/app/components/sidebar/files/files-modal.module.css +209 -0
- package/app/components/sidebar/files/files-modal.tsx +239 -0
- package/app/components/sidebar/hash/hash-utility.module.css +366 -0
- package/app/components/sidebar/hash/hash-utility.tsx +982 -0
- package/app/components/sidebar/notes/notes-modal.tsx +51 -0
- package/app/components/sidebar/notes/notes-sidebar.tsx +491 -0
- package/app/components/sidebar/notes/notes.module.css +360 -0
- package/app/components/sidebar/sidebar-container.tsx +149 -0
- package/app/components/sidebar/sidebar.module.css +321 -0
- package/app/components/sidebar/sidebar.tsx +215 -0
- package/app/components/sidebar/upload/image-upload-zone.module.css +123 -0
- package/app/components/sidebar/upload/image-upload-zone.tsx +330 -0
- package/app/components/theme-provider/theme-provider.tsx +131 -0
- package/app/components/theme-provider/theme.ts +155 -0
- package/app/components/toast/toast.module.css +137 -0
- package/app/components/toast/toast.tsx +56 -0
- package/app/components/toolbar/toolbar-color-selector.module.css +171 -0
- package/app/components/toolbar/toolbar-color-selector.tsx +129 -0
- package/app/components/toolbar/toolbar.module.css +42 -0
- package/app/components/toolbar/toolbar.tsx +167 -0
- package/app/components/user/delete-account.module.css +274 -0
- package/app/components/user/delete-account.tsx +471 -0
- package/app/components/user/inactivity-warning.module.css +145 -0
- package/app/components/user/inactivity-warning.tsx +84 -0
- package/app/components/user/manage-profile.module.css +190 -0
- package/app/components/user/manage-profile.tsx +253 -0
- package/app/components/user/mfa-phone-update.tsx +739 -0
- package/app/config-example/admin-service.json +13 -0
- package/app/config-example/config.json +17 -0
- package/app/config-example/firebase.ts +21 -0
- package/app/config-example/inactivity.ts +13 -0
- package/app/config-example/meta-config.json +6 -0
- package/app/contexts/auth.context.ts +12 -0
- package/app/entry.client.tsx +12 -0
- package/app/entry.server.tsx +44 -0
- package/app/hooks/useInactivityTimeout.ts +110 -0
- package/app/root.tsx +170 -0
- package/app/routes/_index.tsx +16 -0
- package/app/routes/auth/emailActionHandler.module.css +232 -0
- package/app/routes/auth/emailActionHandler.tsx +405 -0
- package/app/routes/auth/emailVerification.tsx +120 -0
- package/app/routes/auth/login.module.css +523 -0
- package/app/routes/auth/login.tsx +654 -0
- package/app/routes/auth/passwordReset.module.css +274 -0
- package/app/routes/auth/passwordReset.tsx +154 -0
- package/app/routes/auth/route.ts +16 -0
- package/app/routes/mobile-prevented/mobilePrevented.module.css +47 -0
- package/app/routes/mobile-prevented/mobilePrevented.tsx +26 -0
- package/app/routes/mobile-prevented/route.ts +14 -0
- package/app/routes/striae/striae.module.css +30 -0
- package/app/routes/striae/striae.tsx +417 -0
- package/app/services/audit-export.service.ts +755 -0
- package/app/services/audit.service.ts +1454 -0
- package/app/services/firebase-errors.ts +106 -0
- package/app/services/firebase.ts +15 -0
- package/app/styles/legal-pages.module.css +113 -0
- package/app/styles/root.module.css +146 -0
- package/app/tailwind.css +225 -0
- package/app/types/annotations.ts +45 -0
- package/app/types/audit.ts +301 -0
- package/app/types/case.ts +90 -0
- package/app/types/export.ts +8 -0
- package/app/types/file.ts +30 -0
- package/app/types/import.ts +107 -0
- package/app/types/index.ts +24 -0
- package/app/types/user.ts +38 -0
- package/app/utils/SHA256.ts +461 -0
- package/app/utils/annotation-timestamp.ts +25 -0
- package/app/utils/audit-export-signature.ts +117 -0
- package/app/utils/auth-action-settings.ts +48 -0
- package/app/utils/auth.ts +34 -0
- package/app/utils/batch-operations.ts +135 -0
- package/app/utils/confirmation-signature.ts +193 -0
- package/app/utils/data-operations.ts +871 -0
- package/app/utils/device-detection.ts +5 -0
- package/app/utils/html-sanitizer.ts +80 -0
- package/app/utils/id-generator.ts +36 -0
- package/app/utils/meta.ts +48 -0
- package/app/utils/mfa-phone.ts +97 -0
- package/app/utils/mfa.ts +79 -0
- package/app/utils/password-policy.ts +28 -0
- package/app/utils/permissions.ts +562 -0
- package/app/utils/signature-utils.ts +160 -0
- package/app/utils/style.ts +83 -0
- package/app/utils/version.ts +5 -0
- package/firebase.json +11 -0
- package/functions/[[path]].ts +10 -0
- package/package.json +138 -0
- package/postcss.config.js +6 -0
- package/public/.well-known/publickey.info@striae.org.asc +17 -0
- package/public/.well-known/security.txt +7 -0
- package/public/_headers +28 -0
- package/public/_routes.json +13 -0
- package/public/assets/striae.jpg +0 -0
- package/public/clear.jpg +0 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +9 -0
- package/public/icon-256.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/logo-dark.png +0 -0
- package/public/manifest.json +25 -0
- package/public/oin-badge.png +0 -0
- package/public/shortcut.png +0 -0
- package/public/social-image.png +0 -0
- package/public/striae-ascii.txt +10 -0
- package/scripts/deploy-all.sh +100 -0
- package/scripts/deploy-config.sh +940 -0
- package/scripts/deploy-pages.sh +34 -0
- package/scripts/deploy-worker-secrets.sh +215 -0
- package/scripts/dev.cjs +23 -0
- package/scripts/install-workers.sh +88 -0
- package/scripts/run-eslint.cjs +35 -0
- package/scripts/update-compatibility-dates.cjs +124 -0
- package/scripts/update-markdown-versions.cjs +43 -0
- package/tailwind.config.ts +22 -0
- package/tsconfig.json +33 -0
- package/vite.config.ts +35 -0
- package/worker-configuration.d.ts +7490 -0
- package/workers/audit-worker/package.json +17 -0
- package/workers/audit-worker/src/audit-worker.example.ts +195 -0
- package/workers/audit-worker/worker-configuration.d.ts +7448 -0
- package/workers/audit-worker/wrangler.jsonc.example +29 -0
- package/workers/data-worker/package.json +17 -0
- package/workers/data-worker/src/data-worker.example.ts +267 -0
- package/workers/data-worker/src/signature-utils.ts +79 -0
- package/workers/data-worker/src/signing-payload-utils.ts +290 -0
- package/workers/data-worker/worker-configuration.d.ts +7448 -0
- package/workers/data-worker/wrangler.jsonc.example +30 -0
- package/workers/image-worker/package.json +17 -0
- package/workers/image-worker/src/image-worker.example.ts +180 -0
- package/workers/image-worker/worker-configuration.d.ts +7447 -0
- package/workers/image-worker/wrangler.jsonc.example +22 -0
- package/workers/keys-worker/package.json +17 -0
- package/workers/keys-worker/src/keys.example.ts +66 -0
- package/workers/keys-worker/src/keys.ts +66 -0
- package/workers/keys-worker/worker-configuration.d.ts +7447 -0
- package/workers/keys-worker/wrangler.jsonc.example +22 -0
- package/workers/pdf-worker/package.json +17 -0
- package/workers/pdf-worker/src/format-striae.ts +534 -0
- package/workers/pdf-worker/src/pdf-worker.example.ts +119 -0
- package/workers/pdf-worker/src/report-types.ts +69 -0
- package/workers/pdf-worker/worker-configuration.d.ts +7448 -0
- package/workers/pdf-worker/wrangler.jsonc.example +26 -0
- package/workers/user-worker/package.json +17 -0
- package/workers/user-worker/src/user-worker.example.ts +636 -0
- package/workers/user-worker/worker-configuration.d.ts +7448 -0
- package/workers/user-worker/wrangler.jsonc.example +29 -0
- package/wrangler.toml.example +8 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media query breakpoints
|
|
3
|
+
*/
|
|
4
|
+
export const media: { [key: string]: number } = {
|
|
5
|
+
desktop: 2560, // 4K/2K displays
|
|
6
|
+
laptop: 1920, // FHD displays
|
|
7
|
+
tablet: 1024, // iPad Pro/Large tablets
|
|
8
|
+
mobile: 768, // Phones landscape/Small tablets
|
|
9
|
+
mobileS: 480, // Phones portrait
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convert a px string to a number
|
|
14
|
+
*/
|
|
15
|
+
export const pxToNum = (px: string): number => Number(px.replace('px', ''));
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Convert a number to a px string
|
|
19
|
+
*/
|
|
20
|
+
export const numToPx = (num: number): string => `${num}px`;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Convert pixel values to rem for a11y
|
|
24
|
+
*/
|
|
25
|
+
export const pxToRem = (px: number): string => `${px / 16}rem`;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Convert ms token values to a raw numbers for ReactTransitionGroup
|
|
29
|
+
* Transition delay props
|
|
30
|
+
*/
|
|
31
|
+
export const msToNum = (msString: string): number => Number(msString.replace('ms', ''));
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Convert a number to an ms string
|
|
35
|
+
*/
|
|
36
|
+
export const numToMs = (num: number): string => `${num}ms`;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Convert an rgb theme property (e.g. rgbBlack: '0 0 0')
|
|
40
|
+
* to values that can be spread into a ThreeJS Color class
|
|
41
|
+
*/
|
|
42
|
+
export const rgbToThreeColor = (rgb: string): number[] =>
|
|
43
|
+
rgb?.split(' ').map(value => Number(value) / 255) || [];
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Convert a JS object into `--` prefixed css custom properties.
|
|
47
|
+
* Optionally pass a second param for normal styles
|
|
48
|
+
*/
|
|
49
|
+
export function cssProps(
|
|
50
|
+
props: { [key: string]: string | number },
|
|
51
|
+
style: { [key: string]: string | number } = {}
|
|
52
|
+
): { [key: string]: string | number } {
|
|
53
|
+
const result: { [key: string]: string | number } = {};
|
|
54
|
+
|
|
55
|
+
const keys = Object.keys(props);
|
|
56
|
+
|
|
57
|
+
for (const key of keys) {
|
|
58
|
+
let value = props[key];
|
|
59
|
+
|
|
60
|
+
if (typeof value === 'number' && key === 'delay') {
|
|
61
|
+
value = numToMs(value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (typeof value === 'number' && key !== 'opacity') {
|
|
65
|
+
value = numToPx(value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (typeof value === 'number' && key === 'opacity') {
|
|
69
|
+
value = `${value * 100}%`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
result[`--${key}`] = value;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { ...result, ...style };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Concatenate classNames together
|
|
80
|
+
*/
|
|
81
|
+
export function classes(...classes: (string | undefined | null | false)[]): string {
|
|
82
|
+
return classes.filter(Boolean).join(' ');
|
|
83
|
+
}
|
package/firebase.json
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createPagesFunctionHandler } from "@remix-run/cloudflare-pages";
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
4
|
+
// @ts-ignore - the server build file is generated by `remix vite:build`
|
|
5
|
+
// eslint-disable-next-line import/no-unresolved
|
|
6
|
+
import * as build from "../build/server";
|
|
7
|
+
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
9
|
+
// @ts-ignore - temporary workaround for crossOrigin type issue
|
|
10
|
+
export const onRequest = createPagesFunctionHandler({ build });
|
package/package.json
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@striae-org/striae",
|
|
3
|
+
"version": "3.0.4",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Cloud-native forensic annotation application for firearms identification (Remix + Cloudflare Workers).",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"homepage": "https://www.striae.org",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/striae-org/striae.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/striae-org/striae/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"forensics",
|
|
17
|
+
"firearms",
|
|
18
|
+
"annotation",
|
|
19
|
+
"remix",
|
|
20
|
+
"cloudflare-workers",
|
|
21
|
+
"chain-of-custody",
|
|
22
|
+
"audit-trail"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"app/components/",
|
|
29
|
+
"app/config-example/",
|
|
30
|
+
"app/contexts/",
|
|
31
|
+
"app/hooks/",
|
|
32
|
+
"app/routes/",
|
|
33
|
+
"app/services/",
|
|
34
|
+
"app/styles/",
|
|
35
|
+
"app/types/",
|
|
36
|
+
"app/utils/",
|
|
37
|
+
"app/entry.client.tsx",
|
|
38
|
+
"app/entry.server.tsx",
|
|
39
|
+
"app/root.tsx",
|
|
40
|
+
"app/tailwind.css",
|
|
41
|
+
"functions/",
|
|
42
|
+
"public/",
|
|
43
|
+
"scripts/",
|
|
44
|
+
"workers/*/package.json",
|
|
45
|
+
"workers/*/src/*.example.ts",
|
|
46
|
+
"workers/*/src/*.example.js",
|
|
47
|
+
"workers/*/src/*.ts",
|
|
48
|
+
"!workers/*/src/*worker.ts",
|
|
49
|
+
"workers/pdf-worker/src/format-striae.ts",
|
|
50
|
+
"workers/pdf-worker/src/report-types.ts",
|
|
51
|
+
"workers/*/wrangler.jsonc.example",
|
|
52
|
+
".env.example",
|
|
53
|
+
"firebase.json",
|
|
54
|
+
"postcss.config.js",
|
|
55
|
+
"tailwind.config.ts",
|
|
56
|
+
"tsconfig.json",
|
|
57
|
+
"vite.config.ts",
|
|
58
|
+
"worker-configuration.d.ts",
|
|
59
|
+
"wrangler.toml.example",
|
|
60
|
+
"LICENSE",
|
|
61
|
+
"NOTICE"
|
|
62
|
+
],
|
|
63
|
+
"sideEffects": [
|
|
64
|
+
"**/*.css"
|
|
65
|
+
],
|
|
66
|
+
"type": "module",
|
|
67
|
+
"scripts": {
|
|
68
|
+
"deploy:all": "bash ./scripts/deploy-all.sh",
|
|
69
|
+
"emulators": "firebase emulators:start --only auth",
|
|
70
|
+
"dev": "node ./scripts/dev.cjs && remix vite:dev",
|
|
71
|
+
"build": "node ./scripts/dev.cjs && remix vite:build",
|
|
72
|
+
"clean": "rm -rf build node_modules/.cache .cache",
|
|
73
|
+
"clean:build": "npm run clean && npm run build",
|
|
74
|
+
"deploy": "npm run build && wrangler pages deploy",
|
|
75
|
+
"publish:npm": "npm publish --access public --registry=https://registry.npmjs.org --@striae-org:registry=https://registry.npmjs.org",
|
|
76
|
+
"publish:npm:dry-run": "npm publish --dry-run --access public --registry=https://registry.npmjs.org --@striae-org:registry=https://registry.npmjs.org",
|
|
77
|
+
"publish:github": "npm publish --registry=https://npm.pkg.github.com --@striae-org:registry=https://npm.pkg.github.com",
|
|
78
|
+
"publish:github:dry-run": "npm publish --dry-run --registry=https://npm.pkg.github.com --@striae-org:registry=https://npm.pkg.github.com",
|
|
79
|
+
"publish:all": "npm run publish:npm && npm run publish:github",
|
|
80
|
+
"publish:all:dry-run": "npm run publish:npm:dry-run && npm run publish:github:dry-run",
|
|
81
|
+
"lint": "node ./scripts/run-eslint.cjs",
|
|
82
|
+
"start": "node ./scripts/dev.cjs && wrangler pages dev ./build/client",
|
|
83
|
+
"typecheck": "tsc",
|
|
84
|
+
"typegen": "wrangler types",
|
|
85
|
+
"preview": "npm run build && wrangler pages dev",
|
|
86
|
+
"cf-typegen": "wrangler types",
|
|
87
|
+
"update-versions": "node ./scripts/update-markdown-versions.cjs",
|
|
88
|
+
"update-compatibility-dates": "node ./scripts/update-compatibility-dates.cjs",
|
|
89
|
+
"deploy-config": "bash ./scripts/deploy-config.sh",
|
|
90
|
+
"update-env": "bash ./scripts/deploy-config.sh --update-env",
|
|
91
|
+
"install-workers": "bash ./scripts/install-workers.sh",
|
|
92
|
+
"deploy-workers": "npm run deploy-workers:audit && npm run deploy-workers:data && npm run deploy-workers:image && npm run deploy-workers:keys && npm run deploy-workers:pdf && npm run deploy-workers:user",
|
|
93
|
+
"deploy-workers:secrets": "bash ./scripts/deploy-worker-secrets.sh",
|
|
94
|
+
"deploy-pages": "bash ./scripts/deploy-pages.sh",
|
|
95
|
+
"deploy-workers:audit": "cd workers/audit-worker && npm run deploy",
|
|
96
|
+
"deploy-workers:data": "cd workers/data-worker && npm run deploy",
|
|
97
|
+
"deploy-workers:image": "cd workers/image-worker && npm run deploy",
|
|
98
|
+
"deploy-workers:keys": "cd workers/keys-worker && npm run deploy",
|
|
99
|
+
"deploy-workers:pdf": "cd workers/pdf-worker && npm run deploy",
|
|
100
|
+
"deploy-workers:user": "cd workers/user-worker && npm run deploy"
|
|
101
|
+
},
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"@remix-run/cloudflare": "^2.17.4",
|
|
104
|
+
"@remix-run/cloudflare-pages": "^2.17.4",
|
|
105
|
+
"@remix-run/react": "^2.17.4",
|
|
106
|
+
"@types/xlsx": "^0.0.35",
|
|
107
|
+
"firebase": "^12.10.0",
|
|
108
|
+
"isbot": "^5.1.35",
|
|
109
|
+
"jszip": "^3.10.1",
|
|
110
|
+
"react": "^18.0.0",
|
|
111
|
+
"react-dom": "^18.0.0",
|
|
112
|
+
"xlsx": "^0.18.5"
|
|
113
|
+
},
|
|
114
|
+
"devDependencies": {
|
|
115
|
+
"@remix-run/dev": "^2.17.4",
|
|
116
|
+
"@types/react": "^19.1.10",
|
|
117
|
+
"@types/react-dom": "^19.1.7",
|
|
118
|
+
"@typescript-eslint/eslint-plugin": "^8.54.0",
|
|
119
|
+
"@typescript-eslint/parser": "^8.56.1",
|
|
120
|
+
"autoprefixer": "^10.4.27",
|
|
121
|
+
"eslint": "^9.39.2",
|
|
122
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
123
|
+
"eslint-plugin-import": "^2.32.0",
|
|
124
|
+
"eslint-plugin-jsx-a11y": "^6.7.1",
|
|
125
|
+
"eslint-plugin-react": "^7.37.4",
|
|
126
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
127
|
+
"postcss": "^8.5.6",
|
|
128
|
+
"tailwindcss": "^3.4.0",
|
|
129
|
+
"typescript": "^5.9.3",
|
|
130
|
+
"vite": "^6.4.1",
|
|
131
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
132
|
+
"wrangler": "^3.114.17"
|
|
133
|
+
},
|
|
134
|
+
"engines": {
|
|
135
|
+
"node": ">=20.0.0"
|
|
136
|
+
},
|
|
137
|
+
"packageManager": "npm@11.11.0"
|
|
138
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
2
|
+
|
|
3
|
+
xjMEaJ+SaRYJKwYBBAHaRw8BAQdAtWcW9OcCVtFNTBf+4lwASGgVBGNIGb6z
|
|
4
|
+
GNIq37cw83zNIWluZm9Ac3RyaWFlLm9yZyA8aW5mb0BzdHJpYWUub3JnPsLA
|
|
5
|
+
EQQTFgoAgwWCaJ+SaQMLCQcJkC2UdiWEnC1iRRQAAAAAABwAIHNhbHRAbm90
|
|
6
|
+
YXRpb25zLm9wZW5wZ3Bqcy5vcmfhki1wbo0xW0HoW6jsyBK/iWN/u01JBBJd
|
|
7
|
+
YGiCbEL+sAMVCggEFgACAQIZAQKbAwIeARYhBCw6mxgiRn72TJictC2UdiWE
|
|
8
|
+
nC1iAADDlgD+Jlmez0pVz0u3kllpSt6S3MOuUCJla6p4ZEbjTniCJaUA/R7X
|
|
9
|
+
kykgKaNm/PUolRZhnUwhcNWT48EMHo1jMkyGKUQEzjgEaJ+SaRIKKwYBBAGX
|
|
10
|
+
VQEFAQEHQNEibB8TSeDgzURCgYgXn32lYJ6vVLl87FeJRsEQY4BfAwEIB8K+
|
|
11
|
+
BBgWCgBwBYJon5JpCZAtlHYlhJwtYkUUAAAAAAAcACBzYWx0QG5vdGF0aW9u
|
|
12
|
+
cy5vcGVucGdwanMub3Jn5sADmb+wNJJLschl/7wW5OxuG8sTK8hrYrYAMu8f
|
|
13
|
+
lsgCmwwWIQQsOpsYIkZ+9kyYnLQtlHYlhJwtYgAADjQBAPLqpZXfz6LF3QCT
|
|
14
|
+
ljTevmSNC+/XPUPUe0pWwmt3O+CFAQCoYARnr6O+e9K2RKTGiji5yY5EvHIo
|
|
15
|
+
GsOM90I360PhCw==
|
|
16
|
+
=MSt/
|
|
17
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Contact: mailto:info@striae.org
|
|
2
|
+
Contact: https://github.com/striae-org/striae/security/advisories/new
|
|
3
|
+
Expires: 2035-08-15T00:00:00.000Z
|
|
4
|
+
Encryption: https://www.striae.org/.well-known/publickey.info@striae.org.asc
|
|
5
|
+
Preferred-Languages: en
|
|
6
|
+
Canonical: https://www.striae.org/.well-known/security.txt
|
|
7
|
+
Policy: https://www.striae.org/security
|
package/public/_headers
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/favicon.ico
|
|
2
|
+
Cache-Control: public, max-age=3600, s-maxage=3600
|
|
3
|
+
/favicon.svg
|
|
4
|
+
Cache-Control: public, max-age=3600, s-maxage=3600
|
|
5
|
+
/icon-256.png
|
|
6
|
+
Cache-Control: public, max-age=3600, s-maxage=3600
|
|
7
|
+
/icon-512.png
|
|
8
|
+
Cache-Control: public, max-age=3600, s-maxage=3600
|
|
9
|
+
/shortcut.png
|
|
10
|
+
Cache-Control: public, max-age=3600, s-maxage=3600
|
|
11
|
+
/*.css
|
|
12
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
13
|
+
/*.js
|
|
14
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
15
|
+
/*.svg
|
|
16
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
17
|
+
/*.jpg
|
|
18
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
19
|
+
/*.png
|
|
20
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
21
|
+
/*
|
|
22
|
+
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
|
|
23
|
+
https://*.striae-cdz.pages.dev/*
|
|
24
|
+
X-Robots-Tag: noindex
|
|
25
|
+
https://*.striae-dev.pages.dev/*
|
|
26
|
+
X-Robots-Tag: noindex
|
|
27
|
+
https://*.striae.org/*
|
|
28
|
+
X-Robots-Tag: noindex
|
|
Binary file
|
package/public/clear.jpg
ADDED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
2
|
+
<rect width="64" height="64" fill="url(#pattern0_17_2)"/>
|
|
3
|
+
<defs>
|
|
4
|
+
<pattern id="pattern0_17_2" patternContentUnits="objectBoundingBox" width="1" height="1">
|
|
5
|
+
<use xlink:href="#image0_17_2" transform="scale(0.015625)"/>
|
|
6
|
+
</pattern>
|
|
7
|
+
<image id="image0_17_2" width="64" height="64" xlink:href="data:image/png;base64,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"/>
|
|
8
|
+
</defs>
|
|
9
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"short_name": "Striae",
|
|
3
|
+
"name": "Striae: A Firearms Examiner's Comparison Companion",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "shortcut.png",
|
|
7
|
+
"sizes": "64x64",
|
|
8
|
+
"type": "image/png"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"src": "icon-256.png",
|
|
12
|
+
"sizes": "256x256",
|
|
13
|
+
"type": "image/png"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"src": "icon-512.png",
|
|
17
|
+
"sizes": "512x512",
|
|
18
|
+
"type": "image/png"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"start_url": ".",
|
|
22
|
+
"display": "standalone",
|
|
23
|
+
"theme_color": "#ddd",
|
|
24
|
+
"background_color": "#ddd"
|
|
25
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
.ยท:'''''''''''''''''''''''''''''''''':ยท.
|
|
2
|
+
: : : :
|
|
3
|
+
: : _____ _ _ : :
|
|
4
|
+
: : / ____| | (_) : :
|
|
5
|
+
: : | (___ | |_ _ __ _ __ _ ___ : :
|
|
6
|
+
: : \___ \| __| '__| |/ _` |/ _ \ : :
|
|
7
|
+
: : ____) | |_| | | | (_| | __/ : :
|
|
8
|
+
: : |_____/ \__|_| |_|\__,_|\___| : :
|
|
9
|
+
: : : :
|
|
10
|
+
'ยท:..................................:ยท'
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# ======================================
|
|
4
|
+
# STRIAE COMPLETE DEPLOYMENT SCRIPT
|
|
5
|
+
# ======================================
|
|
6
|
+
# This script deploys the entire Striae application:
|
|
7
|
+
# 1. Configuration setup (copy configs, replace placeholders)
|
|
8
|
+
# 2. Worker dependencies installation
|
|
9
|
+
# 3. Workers (all 7 workers)
|
|
10
|
+
# 4. Worker secrets/environment variables
|
|
11
|
+
# 5. Pages (frontend)
|
|
12
|
+
|
|
13
|
+
# Colors for output
|
|
14
|
+
RED='\033[0;31m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
BLUE='\033[0;34m'
|
|
18
|
+
PURPLE='\033[0;35m'
|
|
19
|
+
NC='\033[0m' # No Color
|
|
20
|
+
|
|
21
|
+
echo -e "${BLUE}๐ Striae Complete Deployment Script${NC}"
|
|
22
|
+
echo "======================================"
|
|
23
|
+
echo ""
|
|
24
|
+
|
|
25
|
+
# Get the script directory
|
|
26
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
27
|
+
|
|
28
|
+
# Step 1: Configuration Setup
|
|
29
|
+
echo -e "${PURPLE}Step 1/5: Configuration Setup${NC}"
|
|
30
|
+
echo "------------------------------"
|
|
31
|
+
echo -e "${YELLOW}โ๏ธ Setting up configuration files and replacing placeholders...${NC}"
|
|
32
|
+
if ! bash "$SCRIPT_DIR/deploy-config.sh"; then
|
|
33
|
+
echo -e "${RED}โ Configuration setup failed!${NC}"
|
|
34
|
+
echo -e "${YELLOW}Please check your .env file and configuration before proceeding.${NC}"
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
echo -e "${GREEN}โ
Configuration setup completed successfully${NC}"
|
|
38
|
+
echo ""
|
|
39
|
+
|
|
40
|
+
# Step 2: Install Worker Dependencies
|
|
41
|
+
echo -e "${PURPLE}Step 2/5: Installing Worker Dependencies${NC}"
|
|
42
|
+
echo "----------------------------------------"
|
|
43
|
+
echo -e "${YELLOW}๐ฆ Installing npm dependencies for all workers...${NC}"
|
|
44
|
+
if ! bash "$SCRIPT_DIR/install-workers.sh"; then
|
|
45
|
+
echo -e "${RED}โ Worker dependencies installation failed!${NC}"
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
echo -e "${GREEN}โ
All worker dependencies installed successfully${NC}"
|
|
49
|
+
echo ""
|
|
50
|
+
|
|
51
|
+
# Step 3: Deploy Workers
|
|
52
|
+
echo -e "${PURPLE}Step 3/5: Deploying Workers${NC}"
|
|
53
|
+
echo "----------------------------"
|
|
54
|
+
echo -e "${YELLOW}๐ง Deploying all 7 Cloudflare Workers...${NC}"
|
|
55
|
+
if ! npm run deploy-workers; then
|
|
56
|
+
echo -e "${RED}โ Worker deployment failed!${NC}"
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
echo -e "${GREEN}โ
All workers deployed successfully${NC}"
|
|
60
|
+
echo ""
|
|
61
|
+
|
|
62
|
+
# Step 4: Deploy Worker Secrets
|
|
63
|
+
echo -e "${PURPLE}Step 4/5: Deploying Worker Secrets${NC}"
|
|
64
|
+
echo "-----------------------------------"
|
|
65
|
+
echo -e "${YELLOW}๐ Deploying worker environment variables...${NC}"
|
|
66
|
+
if ! bash "$SCRIPT_DIR/deploy-worker-secrets.sh"; then
|
|
67
|
+
echo -e "${RED}โ Worker secrets deployment failed!${NC}"
|
|
68
|
+
exit 1
|
|
69
|
+
fi
|
|
70
|
+
echo -e "${GREEN}โ
Worker secrets deployed successfully${NC}"
|
|
71
|
+
echo ""
|
|
72
|
+
|
|
73
|
+
# Step 5: Deploy Pages
|
|
74
|
+
echo -e "${PURPLE}Step 5/5: Deploying Pages${NC}"
|
|
75
|
+
echo "--------------------------"
|
|
76
|
+
echo -e "${YELLOW}๐ Building and deploying Pages...${NC}"
|
|
77
|
+
if ! npm run deploy-pages; then
|
|
78
|
+
echo -e "${RED}โ Pages deployment failed!${NC}"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
echo -e "${GREEN}โ
Pages deployed successfully${NC}"
|
|
82
|
+
echo ""
|
|
83
|
+
|
|
84
|
+
# Success summary
|
|
85
|
+
echo "=========================================="
|
|
86
|
+
echo -e "${GREEN}๐ COMPLETE DEPLOYMENT SUCCESSFUL! ๐${NC}"
|
|
87
|
+
echo "=========================================="
|
|
88
|
+
echo ""
|
|
89
|
+
echo -e "${BLUE}Deployed Components:${NC}"
|
|
90
|
+
echo " โ
Worker dependencies (npm install)"
|
|
91
|
+
echo " โ
7 Cloudflare Workers"
|
|
92
|
+
echo " โ
Worker environment variables"
|
|
93
|
+
echo " โ
Cloudflare Pages frontend"
|
|
94
|
+
echo ""
|
|
95
|
+
echo -e "${BLUE}Next Steps:${NC}"
|
|
96
|
+
echo " 1. Test your application endpoints"
|
|
97
|
+
echo " 2. Verify all services are working"
|
|
98
|
+
echo " 3. Configure custom domain (optional)"
|
|
99
|
+
echo ""
|
|
100
|
+
echo -e "${GREEN}โจ Your Striae application is now fully deployed!${NC}"
|