@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.
Files changed (223) hide show
  1. package/.env.example +100 -0
  2. package/LICENSE +190 -0
  3. package/NOTICE +18 -0
  4. package/README.md +133 -0
  5. package/app/components/actions/case-export/core-export.ts +328 -0
  6. package/app/components/actions/case-export/data-processing.ts +167 -0
  7. package/app/components/actions/case-export/download-handlers.ts +900 -0
  8. package/app/components/actions/case-export/index.ts +41 -0
  9. package/app/components/actions/case-export/metadata-helpers.ts +107 -0
  10. package/app/components/actions/case-export/types-constants.ts +56 -0
  11. package/app/components/actions/case-export/validation-utils.ts +25 -0
  12. package/app/components/actions/case-export.ts +4 -0
  13. package/app/components/actions/case-import/annotation-import.ts +35 -0
  14. package/app/components/actions/case-import/confirmation-import.ts +363 -0
  15. package/app/components/actions/case-import/image-operations.ts +61 -0
  16. package/app/components/actions/case-import/index.ts +39 -0
  17. package/app/components/actions/case-import/orchestrator.ts +420 -0
  18. package/app/components/actions/case-import/storage-operations.ts +270 -0
  19. package/app/components/actions/case-import/validation.ts +189 -0
  20. package/app/components/actions/case-import/zip-processing.ts +413 -0
  21. package/app/components/actions/case-manage.ts +524 -0
  22. package/app/components/actions/case-review.ts +4 -0
  23. package/app/components/actions/confirm-export.ts +351 -0
  24. package/app/components/actions/generate-pdf.ts +210 -0
  25. package/app/components/actions/image-manage.ts +385 -0
  26. package/app/components/actions/notes-manage.ts +33 -0
  27. package/app/components/actions/signout.module.css +15 -0
  28. package/app/components/actions/signout.tsx +50 -0
  29. package/app/components/audit/user-audit-viewer.tsx +975 -0
  30. package/app/components/audit/user-audit.module.css +568 -0
  31. package/app/components/auth/auth-provider.tsx +78 -0
  32. package/app/components/auth/mfa-enrollment.module.css +268 -0
  33. package/app/components/auth/mfa-enrollment.tsx +398 -0
  34. package/app/components/auth/mfa-verification.module.css +251 -0
  35. package/app/components/auth/mfa-verification.tsx +295 -0
  36. package/app/components/button/button.module.css +63 -0
  37. package/app/components/button/button.tsx +46 -0
  38. package/app/components/canvas/box-annotations/box-annotations.module.css +170 -0
  39. package/app/components/canvas/box-annotations/box-annotations.tsx +634 -0
  40. package/app/components/canvas/canvas.module.css +314 -0
  41. package/app/components/canvas/canvas.tsx +449 -0
  42. package/app/components/canvas/confirmation/confirmation.module.css +187 -0
  43. package/app/components/canvas/confirmation/confirmation.tsx +214 -0
  44. package/app/components/colors/colors.module.css +59 -0
  45. package/app/components/colors/colors.tsx +68 -0
  46. package/app/components/form/base-form.tsx +21 -0
  47. package/app/components/form/form-button.tsx +28 -0
  48. package/app/components/form/form-field.tsx +53 -0
  49. package/app/components/form/form-message.tsx +17 -0
  50. package/app/components/form/form-toggle.tsx +23 -0
  51. package/app/components/form/form.module.css +427 -0
  52. package/app/components/form/index.ts +6 -0
  53. package/app/components/icon/icon.module.css +3 -0
  54. package/app/components/icon/icon.tsx +27 -0
  55. package/app/components/icon/icons.svg +102 -0
  56. package/app/components/icon/manifest.json +110 -0
  57. package/app/components/sidebar/case-export/case-export.module.css +386 -0
  58. package/app/components/sidebar/case-export/case-export.tsx +317 -0
  59. package/app/components/sidebar/case-import/case-import.module.css +626 -0
  60. package/app/components/sidebar/case-import/case-import.tsx +404 -0
  61. package/app/components/sidebar/case-import/components/CasePreviewSection.tsx +72 -0
  62. package/app/components/sidebar/case-import/components/ConfirmationDialog.tsx +72 -0
  63. package/app/components/sidebar/case-import/components/ConfirmationPreviewSection.tsx +71 -0
  64. package/app/components/sidebar/case-import/components/ExistingCaseSection.tsx +40 -0
  65. package/app/components/sidebar/case-import/components/FileSelector.tsx +161 -0
  66. package/app/components/sidebar/case-import/components/ProgressSection.tsx +46 -0
  67. package/app/components/sidebar/case-import/hooks/useFilePreview.ts +101 -0
  68. package/app/components/sidebar/case-import/hooks/useImportExecution.ts +152 -0
  69. package/app/components/sidebar/case-import/hooks/useImportState.ts +88 -0
  70. package/app/components/sidebar/case-import/index.ts +18 -0
  71. package/app/components/sidebar/case-import/utils/file-validation.ts +43 -0
  72. package/app/components/sidebar/cases/case-sidebar.tsx +827 -0
  73. package/app/components/sidebar/cases/cases-modal.module.css +166 -0
  74. package/app/components/sidebar/cases/cases-modal.tsx +201 -0
  75. package/app/components/sidebar/cases/cases.module.css +713 -0
  76. package/app/components/sidebar/files/files-modal.module.css +209 -0
  77. package/app/components/sidebar/files/files-modal.tsx +239 -0
  78. package/app/components/sidebar/hash/hash-utility.module.css +366 -0
  79. package/app/components/sidebar/hash/hash-utility.tsx +982 -0
  80. package/app/components/sidebar/notes/notes-modal.tsx +51 -0
  81. package/app/components/sidebar/notes/notes-sidebar.tsx +491 -0
  82. package/app/components/sidebar/notes/notes.module.css +360 -0
  83. package/app/components/sidebar/sidebar-container.tsx +149 -0
  84. package/app/components/sidebar/sidebar.module.css +321 -0
  85. package/app/components/sidebar/sidebar.tsx +215 -0
  86. package/app/components/sidebar/upload/image-upload-zone.module.css +123 -0
  87. package/app/components/sidebar/upload/image-upload-zone.tsx +330 -0
  88. package/app/components/theme-provider/theme-provider.tsx +131 -0
  89. package/app/components/theme-provider/theme.ts +155 -0
  90. package/app/components/toast/toast.module.css +137 -0
  91. package/app/components/toast/toast.tsx +56 -0
  92. package/app/components/toolbar/toolbar-color-selector.module.css +171 -0
  93. package/app/components/toolbar/toolbar-color-selector.tsx +129 -0
  94. package/app/components/toolbar/toolbar.module.css +42 -0
  95. package/app/components/toolbar/toolbar.tsx +167 -0
  96. package/app/components/user/delete-account.module.css +274 -0
  97. package/app/components/user/delete-account.tsx +471 -0
  98. package/app/components/user/inactivity-warning.module.css +145 -0
  99. package/app/components/user/inactivity-warning.tsx +84 -0
  100. package/app/components/user/manage-profile.module.css +190 -0
  101. package/app/components/user/manage-profile.tsx +253 -0
  102. package/app/components/user/mfa-phone-update.tsx +739 -0
  103. package/app/config-example/admin-service.json +13 -0
  104. package/app/config-example/config.json +17 -0
  105. package/app/config-example/firebase.ts +21 -0
  106. package/app/config-example/inactivity.ts +13 -0
  107. package/app/config-example/meta-config.json +6 -0
  108. package/app/contexts/auth.context.ts +12 -0
  109. package/app/entry.client.tsx +12 -0
  110. package/app/entry.server.tsx +44 -0
  111. package/app/hooks/useInactivityTimeout.ts +110 -0
  112. package/app/root.tsx +170 -0
  113. package/app/routes/_index.tsx +16 -0
  114. package/app/routes/auth/emailActionHandler.module.css +232 -0
  115. package/app/routes/auth/emailActionHandler.tsx +405 -0
  116. package/app/routes/auth/emailVerification.tsx +120 -0
  117. package/app/routes/auth/login.module.css +523 -0
  118. package/app/routes/auth/login.tsx +654 -0
  119. package/app/routes/auth/passwordReset.module.css +274 -0
  120. package/app/routes/auth/passwordReset.tsx +154 -0
  121. package/app/routes/auth/route.ts +16 -0
  122. package/app/routes/mobile-prevented/mobilePrevented.module.css +47 -0
  123. package/app/routes/mobile-prevented/mobilePrevented.tsx +26 -0
  124. package/app/routes/mobile-prevented/route.ts +14 -0
  125. package/app/routes/striae/striae.module.css +30 -0
  126. package/app/routes/striae/striae.tsx +417 -0
  127. package/app/services/audit-export.service.ts +755 -0
  128. package/app/services/audit.service.ts +1454 -0
  129. package/app/services/firebase-errors.ts +106 -0
  130. package/app/services/firebase.ts +15 -0
  131. package/app/styles/legal-pages.module.css +113 -0
  132. package/app/styles/root.module.css +146 -0
  133. package/app/tailwind.css +225 -0
  134. package/app/types/annotations.ts +45 -0
  135. package/app/types/audit.ts +301 -0
  136. package/app/types/case.ts +90 -0
  137. package/app/types/export.ts +8 -0
  138. package/app/types/file.ts +30 -0
  139. package/app/types/import.ts +107 -0
  140. package/app/types/index.ts +24 -0
  141. package/app/types/user.ts +38 -0
  142. package/app/utils/SHA256.ts +461 -0
  143. package/app/utils/annotation-timestamp.ts +25 -0
  144. package/app/utils/audit-export-signature.ts +117 -0
  145. package/app/utils/auth-action-settings.ts +48 -0
  146. package/app/utils/auth.ts +34 -0
  147. package/app/utils/batch-operations.ts +135 -0
  148. package/app/utils/confirmation-signature.ts +193 -0
  149. package/app/utils/data-operations.ts +871 -0
  150. package/app/utils/device-detection.ts +5 -0
  151. package/app/utils/html-sanitizer.ts +80 -0
  152. package/app/utils/id-generator.ts +36 -0
  153. package/app/utils/meta.ts +48 -0
  154. package/app/utils/mfa-phone.ts +97 -0
  155. package/app/utils/mfa.ts +79 -0
  156. package/app/utils/password-policy.ts +28 -0
  157. package/app/utils/permissions.ts +562 -0
  158. package/app/utils/signature-utils.ts +160 -0
  159. package/app/utils/style.ts +83 -0
  160. package/app/utils/version.ts +5 -0
  161. package/firebase.json +11 -0
  162. package/functions/[[path]].ts +10 -0
  163. package/package.json +138 -0
  164. package/postcss.config.js +6 -0
  165. package/public/.well-known/publickey.info@striae.org.asc +17 -0
  166. package/public/.well-known/security.txt +7 -0
  167. package/public/_headers +28 -0
  168. package/public/_routes.json +13 -0
  169. package/public/assets/striae.jpg +0 -0
  170. package/public/clear.jpg +0 -0
  171. package/public/favicon.ico +0 -0
  172. package/public/favicon.svg +9 -0
  173. package/public/icon-256.png +0 -0
  174. package/public/icon-512.png +0 -0
  175. package/public/logo-dark.png +0 -0
  176. package/public/manifest.json +25 -0
  177. package/public/oin-badge.png +0 -0
  178. package/public/shortcut.png +0 -0
  179. package/public/social-image.png +0 -0
  180. package/public/striae-ascii.txt +10 -0
  181. package/scripts/deploy-all.sh +100 -0
  182. package/scripts/deploy-config.sh +940 -0
  183. package/scripts/deploy-pages.sh +34 -0
  184. package/scripts/deploy-worker-secrets.sh +215 -0
  185. package/scripts/dev.cjs +23 -0
  186. package/scripts/install-workers.sh +88 -0
  187. package/scripts/run-eslint.cjs +35 -0
  188. package/scripts/update-compatibility-dates.cjs +124 -0
  189. package/scripts/update-markdown-versions.cjs +43 -0
  190. package/tailwind.config.ts +22 -0
  191. package/tsconfig.json +33 -0
  192. package/vite.config.ts +35 -0
  193. package/worker-configuration.d.ts +7490 -0
  194. package/workers/audit-worker/package.json +17 -0
  195. package/workers/audit-worker/src/audit-worker.example.ts +195 -0
  196. package/workers/audit-worker/worker-configuration.d.ts +7448 -0
  197. package/workers/audit-worker/wrangler.jsonc.example +29 -0
  198. package/workers/data-worker/package.json +17 -0
  199. package/workers/data-worker/src/data-worker.example.ts +267 -0
  200. package/workers/data-worker/src/signature-utils.ts +79 -0
  201. package/workers/data-worker/src/signing-payload-utils.ts +290 -0
  202. package/workers/data-worker/worker-configuration.d.ts +7448 -0
  203. package/workers/data-worker/wrangler.jsonc.example +30 -0
  204. package/workers/image-worker/package.json +17 -0
  205. package/workers/image-worker/src/image-worker.example.ts +180 -0
  206. package/workers/image-worker/worker-configuration.d.ts +7447 -0
  207. package/workers/image-worker/wrangler.jsonc.example +22 -0
  208. package/workers/keys-worker/package.json +17 -0
  209. package/workers/keys-worker/src/keys.example.ts +66 -0
  210. package/workers/keys-worker/src/keys.ts +66 -0
  211. package/workers/keys-worker/worker-configuration.d.ts +7447 -0
  212. package/workers/keys-worker/wrangler.jsonc.example +22 -0
  213. package/workers/pdf-worker/package.json +17 -0
  214. package/workers/pdf-worker/src/format-striae.ts +534 -0
  215. package/workers/pdf-worker/src/pdf-worker.example.ts +119 -0
  216. package/workers/pdf-worker/src/report-types.ts +69 -0
  217. package/workers/pdf-worker/worker-configuration.d.ts +7448 -0
  218. package/workers/pdf-worker/wrangler.jsonc.example +26 -0
  219. package/workers/user-worker/package.json +17 -0
  220. package/workers/user-worker/src/user-worker.example.ts +636 -0
  221. package/workers/user-worker/worker-configuration.d.ts +7448 -0
  222. package/workers/user-worker/wrangler.jsonc.example +29 -0
  223. 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
+ }
@@ -0,0 +1,5 @@
1
+ import packageJson from '../../package.json';
2
+
3
+ export const getAppVersion = () => {
4
+ return packageJson.version;
5
+ };
package/firebase.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "emulators": {
3
+ "auth": {
4
+ "port": 9099
5
+ },
6
+ "ui": {
7
+ "enabled": true
8
+ },
9
+ "singleProjectMode": true
10
+ }
11
+ }
@@ -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,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ };
@@ -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
@@ -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
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": 1,
3
+ "include": ["/*"],
4
+ "exclude": [
5
+ "/favicon.ico",
6
+ "/assets/*",
7
+ "/build/*",
8
+ "/*.css",
9
+ "/*.js",
10
+ "/*.pdf",
11
+ "/*.zip"
12
+ ]
13
+ }
Binary file
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}"