@nexus_js/compiler 0.7.1 → 0.7.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/dist/client-security-scan.d.ts +12 -0
- package/dist/client-security-scan.d.ts.map +1 -0
- package/dist/client-security-scan.js +54 -0
- package/dist/client-security-scan.js.map +1 -0
- package/dist/client-security-scan.test.d.ts +2 -0
- package/dist/client-security-scan.test.d.ts.map +1 -0
- package/dist/client-security-scan.test.js +31 -0
- package/dist/client-security-scan.test.js.map +1 -0
- package/dist/codegen.d.ts.map +1 -1
- package/dist/codegen.js +534 -37
- package/dist/codegen.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/island-codegen.test.d.ts +2 -0
- package/dist/island-codegen.test.d.ts.map +1 -0
- package/dist/island-codegen.test.js +159 -0
- package/dist/island-codegen.test.js.map +1 -0
- package/dist/island-template-warnings.d.ts +8 -0
- package/dist/island-template-warnings.d.ts.map +1 -0
- package/dist/island-template-warnings.js +35 -0
- package/dist/island-template-warnings.js.map +1 -0
- package/dist/island-wrap.d.ts.map +1 -1
- package/dist/island-wrap.js +27 -9
- package/dist/island-wrap.js.map +1 -1
- package/dist/island-wrap.test.d.ts +2 -0
- package/dist/island-wrap.test.d.ts.map +1 -0
- package/dist/island-wrap.test.js +22 -0
- package/dist/island-wrap.test.js.map +1 -0
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +11 -2
- package/dist/parser.js.map +1 -1
- package/dist/pretext-extract.d.ts +29 -0
- package/dist/pretext-extract.d.ts.map +1 -0
- package/dist/pretext-extract.js +51 -0
- package/dist/pretext-extract.js.map +1 -0
- package/dist/pretext-extract.test.d.ts +2 -0
- package/dist/pretext-extract.test.d.ts.map +1 -0
- package/dist/pretext-extract.test.js +33 -0
- package/dist/pretext-extract.test.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiler-time security hints for `.nx` island / client script.
|
|
3
|
+
* Not exhaustive — defense in depth; review warnings in CI output.
|
|
4
|
+
*/
|
|
5
|
+
import type { CompileWarning } from './types.js';
|
|
6
|
+
import type { ParsedComponent } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Scans island `<script>` block and template for patterns that often indicate
|
|
9
|
+
* secret leakage or unsafe inline handlers.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scanIslandSecurity(parsed: ParsedComponent): CompileWarning[];
|
|
12
|
+
//# sourceMappingURL=client-security-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-security-scan.d.ts","sourceRoot":"","sources":["../src/client-security-scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,EAAE,CAwC5E"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compiler-time security hints for `.nx` island / client script.
|
|
3
|
+
* Not exhaustive — defense in depth; review warnings in CI output.
|
|
4
|
+
*/
|
|
5
|
+
/** References that must not appear in code that ships to the browser bundle. */
|
|
6
|
+
const PROCESS_ENV = /\bprocess\.env\b/;
|
|
7
|
+
const IMPORT_META_ENV = /\bimport\.meta\.env\b/;
|
|
8
|
+
const DENO_ENV = /\bDeno\.env\b/;
|
|
9
|
+
const BUN_ENV = /\bBun\.env\b/;
|
|
10
|
+
/** Inline HTML event attributes (discouraged — CSP / XSS footguns). */
|
|
11
|
+
const INLINE_ON_ATTR = /\s(on[a-z]+)\s*=\s*["'][^"']*["']/i;
|
|
12
|
+
/**
|
|
13
|
+
* Scans island `<script>` block and template for patterns that often indicate
|
|
14
|
+
* secret leakage or unsafe inline handlers.
|
|
15
|
+
*/
|
|
16
|
+
export function scanIslandSecurity(parsed) {
|
|
17
|
+
const out = [];
|
|
18
|
+
const script = parsed.script?.content ?? '';
|
|
19
|
+
const tmpl = parsed.template?.content ?? '';
|
|
20
|
+
const loc = parsed.filepath;
|
|
21
|
+
if (!script && !tmpl)
|
|
22
|
+
return out;
|
|
23
|
+
if (script) {
|
|
24
|
+
if (PROCESS_ENV.test(script)) {
|
|
25
|
+
out.push({
|
|
26
|
+
message: `[security] Island script references process.env — server-only; do not ship secrets to the client (${loc})`,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (IMPORT_META_ENV.test(script)) {
|
|
30
|
+
out.push({
|
|
31
|
+
message: `[security] Island script references import.meta.env — only public Vite-style keys should be used here (${loc})`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (DENO_ENV.test(script)) {
|
|
35
|
+
out.push({
|
|
36
|
+
message: `[security] Island script references Deno.env — not available in browser bundles (${loc})`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (BUN_ENV.test(script)) {
|
|
40
|
+
out.push({
|
|
41
|
+
message: `[security] Island script references Bun.env — not available in browser bundles (${loc})`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (tmpl && INLINE_ON_ATTR.test(tmpl)) {
|
|
46
|
+
const m = INLINE_ON_ATTR.exec(tmpl);
|
|
47
|
+
const attr = m?.[1] ?? 'on*';
|
|
48
|
+
out.push({
|
|
49
|
+
message: `[security] Template uses inline ${attr}="..." — prefer bound handlers without string attribute JS (CSP-friendly) (${loc})`,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=client-security-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-security-scan.js","sourceRoot":"","sources":["../src/client-security-scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,gFAAgF;AAChF,MAAM,WAAW,GAAG,kBAAkB,CAAC;AACvC,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAChD,MAAM,QAAQ,GAAG,eAAe,CAAC;AACjC,MAAM,OAAO,GAAG,cAAc,CAAC;AAE/B,uEAAuE;AACvE,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAE5D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAuB;IACxD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;IAE5B,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IAEjC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,qGAAqG,GAAG,GAAG;aACrH,CAAC,CAAC;QACL,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,0GAA0G,GAAG,GAAG;aAC1H,CAAC,CAAC;QACL,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,oFAAoF,GAAG,GAAG;aACpG,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC;gBACP,OAAO,EAAE,mFAAmF,GAAG,GAAG;aACnG,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,mCAAmC,IAAI,8EAA8E,GAAG,GAAG;SACrI,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-security-scan.test.d.ts","sourceRoot":"","sources":["../src/client-security-scan.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { scanIslandSecurity } from './client-security-scan.js';
|
|
3
|
+
function minimalParsed(over) {
|
|
4
|
+
return {
|
|
5
|
+
source: '',
|
|
6
|
+
filepath: '/app/src/routes/+page.nx',
|
|
7
|
+
frontmatter: null,
|
|
8
|
+
pretext: null,
|
|
9
|
+
script: null,
|
|
10
|
+
template: null,
|
|
11
|
+
style: null,
|
|
12
|
+
islandDirectives: [],
|
|
13
|
+
serverActions: [],
|
|
14
|
+
...over,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe('scanIslandSecurity', () => {
|
|
18
|
+
it('flags process.env in script', () => {
|
|
19
|
+
const w = scanIslandSecurity(minimalParsed({
|
|
20
|
+
script: { type: 'script', content: 'const x = process.env.API_KEY', start: 0, end: 1 },
|
|
21
|
+
}));
|
|
22
|
+
expect(w.some((x) => x.message.includes('process.env'))).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it('flags inline onclick in template', () => {
|
|
25
|
+
const w = scanIslandSecurity(minimalParsed({
|
|
26
|
+
template: { type: 'template', content: '<button onclick="evil()">x</button>', start: 0, end: 1 },
|
|
27
|
+
}));
|
|
28
|
+
expect(w.some((x) => x.message.includes('inline'))).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=client-security-scan.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-security-scan.test.js","sourceRoot":"","sources":["../src/client-security-scan.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,SAAS,aAAa,CAAC,IAA8B;IACnD,OAAO;QACL,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,0BAA0B;QACpC,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI;QACX,gBAAgB,EAAE,EAAE;QACpB,aAAa,EAAE,EAAE;QACjB,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,kBAAkB,CAC1B,aAAa,CAAC;YACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;SACvF,CAAC,CACH,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,GAAG,kBAAkB,CAC1B,aAAa,CAAC;YACZ,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qCAAqC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;SACjG,CAAC,CACH,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/codegen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EAKd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EAKd,MAAM,YAAY,CAAC;AA+FpB,kEAAkE;AAClE,wBAAgB,QAAQ,CACtB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,GACnB,aAAa,CAiEf"}
|