Skip to content

Commit d380f68

Browse files
committed
chore: javascript imporvements (snippets, templates etc)
1 parent 6261ee9 commit d380f68

File tree

18 files changed

+266
-35
lines changed

18 files changed

+266
-35
lines changed

idee-javascript.el

Lines changed: 115 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
;;; Code:
2525

2626
(require 'json)
27-
(require 'tide)
2827
(require 'flycheck)
28+
(require 'idee-arch)
2929
(require 'idee-projects)
3030
(require 'idee-visitors)
3131

@@ -35,13 +35,11 @@
3535

3636
(defun idee/javascript-enable()
3737
"Enable javascript, add hooks, visitors etc."
38-
(interactive)
39-
(tidee/restart-server))
38+
(interactive))
4039

4140
(defun idee/javascript-disable()
4241
"Disable javascript, Remove hooks, visitors etc."
43-
(interactive)
44-
(delete-process (tidee/current-server)))
42+
(interactive))
4543

4644
(defun idee/javascript-hook()
4745
"Javascript hook."
@@ -51,23 +49,27 @@
5149
(setq idee/function-alist (delq (assoc 'idee/declaration-function idee/function-alist) idee/function-alist))
5250
(setq idee/function-alist (delq (assoc 'idee/implementation-function idee/function-alist) idee/function-alist))
5351
(setq idee/function-alist (delq (assoc 'idee/optimize-imports-function idee/function-alist) idee/function-alist))
52+
(setq idee/function-alist (delq (assoc 'idee/indent-function idee/function-alist) idee/function-alist))
53+
;(setq idee/function-alist (delq (assoc 'idee/mode-hydra-function idee/function-alist) idee/function-alist))
54+
;(setq idee/function-alist (delq (assoc 'idee/run-or-eval-function idee/function-alist) idee/function-alist))
55+
;(setq idee/function-alist (delq (assoc 'idee/test idee/function-alist) idee/function-alist))
5456

5557
;; Set functions
56-
(add-to-list 'idee/function-alist '(idee/references-function . tidee/references))
57-
(add-to-list 'idee/function-alist '(idee/declaration-function . tidee/jump-to-definition))
58-
(add-to-list 'idee/function-alist '(idee/implementation-function . tidee/jump-to-implementation))
59-
(add-to-list 'idee/function-alist '(idee/optimize-imports-function . tidee/organize-imports)))
58+
(add-to-list 'idee/function-alist '(idee/references-function . lsp-find-references))
59+
(add-to-list 'idee/function-alist '(idee/declaration-function . lsp-find-definition))
60+
(add-to-list 'idee/function-alist '(idee/implementation-function . lsp-find-implementation))
61+
(add-to-list 'idee/function-alist '(idee/optimize-imports-function . lsp-java-organize-imports)))
6062

6163
;;; Project Factory
62-
(defun idee/new-npm-project (&optional create-function)
64+
(defun idee/new-npm-project (&optional create-function target-dir)
6365
"Create a new npm project.
6466
The command supports accepting an external CREATE-FUNCTION or defaults to idee/project-create-with-shell."
6567
(interactive)
6668
(let* ((initializer (read-string "Intializer:" "react-app"))
6769
(recomended-dir (concat (file-name-as-directory default-directory) initializer))
6870
(temp-dir (concat temporary-file-directory "npm-" (format "%06x-%06x" (random (expt 16 6)) (random (expt 16 6)))))
6971
(generated-dir (concat (file-name-as-directory temp-dir) initializer))
70-
(target-dir (idee/project-dir-select))
72+
(target-dir (or target-dir (idee/project-dir-select)))
7173
(parent-dir (file-name-directory (directory-file-name target-dir)))
7274
(dir-name (substring target-dir (length parent-dir)))
7375
(generate-command (format "npm init %s ." initializer)))
@@ -76,14 +78,29 @@ The command supports accepting an external CREATE-FUNCTION or defaults to idee/p
7678
(idee/project-name-set dir-name)
7779
(idee/project-version-set "1.0.0")))
7880

81+
(defun idee/new-react-project (&optional create-function target-dir)
82+
"Create a new react project.
83+
The command supports accepting an external CREATE-FUNCTION or defaults to idee/project-create-with-shell."
84+
(interactive)
85+
(let* ((recomended-dir (file-name-as-directory default-directory))
86+
(temp-dir (concat temporary-file-directory "npm-" (format "%06x-%06x" (random (expt 16 6)) (random (expt 16 6)))))
87+
(generated-dir (file-name-as-directory temp-dir))
88+
(target-dir (or target-dir (idee/project-dir-select)))
89+
(parent-dir (file-name-directory (directory-file-name target-dir)))
90+
(dir-name (substring target-dir (length parent-dir)))
91+
(generate-command (format "npx create-react-app %s" dir-name))
92+
(cleanup-command (format "mv %s/* . && rm -r %s" dir-name dir-name)))
93+
94+
(funcall (or create-function 'idee/project-create-with-shell) target-dir generate-command cleanup-command)
95+
(idee/project-name-set dir-name)
96+
(idee/project-version-set "1.0.0")))
7997

8098
(defconst idee/npm-project-factory
8199
(make-idee/project-factory
82100
:name "Npm"
83101
:description "A project factory that creates a new project using npm."
84102
:func 'idee/new-npm-project))
85103

86-
87104
;;; Visitor
88105
(defun idee/javascript-project-p (root)
89106
"Check if ROOT is the root path of a javascript project."
@@ -101,18 +118,102 @@ The command supports accepting an external CREATE-FUNCTION or defaults to idee/p
101118

102119
(defun idee/javascript-package-json-version (p-json)
103120
"Get the project version from P-JSON."
104-
(let* ((p (json-read-file p-json)))
105-
(car (gethash "version" p))))
121+
(if (file-exists-p p-json)
122+
(let* ((json (json-read-file p-json))
123+
(p (if json (car (gethash "version" p)) nil))))
124+
nil))
125+
126+
;;
127+
;; Snippets
128+
;;
129+
130+
(defun idee/javascript-create-template (source-file name key &optional templates-dir)
131+
"Create snippet from javascript file."
132+
(with-temp-buffer
133+
(let* ((root-dir (idee/project-root-dir (buffer-file-name)))
134+
(conf-dir (concat (file-name-as-directory root-dir) idee/project-conf-dir))
135+
(project-templates-dir (concat (file-name-as-directory conf-dir) "templates"))
136+
(templates-dir (or templates-dir project-templates-dir))
137+
(body (idee/javascript-snippet-body-from source-file))
138+
(target (concat (file-name-as-directory templates-dir) (format "js-mode/%s" key)))
139+
(parent (file-name-directory target)))
140+
(set-visited-file-name target)
141+
(insert (format "# name: %s" name))
142+
(newline)
143+
(insert (format "# key: %s" key))
144+
(newline)
145+
(insert "# --")
146+
(newline)
147+
(insert body)
148+
(write-file target)
149+
(yas-load-directory parent)
150+
(yas-compile-directory parent))))
151+
152+
(defun idee/javascript-snippet-body-from (f)
153+
"Create snippet from file F."
154+
(with-temp-buffer
155+
(save-excursion
156+
(insert-file-contents f)
157+
(goto-char (point-min))
158+
(idee/comment-remove-at-point java-comment-style)
159+
(let* ((content (buffer-substring-no-properties (point-min) (point-max)))
160+
(name (idee/filename f))
161+
(updated (concat "`idee/header`\n" (replace-regexp-in-string (regexp-quote name) "`(idee/filename)`" content t))))
162+
updated))))
163+
164+
;;
165+
;; Archetypes
166+
;;
167+
(defun idee/javascript-react-component (&optional base-path src-path)
168+
"Create a react component javascript and css."
169+
(interactive)
170+
(let* ((name (read-string "Component name:"))
171+
(base-path (file-name-as-directory (or base-path (idee/module-root-dir) default-directory)))
172+
(src-path (file-name-as-directory (or src-path "src/")))
173+
(js (concat base-path (format "%s/%s.js" src-path name)))
174+
(css (concat base-path (format "%s/%s.css" src-path name))))
175+
176+
;; Javascript
177+
(with-temp-buffer
178+
(message "With temp buffer 1")
179+
(set-visited-file-name js)
180+
(insert "rcomp")
181+
(js-mode)
182+
(yas-expand)
183+
(write-file js))
184+
185+
;; CSS
186+
(with-temp-buffer
187+
(set-visited-file-name css)
188+
(insert "")
189+
(yas-expand)
190+
(write-file css))
191+
192+
(find-file js)))
193+
194+
(idee/archetype-register
195+
(make-idee/archetype
196+
:name "React component"
197+
:description "A react component js and css"
198+
:func 'idee/javascript-react-component))
199+
106200

107201
;;; Init
108202
(defun idee/javascript-init ()
109203
"Initialize IDE javascript."
110204
(interactive)
111205
(idee/project-factory-register idee/npm-project-factory)
112206
(idee/visitor-register 'idee/javascript-visitor)
207+
208+
(idee/template-factory-register (make-idee/template-factory
209+
:mode 'js-mode
210+
:description "A javascript temlate factory"
211+
:func 'idee/javascript-create-template))
212+
113213
;; Hooks
114214
(add-hook 'javascipt-mode-hook 'idee/javascript-hook)
115215
(add-hook 'js2-mode-hook 'idee/javascript-hook)
216+
(add-hook 'js-jsx-mode-hook 'idee/javascript-hook)
116217
(add-hook 'typescirpt-mode-hook 'idee/javascript-hook))
117218

118219
(provide 'idee-javascript)

idee-utils.el

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
;; File funtcionts
2727
;;
2828

29+
(defun idee/filename (&optional F)
30+
"Return the filename for the F or the current file (strips path and extension)."
31+
(file-name-nondirectory (file-name-sans-extension (or f (buffer-file-name)))))
32+
2933
;;;###autoload
3034
(defun idee/read-file (f)
3135
"Read the content of file F."

idee-vars.el

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
("md" . "markdown-mode")
3636
("java" . "java-mode")
3737
("json" . "json-mode")
38-
("js" . "js2-mode")
38+
("js" . "js-mode")
3939
("ts" . "typescript-mode")
4040
("py" . "python-mode")
4141
("go" . "go-mode")

snippets/js-mode/addf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# -*- mode: snippet -*-
2+
# name: Add Factory
3+
# key: addf
4+
# --
5+
6+
export const add${1:$$(idee/capitalize-first yas-text)}Factory = ([state, func]) => {
7+
return (new$1) => {
8+
return func([...state, new$1]);
9+
}
10+
}

snippets/js-mode/cons

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# -*- mode: snippet -*-
2+
# name: constant
3+
# key: cons
4+
# --
5+
export const ${1:$(upcase (replace-regexp-in-string "[^a-zA-z0-9]+" "_" yas-text))} = "${1:constant}";
6+
$0

snippets/js-mode/papply

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# -*- mode: snippet -*-
2+
# name: Partially apply
3+
# key: papply
4+
# --
5+
export const ${1:partiallyApply} = (Component, ${2:partialProps}) => {
6+
return props => {
7+
<Component {...$2} {...props} />
8+
}
9+
}

snippets/js-mode/ratom

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# -*- mode: snippet -*-
2+
# name: Recoil atom
3+
# key: ratom
4+
# --
5+
6+
export const ${1:items}State = atom({
7+
key: '$1',
8+
default: [],
9+
});

snippets/js-mode/rdxa

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# -*- mode: snippet -*-
2+
# name: redux action
3+
# key: rdxa
4+
# --
5+
export const ${1:$(upcase (replace-regexp-in-string "[^a-zA-z0-9]+" "_" yas-text))} = "${1:$$(upcase (replace-regexp-in-string "[^a-zA-z0-9]+" "_" yas-text))}";
6+
export const ${1:$(replace-regexp-in-string "[^a-zA-Z0-9]" "" (replace-regexp-in-string "[^a-zA-Z0-9][a-zA-Z0-9]" #'upcase (downcase yas-text)))} = ${2:text} => ({
7+
type: ${1:$(upcase (replace-regexp-in-string "[^a-zA-z0-9]+" "_" yas-text))},
8+
payload: { $2 },
9+
$0
10+
})

snippets/js-mode/rmf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# -*- mode: snippet -*-
2+
# name: Remove Factory
3+
# key: rmf
4+
# --
5+
6+
export const remove${1:$(idee/capitalize-first yas-text)}By${2:$(idee/capitalize-first yas-text)}Factory = ([state, func]) => {
7+
return (${2:id}) => {
8+
return func(state.filter(${1:item}.$2 !== $2));
9+
}
10+
}

0 commit comments

Comments
 (0)