@platformos/platformos-common 0.0.10 → 0.0.12

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 (45) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CLAUDE.md +70 -0
  3. package/dist/documents-locator/DocumentsLocator.d.ts +35 -2
  4. package/dist/documents-locator/DocumentsLocator.js +126 -1
  5. package/dist/documents-locator/DocumentsLocator.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/path-utils.d.ts +59 -15
  10. package/dist/path-utils.js +100 -28
  11. package/dist/path-utils.js.map +1 -1
  12. package/dist/route-table/RouteTable.d.ts +45 -0
  13. package/dist/route-table/RouteTable.js +384 -0
  14. package/dist/route-table/RouteTable.js.map +1 -0
  15. package/dist/route-table/index.d.ts +5 -0
  16. package/dist/route-table/index.js +13 -0
  17. package/dist/route-table/index.js.map +1 -0
  18. package/dist/route-table/parseSlug.d.ts +31 -0
  19. package/dist/route-table/parseSlug.js +124 -0
  20. package/dist/route-table/parseSlug.js.map +1 -0
  21. package/dist/route-table/slugFromFilePath.d.ts +23 -0
  22. package/dist/route-table/slugFromFilePath.js +81 -0
  23. package/dist/route-table/slugFromFilePath.js.map +1 -0
  24. package/dist/route-table/types.d.ts +30 -0
  25. package/dist/route-table/types.js +3 -0
  26. package/dist/route-table/types.js.map +1 -0
  27. package/dist/translation-provider/TranslationProvider.d.ts +1 -1
  28. package/dist/translation-provider/TranslationProvider.js +2 -2
  29. package/dist/translation-provider/TranslationProvider.js.map +1 -1
  30. package/dist/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +1 -1
  32. package/src/documents-locator/DocumentsLocator.spec.ts +299 -5
  33. package/src/documents-locator/DocumentsLocator.ts +144 -1
  34. package/src/index.ts +1 -0
  35. package/src/path-utils.spec.ts +320 -33
  36. package/src/path-utils.ts +103 -28
  37. package/src/route-table/RouteTable.spec.ts +708 -0
  38. package/src/route-table/RouteTable.ts +437 -0
  39. package/src/route-table/index.ts +5 -0
  40. package/src/route-table/parseSlug.spec.ts +177 -0
  41. package/src/route-table/parseSlug.ts +136 -0
  42. package/src/route-table/slugFromFilePath.spec.ts +84 -0
  43. package/src/route-table/slugFromFilePath.ts +84 -0
  44. package/src/route-table/types.ts +25 -0
  45. package/src/translation-provider/TranslationProvider.ts +4 -2
@@ -9,10 +9,15 @@
9
9
  * - getFileType() classifies any URI to a PlatformOSFileType
10
10
  * - isPage(), isLayout(), isPartial() etc. are convenience wrappers around getFileType()
11
11
  *
12
- * Pattern precision: each type uses exact path segment patterns (/app/{dir}/ or
13
- * /(public|private)/{dir}/) so that nested paths don't produce false positives.
14
- * For example, app/lib/smses/file.liquid is correctly identified as Partial
15
- * (matches /app/lib/), not Sms (does not match /app/smses/).
12
+ * Source of truth: app/services/app_builder/services/converters_config.rb and
13
+ * app/models/concerns/deployable.rb in the platformOS server codebase.
14
+ *
15
+ * DIR_PREFIX (Ruby): ^/?((marketplace_builder|app)/|modules/(.+)(private|public)/)?
16
+ * This means files can live under:
17
+ * - app/{dir}/
18
+ * - marketplace_builder/{dir}/ (legacy alias for app/)
19
+ * - modules/{name}/(public|private)/{dir}/
20
+ * - app/modules/{name}/(public|private)/{dir}/
16
21
  */
17
22
  Object.defineProperty(exports, "__esModule", { value: true });
18
23
  exports.FILE_TYPE_DIRS = exports.PlatformOSFileType = void 0;
@@ -20,6 +25,7 @@ exports.getFileType = getFileType;
20
25
  exports.getAppPaths = getAppPaths;
21
26
  exports.getModulePaths = getModulePaths;
22
27
  exports.isKnownLiquidFile = isKnownLiquidFile;
28
+ exports.isKnownGraphQLFile = isKnownGraphQLFile;
23
29
  exports.isPartial = isPartial;
24
30
  exports.isPage = isPage;
25
31
  exports.isLayout = isLayout;
@@ -28,50 +34,98 @@ exports.isEmail = isEmail;
28
34
  exports.isApiCall = isApiCall;
29
35
  exports.isSms = isSms;
30
36
  exports.isMigration = isMigration;
37
+ exports.isFormConfiguration = isFormConfiguration;
31
38
  /**
32
- * File types that exist in a platformOS app, each mapping to one or more
33
- * canonical directory names relative to the app root or module access level.
39
+ * File types that exist in a platformOS app, each corresponding to a server-side
40
+ * converter that processes the file on deploy.
41
+ *
42
+ * Liquid types: Page, Layout, Partial, Authorization, Email, ApiCall, Sms, Migration, FormConfiguration
43
+ * YAML types: CustomModelType, InstanceProfileType, TransactableType, Translation
44
+ * GraphQL types: GraphQL
45
+ * Binary/other: Asset
34
46
  */
35
47
  var PlatformOSFileType;
36
48
  (function (PlatformOSFileType) {
49
+ // ── Liquid ──────────────────────────────────────────────────────────────────
50
+ /** views/pages/ or pages/ → PageConverter */
37
51
  PlatformOSFileType["Page"] = "Page";
52
+ /** views/layouts/ → LiquidViewConverter (layouts) */
38
53
  PlatformOSFileType["Layout"] = "Layout";
54
+ /** views/partials/ or lib/ → LiquidViewConverter (partials) */
39
55
  PlatformOSFileType["Partial"] = "Partial";
56
+ /** authorization_policies/ → AuthorizationPolicyConverter */
40
57
  PlatformOSFileType["Authorization"] = "Authorization";
58
+ /** emails/ or notifications/email_notifications/ → EmailNotificationConverter */
41
59
  PlatformOSFileType["Email"] = "Email";
60
+ /** api_calls/ or notifications/api_call_notifications/ → ApiCallNotificationConverter */
42
61
  PlatformOSFileType["ApiCall"] = "ApiCall";
62
+ /** smses/ or notifications/sms_notifications/ → SmsNotificationConverter */
43
63
  PlatformOSFileType["Sms"] = "Sms";
64
+ /** migrations/ → MigrationConverter */
44
65
  PlatformOSFileType["Migration"] = "Migration";
66
+ /** form_configurations/ or forms/ → FormConfigurationConverter */
67
+ PlatformOSFileType["FormConfiguration"] = "FormConfiguration";
68
+ // ── YAML ────────────────────────────────────────────────────────────────────
69
+ /** custom_model_types/, model_schemas/, or schema/ → CustomModelTypeConverter */
70
+ PlatformOSFileType["CustomModelType"] = "CustomModelType";
71
+ /** instance_profile_types/, user_profile_types/, or user_profile_schemas/ → InstanceProfileTypeConverter */
72
+ PlatformOSFileType["InstanceProfileType"] = "InstanceProfileType";
73
+ /** transactable_types/ → TransactableTypeConverter */
74
+ PlatformOSFileType["TransactableType"] = "TransactableType";
75
+ /** translations/ → TranslationConverter */
76
+ PlatformOSFileType["Translation"] = "Translation";
77
+ // ── GraphQL ─────────────────────────────────────────────────────────────────
78
+ /** graphql/ or graph_queries/ → GraphQueryConverter */
45
79
  PlatformOSFileType["GraphQL"] = "GraphQL";
80
+ // ── Binary/other ────────────────────────────────────────────────────────────
81
+ /** assets/ → AssetConverter */
46
82
  PlatformOSFileType["Asset"] = "Asset";
47
83
  })(PlatformOSFileType || (exports.PlatformOSFileType = PlatformOSFileType = {}));
48
84
  /**
49
85
  * The single source of truth for the platformOS directory structure.
50
86
  *
51
87
  * Maps each file type to its canonical directory name(s) relative to:
52
- * - the app root: app/{dir}/
88
+ * - the app root: (app|marketplace_builder)/{dir}/
53
89
  * - a module access level: modules/{name}/(public|private)/{dir}/
54
90
  * - a nested module access level: app/modules/{name}/(public|private)/{dir}/
55
91
  *
92
+ * Multiple dirs per type represent canonical + legacy aliases from the server
93
+ * converters_config.rb FULL_PHYSICAL_PATH regexes.
94
+ *
56
95
  * Types with multiple dirs (e.g. Partial) will match any of their dirs.
57
- * The first matching type wins, so order of evaluation matters for overlapping
58
- * paths — but exact segment matching means dirs don't overlap in practice.
96
+ * Order within each array doesn't matter for matching. Across types,
97
+ * exact segment matching prevents false positives between overlapping paths
98
+ * (e.g. app/lib/smses/ → Partial, not Sms).
59
99
  */
60
100
  exports.FILE_TYPE_DIRS = {
61
- [PlatformOSFileType.Page]: ['views/pages'],
101
+ // Liquid
102
+ [PlatformOSFileType.Page]: ['views/pages', 'pages'],
62
103
  [PlatformOSFileType.Layout]: ['views/layouts'],
63
104
  [PlatformOSFileType.Partial]: ['views/partials', 'lib'],
64
105
  [PlatformOSFileType.Authorization]: ['authorization_policies'],
65
- [PlatformOSFileType.Email]: ['emails'],
66
- [PlatformOSFileType.ApiCall]: ['api_calls'],
67
- [PlatformOSFileType.Sms]: ['smses'],
106
+ [PlatformOSFileType.Email]: ['emails', 'notifications/email_notifications'],
107
+ [PlatformOSFileType.ApiCall]: ['api_calls', 'notifications/api_call_notifications'],
108
+ [PlatformOSFileType.Sms]: ['smses', 'notifications/sms_notifications'],
68
109
  [PlatformOSFileType.Migration]: ['migrations'],
69
- [PlatformOSFileType.GraphQL]: ['graphql'],
110
+ [PlatformOSFileType.FormConfiguration]: ['form_configurations', 'forms'],
111
+ // YAML
112
+ [PlatformOSFileType.CustomModelType]: ['custom_model_types', 'model_schemas', 'schema'],
113
+ [PlatformOSFileType.InstanceProfileType]: [
114
+ 'instance_profile_types',
115
+ 'user_profile_types',
116
+ 'user_profile_schemas',
117
+ ],
118
+ [PlatformOSFileType.TransactableType]: ['transactable_types'],
119
+ [PlatformOSFileType.Translation]: ['translations'],
120
+ // GraphQL
121
+ [PlatformOSFileType.GraphQL]: ['graphql', 'graph_queries'],
122
+ // Asset
70
123
  [PlatformOSFileType.Asset]: ['assets'],
71
124
  };
72
125
  /**
73
- * Liquid-containing file types. GraphQL and Asset are excluded because they
74
- * don't contain Liquid code and should not be passed to the Liquid linter.
126
+ * Liquid-containing file types. GraphQL, Asset, and YAML types are excluded
127
+ * because they don't contain Liquid code and should not be passed to the
128
+ * Liquid linter.
75
129
  */
76
130
  const LIQUID_FILE_TYPES = new Set([
77
131
  PlatformOSFileType.Page,
@@ -82,31 +136,39 @@ const LIQUID_FILE_TYPES = new Set([
82
136
  PlatformOSFileType.ApiCall,
83
137
  PlatformOSFileType.Sms,
84
138
  PlatformOSFileType.Migration,
139
+ PlatformOSFileType.FormConfiguration,
85
140
  ]);
86
141
  /**
87
142
  * Pre-compiled regex per file type, derived entirely from FILE_TYPE_DIRS.
88
143
  *
89
- * For each canonical dir, two pattern alternatives are generated:
90
- * /app/{dir}/ — direct app-level path (e.g. /app/lib/)
91
- * /(public|private)/{dir}/ — module path, covers both:
92
- * modules/{name}/(public|private)/{dir}/
93
- * app/modules/{name}/(public|private)/{dir}/
144
+ * For each canonical dir, three pattern alternatives are generated:
145
+ * /(app|marketplace_builder)/{dir}/ — direct app-level path (modern + legacy root)
146
+ * /(public|private)/{dir}/ — module path, covers both:
147
+ * modules/{name}/(public|private)/{dir}/
148
+ * app/modules/{name}/(public|private)/{dir}/
94
149
  *
95
150
  * Exact path segment matching prevents false positives:
96
151
  * /app/lib/smses/file.liquid → matches /app/lib/ → Partial (NOT Sms)
97
152
  * /app/smses/file.liquid → matches /app/smses/ → Sms (NOT Partial)
98
153
  */
99
154
  const TYPE_MATCHERS = new Map(Object.entries(exports.FILE_TYPE_DIRS).map(([type, dirs]) => {
100
- const alternatives = dirs.flatMap((dir) => [`/app/${dir}/`, `/(public|private)/${dir}/`]);
155
+ const alternatives = dirs.flatMap((dir) => [
156
+ `/(app|marketplace_builder)/${dir}/`,
157
+ `/(public|private)/${dir}/`,
158
+ ]);
101
159
  return [type, new RegExp(alternatives.join('|'))];
102
160
  }));
103
161
  /**
104
162
  * Returns the PlatformOSFileType for the given URI, or undefined if the URI
105
163
  * does not belong to any recognized platformOS directory.
106
164
  *
165
+ * Supports both modern (app/) and legacy (marketplace_builder/) app roots,
166
+ * as well as module paths (modules/{name}/public|private/).
167
+ *
107
168
  * @example
108
- * getFileType('file:///root/app/lib/smses/notify.liquid') // → PlatformOSFileType.Partial
109
- * getFileType('file:///root/app/smses/notify.liquid') // → PlatformOSFileType.Sms
169
+ * getFileType('file:///root/app/lib/smses/notify.liquid') // → Partial
170
+ * getFileType('file:///root/app/smses/notify.liquid') // → Sms
171
+ * getFileType('file:///root/marketplace_builder/views/pages/home.liquid') // → Page
110
172
  * getFileType('file:///root/modules/core/generators/templates/lib/create.liquid') // → undefined
111
173
  */
112
174
  function getFileType(uri) {
@@ -118,10 +180,11 @@ function getFileType(uri) {
118
180
  }
119
181
  /**
120
182
  * Returns app-level search paths for a file type (relative to project root).
183
+ * Uses the modern `app/` root (not the legacy `marketplace_builder/` alias).
121
184
  *
122
185
  * @example
123
186
  * getAppPaths(PlatformOSFileType.Partial) // → ['app/views/partials', 'app/lib']
124
- * getAppPaths(PlatformOSFileType.GraphQL) // → ['app/graphql']
187
+ * getAppPaths(PlatformOSFileType.GraphQL) // → ['app/graphql', 'app/graph_queries']
125
188
  */
126
189
  function getAppPaths(type) {
127
190
  return exports.FILE_TYPE_DIRS[type].map((dir) => `app/${dir}`);
@@ -138,9 +201,7 @@ function getAppPaths(type) {
138
201
  * 'modules/core/public/views/partials',
139
202
  * 'modules/core/private/views/partials',
140
203
  * 'app/modules/core/public/lib',
141
- * 'app/modules/core/private/lib',
142
- * 'modules/core/public/lib',
143
- * 'modules/core/private/lib',
204
+ * ...
144
205
  * ]
145
206
  */
146
207
  function getModulePaths(type, moduleName) {
@@ -160,6 +221,14 @@ function isKnownLiquidFile(uri) {
160
221
  const type = getFileType(uri);
161
222
  return type !== undefined && LIQUID_FILE_TYPES.has(type);
162
223
  }
224
+ /**
225
+ * Returns true if the URI belongs to a recognized platformOS GraphQL directory
226
+ * and should be linted. Files outside known directories (e.g. generator
227
+ * templates, schema files, ERB templates) return false and are excluded.
228
+ */
229
+ function isKnownGraphQLFile(uri) {
230
+ return getFileType(uri) === PlatformOSFileType.GraphQL;
231
+ }
163
232
  function isPartial(uri) {
164
233
  return getFileType(uri) === PlatformOSFileType.Partial;
165
234
  }
@@ -184,4 +253,7 @@ function isSms(uri) {
184
253
  function isMigration(uri) {
185
254
  return getFileType(uri) === PlatformOSFileType.Migration;
186
255
  }
256
+ function isFormConfiguration(uri) {
257
+ return getFileType(uri) === PlatformOSFileType.FormConfiguration;
258
+ }
187
259
  //# sourceMappingURL=path-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"path-utils.js","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { URI } from 'vscode-uri';
2
+ import { AbstractFileSystem } from '../AbstractFileSystem';
3
+ import { RouteEntry } from './types';
4
+ export declare class RouteTable {
5
+ private fs;
6
+ private routes;
7
+ private _built;
8
+ constructor(fs: AbstractFileSystem);
9
+ /** Returns true if build() has completed at least once. */
10
+ isBuilt(): boolean;
11
+ build(rootUri: URI): Promise<void>;
12
+ updateFile(uri: string, content: string): void;
13
+ removeFile(uri: string): void;
14
+ /**
15
+ * Find all routes matching a URL pattern and optional method.
16
+ * The pattern can contain `:_liquid_` segments for Liquid interpolations.
17
+ * Results are sorted by precedence (highest priority first = lowest number).
18
+ *
19
+ * A known format extension on the last segment (e.g., `/api/data.json`)
20
+ * is stripped and used to filter routes by format. When no format extension
21
+ * is present (e.g., `/about`), only `html` routes match — following the
22
+ * platformOS/Rails convention where HTML is the default format and non-HTML
23
+ * formats require an explicit extension or Accept header.
24
+ */
25
+ match(urlPattern: string, method?: string): RouteEntry[];
26
+ hasMatch(urlPattern: string, method?: string): boolean;
27
+ /** Returns the total number of route entries (including index aliases). */
28
+ routeCount(): number;
29
+ allRoutes(): RouteEntry[];
30
+ private matchEntry;
31
+ /**
32
+ * Try optional groups left-to-right greedily — matching Rails' ActionDispatch::Journey
33
+ * semantics. Each group is tried in order; if it matches, its segments are consumed
34
+ * and the next group is attempted. If it doesn't match, it's skipped (optional).
35
+ *
36
+ * This greedy approach is correct because the platformOS backend converts slugs like
37
+ * `search(/:country)(/:city)` into Journey path strings and Journey matches
38
+ * left-to-right without backtracking.
39
+ */
40
+ private matchOptionalGroups;
41
+ private addPageFromContent;
42
+ private discoverPageFiles;
43
+ private discoverModuleNames;
44
+ private walkDirectory;
45
+ }