js-routes 2.2.8 → 2.2.10

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -9
  3. data/Readme.md +60 -45
  4. data/lib/js_routes/configuration.rb +80 -34
  5. data/lib/js_routes/engine.rb +2 -0
  6. data/lib/js_routes/generators/base.rb +19 -0
  7. data/lib/js_routes/generators/middleware.rb +6 -8
  8. data/lib/js_routes/generators/webpacker.rb +1 -3
  9. data/lib/js_routes/instance.rb +50 -15
  10. data/lib/js_routes/middleware.rb +16 -3
  11. data/lib/js_routes/route.rb +60 -17
  12. data/lib/js_routes/types.rb +38 -0
  13. data/lib/js_routes/version.rb +2 -1
  14. data/lib/js_routes.rb +25 -7
  15. metadata +28 -45
  16. data/.document +0 -5
  17. data/.eslintrc.js +0 -15
  18. data/.github/workflows/ci.yml +0 -36
  19. data/.gitignore +0 -65
  20. data/.nvmrc +0 -1
  21. data/.rspec +0 -1
  22. data/Appraisals +0 -17
  23. data/Gemfile +0 -4
  24. data/Rakefile +0 -37
  25. data/VERSION_2_UPGRADE.md +0 -66
  26. data/gemfiles/rails50_sprockets_3.gemfile +0 -8
  27. data/gemfiles/rails51_sprockets_3.gemfile +0 -8
  28. data/gemfiles/rails52_sprockets_3.gemfile +0 -8
  29. data/gemfiles/rails70_sprockets_4.gemfile +0 -8
  30. data/js-routes.gemspec +0 -39
  31. data/package.json +0 -38
  32. data/spec/dummy/app/assets/config/manifest.js +0 -2
  33. data/spec/dummy/app/assets/javascripts/.gitkeep +0 -0
  34. data/spec/dummy/config/routes.rb +0 -55
  35. data/spec/js_routes/default_serializer_spec.rb +0 -31
  36. data/spec/js_routes/module_types/amd_spec.rb +0 -35
  37. data/spec/js_routes/module_types/cjs_spec.rb +0 -15
  38. data/spec/js_routes/module_types/dts/routes.spec.d.ts +0 -115
  39. data/spec/js_routes/module_types/dts/test.spec.ts +0 -56
  40. data/spec/js_routes/module_types/dts_spec.rb +0 -111
  41. data/spec/js_routes/module_types/esm_spec.rb +0 -45
  42. data/spec/js_routes/module_types/nil_spec.rb +0 -87
  43. data/spec/js_routes/module_types/umd_spec.rb +0 -85
  44. data/spec/js_routes/options_spec.rb +0 -508
  45. data/spec/js_routes/rails_routes_compatibility_spec.rb +0 -473
  46. data/spec/js_routes/route_specification_spec.rb +0 -37
  47. data/spec/js_routes/zzz_sprockets_spec.rb +0 -152
  48. data/spec/spec_helper.rb +0 -135
  49. data/spec/support/routes.rb +0 -81
  50. data/spec/tsconfig.json +0 -4
  51. data/tsconfig.json +0 -28
  52. data/yarn.lock +0 -2457
@@ -1,115 +0,0 @@
1
- /**
2
- * File generated by js-routes RubyVariables.GEM_VERSION
3
- * Based on Rails RubyVariables.RAILS_VERSION routes of RubyVariables.APP_CLASS
4
- */
5
- declare type Optional<T> = {
6
- [P in keyof T]?: T[P] | null;
7
- };
8
- declare type BaseRouteParameter = string | boolean | Date | number;
9
- declare type MethodRouteParameter = BaseRouteParameter | (() => BaseRouteParameter);
10
- declare type ModelRouteParameter = {
11
- id: MethodRouteParameter;
12
- } | {
13
- to_param: MethodRouteParameter;
14
- } | {
15
- toParam: MethodRouteParameter;
16
- };
17
- declare type RequiredRouteParameter = BaseRouteParameter | ModelRouteParameter;
18
- declare type OptionalRouteParameter = undefined | null | RequiredRouteParameter;
19
- declare type QueryRouteParameter = OptionalRouteParameter | QueryRouteParameter[] | {
20
- [k: string]: QueryRouteParameter;
21
- };
22
- declare type RouteParameters = Record<string, QueryRouteParameter>;
23
- declare type Serializable = Record<string, unknown>;
24
- declare type Serializer = (value: Serializable) => string;
25
- declare type RouteHelperExtras = {
26
- requiredParams(): string[];
27
- toString(): string;
28
- };
29
- declare type RequiredParameters<T extends number> = T extends 1 ? [RequiredRouteParameter] : T extends 2 ? [RequiredRouteParameter, RequiredRouteParameter] : T extends 3 ? [RequiredRouteParameter, RequiredRouteParameter, RequiredRouteParameter] : T extends 4 ? [
30
- RequiredRouteParameter,
31
- RequiredRouteParameter,
32
- RequiredRouteParameter,
33
- RequiredRouteParameter
34
- ] : RequiredRouteParameter[];
35
- declare type RouteHelperOptions = RouteOptions & Record<string, OptionalRouteParameter>;
36
- declare type RouteHelper<T extends number = number> = ((...args: [...RequiredParameters<T>, RouteHelperOptions]) => string) & RouteHelperExtras;
37
- declare type RouteHelpers = Record<string, RouteHelper>;
38
- declare type Configuration = {
39
- prefix: string;
40
- default_url_options: RouteParameters;
41
- special_options_key: string;
42
- serializer: Serializer;
43
- };
44
- interface RouterExposedMethods {
45
- config(): Configuration;
46
- configure(arg: Partial<Configuration>): Configuration;
47
- serialize: Serializer;
48
- }
49
- declare type KeywordUrlOptions = Optional<{
50
- host: string;
51
- protocol: string;
52
- subdomain: string;
53
- port: string | number;
54
- anchor: string;
55
- trailing_slash: boolean;
56
- params: RouteParameters;
57
- }>;
58
- declare type RouteOptions = KeywordUrlOptions & RouteParameters;
59
- declare type PartsTable = Record<string, {
60
- r?: boolean;
61
- d?: OptionalRouteParameter;
62
- }>;
63
- declare type ModuleType = "CJS" | "AMD" | "UMD" | "ESM" | "DTS" | "NIL";
64
- declare const RubyVariables: {
65
- PREFIX: string;
66
- DEPRECATED_GLOBBING_BEHAVIOR: boolean;
67
- DEPRECATED_FALSE_PARAMETER_BEHAVIOR: boolean;
68
- SPECIAL_OPTIONS_KEY: string;
69
- DEFAULT_URL_OPTIONS: RouteParameters;
70
- SERIALIZER: Serializer;
71
- ROUTES_OBJECT: RouteHelpers;
72
- MODULE_TYPE: ModuleType;
73
- WRAPPER: <T>(callback: T) => T;
74
- };
75
- declare const define: undefined | (((arg: unknown[], callback: () => unknown) => void) & {
76
- amd?: unknown;
77
- });
78
- declare const module: {
79
- exports: any;
80
- } | undefined;
81
- export const configure: RouterExposedMethods['configure'];
82
-
83
- export const config: RouterExposedMethods['config'];
84
-
85
- export const serialize: RouterExposedMethods['serialize'];
86
-
87
- /**
88
- * Generates rails route to
89
- * /inboxes/:inbox_id/messages/:message_id/attachments/:id(.:format)
90
- * @param {any} inbox_id
91
- * @param {any} message_id
92
- * @param {any} id
93
- * @param {object | undefined} options
94
- * @returns {string} route path
95
- */
96
- export const inbox_message_attachment_path: ((
97
- inbox_id: RequiredRouteParameter,
98
- message_id: RequiredRouteParameter,
99
- id: RequiredRouteParameter,
100
- options?: {format?: OptionalRouteParameter} & RouteOptions
101
- ) => string) & RouteHelperExtras;
102
-
103
- /**
104
- * Generates rails route to
105
- * /inboxes(.:format)
106
- * @param {object | undefined} options
107
- * @returns {string} route path
108
- */
109
- export const inboxes_path: ((
110
- options?: {format?: OptionalRouteParameter} & RouteOptions
111
- ) => string) & RouteHelperExtras;
112
-
113
- // By some reason this line prevents all types in a file
114
- // from being automatically exported
115
- export {};
@@ -1,56 +0,0 @@
1
- import {
2
- inbox_message_attachment_path,
3
- inboxes_path,
4
- serialize,
5
- configure,
6
- config,
7
- } from "./routes.spec";
8
-
9
- // Route Helpers
10
- inboxes_path();
11
- inboxes_path({
12
- locale: "en",
13
- search: {
14
- q: "ukraine",
15
- page: 3,
16
- keywords: ["large", "small", { advanced: true }],
17
- },
18
- });
19
-
20
- inbox_message_attachment_path(1, "2", true);
21
- inbox_message_attachment_path(
22
- { id: 1 },
23
- { to_param: () => "2" },
24
- { toParam: () => true }
25
- );
26
- inbox_message_attachment_path(1, "2", true, { format: "json" });
27
- inboxes_path.toString();
28
- inboxes_path.requiredParams();
29
-
30
- // serialize test
31
- const SerializerArgument = {
32
- locale: "en",
33
- search: {
34
- q: "ukraine",
35
- page: 3,
36
- keywords: ["large", "small", { advanced: true }],
37
- },
38
- };
39
- serialize(SerializerArgument);
40
- config().serializer(SerializerArgument);
41
-
42
- // configure test
43
- configure({
44
- default_url_options: { port: 1, host: null },
45
- prefix: "",
46
- special_options_key: "_options",
47
- serializer: (value) => JSON.stringify(value),
48
- });
49
-
50
- // config tests
51
- const Config = config();
52
- console.log(
53
- Config.prefix,
54
- Config.default_url_options,
55
- Config.special_options_key
56
- );
@@ -1,111 +0,0 @@
1
-
2
- require "active_support/core_ext/string/strip"
3
- require "fileutils"
4
- require "open3"
5
- require "spec_helper"
6
-
7
- describe JsRoutes, "compatibility with DTS" do
8
-
9
- OPTIONS = {module_type: 'DTS', include: [/^inboxes$/, /^inbox_message_attachment$/]}
10
- let(:extra_options) do
11
- {}
12
- end
13
-
14
- let(:generated_js) do
15
- JsRoutes.generate(**OPTIONS, **extra_options)
16
- end
17
-
18
- context "when file is generated" do
19
- let(:dir_name) do
20
- File.expand_path(__dir__ + "/dts")
21
- end
22
-
23
- let(:file_name) do
24
- dir_name + "/routes.spec.d.ts"
25
- end
26
-
27
- before do
28
- FileUtils.mkdir_p(dir_name)
29
- File.write(file_name, generated_js)
30
- end
31
-
32
- it "has no compile errors", :slow do
33
- command = "yarn tsc --strict --noEmit -p spec/tsconfig.json"
34
- stdout, stderr, status = Open3.capture3(command)
35
- expect(stderr).to eq("")
36
- expect(stdout).to include("Done in ")
37
- expect(status).to eq(0)
38
- end
39
- end
40
-
41
- context "when camel case is enabled" do
42
- let(:extra_options) { {camel_case: true} }
43
-
44
- it "camelizes route name and arguments" do
45
-
46
- expect(generated_js).to include(<<-DOC.rstrip)
47
- /**
48
- * Generates rails route to
49
- * /inboxes/:inbox_id/messages/:message_id/attachments/:id(.:format)
50
- * @param {any} inboxId
51
- * @param {any} messageId
52
- * @param {any} id
53
- * @param {object | undefined} options
54
- * @returns {string} route path
55
- */
56
- export const inboxMessageAttachmentPath: ((
57
- inboxId: RequiredRouteParameter,
58
- messageId: RequiredRouteParameter,
59
- id: RequiredRouteParameter,
60
- options?: {format?: OptionalRouteParameter} & RouteOptions
61
- ) => string) & RouteHelperExtras;
62
- DOC
63
- end
64
- end
65
-
66
- it "exports route helpers" do
67
- expect(generated_js).to include(<<-DOC.rstrip)
68
- /**
69
- * Generates rails route to
70
- * /inboxes(.:format)
71
- * @param {object | undefined} options
72
- * @returns {string} route path
73
- */
74
- export const inboxes_path: ((
75
- options?: {format?: OptionalRouteParameter} & RouteOptions
76
- ) => string) & RouteHelperExtras;
77
- DOC
78
- expect(generated_js).to include(<<-DOC.rstrip)
79
- /**
80
- * Generates rails route to
81
- * /inboxes/:inbox_id/messages/:message_id/attachments/:id(.:format)
82
- * @param {any} inbox_id
83
- * @param {any} message_id
84
- * @param {any} id
85
- * @param {object | undefined} options
86
- * @returns {string} route path
87
- */
88
- export const inbox_message_attachment_path: ((
89
- inbox_id: RequiredRouteParameter,
90
- message_id: RequiredRouteParameter,
91
- id: RequiredRouteParameter,
92
- options?: {format?: OptionalRouteParameter} & RouteOptions
93
- ) => string) & RouteHelperExtras
94
- DOC
95
- end
96
-
97
- it "exports utility methods" do
98
- expect(generated_js).to include("export const serialize: RouterExposedMethods['serialize'];")
99
- end
100
-
101
- it "prevents all types from automatic export" do
102
- expect(generated_js).to include("export {};")
103
- end
104
-
105
- describe "compiled javascript asset" do
106
- subject { ERB.new(File.read("app/assets/javascripts/js-routes.js.erb")).result(binding) }
107
- it "should have js routes code" do
108
- is_expected.to include("export const inbox_message_path = /*#__PURE__*/ __jsr.r(")
109
- end
110
- end
111
- end
@@ -1,45 +0,0 @@
1
- require "active_support/core_ext/string/strip"
2
- require "spec_helper"
3
-
4
- describe JsRoutes, "compatibility with ESM" do
5
-
6
- let(:generated_js) {
7
- JsRoutes.generate(module_type: 'ESM')
8
- }
9
-
10
- before(:each) do
11
- # export keyword is not supported by a simulated js environment
12
- evaljs(generated_js.gsub("export const ", "const "))
13
- end
14
-
15
- it "defines route helpers" do
16
- expectjs("inboxes_path()").to eq(test_routes.inboxes_path())
17
- end
18
-
19
- it "exports route helpers" do
20
- expect(generated_js).to include(<<-DOC.rstrip)
21
- /**
22
- * Generates rails route to
23
- * /inboxes(.:format)
24
- * @param {object | undefined} options
25
- * @returns {string} route path
26
- */
27
- export const inboxes_path = /*#__PURE__*/ __jsr.r(
28
- DOC
29
- end
30
-
31
- it "exports utility methods" do
32
- expect(generated_js).to include("export const serialize = ")
33
- end
34
-
35
- it "defines utility methods" do
36
- expectjs("serialize({a: 1, b: 2})").to eq({a: 1, b: 2}.to_param)
37
- end
38
-
39
- describe "compiled javascript asset" do
40
- subject { ERB.new(File.read("app/assets/javascripts/js-routes.js.erb")).result(binding) }
41
- it "should have js routes code" do
42
- is_expected.to include("export const inbox_message_path = /*#__PURE__*/ __jsr.r(")
43
- end
44
- end
45
- end
@@ -1,87 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe JsRoutes, "compatibility with NIL (legacy browser)" do
4
- let(:generated_js) do
5
- JsRoutes.generate(
6
- module_type: nil,
7
- include: /book|inboxes|inbox_message/,
8
- **_options
9
- )
10
- end
11
-
12
- let(:_options) { {} }
13
- describe "generated js" do
14
- subject do
15
- generated_js
16
- end
17
-
18
- it "should call route function for each route" do
19
- is_expected.to include("inboxes_path: __jsr.r(")
20
- end
21
- it "should have correct function without arguments signature" do
22
- is_expected.to include('inboxes_path: __jsr.r({"format":{}}')
23
- end
24
- it "should have correct function with arguments signature" do
25
- is_expected.to include('inbox_message_path: __jsr.r({"inbox_id":{"r":true},"id":{"r":true},"format":{}}')
26
- end
27
- it "should have correct function signature with unordered hash" do
28
- is_expected.to include('inbox_message_attachment_path: __jsr.r({"inbox_id":{"r":true},"message_id":{"r":true},"id":{"r":true},"format":{}}')
29
- end
30
- end
31
-
32
- describe "inline generation" do
33
- let(:_options) { {namespace: nil} }
34
- before do
35
- evaljs("const r = #{generated_js}")
36
- end
37
-
38
- it "should be possible" do
39
- expectjs("r.inboxes_path()").to eq(test_routes.inboxes_path())
40
- end
41
- end
42
-
43
- describe "namespace option" do
44
- let(:_options) { {namespace: "PHM"} }
45
- let(:_presetup) { "" }
46
- before do
47
- evaljs("var window = this;")
48
- evaljs("window.PHM = {}")
49
- evaljs(_presetup)
50
- evaljs(generated_js)
51
- end
52
- it "should use this namespace for routing" do
53
- expectjs("window.Routes").to be_nil
54
- expectjs("window.PHM.inboxes_path").not_to be_nil
55
- end
56
-
57
- describe "is nested" do
58
- context "and defined on client" do
59
- let(:_presetup) { "window.PHM = {}" }
60
- let(:_options) { {namespace: "PHM.Routes"} }
61
-
62
- it "should use this namespace for routing" do
63
- expectjs("PHM.Routes.inboxes_path").not_to be_nil
64
- end
65
- end
66
-
67
- context "but undefined on client" do
68
- let(:_options) { {namespace: "PHM.Routes"} }
69
-
70
- it "should initialize namespace" do
71
- expectjs("window.PHM.Routes.inboxes_path").not_to be_nil
72
- end
73
- end
74
-
75
- context "and some parts are defined" do
76
- let(:_presetup) { "window.PHM = { Utils: {} };" }
77
- let(:_options) { {namespace: "PHM.Routes"} }
78
-
79
- it "should not overwrite existing parts" do
80
- expectjs("window.PHM.Utils").not_to be_nil
81
- expectjs("window.PHM.Routes.inboxes_path").not_to be_nil
82
- end
83
- end
84
- end
85
- end
86
- end
87
-
@@ -1,85 +0,0 @@
1
- require "active_support/core_ext/string/strip"
2
- require "fileutils"
3
- require 'spec_helper'
4
-
5
- describe JsRoutes, "compatibility with UMD" do
6
- describe "generated js" do
7
- subject do
8
- JsRoutes.generate(
9
- module_type: 'UMD',
10
- include: /book|inboxes|inbox_message/,
11
- )
12
- end
13
-
14
- it "should include a comment in the header" do
15
- app_class = "App"
16
-
17
- is_expected.to include("File generated by js-routes #{JsRoutes::VERSION}")
18
- is_expected.to include("Based on Rails #{ActionPack.version} routes of #{app_class}")
19
- end
20
-
21
- it "should call route function for each route" do
22
- is_expected.to include("inboxes_path: __jsr.r(")
23
- end
24
- it "should have correct function without arguments signature" do
25
- is_expected.to include('inboxes_path: __jsr.r({"format":{}}')
26
- end
27
- it "should have correct function with arguments signature" do
28
- is_expected.to include('inbox_message_path: __jsr.r({"inbox_id":{"r":true},"id":{"r":true},"format":{}}')
29
- end
30
- it "should have correct function signature with unordered hash" do
31
- is_expected.to include('inbox_message_attachment_path: __jsr.r({"inbox_id":{"r":true},"message_id":{"r":true},"id":{"r":true},"format":{}}')
32
- end
33
-
34
- it "should have correct function comment with options argument" do
35
- is_expected.to include(<<-DOC.rstrip)
36
- /**
37
- * Generates rails route to
38
- * /inboxes(.:format)
39
- * @param {object | undefined} options
40
- * @returns {string} route path
41
- */
42
- inboxes_path: __jsr.r
43
- DOC
44
- end
45
- it "should have correct function comment with arguments" do
46
- is_expected.to include(<<-DOC.rstrip)
47
- /**
48
- * Generates rails route to
49
- * /inboxes/:inbox_id/messages/:message_id/attachments/new(.:format)
50
- * @param {any} inbox_id
51
- * @param {any} message_id
52
- * @param {object | undefined} options
53
- * @returns {string} route path
54
- */
55
- new_inbox_message_attachment_path: __jsr.r
56
- DOC
57
- end
58
-
59
- it "routes should be sorted in alphabetical order" do
60
- expect(subject.index("book_path")).to be <= subject.index("inboxes_path")
61
- end
62
- end
63
-
64
- describe ".generate!" do
65
-
66
- let(:name) { Rails.root.join('app', 'assets', 'javascripts', 'routes.js') }
67
-
68
- before(:each) do
69
- FileUtils.rm_f(name)
70
- JsRoutes.generate!(file: name)
71
- end
72
-
73
- after(:each) do
74
- FileUtils.rm_f(name)
75
- end
76
-
77
- after(:all) do
78
- FileUtils.rm_f("#{File.dirname(__FILE__)}/../routes.js") # let(:name) is not available here
79
- end
80
-
81
- it "should not generate file before initialization" do
82
- expect(File.exist?(name)).to be_falsey
83
- end
84
- end
85
- end