Skip to content

Commit

Permalink
refactor broser-exteionsion/source/react-lowcode
Browse files Browse the repository at this point in the history
  • Loading branch information
Jozef Slezak committed Mar 3, 2021
1 parent 2d6b5c5 commit ad93242
Show file tree
Hide file tree
Showing 33 changed files with 186 additions and 255 deletions.
2 changes: 1 addition & 1 deletion packages/browser-extension/source/Background/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import "emoji-log"
import { browser, Runtime } from "webextension-polyfill-ts"
import { fetchLocalCode } from "../browser/fetchLocalCode"
import { fetchLocalCode } from "../react-lowcode/devtools/fetchLocalCode"

console.log("hello froom backgroundScript")

Expand Down
12 changes: 6 additions & 6 deletions packages/browser-extension/source/DevToolScript/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import { initLocalization } from "../localization/init";
//@ts-ignore
import {WCMonacoEditor} from './wcEditor'

import { InspectedElementPayload } from '../devtools'
import { cloneInspectedElement } from '../cloneInspectedElement'
import { InspectedElementPayload } from '../react-lowcode/devtools'
import { cloneInspectedElement } from '../react-lowcode/clone/inspected'

console.log("[lowcode] devtools.js A");

import { io, ioRefreshEditor } from '../util/global'
import { io, ioRefreshEditor } from '../io/global'

browser.devtools.panels
.create("Lowcode", "/icon.png", "/devtools.html")
Expand All @@ -40,9 +40,9 @@ browser.devtools.panels


if (msg?.type == 'lowcodeSources' && panelWindow) {
findLocaliozationFiles(msg?.path).then((foundFiles) => {
console.log('FOUND C', msg?.path, foundFiles)
const msgFiles = foundFiles.filter((file: string) => !file?.endsWith('/package.json') && !file?.endsWith('\\package.json'))
findLocaliozationFiles(msg.path, io).then((foundFiles) => {
console.log('FOUND C', msg.path, foundFiles)
const msgFiles = foundFiles.filter((file: string) => !file?.endsWith('/package.json') && !file?.endsWith('\\package.json')) // TODO exclude parameter in readDirectory
initLocalization(msgFiles, panelWindow.document, io)
})
}
Expand Down
10 changes: 6 additions & 4 deletions packages/browser-extension/source/InjectScript/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import ts from "typescript"
import fs from "fs"
import {
astFindSource,
jsxElementGetAttributes,
startOfJsxIdentifier,
startOfJsxNode,
} from "../tsx/ast"
import { findAttributeByName, isValidJsxElement } from "../util/routeHandlers"
} from "../react-lowcode/ast/find"
import {
jsxElementGetAttributes,
} from "../react-lowcode/attributes"
import { isValidJsxElement } from "../react-lowcode/routes/routeHandlers"
import { findAttributeByName } from "../react-lowcode/attributes"

import { APP_TXS_SAMPLE_CODE } from './index.testdata'

Expand Down
2 changes: 1 addition & 1 deletion packages/browser-extension/source/InjectScript/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DevTools, DevToolsHook } from "../devtools"
import { DevTools, DevToolsHook } from "../react-lowcode/devtools"

console.log("helloworld from content script, som v contentscripte")

Expand Down
4 changes: 2 additions & 2 deletions packages/browser-extension/source/io/cachefs.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { CodeRW } from './rw'
import { CodeDir } from './dir'
import { CodeRW } from '../react-lowcode/io/rw'
import { CodeDir } from '../react-lowcode/io/dir'
import { Noop } from './noop'

export class CacheFS implements CodeRW, CodeDir {
Expand Down
36 changes: 26 additions & 10 deletions packages/browser-extension/source/io/fetchfs.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@

import { CodeRW } from './rw'
import { CodeDir } from './dir'
import { fetchLocalCode } from '../browser/fetchLocalCode'
import { readFile, writeFile, readDir } from "../util/fetch"
import { CodeRW } from '../react-lowcode/io/rw'
import { CodeDir } from '../react-lowcode/io/dir'
import { fetchLocalCode } from '../react-lowcode/devtools/fetchLocalCode'

export class FetchFS implements CodeRW, CodeDir {
endpoint: string

constructor(endpoint: string) {
this.endpoint = endpoint
}

export class FetchFS implements CodeRW, CodeDir {
async readFile(path: string): Promise<string | undefined> {
if (path.startsWith("file://")) {
const localRet = await fetchLocalCode(path)
Expand All @@ -13,15 +18,26 @@ export class FetchFS implements CodeRW, CodeDir {
}
}

return readFile(path)
const res = await fetch(`${this.endpoint}/files/${path}`)
const code = await res.text()
return code
}

writeFile(path: string, content: string): Promise<void> {
return writeFile(path, content)
async writeFile(path: string, content: string): Promise<void> {
await fetch(`${this.endpoint}/files/${path}`, {
method: "PUT",
headers: {
"Content-Type": "text/plain",
},
body: content,
})
}

readDirectory(path: string, /*extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number*/): Promise<string[] | undefined> {
return readDir(path)
async readDirectory(path: string, extensions: readonly string[] = [], /*exclude?: readonly string[], include?: readonly string[], depth?: number*/): Promise<string[] | undefined> {
const queryString = [extensions.map((ext) => 'ext=' + encodeURI(ext)), 'depth=10'].join('&')
const res = await fetch(`${this.endpoint}/dir/${path}?${queryString}`)//extensions
const dir = await res.json()
return dir
}

}
22 changes: 22 additions & 0 deletions packages/browser-extension/source/io/global.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { FetchFS, CacheFS } from '.'
import { CodeRW } from '../react-lowcode/io/rw'

// IMPORT THIS ONLY IN InjectScript/index.ts and DevToolScript.index.ts
export const io = new CacheFS(new FetchFS('http://localhost:7500'))

export const ioRefreshEditor = withWriteListener(io, (path: string/*, content: string*/) => {
console.log('written', path)
})

function withWriteListener(rw: CodeRW, listener: (path: string, content: string) => void): CodeRW {
return {
readFile(path: string, encoding?: string): Promise<string | undefined> {
return rw.readFile(path, encoding)
},
writeFile(path: string, content: string) {
return rw.writeFile(path, content).then(() => {
listener(path, content)
})
}
}
}
4 changes: 2 additions & 2 deletions packages/browser-extension/source/io/noop.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { CodeRW } from './rw'
import { CodeDir } from './dir'
import { CodeRW } from '../react-lowcode/io/rw'
import { CodeDir } from '../react-lowcode/io/dir'

export class Noop implements CodeRW, CodeDir {
readFile(): Promise<string | undefined> {
Expand Down
6 changes: 3 additions & 3 deletions packages/browser-extension/source/localization/init.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { createAst } from "../tsx/createSourceFile";
import { createAst } from "../react-lowcode/ast/factory";
import sk_SK from "../localization/sk_SK";
import { addNewLocale, changeAllFiles, changeLocaleFile, combineLocales, createDynamicLocales, createTemporaryLocales, getLocaleFilesNames, getValuesFromLocalizationASTJSON, findLocaliozationFiles, saveAllLocalesFromTable, saveAllValuesAndParseBack, saveTableValuesAndParseBack, sendUpdatedFiles, updateFiles } from "../localization/localizations";
import { createDynamicTable, createMultiTableWithMessages, createTableWithMessages } from "../localization/localeTables";
import en_EN from "../localization/en_EN";
import { ScriptTarget, ScriptKind } from "typescript";
import { CodeRW } from '../io/rw'
import { CodeRW } from '../react-lowcode/io/rw'

export async function initLocalization(directory: string[], document: HTMLDocument, io: CodeRW) {
console.log('initLocalization', directory, document, io)
Expand All @@ -14,7 +14,7 @@ export async function initLocalization(directory: string[], document: HTMLDocume
//@ts-ignore
const fileNames = getLocaleFilesNames(directory)
console.log("FileNames", fileNames)
const temporary = await createTemporaryLocales(fileNames)
const temporary = await createTemporaryLocales(fileNames, io)
console.log("Temporary", temporary)
//@ts-ignore
const dynamicLocales = createDynamicLocales(temporary)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import ts, { ScriptKind, ScriptTarget } from "typescript"
import { createAst } from "../tsx/createSourceFile"
import { createAst } from "../react-lowcode/ast/factory"
import { changeLocaleFile, getValuesFromLocalizationASTJSON } from "./localizations"
import sk_SK from "./sk_SK"

Expand Down
28 changes: 10 additions & 18 deletions packages/browser-extension/source/localization/localizations.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { SourceFile, factory, ScriptKind, ScriptTarget, createSourceFile, Printer } from "typescript"
import sk_SK from "./sk_SK";
import { Message, MultiMessage } from "./localizationInterfaces";
import { createAst } from "../tsx/createSourceFile";
import { readDir, readFile } from "../util/fetch"
import * as path from 'path'
import { CodeRW } from "../io/rw";


import { createAst } from "../react-lowcode/ast/factory";
import { CodeRW } from "../react-lowcode/io/rw";
import { CodeDir } from "../react-lowcode/io/dir";

export function getValuesFromLocalizationASTJSON(astLocale: SourceFile | undefined, languageLocale = "sk_SK") {
let localeMessages: Message[] = []
Expand All @@ -16,7 +12,7 @@ export function getValuesFromLocalizationASTJSON(astLocale: SourceFile | undefin
id: property.name.text,
value: property.initializer?.text,
locale: languageLocale,
position: { pos: property.initializer.pos, end: property.initializer.end }
position: { pos: property.initializer?.pos, end: property.initializer?.end }
}
localeMessages = [...localeMessages, locale]
})
Expand Down Expand Up @@ -58,13 +54,9 @@ export const changeLocaleFile = (localeFile: string, changedMessages: Message[],

const JSON_EXTENSION = '.json'

export const findLocaliozationFiles = async (pathToDir: string) => {
try {
const dir = await readDir(pathToDir, [JSON_EXTENSION]).catch((err) => console.log("Error", err))
return dir
} catch (error) {
console.log("Error", error)
}
export const findLocaliozationFiles = async (pathToDir: string, io: CodeDir) => {
const dir = await io.readDirectory(pathToDir, [JSON_EXTENSION]).catch((err) => console.log("Error", err))
return dir || []
}

export const getLocaleFilesNames = (directory: string[]) => {
Expand All @@ -79,10 +71,10 @@ interface FileNameSource {
readonly source: string
}

export const createTemporaryLocales = async (fileNames: string[]): Promise<FileNameSource[]> => {
const allFiles = fileNames.map(fileName => readFile(fileName))
export const createTemporaryLocales = async (fileNames: string[], io: CodeRW): Promise<FileNameSource[]> => {
const allFiles = fileNames.map(fileName => io.readFile(fileName))
const filesObjects = fileNames.map(async (file: string, index: number) => {
return { locale: file, source: await allFiles[index] }
return { locale: file, source: await allFiles[index] || '' }
})
return Promise.all(filesObjects)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import ts from "typescript"
import { createAst } from "./createSourceFile"
import { createAst } from "./factory"

export interface SourceLineCol {
fileName: string
Expand Down Expand Up @@ -81,26 +81,14 @@ export function astFindSource(code: string, source: SourceLineCol) {
return null
}

export const jsxElementGetAttributes = (node: ts.JsxOpeningLikeElement) => {
const attributes: Array<Attribute> = []
export const findElementInCode = (code: string, source: SourceLineCol) => {
const found = astFindSource(code, source)
if (found) {
const before = code.substring(0, found.end)

node.attributes.forEachChild((a: unknown) => {
const attribute = a as ts.JsxAttribute
const { initializer } = attribute

if (!initializer) return

if (initializer && ts.isStringLiteral(initializer)) {
attributes.push({
[attribute.name.text]: initializer.text,
})
} else if (initializer && ts.isJsxExpression(initializer)) {
attributes.push({
[attribute.name.text]:
//@ts-ignore
initializer.expression?.escapedText,
})
}
})
return attributes
const startEndOfLine = before.lastIndexOf("\n")
const lineStarts = startEndOfLine >= 0 ? startEndOfLine : 0
return code.substring(lineStarts, found.end)
}
return null
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import ts from "typescript"
import { wrapNodesWithFragment } from "../util/nodeCreators"
import { wrapNodesWithFragment } from "../routes/factory"

const addTransformer = <T extends ts.Node, U extends ts.Node | ts.JsxChild>(
start: number,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import ts from "typescript"
import { Attribute } from "../ast/find"

export const findAttributeByName = (
attributes: Array<Attribute>,
attributeName: string
) => {
const attribute = attributes.find(a => a[attributeName])
return attribute ? attribute[attributeName] : null
}

export const jsxElementGetAttributes = (node: ts.JsxOpeningLikeElement) => {
const attributes: Array<Attribute> = []

node.attributes.forEachChild((a: unknown) => {
const attribute = a as ts.JsxAttribute
const { initializer } = attribute

if (!initializer) return

if (initializer && ts.isStringLiteral(initializer)) {
attributes.push({
[attribute.name.text]: initializer.text,
})
} else if (initializer && ts.isJsxExpression(initializer)) {
attributes.push({
[attribute.name.text]:
//@ts-ignore
initializer.expression?.escapedText,
})
}
})
return attributes
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,8 @@
import ts from "typescript"
import { SourceLineCol, astFindSource } from "./ast"
import { createAst } from "./createSourceFile"
import { isInsideMapPatternFunction } from "./mapRecognition"
import { addElementsToAST } from "./transformer"

export const findElementInCode = (code: string, source: SourceLineCol) => {
const found = astFindSource(code, source)
if (found) {
const before = code.substring(0, found.end)

const startEndOfLine = before.lastIndexOf("\n")
const lineStarts = startEndOfLine >= 0 ? startEndOfLine : 0
return code.substring(lineStarts, found.end)
}
return null
}
import { SourceLineCol, astFindSource } from "../ast/find"
import { createAst } from "../ast/factory"
import { isInsideMapPatternFunction } from "../functions/maps"
import { addElementsToAST } from "../ast/transformer"

export const addCodeSnippet = (
code: string,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { cloneRoute, cloneElement } from "./cloneElements"
import { InspectedElementPayload } from "./devtools"
import { readFile } from "./util/fetch"
import { cloneRoute, cloneElement } from "./source"
import { InspectedElementPayload } from "../devtools"

import { CodeRW } from "./io/rw"
import { CodeRW } from "../io/rw"

export async function cloneInspectedElement(inspectedElement: InspectedElementPayload, io: CodeRW) {
console.log('cloneInspectedElement A', inspectedElement)
Expand All @@ -16,9 +15,9 @@ export async function cloneInspectedElement(inspectedElement: InspectedElementPa
console.log('cloneInspectedElement B', ownerList, columnNumber, fileName, lineNumber, event)

if (ownerList && columnNumber && fileName && lineNumber) {
const code = await readFile(fileName).catch(err => {
const code = await io.readFile(fileName).catch(err => {
throw new Error(err)
})
}) || ''

if (ownerList[ownerList.length - 1].displayName === "Route") {
cloneRoute(code, { columnNumber, lineNumber, fileName }, io)
Expand Down
Loading

0 comments on commit ad93242

Please sign in to comment.