agnostics 0.0.3 → 0.0.5

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 (48) hide show
  1. package/lib/bases/_BaseOnCall.js +41 -0
  2. package/lib/bases/_BasePrompt.js +33 -0
  3. package/lib/bases/_BaseRemote.js +118 -0
  4. package/lib/bases/index.js +12 -0
  5. package/lib/helpers/_Yargs.js +28 -57
  6. package/lib/index.js +3 -0
  7. package/lib/loaders/_Loaders.js +62 -0
  8. package/lib/loaders/index.js +9 -0
  9. package/lib/logger/_Logger.js +1 -1
  10. package/lib/logger/index.js +1 -3
  11. package/lib/specification/_Properties.js +23 -8
  12. package/lib/targets/_InquirerTarget.js +15 -0
  13. package/lib/targets/_WebviewTarget.js +182 -0
  14. package/lib/targets/index.js +9 -0
  15. package/lib/workers/_AutoRunner.js +67 -0
  16. package/lib/workers/_AutoWorker.js +136 -0
  17. package/lib/workers/index.js +9 -0
  18. package/package.json +57 -31
  19. package/types/bases/_BaseOnCall.d.ts +7 -0
  20. package/types/bases/_BaseOnCall.d.ts.map +1 -0
  21. package/types/bases/_BasePrompt.d.ts +8 -0
  22. package/types/bases/_BasePrompt.d.ts.map +1 -0
  23. package/types/bases/_BaseRemote.d.ts +13 -0
  24. package/types/bases/_BaseRemote.d.ts.map +1 -0
  25. package/types/bases/index.d.ts +4 -0
  26. package/types/bases/index.d.ts.map +1 -0
  27. package/types/helpers/_Yargs.d.ts +2 -1
  28. package/types/helpers/_Yargs.d.ts.map +1 -1
  29. package/types/loaders/_Loaders.d.ts +8 -0
  30. package/types/loaders/_Loaders.d.ts.map +1 -0
  31. package/types/loaders/index.d.ts +2 -0
  32. package/types/loaders/index.d.ts.map +1 -0
  33. package/types/specification/_Properties.d.ts +41 -35
  34. package/types/targets/_InquirerTarget.d.ts +2 -0
  35. package/types/targets/_InquirerTarget.d.ts.map +1 -0
  36. package/types/targets/_WebviewTarget.d.ts +48 -0
  37. package/types/targets/_WebviewTarget.d.ts.map +1 -0
  38. package/types/targets/index.d.ts +2 -0
  39. package/types/targets/index.d.ts.map +1 -0
  40. package/types/workers/_AutoRunner.d.ts +2 -0
  41. package/types/workers/_AutoRunner.d.ts.map +1 -0
  42. package/types/workers/_AutoWorker.d.ts +17 -0
  43. package/types/workers/_AutoWorker.d.ts.map +1 -0
  44. package/types/workers/index.d.ts +2 -0
  45. package/types/workers/index.d.ts.map +1 -0
  46. package/lib/logger/_ASCII.js +0 -39
  47. package/lib/logger/_System.js +0 -191
  48. package/lib/logger/chars.js +0 -730
@@ -0,0 +1,182 @@
1
+ //////////////////////////////////////////
2
+ // //
3
+ // //
4
+ // WINDOW TARGET //
5
+ // //
6
+ // //
7
+ //////////////////////////////////////////
8
+
9
+ import { CreateLogger } from 'agnostics/logger'
10
+ const { SAY, ERR, YAY, HUH, HMM } = CreateLogger( import.meta.url )
11
+ import fs from 'node:fs'
12
+
13
+ import { BaseRemote } from '../bases/_BaseRemote.js'
14
+
15
+ export const WebviewConfig = {
16
+
17
+ app: {
18
+ controlFlow: 0, // Poll | WaitUntil | Exit | ExitWithCode
19
+ waitTime: 0, // ms for WaitUntil
20
+ exitCode: 0, // for ExitWithCode
21
+ },
22
+ browser: {
23
+ resizable: true,
24
+ title: 'Hello World',
25
+ width: 800,
26
+ height: 600,
27
+ x: null,
28
+ y: null,
29
+ contentProtection: false,
30
+ alwaysOnTop: false,
31
+ alwaysOnBottom: false,
32
+ visible: true,
33
+ decorations: true, // false = borderless/frameless
34
+ transparent: false, // needs CSS background: transparent
35
+ visibleOnAllWorkspaces: false,
36
+ maximized: false,
37
+ maximizable: true,
38
+ minimizable: true,
39
+ focused: true,
40
+ fullscreen: null // Exclusive | Borderless | null
41
+ },
42
+ webview: {
43
+ enableDevtools: true,
44
+ incognito: false,
45
+ userAgent: null,
46
+ child: false,
47
+ preload: null,
48
+ hotkeysZoom: false,
49
+ theme: 2, // Light | Dark | System
50
+ clipboard: false,
51
+ autoplay: false,
52
+ backForwardNavigationGestures: false
53
+ },
54
+ showDevTools: false
55
+ }
56
+
57
+ const PreloadScript = `
58
+
59
+ console.log('[PRELOAD] safe ipc')
60
+
61
+ globalThis.gt = globalThis
62
+
63
+ gt.postMessage = gt.webkit.messageHandlers.ipc.postMessage || gt.ipc.postMessage || gt.chrome.webview.postMessage
64
+
65
+ `
66
+
67
+
68
+ export class WebviewTarget extends BaseRemote {
69
+
70
+ className = 'WebviewTarget:BaseRemote:BaseOnCall'
71
+
72
+ $instance = null
73
+
74
+ constructor( source, config = {} ) {
75
+
76
+ super()
77
+
78
+ if (!source) throw Error('NO SOURCE')
79
+
80
+ config = { ...WebviewConfig, ...(config || {})}
81
+
82
+ const clean = obj => Object.fromEntries(
83
+ Object.entries(obj).filter(([, v]) => v != null))
84
+
85
+ const isUrl = source.startsWith('http') || source.startsWith('www')
86
+ const isPath = source.startsWith('/')||source.startsWith('.')
87
+ const isHtml = source.trim().startsWith('<')
88
+
89
+ if (isUrl) {
90
+ config.webview.url = source
91
+ } else if (isPath && !isHtml) {
92
+ config.webview.html = fs.readFileSync(source, 'utf8')
93
+ SAY('READ HTML:', source)
94
+ } else {
95
+ config.webview.html = source
96
+ }
97
+
98
+ const appOpts = clean({...WebviewConfig.app, ...config.app})
99
+ const browserOpts = clean({...WebviewConfig.browser, ...config.browser})
100
+ const webviewOpts = clean({...WebviewConfig.webview, ...config.webview})
101
+
102
+ webviewOpts.preload = PreloadScript
103
+
104
+
105
+ const app = new globalThis.Webview( appOpts )
106
+ const browser = app.createBrowserWindow( browserOpts )
107
+ const webview = browser.createWebview( webviewOpts )
108
+
109
+ if (config.showDevTools && !webview.isDevtoolsOpen()) webview.openDevtools()
110
+ if (!config.showDevTools && webview.isDevtoolsOpen()) webview.closeDevtools()
111
+
112
+ app.onEvent(event => {
113
+
114
+ if (event === 0) {
115
+ SAY('WINDOW CLOSE REQ:', event)
116
+ this.$call('closing', 0)
117
+ browser.close()
118
+ } else if (event === 1) {
119
+ SAY('APP CLOSE REQ:', event)
120
+ this.$call('closing', 1)
121
+ app.close()
122
+ } else {
123
+ SAY('MISC EVENT:', event)
124
+ }
125
+ })
126
+
127
+ webview.onIpcMessage( message => {
128
+ SAY('WEBVIEW MESSAGE:', message)
129
+ })
130
+
131
+ this.$instance = { app, browser, webview }
132
+
133
+ }
134
+
135
+ construct( ...constructArguments ) {
136
+
137
+ const { app, browser, webview } = this.$instance
138
+
139
+ const args = constructArguments.map( arg => JSON.stringify(arg) ).join(', ')
140
+
141
+ SAY('EVAL')
142
+ webview.evaluateScript(`
143
+
144
+ console.log('EVAL')
145
+
146
+ gt.app = new App( ${args} )
147
+
148
+ gt.onIpcMessage = async message => {
149
+
150
+ console.log('NEW MESSAGE', message)
151
+ // const res = await app[name](...req)
152
+
153
+ // parentPort.postMessage({
154
+ // type,
155
+ // name,
156
+ // index,
157
+ // res
158
+ // })
159
+ }
160
+
161
+ app.on('*', (name, res) => {
162
+
163
+ console.log('WOOOO', name, res)
164
+ gt.webkit.messageHandlers.ipc.postMessage('data')
165
+ gt.ipc.postMessage({
166
+ type: 'listener',
167
+ name,
168
+ res
169
+ })
170
+ })
171
+ `)
172
+
173
+ // ========= INIT =========
174
+
175
+ return new Promise( resolve => {
176
+ HMM('INITIIALISE (wait)')
177
+ this.resolveConstruct = resolve
178
+ app.run()
179
+ })
180
+ }
181
+
182
+ }
@@ -0,0 +1,9 @@
1
+ //////////////////////////////////////////
2
+ // //
3
+ // //
4
+ // TARGETS //
5
+ // //
6
+ // //
7
+ //////////////////////////////////////////
8
+
9
+ export * from './_WebviewTarget.js'
@@ -0,0 +1,67 @@
1
+ //////////////////////////////////////////
2
+ // //
3
+ // //
4
+ // AUTO INSTANCE //
5
+ // //
6
+ // //
7
+ //////////////////////////////////////////
8
+
9
+ import { workerData, parentPort } from 'worker_threads'
10
+ const { importUrl, importName, constructArguments } = workerData
11
+
12
+ import { CreateLogger } from 'agnostics/logger'
13
+ const { SAY, ERR } = CreateLogger( import.meta.url )
14
+ import path from 'node:path'
15
+
16
+ async function RunInstance() {
17
+
18
+ // ========= INSTANTIATE =========
19
+
20
+ const cwdImportUrl = path.resolve( process.cwd(), importUrl )
21
+ const imported = await import(cwdImportUrl)
22
+ const instantiator = imported[importName]
23
+ if (!instantiator) return ERR('NO INSTANCE:', importUrl, importName)
24
+
25
+ // ========= INSTANCE =========
26
+
27
+ const instance = new instantiator()
28
+ await instance.construct( ...constructArguments )
29
+
30
+ // ========= REQ / RES =========
31
+
32
+ parentPort.on( 'message', async ({type,name,req,index}) => {
33
+
34
+ const res = await instance[name](...req)
35
+
36
+ parentPort.postMessage({
37
+ type,
38
+ name,
39
+ index,
40
+ res
41
+ })
42
+ })
43
+
44
+ // ========= ALL EVENTS =========
45
+
46
+ instance.on('*', (name, res) => {
47
+
48
+ parentPort.postMessage({
49
+ type: 'listener',
50
+ name,
51
+ res
52
+ })
53
+ })
54
+
55
+ // ========= INIT METHODS =========
56
+
57
+ const methodListenerNames = instance.getMethodListenerNames()
58
+
59
+ parentPort.postMessage({
60
+ name: 'methodListenerNames',
61
+ res: methodListenerNames
62
+ })
63
+
64
+
65
+ }
66
+
67
+ RunInstance()
@@ -0,0 +1,136 @@
1
+ //////////////////////////////////////////
2
+ // //
3
+ // //
4
+ // AUTO WORKER //
5
+ // //
6
+ // //
7
+ //////////////////////////////////////////
8
+
9
+ import { CreateLogger } from 'agnostics/logger'
10
+ const { SAY, ERR, YAY, HMM, HUH } = CreateLogger( import.meta.url )
11
+
12
+ import { Worker } from 'node:worker_threads'
13
+ import { BaseRemote } from '../bases/_BaseRemote.js'
14
+
15
+ import { fileURLToPath } from 'node:url'
16
+ import path from 'node:path'
17
+
18
+ // Get the directory of the CURRENT file
19
+ const __filename = fileURLToPath(import.meta.url)
20
+ const _dir = path.dirname(__filename)
21
+
22
+ // We use a template literal or a joined string that Rollup
23
+ // can't resolve statically during the build.
24
+ const workerFilename = '_AutoRunner.js';
25
+ export const AutoRunnerPath = path.join(_dir, 'workers', workerFilename);
26
+
27
+ export class AutoWorker extends BaseRemote {
28
+
29
+ className = 'AutoWorker:BaseRemote'
30
+
31
+ $worker = null
32
+
33
+ $listenerCbs = {
34
+ error: [],
35
+ exit: [],
36
+ online: []
37
+ }
38
+
39
+ importUrl = null
40
+ importName = null
41
+
42
+ constructor( importPath ) {
43
+
44
+ super() // Base = on / $call pattern
45
+
46
+ let [ importUrl, importName ] = importPath.split('?')
47
+ if (importName === '') importName = 'default'
48
+
49
+ this.importUrl = importUrl
50
+ this.importName = importName
51
+
52
+ }
53
+
54
+ $sendRequest( type, name, req, index) {
55
+
56
+ this.$worker.postMessage({
57
+ type,
58
+ name,
59
+ req,
60
+ index
61
+ })
62
+ }
63
+
64
+ construct( ...constructArguments ) {
65
+
66
+ const { importUrl, importName } = this
67
+
68
+ this.className = importName + ':' + this.className
69
+
70
+ this.$worker = new Worker(
71
+ new URL('./_AutoRunner.js?worker', import.meta.url).pathname,
72
+ {
73
+ type: 'module',
74
+ workerData: {
75
+ importUrl,
76
+ importName,
77
+ constructArguments
78
+ }})
79
+
80
+ // ========= MESSAGES =========
81
+
82
+ this.$worker.on('message', message => {
83
+
84
+ // ========= INIT =========
85
+
86
+ if (message.name === 'methodListenerNames') {
87
+
88
+ const { methodNames, listenerNames } = message.res
89
+ this.$initMethodsAndListeners( methodNames, listenerNames )
90
+
91
+ } else {
92
+
93
+ // ========= RESPONSE =========
94
+
95
+ const { type, index, name, res } = message
96
+ this.$handleResponse( type, index, name, res )
97
+ }
98
+
99
+ if (this.finishConstruct) {
100
+ HUH('INITED / finishConstruct')
101
+ this.finishConstruct()
102
+ this.finishConstruct = null
103
+ }
104
+ })
105
+
106
+ // ========= ERROR =========
107
+
108
+ this.$worker.on('error', message => {
109
+ ERR('ERROR:', message)
110
+ this.$call( 'error', message )
111
+ })
112
+
113
+ // ========= EXIT =========
114
+
115
+ this.$worker.on('exit', message => {
116
+ HMM('EXIT:', message)
117
+ this.$call( 'exit', message )
118
+ })
119
+
120
+ // ========= ONLINE =========
121
+
122
+ this.$worker.on('online', message => {
123
+ YAY('WORKER ONLINE')
124
+ this.$call( 'online', true )
125
+ })
126
+
127
+ // ========= INIT =========
128
+
129
+ return new Promise( resolve => {
130
+ HMM('INITIIALISE (wait)')
131
+ this.finishConstruct = resolve
132
+ })
133
+ }
134
+
135
+
136
+ }
@@ -0,0 +1,9 @@
1
+ //////////////////////////////////////////
2
+ // //
3
+ // //
4
+ // AUTOWORKER //
5
+ // //
6
+ // //
7
+ //////////////////////////////////////////
8
+
9
+ export * from './_AutoWorker.js'
package/package.json CHANGED
@@ -1,32 +1,58 @@
1
1
  {
2
- "name": "agnostics",
3
- "version": "0.0.3",
4
- "author": "Autr <g@sinnott.cc>",
5
- "description": "featherless birds",
6
- "exports": {
7
- ".": {
8
- "types": "./types/index.d.ts",
9
- "default": "./lib/index.js"
10
- },
11
- "./inputs": {
12
- "types": "./types/inputs/index.d.ts",
13
- "default": "./lib/inputs/index.js"
14
- },
15
- "./helpers": {
16
- "types": "./types/helpers/index.d.ts",
17
- "default": "./lib/helpers/index.js"
18
- },
19
- "./specification": {
20
- "types": "./types/specification/index.d.ts",
21
- "default": "./lib/specification/index.js"
22
- },
23
- "./logger": {
24
- "types": "./types/logger/index.d.ts",
25
- "default": "./lib/logger/index.js"
26
- }
27
- },
28
- "files": [ "lib", "types" ],
29
- "esversion": 6,
30
- "type": "module",
31
- "dependencies": {}
32
- }
2
+ "name": "agnostics",
3
+ "version": "0.0.5",
4
+ "author": "Autr <g@sinnott.cc>",
5
+ "description": "featherless birds",
6
+ "esversion": 6,
7
+ "type": "module",
8
+ "scripts": {
9
+ "publish": "npm whoami > /dev/null 2>&1 && npm publish || (npm login && npm publish)",
10
+ "types": "node ../subldx/run.js types lib types --package package.json"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./types/index.js",
15
+ "default": "./lib/index.js"
16
+ },
17
+ "./bases": {
18
+ "types": "./types/bases/index.js",
19
+ "default": "./lib/bases/index.js"
20
+ },
21
+ "./helpers": {
22
+ "types": "./types/helpers/index.js",
23
+ "default": "./lib/helpers/index.js"
24
+ },
25
+ "./inputs": {
26
+ "types": "./types/inputs/index.js",
27
+ "default": "./lib/inputs/index.js"
28
+ },
29
+ "./loaders": {
30
+ "types": "./types/loaders/index.js",
31
+ "default": "./lib/loaders/index.js"
32
+ },
33
+ "./logger": {
34
+ "types": "./types/logger/index.js",
35
+ "default": "./lib/logger/index.js"
36
+ },
37
+ "./schema": {
38
+ "types": "./types/schema/index.js",
39
+ "default": "./lib/schema/index.js"
40
+ },
41
+ "./specification": {
42
+ "types": "./types/specification/index.js",
43
+ "default": "./lib/specification/index.js"
44
+ },
45
+ "./targets": {
46
+ "types": "./types/targets/index.js",
47
+ "default": "./lib/targets/index.js"
48
+ },
49
+ "./workers": {
50
+ "types": "./types/workers/index.js",
51
+ "default": "./lib/workers/index.js"
52
+ }
53
+ },
54
+ "files": [
55
+ "lib",
56
+ "types"
57
+ ]
58
+ }
@@ -0,0 +1,7 @@
1
+ export class BaseOnCall {
2
+ className: string;
3
+ $listenerCbs: {};
4
+ $call(name: any, res: any): void;
5
+ on(name: any, callback: any): void;
6
+ }
7
+ //# sourceMappingURL=_BaseOnCall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_BaseOnCall.d.ts","sourceRoot":"","sources":["../../lib/bases/_BaseOnCall.js"],"names":[],"mappings":"AAWA;IAEC,kBAAkB;IAElB,iBAAiB;IAIjB,iCAWC;IAED,mCAMC;CAED"}
@@ -0,0 +1,8 @@
1
+ export class BasePrompt extends BaseOnCall {
2
+ ask(config?: {
3
+ message: string;
4
+ schema: {};
5
+ }): Promise<any>;
6
+ }
7
+ import { BaseOnCall } from './_BaseOnCall.js';
8
+ //# sourceMappingURL=_BasePrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_BasePrompt.d.ts","sourceRoot":"","sources":["../../lib/bases/_BasePrompt.js"],"names":[],"mappings":"AAaA;IAQC;;;qBASC;CACD;2BApB0B,kBAAkB"}
@@ -0,0 +1,13 @@
1
+ export class BaseRemote extends BaseOnCall {
2
+ $methodReqs: {};
3
+ isIniting: boolean;
4
+ construct(): void;
5
+ getMethodListenerNames(): {
6
+ methodNames: Set<any>;
7
+ listenerNames: string[];
8
+ };
9
+ $initMethodsAndListeners(methodNames: any, listenerNames: any): void;
10
+ $handleResponse(type: any, index: any, name: any, res: any): void;
11
+ }
12
+ import { BaseOnCall } from './_BaseOnCall.js';
13
+ //# sourceMappingURL=_BaseRemote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_BaseRemote.d.ts","sourceRoot":"","sources":["../../lib/bases/_BaseRemote.js"],"names":[],"mappings":"AAwBA;IAIC,gBACC;IAIA,mBAAqB;IAGtB,kBAAc;IAEd;;;MAyBC;IAED,qEA+BC;IAED,kEAiBC;CAED;2BA/F0B,kBAAkB"}
@@ -0,0 +1,4 @@
1
+ export * from "./_BaseOnCall.js";
2
+ export * from "./_BasePrompt.js";
3
+ export * from "./_BaseRemote.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/bases/index.js"],"names":[],"mappings":""}
@@ -7,6 +7,7 @@ export function ConvertYargsProperty(def: any, override?: {}): {
7
7
  coerce: any;
8
8
  default: any;
9
9
  accept: any[];
10
+ choices: any;
10
11
  };
11
12
  export function YargsProcessWorkaround(): void;
12
13
  export class YargsCommand {
@@ -16,7 +17,7 @@ export class YargsCommand {
16
17
  description?: string;
17
18
  version?: string;
18
19
  });
19
- command: string;
20
+ command: any;
20
21
  description: string;
21
22
  version: string;
22
23
  positionals: {};
@@ -1 +1 @@
1
- {"version":3,"file":"_Yargs.d.ts","sourceRoot":"","sources":["../../lib/helpers/_Yargs.js"],"names":[],"mappings":"AAwEA,yEAIC;AAGD,8EA4BC;AAED;;;;;;;EAYC;AAGD,+CAUC;AAED;IAYC;;;;;OAuCC;IAjDD,gBAAc;IACd,oBAAmB;IACnB,gBAAe;IACf,gBAAgB;IAChB,YAAY;IAEZ,iBAAiB;IACjB,aAAa;IACb,mBAAgB;IA2ChB,mBAA+B,cAAS,kCA+CvC;CACD;AAGD;IAUC;;;;;OAkBC;IA1BD,aAAc;IACd,oBAAmB;IACnB,gBAAe;IAEf,mBAAgB;IAChB,aAAa;IACb,cAAc;IAsBd,mBAAgC,WAAM,EAAE,cAAS,kCAmDhD;CAGD"}
1
+ {"version":3,"file":"_Yargs.d.ts","sourceRoot":"","sources":["../../lib/helpers/_Yargs.js"],"names":[],"mappings":"AA4CA,yEAIC;AAGD,8EA4BC;AAED;;;;;;;;EAeC;AAGD,+CAUC;AAED;IAYC;;;;;OAsCC;IAhDD,aAAc;IACd,oBAAmB;IACnB,gBAAe;IACf,gBAAgB;IAChB,YAAY;IAEZ,iBAAiB;IACjB,aAAa;IACb,mBAAgB;IA0ChB,mBAA+B,cAAS,kCA4CvC;CACD;AAGD;IAUC;;;;;OAkBC;IA1BD,aAAc;IACd,oBAAmB;IACnB,gBAAe;IAEf,mBAAgB;IAChB,aAAa;IACb,cAAc;IAsBd,mBAAgC,WAAM,EAAE,cAAS,kCA8ChD;CAGD"}
@@ -0,0 +1,8 @@
1
+ export function LoadDep(name: any, url: any): Promise<any>;
2
+ export function LoadWebview(): Promise<any>;
3
+ export function LoadYargs(): Promise<{
4
+ YargsLib: any;
5
+ YargsBin: any;
6
+ }>;
7
+ export function LoadGlobby(): Promise<any>;
8
+ //# sourceMappingURL=_Loaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_Loaders.d.ts","sourceRoot":"","sources":["../../lib/loaders/_Loaders.js"],"names":[],"mappings":"AAeA,2DA8BC;AAED,4CAEC;AAED;;;GAMC;AAED,2CAEC"}
@@ -0,0 +1,2 @@
1
+ export * from "./_Loaders.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/loaders/index.js"],"names":[],"mappings":""}