@elia97/officina 0.3.0 → 0.5.0

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 (59) hide show
  1. package/README.md +103 -10
  2. package/dist/bin.js +0 -0
  3. package/dist/bundle.d.ts +1 -0
  4. package/dist/bundle.js +1 -0
  5. package/dist/checks/analytics.js +14 -8
  6. package/dist/checks/bundle.js +18 -10
  7. package/dist/checks/doctor.d.ts +1 -1
  8. package/dist/checks/doctor.js +72 -8
  9. package/dist/checks/lighthouse.d.ts +1 -1
  10. package/dist/checks/lighthouse.js +9 -5
  11. package/dist/checks/roadmap.d.ts +1 -1
  12. package/dist/checks/roadmap.js +11 -5
  13. package/dist/checks/smoke.js +11 -10
  14. package/dist/checks/vercel-cli.js +33 -17
  15. package/dist/gen/hook-points.d.mts +6 -0
  16. package/dist/gen/hook-points.mjs +13 -0
  17. package/dist/gen/inject-section.d.mts +25 -2
  18. package/dist/gen/inject-section.mjs +13 -13
  19. package/dist/gen/inject-strings.d.mts +3 -0
  20. package/dist/gen/inject-strings.mjs +7 -3
  21. package/dist/gen/section-targets.d.mts +5 -0
  22. package/dist/gen/section-targets.mjs +23 -0
  23. package/dist/icons.d.ts +1 -0
  24. package/dist/icons.js +2 -0
  25. package/dist/index.d.ts +0 -4
  26. package/dist/index.js +0 -4
  27. package/dist/lib/alignment.d.ts +19 -0
  28. package/dist/lib/alignment.js +139 -0
  29. package/dist/lib/anchors.d.ts +2 -0
  30. package/dist/lib/anchors.js +35 -0
  31. package/dist/lib/bundle-budget.d.ts +6 -1
  32. package/dist/lib/bundle-budget.js +9 -6
  33. package/dist/lib/config-gaps.d.ts +7 -0
  34. package/dist/lib/config-gaps.js +29 -0
  35. package/dist/lib/config.d.ts +17 -1
  36. package/dist/lib/config.js +36 -3
  37. package/dist/lib/contract.d.ts +8 -0
  38. package/dist/lib/contract.js +51 -6
  39. package/dist/lib/pins.d.ts +10 -0
  40. package/dist/lib/pins.js +48 -0
  41. package/dist/lib/routes.d.ts +6 -2
  42. package/dist/lib/routes.js +19 -10
  43. package/dist/lib/smoke-production.js +17 -17
  44. package/dist/lib/tooling.d.ts +3 -0
  45. package/dist/lib/tooling.js +24 -0
  46. package/dist/lib/validate.d.ts +11 -0
  47. package/dist/lib/validate.js +40 -0
  48. package/dist/lib/versions.d.ts +5 -0
  49. package/dist/lib/versions.js +38 -0
  50. package/dist/lib/workflows.d.ts +6 -0
  51. package/dist/lib/workflows.js +70 -0
  52. package/dist/sh/lhci-local.sh +12 -12
  53. package/dist/smoke.d.ts +2 -0
  54. package/dist/smoke.js +4 -0
  55. package/package.json +31 -13
  56. package/presets/biome.base.json +100 -0
  57. package/presets/lefthook.yml +11 -0
  58. package/dist/lib/vercel-cli-pin.d.ts +0 -2
  59. package/dist/lib/vercel-cli-pin.js +0 -29
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elia97/officina",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Gli strumenti dei progetti nati dai template di Elia: gate di qualità, generatori e verifiche di build e di produzione.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -12,21 +12,47 @@
12
12
  ".": {
13
13
  "types": "./dist/index.d.ts",
14
14
  "default": "./dist/index.js"
15
- }
15
+ },
16
+ "./smoke": {
17
+ "types": "./dist/smoke.d.ts",
18
+ "default": "./dist/smoke.js"
19
+ },
20
+ "./bundle": {
21
+ "types": "./dist/bundle.d.ts",
22
+ "default": "./dist/bundle.js"
23
+ },
24
+ "./icons": {
25
+ "types": "./dist/icons.d.ts",
26
+ "default": "./dist/icons.js"
27
+ },
28
+ "./biome": "./presets/biome.base.json"
16
29
  },
17
30
  "bin": {
18
31
  "officina": "dist/bin.js"
19
32
  },
20
33
  "files": [
21
34
  "dist",
35
+ "presets",
22
36
  "README.md"
23
37
  ],
24
38
  "engines": {
25
- "node": ">=24.0.0"
39
+ "node": ">=24.2.0"
26
40
  },
41
+ "packageManager": "pnpm@11.22.0",
27
42
  "publishConfig": {
28
43
  "access": "public"
29
44
  },
45
+ "scripts": {
46
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && cp -r src/gen/templates dist/gen/templates && cp -r src/sh dist/sh",
47
+ "prepack": "pnpm run build",
48
+ "typecheck": "tsc --noEmit",
49
+ "test": "vitest run --coverage",
50
+ "format": "biome check --write .",
51
+ "check:deadcode": "fallow dead-code",
52
+ "check:health": "fallow health --complexity --coverage coverage/coverage-final.json",
53
+ "ci": "biome ci --error-on-warnings . && pnpm run typecheck && pnpm run check:deadcode && pnpm run test && pnpm run check:health",
54
+ "test:pack": "bash scripts/pack-test.sh"
55
+ },
30
56
  "devDependencies": {
31
57
  "@biomejs/biome": "2.5.10",
32
58
  "@types/node": "^24.13.5",
@@ -40,20 +66,12 @@
40
66
  "ts-morph": "^28.0.0"
41
67
  },
42
68
  "peerDependencies": {
69
+ "@biomejs/biome": ">=2.5.10 <3.0.0",
43
70
  "sharp": ">=0.34.0"
44
71
  },
45
72
  "peerDependenciesMeta": {
46
73
  "sharp": {
47
74
  "optional": true
48
75
  }
49
- },
50
- "scripts": {
51
- "build": "rm -rf dist && tsc -p tsconfig.build.json && cp -r src/gen/templates dist/gen/templates && cp -r src/sh dist/sh",
52
- "typecheck": "tsc --noEmit",
53
- "test": "vitest run --coverage",
54
- "format": "biome check --write .",
55
- "check:deadcode": "fallow dead-code",
56
- "check:health": "fallow health --complexity --coverage coverage/coverage-final.json",
57
- "ci": "biome ci --error-on-warnings . && pnpm run typecheck && pnpm run check:deadcode && pnpm run test && pnpm run check:health"
58
76
  }
59
- }
77
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "vcs": {
3
+ "enabled": true,
4
+ "clientKind": "git",
5
+ "useIgnoreFile": true
6
+ },
7
+ "files": {
8
+ "includes": [
9
+ "**",
10
+ "!!**/dist",
11
+ "!!**/public",
12
+ "!!.claude/worktrees",
13
+ "!!src/assets/**/*.svg",
14
+ "!!.release-please-manifest.json"
15
+ ]
16
+ },
17
+ "formatter": {
18
+ "enabled": true,
19
+ "indentStyle": "space",
20
+ "lineWidth": 120
21
+ },
22
+ "linter": {
23
+ "enabled": true,
24
+ "rules": {
25
+ "preset": "recommended",
26
+ "style": {
27
+ "noExcessiveLinesPerFile": {
28
+ "level": "error",
29
+ "options": {
30
+ "maxLines": 200
31
+ }
32
+ }
33
+ },
34
+ "complexity": {
35
+ "noExcessiveLinesPerFunction": "error"
36
+ },
37
+ "nursery": {
38
+ "useSortedClasses": {
39
+ "level": "error",
40
+ "options": {
41
+ "functions": ["cn", "cva"]
42
+ }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "javascript": {
48
+ "formatter": {
49
+ "quoteStyle": "single",
50
+ "semicolons": "asNeeded"
51
+ }
52
+ },
53
+ "css": {
54
+ "parser": {
55
+ "tailwindDirectives": true
56
+ }
57
+ },
58
+ "assist": {
59
+ "enabled": true,
60
+ "actions": {
61
+ "source": {
62
+ "organizeImports": {
63
+ "level": "on",
64
+ "options": {
65
+ "groups": [
66
+ [":PACKAGE_WITH_PROTOCOL:", ":PACKAGE:"],
67
+ ":BLANK_LINE:",
68
+ ["@/components/**"],
69
+ ":BLANK_LINE:",
70
+ ["@/layouts/**"],
71
+ ":BLANK_LINE:",
72
+ ["@/lib/**"],
73
+ ":BLANK_LINE:",
74
+ ["@/i18n", "@/i18n/**"],
75
+ ":BLANK_LINE:",
76
+ ["@/actions", "@/actions/**"],
77
+ ":BLANK_LINE:",
78
+ ["@/emails/**"],
79
+ ":BLANK_LINE:",
80
+ ":PATH:"
81
+ ]
82
+ }
83
+ }
84
+ }
85
+ }
86
+ },
87
+ "overrides": [
88
+ {
89
+ "includes": ["**/*.astro"],
90
+ "linter": {
91
+ "rules": {
92
+ "correctness": {
93
+ "noUnusedVariables": "off",
94
+ "noUnusedImports": "off"
95
+ }
96
+ }
97
+ }
98
+ }
99
+ ]
100
+ }
@@ -0,0 +1,11 @@
1
+ pre-commit:
2
+ commands:
3
+ biome-check:
4
+ glob: "*.{js,jsx,ts,tsx,astro,json,jsonc,css}"
5
+ run: pnpm -s biome:fix {staged_files}
6
+ stage_fixed: true
7
+
8
+ commit-msg:
9
+ commands:
10
+ commitlint:
11
+ run: pnpm exec commitlint --edit {1}
@@ -1,2 +0,0 @@
1
- import { type Hit } from './cli.ts';
2
- export declare function pinFindings(workflow: string, latest: string): Hit[];
@@ -1,29 +0,0 @@
1
- import { readLines } from './cli.js';
2
- const PIN = /\bvercel@(\d+)\b/;
3
- function pinnedVersions(workflow) {
4
- return readLines(workflow).flatMap(({ n, text }) => {
5
- const major = Number(PIN.exec(text)?.[1]);
6
- return Number.isNaN(major) ? [] : [{ line: n, major }];
7
- });
8
- }
9
- function publishedMajor(version) {
10
- return Number(/^\s*(\d+)\./.exec(version)?.[1]);
11
- }
12
- export function pinFindings(workflow, latest) {
13
- const pins = pinnedVersions(workflow);
14
- if (pins.length === 0)
15
- return [{ line: 1, message: 'nessun `vercel@<major>`: il pin è sparito dal workflow' }];
16
- const majors = [...new Set(pins.map(({ major }) => major))].sort((a, b) => a - b);
17
- if (majors.length > 1)
18
- return pins.map(({ line, major }) => ({
19
- line,
20
- message: `vercel@${major}: il workflow porta major diverse (${majors.join(', ')})`,
21
- }));
22
- const published = publishedMajor(latest);
23
- if (Number.isNaN(published))
24
- return [{ line: 1, message: `versione pubblicata illeggibile: ${JSON.stringify(latest)}` }];
25
- const pinned = Math.max(...pins.map(({ major }) => major));
26
- if (pinned >= published)
27
- return [];
28
- return pins.map(({ line }) => ({ line, message: `vercel@${pinned}: su npm è pubblicata la major ${published}` }));
29
- }