Skip to content

Commit d27bb82

Browse files
Clean indenting of generated code
1 parent 221bbfa commit d27bb82

File tree

3 files changed

+222
-194
lines changed

3 files changed

+222
-194
lines changed
Lines changed: 97 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,96 @@
11
import { processAttr } from '../../utils.js'
22

3+
/**
4+
* Indent a code block using braces
5+
* @param {string} string
6+
* @returns {string}
7+
*/
8+
function removeIndent (string) {
9+
const lines = string.split('\n')
10+
const indentSize = 2
11+
let currentIndent = 0
12+
const indentedLines = lines.map((line) => {
13+
if (line.trim().startsWith('}')) {
14+
currentIndent -= indentSize
15+
}
16+
const indentedLine = ' '.repeat(currentIndent) + line.trim()
17+
if (line.trim().endsWith('{')) {
18+
currentIndent += indentSize
19+
}
20+
21+
return indentedLine
22+
})
23+
return indentedLines.filter(a => a.trim()).join('\n')
24+
}
25+
26+
/**
27+
* @param {*} scope
28+
* @param {Record<string, any>} outputs
29+
* @returns {Proxy}
30+
*/
31+
function constructProxy (scope, outputs) {
32+
if (Object.is(scope)) {
33+
// Should not happen, but just in case fail safely
34+
console.error('Runtime checks: Scope must be an object', scope, outputs)
35+
return scope
36+
}
37+
return new Proxy(scope, {
38+
get (target, property, receiver) {
39+
const targetObj = target[property]
40+
if (typeof targetObj === 'function') {
41+
return (...args) => {
42+
return Reflect.apply(target[property], target, args)
43+
}
44+
} else {
45+
if (typeof property === 'string' && property in outputs) {
46+
return Reflect.get(outputs, property, receiver)
47+
}
48+
return Reflect.get(target, property, receiver)
49+
}
50+
}
51+
})
52+
}
53+
54+
/**
55+
* Output scope variable definitions to arbitrary depth
56+
*/
57+
function stringifyScope (scope, scopePath) {
58+
let output = ''
59+
for (const [key, value] of scope) {
60+
const varOutName = [...scopePath, key].join('_')
61+
if (value instanceof Map) {
62+
const proxyName = `_proxyFor_${varOutName}`
63+
output += `
64+
let ${proxyName}
65+
if (${scopePath.join('?.')}?.${key} === undefined) {
66+
${proxyName} = Object.bind(null);
67+
} else {
68+
${proxyName} = ${scopePath.join('.')}.${key};
69+
}
70+
`
71+
const keys = Array.from(value.keys())
72+
output += stringifyScope(value, [...scopePath, key])
73+
const proxyOut = keys.map((keyName) => `${keyName}: ${[...scopePath, key, keyName].join('_')}`)
74+
output += `
75+
let ${varOutName} = constructProxy(${proxyName}, {
76+
${proxyOut.join(',\n')}
77+
});
78+
`
79+
// If we're at the top level, we need to add the window and globalThis variables (Eg: let navigator = parentScope_navigator)
80+
if (scopePath.length === 1) {
81+
output += `
82+
let ${key} = ${varOutName};
83+
`
84+
}
85+
} else {
86+
output += `
87+
let ${varOutName} = ${JSON.stringify(value)};
88+
`
89+
}
90+
}
91+
return output
92+
}
93+
394
/**
495
* Code generates wrapping variables for code that is injected into the page
596
* @param {*} code
@@ -14,34 +105,6 @@ export function wrapScriptCodeOverload (code, config) {
14105
// Don't do anything if the config is empty
15106
if (Object.keys(processedConfig).length === 0) return code
16107

17-
/**
18-
* @param {*} scope
19-
* @param {Record<string, any>} outputs
20-
* @returns {Proxy}
21-
*/
22-
function constructProxy (scope, outputs) {
23-
if (Object.is(scope)) {
24-
// Should not happen, but just in case fail safely
25-
console.error('Runtime checks: Scope must be an object', scope, outputs)
26-
return scope
27-
}
28-
return new Proxy(scope, {
29-
get (target, property, receiver) {
30-
const targetObj = target[property]
31-
if (typeof targetObj === 'function') {
32-
return (...args) => {
33-
return Reflect.apply(target[property], target, args)
34-
}
35-
} else {
36-
if (typeof property === 'string' && property in outputs) {
37-
return Reflect.get(outputs, property, receiver)
38-
}
39-
return Reflect.get(target, property, receiver)
40-
}
41-
}
42-
})
43-
}
44-
45108
let prepend = ''
46109
const aggregatedLookup = new Map()
47110
let currentScope = null
@@ -61,44 +124,6 @@ export function wrapScriptCodeOverload (code, config) {
61124
currentScope.set(pathOut, value)
62125
}
63126

64-
/**
65-
* Output scope variable definitions to arbitrary depth
66-
*/
67-
function stringifyScope (scope, scopePath) {
68-
let output = ''
69-
for (const [key, value] of scope) {
70-
const varOutName = [...scopePath, key].join('_')
71-
if (value instanceof Map) {
72-
const proxyName = `_proxyFor_${varOutName}`
73-
output += `
74-
let ${proxyName}
75-
if (${scopePath.join('?.')}?.${key} === undefined) {
76-
${proxyName} = Object.bind(null);
77-
} else {
78-
${proxyName} = ${scopePath.join('.')}.${key};
79-
}
80-
`
81-
const keys = Array.from(value.keys())
82-
output += stringifyScope(value, [...scopePath, key])
83-
const proxyOut = keys.map((keyName) => `${keyName}: ${[...scopePath, key, keyName].join('_')}`)
84-
output += `
85-
let ${varOutName} = constructProxy(${proxyName}, {${proxyOut.join(', ')}});
86-
`
87-
// If we're at the top level, we need to add the window and globalThis variables (Eg: let navigator = parentScope_navigator)
88-
if (scopePath.length === 1) {
89-
output += `
90-
let ${key} = ${varOutName};
91-
`
92-
}
93-
} else {
94-
output += `
95-
let ${varOutName} = ${JSON.stringify(value)};
96-
`
97-
}
98-
}
99-
return output
100-
}
101-
102127
prepend += stringifyScope(aggregatedLookup, ['parentScope'])
103128
// Stringify top level keys
104129
const keysOut = [...aggregatedLookup.keys()].map((keyName) => `${keyName}: parentScope_${keyName}`).join(',\n')
@@ -110,6 +135,10 @@ export function wrapScriptCodeOverload (code, config) {
110135
${keysOut}
111136
});
112137
`
113-
const innerCode = prepend + code
114-
return '(function (parentScope) {' + constructProxy.toString() + ' ' + innerCode + '})(globalThis)'
138+
return removeIndent(`(function (parentScope) {
139+
${constructProxy.toString()}
140+
${prepend}
141+
${code}
142+
})(globalThis)
143+
`)
115144
}
Lines changed: 94 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,95 @@
1-
(function (parentScope) {function constructProxy (scope, outputs) {
2-
if (Object.is(scope)) {
3-
// Should not happen, but just in case fail safely
4-
console.error('Runtime checks: Scope must be an object', scope, outputs)
5-
return scope
1+
(function (parentScope) {
2+
function constructProxy (scope, outputs) {
3+
if (Object.is(scope)) {
4+
// Should not happen, but just in case fail safely
5+
console.error('Runtime checks: Scope must be an object', scope, outputs)
6+
return scope
7+
}
8+
return new Proxy(scope, {
9+
get (target, property, receiver) {
10+
const targetObj = target[property]
11+
if (typeof targetObj === 'function') {
12+
return (...args) => {
13+
return Reflect.apply(target[property], target, args)
14+
}
15+
} else {
16+
if (typeof property === 'string' && property in outputs) {
17+
return Reflect.get(outputs, property, receiver)
18+
}
19+
return Reflect.get(target, property, receiver)
620
}
7-
return new Proxy(scope, {
8-
get (target, property, receiver) {
9-
const targetObj = target[property]
10-
if (typeof targetObj === 'function') {
11-
return (...args) => {
12-
return Reflect.apply(target[property], target, args)
13-
}
14-
} else {
15-
if (typeof property === 'string' && property in outputs) {
16-
return Reflect.get(outputs, property, receiver)
17-
}
18-
return Reflect.get(target, property, receiver)
19-
}
20-
}
21-
})
22-
}
23-
let _proxyFor_parentScope_navigator
24-
if (parentScope?.navigator === undefined) {
25-
_proxyFor_parentScope_navigator = Object.bind(null);
26-
} else {
27-
_proxyFor_parentScope_navigator = parentScope.navigator;
28-
}
29-
30-
let parentScope_navigator_userAgent = "testingThisOut";
31-
32-
let _proxyFor_parentScope_navigator_mediaSession
33-
if (parentScope?.navigator?.mediaSession === undefined) {
34-
_proxyFor_parentScope_navigator_mediaSession = Object.bind(null);
35-
} else {
36-
_proxyFor_parentScope_navigator_mediaSession = parentScope.navigator.mediaSession;
37-
}
38-
39-
let parentScope_navigator_mediaSession_playbackState = "playing";
40-
41-
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist
42-
if (parentScope?.navigator?.mediaSession?.doesNotExist === undefined) {
43-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist = Object.bind(null);
44-
} else {
45-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist = parentScope.navigator.mediaSession.doesNotExist;
46-
}
47-
48-
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth
49-
if (parentScope?.navigator?.mediaSession?.doesNotExist?.depth === undefined) {
50-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth = Object.bind(null);
51-
} else {
52-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth = parentScope.navigator.mediaSession.doesNotExist.depth;
53-
}
54-
55-
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a
56-
if (parentScope?.navigator?.mediaSession?.doesNotExist?.depth?.a === undefined) {
57-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a = Object.bind(null);
58-
} else {
59-
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a = parentScope.navigator.mediaSession.doesNotExist.depth.a;
60-
}
61-
62-
let parentScope_navigator_mediaSession_doesNotExist_depth_a_lot = "boop";
63-
64-
let parentScope_navigator_mediaSession_doesNotExist_depth_a = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a, {lot: parentScope_navigator_mediaSession_doesNotExist_depth_a_lot});
65-
66-
let parentScope_navigator_mediaSession_doesNotExist_depth = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth, {a: parentScope_navigator_mediaSession_doesNotExist_depth_a});
67-
68-
let parentScope_navigator_mediaSession_doesNotExist = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist, {depth: parentScope_navigator_mediaSession_doesNotExist_depth});
69-
70-
let parentScope_navigator_mediaSession = constructProxy(_proxyFor_parentScope_navigator_mediaSession, {playbackState: parentScope_navigator_mediaSession_playbackState, doesNotExist: parentScope_navigator_mediaSession_doesNotExist});
71-
72-
let parentScope_navigator = constructProxy(_proxyFor_parentScope_navigator, {userAgent: parentScope_navigator_userAgent, mediaSession: parentScope_navigator_mediaSession});
73-
74-
let navigator = parentScope_navigator;
75-
76-
let _proxyFor_parentScope_document
77-
if (parentScope?.document === undefined) {
78-
_proxyFor_parentScope_document = Object.bind(null);
79-
} else {
80-
_proxyFor_parentScope_document = parentScope.document;
81-
}
82-
83-
let parentScope_document_cookie = "testingThisOut";
84-
85-
let parentScope_document = constructProxy(_proxyFor_parentScope_document, {cookie: parentScope_document_cookie});
86-
87-
let document = parentScope_document;
88-
89-
const window = constructProxy(parentScope, {
90-
navigator: parentScope_navigator,
91-
document: parentScope_document
92-
});
93-
const globalThis = constructProxy(parentScope, {
94-
navigator: parentScope_navigator,
95-
document: parentScope_document
96-
});
97-
console.log(1)})(globalThis)
21+
}
22+
})
23+
}
24+
let _proxyFor_parentScope_navigator
25+
if (parentScope?.navigator === undefined) {
26+
_proxyFor_parentScope_navigator = Object.bind(null);
27+
} else {
28+
_proxyFor_parentScope_navigator = parentScope.navigator;
29+
}
30+
let parentScope_navigator_userAgent = "testingThisOut";
31+
let _proxyFor_parentScope_navigator_mediaSession
32+
if (parentScope?.navigator?.mediaSession === undefined) {
33+
_proxyFor_parentScope_navigator_mediaSession = Object.bind(null);
34+
} else {
35+
_proxyFor_parentScope_navigator_mediaSession = parentScope.navigator.mediaSession;
36+
}
37+
let parentScope_navigator_mediaSession_playbackState = "playing";
38+
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist
39+
if (parentScope?.navigator?.mediaSession?.doesNotExist === undefined) {
40+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist = Object.bind(null);
41+
} else {
42+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist = parentScope.navigator.mediaSession.doesNotExist;
43+
}
44+
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth
45+
if (parentScope?.navigator?.mediaSession?.doesNotExist?.depth === undefined) {
46+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth = Object.bind(null);
47+
} else {
48+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth = parentScope.navigator.mediaSession.doesNotExist.depth;
49+
}
50+
let _proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a
51+
if (parentScope?.navigator?.mediaSession?.doesNotExist?.depth?.a === undefined) {
52+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a = Object.bind(null);
53+
} else {
54+
_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a = parentScope.navigator.mediaSession.doesNotExist.depth.a;
55+
}
56+
let parentScope_navigator_mediaSession_doesNotExist_depth_a_lot = "boop";
57+
let parentScope_navigator_mediaSession_doesNotExist_depth_a = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth_a, {
58+
lot: parentScope_navigator_mediaSession_doesNotExist_depth_a_lot
59+
});
60+
let parentScope_navigator_mediaSession_doesNotExist_depth = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist_depth, {
61+
a: parentScope_navigator_mediaSession_doesNotExist_depth_a
62+
});
63+
let parentScope_navigator_mediaSession_doesNotExist = constructProxy(_proxyFor_parentScope_navigator_mediaSession_doesNotExist, {
64+
depth: parentScope_navigator_mediaSession_doesNotExist_depth
65+
});
66+
let parentScope_navigator_mediaSession = constructProxy(_proxyFor_parentScope_navigator_mediaSession, {
67+
playbackState: parentScope_navigator_mediaSession_playbackState,
68+
doesNotExist: parentScope_navigator_mediaSession_doesNotExist
69+
});
70+
let parentScope_navigator = constructProxy(_proxyFor_parentScope_navigator, {
71+
userAgent: parentScope_navigator_userAgent,
72+
mediaSession: parentScope_navigator_mediaSession
73+
});
74+
let navigator = parentScope_navigator;
75+
let _proxyFor_parentScope_document
76+
if (parentScope?.document === undefined) {
77+
_proxyFor_parentScope_document = Object.bind(null);
78+
} else {
79+
_proxyFor_parentScope_document = parentScope.document;
80+
}
81+
let parentScope_document_cookie = "testingThisOut";
82+
let parentScope_document = constructProxy(_proxyFor_parentScope_document, {
83+
cookie: parentScope_document_cookie
84+
});
85+
let document = parentScope_document;
86+
const window = constructProxy(parentScope, {
87+
navigator: parentScope_navigator,
88+
document: parentScope_document
89+
});
90+
const globalThis = constructProxy(parentScope, {
91+
navigator: parentScope_navigator,
92+
document: parentScope_document
93+
});
94+
console.log(1)
95+
})(globalThis)

0 commit comments

Comments
 (0)