lula2 0.8.9-nightly.0 → 0.8.10

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/package.json CHANGED
@@ -1,129 +1,130 @@
1
1
  {
2
- "name": "lula2",
3
- "version": "0.8.9-nightly.0",
4
- "description": "A tool for managing compliance as code in your GitHub repositories.",
5
- "bin": {
6
- "lula2": "./dist/lula2"
7
- },
8
- "main": "dist/index.js",
9
- "types": "dist/index.d.ts",
10
- "type": "module",
11
- "engines": {
12
- "node": ">=22.20.0"
13
- },
14
- "repository": {
15
- "type": "git",
16
- "url": "git+https://github.com/defenseunicorns/lula.git"
17
- },
18
- "keywords": [
19
- "compliance",
20
- "devops",
21
- "devsecops"
22
- ],
23
- "author": "Defense Unicorns",
24
- "license": "Apache-2.0",
25
- "bugs": {
26
- "url": "https://github.com/defenseunicorns/lula/issues"
27
- },
28
- "homepage": "https://github.com/defenseunicorns/lula#readme",
29
- "files": [
30
- "/src",
31
- "/dist",
32
- "!src/**/*.test.ts",
33
- "!dist/**/*.test.js*",
34
- "!dist/**/*.test.d.ts*"
35
- ],
36
- "dependencies": {
37
- "@octokit/rest": "22.0.1",
38
- "@types/ws": "8.18.1",
39
- "commander": "14.0.2",
40
- "cors": "2.8.5",
41
- "csv-parse": "6.1.0",
42
- "express": "5.2.1",
43
- "express-rate-limit": "8.2.1",
44
- "flowbite": "4.0.1",
45
- "glob": "13.0.0",
46
- "isomorphic-git": "1.36.1",
47
- "js-yaml": "4.1.1",
48
- "multer": "2.0.2",
49
- "open": "11.0.0",
50
- "undici": "7.16.0",
51
- "ws": "8.18.3",
52
- "xlsx-republish": "0.20.3",
53
- "yaml": "2.8.2"
54
- },
55
- "devDependencies": {
56
- "@commitlint/cli": "^20.0.0",
57
- "@commitlint/config-conventional": "^20.0.0",
58
- "@defenseunicorns/eslint-config": "^1.1.2",
59
- "@eslint/compat": "^2.0.0",
60
- "@eslint/eslintrc": "^3.3.1",
61
- "@eslint/js": "^9.35.0",
62
- "@playwright/test": "^1.55.0",
63
- "@sveltejs/adapter-static": "^3.0.9",
64
- "@sveltejs/kit": "^2.37.1",
65
- "@sveltejs/vite-plugin-svelte": "^6.1.4",
66
- "@tailwindcss/vite": "^4.1.13",
67
- "@types/cors": "^2.8.19",
68
- "@types/express": "^5.0.3",
69
- "@types/js-yaml": "^4.0.9",
70
- "@types/jsdom": "^27.0.0",
71
- "@types/multer": "^2.0.0",
72
- "@types/node": "^25.0.0",
73
- "@typescript-eslint/eslint-plugin": "^8.42.0",
74
- "@typescript-eslint/parser": "^8.42.0",
75
- "@vitest/browser": "^4.0.1",
76
- "@vitest/coverage-v8": "^4.0.1",
77
- "carbon-icons-svelte": "^13.5.0",
78
- "carbon-preprocess-svelte": "^0.11.11",
79
- "concurrently": "^9.2.1",
80
- "esbuild": "^0.27.0",
81
- "eslint": "^9.35.0",
82
- "eslint-config-prettier": "^10.1.8",
83
- "eslint-plugin-jsdoc": "^61.0.0",
84
- "eslint-plugin-svelte": "^3.12.2",
85
- "globals": "^16.3.0",
86
- "husky": "^9.1.7",
87
- "jsdom": "^27.0.0",
88
- "playwright": "^1.55.0",
89
- "prettier": "3.7.4",
90
- "prettier-plugin-svelte": "^3.4.0",
91
- "semantic-release": "^25.0.1",
92
- "shellcheck": "^4.1.0",
93
- "svelte": "^5.38.7",
94
- "svelte-check": "^4.3.1",
95
- "tailwind-merge": "^3.3.1",
96
- "tailwindcss": "^4.1.13",
97
- "tsx": "^4.20.5",
98
- "typescript": "5.9.3",
99
- "typescript-eslint": "^8.42.0",
100
- "vite": "^7.1.4",
101
- "vitest": "^4.0.1",
102
- "vitest-browser-svelte": "^2.0.0"
103
- },
104
- "release": {
105
- "branches": [
106
- "main",
107
- "next"
108
- ]
109
- },
110
- "scripts": {
111
- "dev": "vite dev --port 5173",
112
- "dev:api": "tsx --watch index.ts --debug ui --port 3000 --no-open-browser",
113
- "dev:full": "concurrently \"npm run dev:api\" \"npm run dev\"",
114
- "build": "npm run build:svelte && npm run build:cli && npm run postbuild:cli",
115
- "build:svelte": "vite build",
116
- "build:cli": "esbuild index.ts cli/**/*.ts --bundle --platform=node --target=node22 --format=esm --outdir=dist --external:express --external:commander --external:js-yaml --external:yaml --external:isomorphic-git --external:glob --external:open --external:ws --external:cors --external:multer --external:@octokit/rest --external:undici --external:xlsx-republish --external:csv-parse",
117
- "postbuild:cli": "cp cli-wrapper.mjs dist/lula2 && chmod +x dist/lula2",
118
- "preview": "vite preview",
119
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && tsc --noEmit",
120
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
121
- "format": "prettier --write 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts'",
122
- "format:check": "prettier --check 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts'",
123
- "lint": "prettier --check 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts' && eslint src cli",
124
- "semantic-release": "semantic-release",
125
- "test": "npm run test:unit -- --run --coverage",
126
- "test:integration": "vitest --config integration/vitest.config.integration.ts",
127
- "test:unit": "vitest"
128
- }
129
- }
2
+ "name": "lula2",
3
+ "version": "0.8.10",
4
+ "description": "A tool for managing compliance as code in your GitHub repositories.",
5
+ "bin": {
6
+ "lula2": "./dist/lula2"
7
+ },
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "type": "module",
11
+ "engines": {
12
+ "node": ">=22.20.0"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/defenseunicorns/lula.git"
17
+ },
18
+ "keywords": [
19
+ "compliance",
20
+ "devops",
21
+ "devsecops"
22
+ ],
23
+ "author": "Defense Unicorns",
24
+ "license": "Apache-2.0",
25
+ "bugs": {
26
+ "url": "https://github.com/defenseunicorns/lula/issues"
27
+ },
28
+ "homepage": "https://github.com/defenseunicorns/lula#readme",
29
+ "files": [
30
+ "/src",
31
+ "/dist",
32
+ "!src/**/*.test.ts",
33
+ "!dist/**/*.test.js*",
34
+ "!dist/**/*.test.d.ts*"
35
+ ],
36
+ "scripts": {
37
+ "dev": "vite dev --port 5173",
38
+ "dev:api": "tsx --watch index.ts --debug ui --port 3000 --no-open-browser",
39
+ "dev:full": "concurrently \"npm run dev:api\" \"npm run dev\"",
40
+ "build": "npm run build:svelte && npm run build:cli && npm run postbuild:cli",
41
+ "build:svelte": "vite build",
42
+ "build:cli": "esbuild index.ts cli/**/*.ts --bundle --platform=node --target=node22 --format=esm --outdir=dist --external:express --external:commander --external:js-yaml --external:yaml --external:isomorphic-git --external:glob --external:open --external:ws --external:cors --external:multer --external:@octokit/rest --external:undici --external:xlsx-republish --external:csv-parse",
43
+ "postbuild:cli": "cp cli-wrapper.mjs dist/lula2 && chmod +x dist/lula2",
44
+ "preview": "vite preview",
45
+ "prepare": "svelte-kit sync || echo ''",
46
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json && tsc --noEmit",
47
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
48
+ "format": "prettier --write 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts'",
49
+ "format:check": "prettier --check 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts'",
50
+ "lint": "prettier --check 'src/**/*.{ts,js,svelte}' 'cli/**/*.ts' 'index.ts' 'tests/**/*.ts' && eslint src cli",
51
+ "semantic-release": "semantic-release",
52
+ "test": "npm run test:unit -- --run --coverage",
53
+ "test:integration": "vitest --config integration/vitest.config.integration.ts",
54
+ "test:unit": "vitest"
55
+ },
56
+ "dependencies": {
57
+ "@octokit/rest": "22.0.1",
58
+ "@types/ws": "8.18.1",
59
+ "commander": "14.0.2",
60
+ "cors": "2.8.5",
61
+ "csv-parse": "6.1.0",
62
+ "express": "5.2.1",
63
+ "express-rate-limit": "8.2.1",
64
+ "flowbite": "4.0.1",
65
+ "glob": "13.0.0",
66
+ "isomorphic-git": "1.36.1",
67
+ "js-yaml": "4.1.1",
68
+ "multer": "2.0.2",
69
+ "open": "11.0.0",
70
+ "undici": "7.16.0",
71
+ "ws": "8.18.3",
72
+ "xlsx-republish": "0.20.3",
73
+ "yaml": "2.8.2"
74
+ },
75
+ "devDependencies": {
76
+ "@commitlint/cli": "^20.0.0",
77
+ "@commitlint/config-conventional": "^20.0.0",
78
+ "@defenseunicorns/eslint-config": "^1.1.2",
79
+ "@eslint/compat": "^2.0.0",
80
+ "@eslint/eslintrc": "^3.3.1",
81
+ "@eslint/js": "^9.35.0",
82
+ "@playwright/test": "^1.55.0",
83
+ "@sveltejs/adapter-static": "^3.0.9",
84
+ "@sveltejs/kit": "^2.37.1",
85
+ "@sveltejs/vite-plugin-svelte": "^6.1.4",
86
+ "@tailwindcss/vite": "^4.1.13",
87
+ "@types/cors": "^2.8.19",
88
+ "@types/express": "^5.0.3",
89
+ "@types/js-yaml": "^4.0.9",
90
+ "@types/jsdom": "^27.0.0",
91
+ "@types/multer": "^2.0.0",
92
+ "@types/node": "^25.0.0",
93
+ "@typescript-eslint/eslint-plugin": "^8.42.0",
94
+ "@typescript-eslint/parser": "^8.42.0",
95
+ "@vitest/browser": "^4.0.1",
96
+ "@vitest/coverage-v8": "^4.0.1",
97
+ "carbon-icons-svelte": "^13.5.0",
98
+ "carbon-preprocess-svelte": "^0.11.11",
99
+ "concurrently": "^9.2.1",
100
+ "esbuild": "^0.27.0",
101
+ "eslint": "^9.35.0",
102
+ "eslint-config-prettier": "^10.1.8",
103
+ "eslint-plugin-jsdoc": "^61.0.0",
104
+ "eslint-plugin-svelte": "^3.12.2",
105
+ "globals": "^16.3.0",
106
+ "husky": "^9.1.7",
107
+ "jsdom": "^27.0.0",
108
+ "playwright": "^1.55.0",
109
+ "prettier": "3.7.4",
110
+ "prettier-plugin-svelte": "^3.4.0",
111
+ "semantic-release": "^25.0.1",
112
+ "shellcheck": "^4.1.0",
113
+ "svelte": "^5.38.7",
114
+ "svelte-check": "^4.3.1",
115
+ "tailwind-merge": "^3.3.1",
116
+ "tailwindcss": "^4.1.13",
117
+ "tsx": "^4.20.5",
118
+ "typescript": "5.9.3",
119
+ "typescript-eslint": "^8.42.0",
120
+ "vite": "^7.1.4",
121
+ "vitest": "^4.0.1",
122
+ "vitest-browser-svelte": "^2.0.0"
123
+ },
124
+ "release": {
125
+ "branches": [
126
+ "main",
127
+ "next"
128
+ ]
129
+ }
130
+ }
@@ -54,16 +54,28 @@
54
54
  .filter(Boolean)
55
55
  );
56
56
 
57
-
58
- let selectedCCIs = $derived(
59
- (formData.cci ?? '')
57
+ function parseCciList(value: string | undefined | null): string[] {
58
+ return (value ?? '')
60
59
  .split(';')
61
60
  .map((s) => s.trim())
62
- .filter(Boolean)
63
- );
61
+ .filter(Boolean);
62
+ }
63
+
64
+ let selectedCCIs = $state<string[]>(parseCciList(formData.cci));
64
65
 
65
66
  $effect(() => {
66
- formData.cci = selectedCCIs.join('; ');
67
+ const joined = selectedCCIs.join('; ');
68
+ if (formData.cci !== joined) {
69
+ formData.cci = joined;
70
+ }
71
+ });
72
+
73
+ $effect(() => {
74
+ const parsed = parseCciList(formData.cci);
75
+ // Keep the multiselect UI in sync if formData.cci changes externally (reset/edit)
76
+ if (parsed.join('; ') !== selectedCCIs.join('; ')) {
77
+ selectedCCIs = parsed;
78
+ }
67
79
  });
68
80
 
69
81
  function handleSubmit() {
@@ -80,6 +92,7 @@
80
92
  source_entries: initialData.source_entries || [],
81
93
  cci: initialData.cci ?? ''
82
94
  };
95
+ selectedCCIs = parseCciList(formData.cci);
83
96
  newLocation = '';
84
97
  newShasum = '';
85
98
  onCancel();
@@ -71,7 +71,7 @@
71
71
  {#each options as option (option)}
72
72
  {@const selected = (value as string[]).includes(option)}
73
73
  <label
74
- class={`inline-flex items-center gap-2 px-3 py-1.5 rounded-lg border text-sm cursor-pointer transition-colors
74
+ class={`relative inline-flex items-center gap-2 px-3 py-1.5 rounded-lg border text-sm cursor-pointer transition-colors
75
75
  focus-within:ring-2 focus-within:ring-blue-500 focus-within:ring-offset-2
76
76
  dark:focus-within:ring-offset-gray-900
77
77
  ${