From 0c2d3def30ee690c3ada56421c7023a035a8f077 Mon Sep 17 00:00:00 2001 From: LorisSigrist Date: Tue, 30 Jul 2024 13:40:54 +0200 Subject: [PATCH 01/58] start building the Paraglide adder --- adders/paraglide/config/adder.ts | 144 +++++++++++++++++++++++++++++ adders/paraglide/config/checks.ts | 6 ++ adders/paraglide/config/options.ts | 18 ++++ adders/paraglide/config/tests.ts | 14 +++ adders/paraglide/index.ts | 8 ++ adders/paraglide/paraglide.png | Bin 0 -> 26763 bytes 6 files changed, 190 insertions(+) create mode 100644 adders/paraglide/config/adder.ts create mode 100644 adders/paraglide/config/checks.ts create mode 100644 adders/paraglide/config/options.ts create mode 100644 adders/paraglide/config/tests.ts create mode 100644 adders/paraglide/index.ts create mode 100644 adders/paraglide/paraglide.png diff --git a/adders/paraglide/config/adder.ts b/adders/paraglide/config/adder.ts new file mode 100644 index 00000000..f90a55f4 --- /dev/null +++ b/adders/paraglide/config/adder.ts @@ -0,0 +1,144 @@ +import { defineAdderConfig } from '@svelte-add/core'; +import { options } from './options'; + +const DEFAULT_INLANG_PROJECT = { + $schema: 'https://inlang.com/schema/project-settings', + sourceLanguageTag: 'en', + languageTags: ['en'], + modules: [ + 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-identical-pattern@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-valid-js-identifier@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@latest/dist/index.js', + 'https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@latest/dist/index.js', + ], + 'plugin.inlang.messageFormat': { + pathPattern: './messages/{languageTag}.json', + }, +}; + +export const adder = defineAdderConfig({ + metadata: { + id: 'paraglide', + name: 'Paraglide', + description: 'Typesafe i18n with localized routing', + environments: { svelte: false, kit: true }, + website: { + logo: './paraglide.png', + keywords: [ + 'i18n', + 'internationalization', + 'l10n', + 'localization', + 'routing', + 'paraglide', + 'paraglide-js', + 'paraglide-sveltekit', + 'inlang', + ], + documentation: 'https://inlang.com/m/dxnzrydw/paraglide-sveltekit-i18n', + }, + }, + options, + integrationType: 'inline', + packages: [ + { + name: '@inlang/paraglide-js', + version: '*', + dev: true, + }, + { + name: '@inlang/paraglide-sveltekit', + version: '*', + dev: false, + }, + ], + files: [ + { + // create an inlang project + name: () => 'project.inlang/settings.json', + contentType: 'json', + content: ({ options, data }) => { + const availableLanguageTags = options.availableLanguageTags + .split(',') + .map((tag) => tag.trim()); + const sourceLanguageTag = availableLanguageTags[0]; + + data.sourceLanguageTag = sourceLanguageTag; + data.availableLanguageTags = availableLanguageTags; + }, + }, + { + // add the vite plugin + name: ({ typescript }) => `vite.config.${typescript.installed ? 'ts' : 'js'}`, + contentType: 'script', + content: ({ ast, array, object, functions, common, imports, exports }) => { + const vitePluginName = 'paraglide'; + imports.addDefault(ast, '@inlang/paraglide-sveltekit/vite', vitePluginName); + + const { value: rootObject } = exports.defaultExport( + ast, + functions.call('defineConfig', []), + ); + const param1 = functions.argumentByIndex(rootObject, 0, object.createEmpty()); + + const pluginsArray = object.property(param1, 'plugins', array.createEmpty()); + const pluginFunctionCall = functions.call(vitePluginName, []); + const pluginConfig = object.create({ + project: common.createLiteral('./project.inlang'), + outdir: common.createLiteral('./src/lib/paraglide'), + }); + functions.argumentByIndex(pluginFunctionCall, 0, pluginConfig); + + array.push(pluginsArray, pluginFunctionCall); + }, + }, + { + // reroute hook + name: () => 'src/hooks.js', + contentType: 'script', + content({ ast, imports }) { + imports.addNamed(ast, '$lib/i18n', { + i18n: 'i18n', + }); + }, + }, + { + // add the component to the layout + name: ({ kit }) => `${kit.routesDirectory}/+layout.svelte`, + contentType: 'svelte', + content: ({ js, html }) => { + js.imports.addNamed(js.ast, '@inlang/paraglide-sveltekit', { + ParaglideJS: 'ParaglideJS', + }); + js.imports.addNamed(js.ast, '$lib/i18n', { + i18n: 'i18n', + }); + + const rootChildren = html.ast.children; + if (rootChildren.length === 0) { + const slot = html.element('slot'); + rootChildren.push(slot); + } + + //wrap the HTML in a ParaglideJS instance + const root = html.element('ParaglideJS', {}); + root.attribs = { + i18n: '{i18n}', + }; + root.attributes.push({ + name: 'i18n', + value: 'i18n', + }); + root.children = rootChildren; + html.ast.children = [root]; + }, + }, + ], + nextSteps: () => [ + 'Edit your messages in `messages/en.json`', + 'Consider installing the Sherlock IDE Extension', + ], +}); diff --git a/adders/paraglide/config/checks.ts b/adders/paraglide/config/checks.ts new file mode 100644 index 00000000..fc08d6f3 --- /dev/null +++ b/adders/paraglide/config/checks.ts @@ -0,0 +1,6 @@ +import { defineAdderChecks } from '@svelte-add/core'; +import { options } from './options'; + +export const checks = defineAdderChecks({ + options, +}); diff --git a/adders/paraglide/config/options.ts b/adders/paraglide/config/options.ts new file mode 100644 index 00000000..3532c5d7 --- /dev/null +++ b/adders/paraglide/config/options.ts @@ -0,0 +1,18 @@ +import { defineAdderOptions } from '@svelte-add/core'; + +export const options = defineAdderOptions({ + availableLanguageTags: { + question: 'Which language tags would you like to support?', + type: 'string', + default: 'en', + }, + routing: { + question: 'Which routing strategy would you like to use?', + type: 'select', + default: 'prefix', + options: [ + { value: 'prefix', label: 'Path Prefix' }, + { value: 'domain', label: 'Domain' }, + ], + }, +}); diff --git a/adders/paraglide/config/tests.ts b/adders/paraglide/config/tests.ts new file mode 100644 index 00000000..f2745c00 --- /dev/null +++ b/adders/paraglide/config/tests.ts @@ -0,0 +1,14 @@ +import { defineAdderTests } from '@svelte-add/core'; +import { options } from './options'; + +export const tests = defineAdderTests({ + files: [], + options, + optionValues: [], + tests: [ + { + name: '', + run: async () => {}, + }, + ], +}); diff --git a/adders/paraglide/index.ts b/adders/paraglide/index.ts new file mode 100644 index 00000000..0ae44fcc --- /dev/null +++ b/adders/paraglide/index.ts @@ -0,0 +1,8 @@ +#!/usr/bin/env node + +import { defineAdder } from '@svelte-add/core'; +import { adder } from './config/adder.js'; +import { checks } from './config/checks.js'; +import { tests } from './config/tests.js'; + +export default defineAdder(adder, checks, tests); diff --git a/adders/paraglide/paraglide.png b/adders/paraglide/paraglide.png new file mode 100644 index 0000000000000000000000000000000000000000..a8dd3364ab9c26414919c865be56699f5b288ff1 GIT binary patch literal 26763 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 Date: Wed, 31 Jul 2024 10:38:57 +0200 Subject: [PATCH 02/58] Add a bunch of config --- .gitignore.rej | 7 ++++ adders/paraglide/config/adder.ts | 52 ++++++++++++++++++++++++++---- adders/paraglide/config/options.ts | 38 ++++++++++++++++------ adders/paraglide/config/tests.ts | 9 ++---- 4 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 .gitignore.rej diff --git a/.gitignore.rej b/.gitignore.rej new file mode 100644 index 00000000..93200928 --- /dev/null +++ b/.gitignore.rej @@ -0,0 +1,7 @@ +diff a/.gitignore b/.gitignore (rejected hunks) +@@ -6,3 +6,4 @@ packages/tests/.outputs + temp/ + coverage/ + .rollup.cache ++playground +\ No newline at end of file diff --git a/adders/paraglide/config/adder.ts b/adders/paraglide/config/adder.ts index f90a55f4..28c5fc7a 100644 --- a/adders/paraglide/config/adder.ts +++ b/adders/paraglide/config/adder.ts @@ -1,3 +1,5 @@ +import fs from 'node:fs'; +import path from 'node:path'; import { defineAdderConfig } from '@svelte-add/core'; import { options } from './options'; @@ -19,6 +21,11 @@ const DEFAULT_INLANG_PROJECT = { }, }; +/** + * If some parts of the automated setup fail we need to tell the user to do it manually. + */ +const manualSteps : string[] = []; + export const adder = defineAdderConfig({ metadata: { id: 'paraglide', @@ -57,10 +64,15 @@ export const adder = defineAdderConfig({ ], files: [ { - // create an inlang project + // create an inlang project if it doesn't exist yet name: () => 'project.inlang/settings.json', + condition: ({ cwd }) => !fs.existsSync(path.join(cwd, 'project.inlang')), contentType: 'json', content: ({ options, data }) => { + for (const key in DEFAULT_INLANG_PROJECT) { + data[key] = DEFAULT_INLANG_PROJECT[key]; + } + const availableLanguageTags = options.availableLanguageTags .split(',') .map((tag) => tag.trim()); @@ -95,14 +107,43 @@ export const adder = defineAdderConfig({ array.push(pluginsArray, pluginFunctionCall); }, }, + { + // src/lib/i18n file + name: ({ typescript }) => `src/lib/i18n.${typescript.installed ? 'ts' : 'js'}`, + contentType: 'script', + content({ ast, imports, exports, functions, variables, common }) { + imports.addNamed(ast, '@inlang/paraglide-sveltekit', { createI18n: 'createI18n' }); + imports.addDefault(ast, '$lib/paraglide/runtime', '* as runtime'); + + const createI18nExpression = common.expressionFromString('createI18n(runtime)'); + const i18n = variables.declaration(ast, 'const', 'i18n', createI18nExpression); + + const existingExport = exports.namedExport(ast, 'i18n', i18n); + if (existingExport) { + manualSteps.push( + '⚠️ Setting up $lib/i18n failed because it aleady exports an i18n function. Check that it is correct', + ); + } + }, + }, { // reroute hook name: () => 'src/hooks.js', contentType: 'script', - content({ ast, imports }) { + content({ ast, imports, exports, functions, variables, common }) { imports.addNamed(ast, '$lib/i18n', { i18n: 'i18n', }); + + const expression = common.expressionFromString('i18n.reroute()'); + const rerouteIdentifier = variables.declaration(ast, 'const', 'reroute', expression); + + const existingExport = exports.namedExport(ast, 'reroute', rerouteIdentifier); + if (existingExport) { + manualSteps.push( + '⚠️ Adding the reroute hook automatically failed. You need to do it manually', + ); + } }, }, { @@ -126,18 +167,15 @@ export const adder = defineAdderConfig({ //wrap the HTML in a ParaglideJS instance const root = html.element('ParaglideJS', {}); root.attribs = { - i18n: '{i18n}', + '{i18n}': '', }; - root.attributes.push({ - name: 'i18n', - value: 'i18n', - }); root.children = rootChildren; html.ast.children = [root]; }, }, ], nextSteps: () => [ + ...manualSteps, 'Edit your messages in `messages/en.json`', 'Consider installing the Sherlock IDE Extension', ], diff --git a/adders/paraglide/config/options.ts b/adders/paraglide/config/options.ts index 3532c5d7..44e93c55 100644 --- a/adders/paraglide/config/options.ts +++ b/adders/paraglide/config/options.ts @@ -6,13 +6,33 @@ export const options = defineAdderOptions({ type: 'string', default: 'en', }, - routing: { - question: 'Which routing strategy would you like to use?', - type: 'select', - default: 'prefix', - options: [ - { value: 'prefix', label: 'Path Prefix' }, - { value: 'domain', label: 'Domain' }, - ], - }, }); + +export const isValidLanguageTag = (languageTag: string): boolean => + RegExp( + '^((?(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?([A-Za-z]{2,3}(-(?[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?))(-(?