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
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."
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.
6466The 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 " %0 6x-%0 6x" (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 " %0 6x-%0 6x" (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 )
0 commit comments